那个旅游网站可以做行程,西安企业建站公司,赤峰最好的网站建设公司,网站制作推广公司文章目录 1. 概念介绍2. 具体细节2.1 发现服务2.2 发现特征值2.3 发送数据2.4 接收数据 3. 代码与效果3.13.2 运行效果 4. 经验总结 我们在上一章回中介绍了连接蓝牙设备的细节相关的内容#xff0c;本章回中将介绍通过蓝牙发送数据的细节.闲话休提#xff0c;让… 文章目录 1. 概念介绍2. 具体细节2.1 发现服务2.2 发现特征值2.3 发送数据2.4 接收数据 3. 代码与效果3.13.2 运行效果 4. 经验总结 我们在上一章回中介绍了连接蓝牙设备的细节相关的内容本章回中将介绍通过蓝牙发送数据的细节.闲话休提让我们一起Talk Flutter吧。 1. 概念介绍
我们在本章回中介绍的通过蓝牙设备发送数据仍然使用flutter_blue_plus包提供的接口我们在第一百一十九回章回中介过通过蓝牙发送数据的方法不过还有一些 细节问题需要注意本章回中将详细介绍通过蓝牙发送数据的细节内容。
2. 具体细节
通过蓝牙发送数据的细节主要包含发现服务(BluetoothService)和特征值(Characteristic)发送数据和接收数据。我们把这些内容分成各个小节来介绍。
2.1 发现服务
发现服务使用包中的discoverServices()方法就可以不过蓝牙设备的服务比较多需要进行遍历操作在遍历过程中找到需要操作的服务通常是通过服务的uuid 来判断服务是否是我们需要操作的某个服务。此外蓝牙设备的服务具有读写特性也可以依据读写特性来区分服务。
2.2 发现特征值
发现特征值不需要专门的方法通过服务的characteristics属性就可以获取到该服务的特征值该属性是一个列表包含服务中的多个特征值。我们需要对特征值列表 进行遍历操作在遍历过程中找到需要操作的特征值通常是通过特征值的uuid来判断特征值是否是我们需要操作的某个特征值。此外蓝牙设备的特征值类似服务也 具有读写特性也可以依据读写特性来区分不同的特征值。
2.3 发送数据
2.4 接收数据
通过蓝牙设备读写数据有两种方法一种是读写Characteristics另外一种是读写Descriptor.我们在本章回中介绍的读写数据本质上是读写Characteristics。 flutter_blue_plus包提供了相关的接口去读写Characteristics本章回中将介绍如何使用这些接口去读写数据。
获取服务,通过包中的discoverServices()方法来获取服务通过服务的characteristics属性获取characteristics使用characteristics中的read()和write()方法来读写数据使用characteristics中的onValueReceived属性监听读写结果该属性是Stream类型和蓝牙连接状态的监听方法一样
3. 代码与效果
3.1
上面小节中介绍的实现方法比较抽象接下来我们通过具体的代码来演示如何给蓝牙设备读写数据 FutureListBluetoothService discoverServices(BluetoothDevice device) async {ListBluetoothService services await device.discoverServices();ListBluetoothCharacteristic characteristics;StreamListint readValueChanged;StreamListint writeValueChanged;for (var element in services) {// log.i(service: ${element.toString()});characteristics element.characteristics;for(var char in characteristics) {if(char.properties.read) {readValueChanged char.onValueReceived;readValueChanged.listen((event) {log.i(read chara feedback: ${event.toString()});});readCharacteristics(char);}if(char.properties.write) {writeValueChanged char.onValueReceived;writeValueChanged.listen((event) {log.i(write chara feedback: ${getNiceHexArray(event)});},onError:(e){log.i(write chara error: ${e.toString()});},onDone: () log.i(write chara done),);writeCharacteristics(char);}}}return services;}///依据指定的UUID读取特征值void readCharacteristics (BluetoothCharacteristic characteristic) async{if(PrivateKey.searchServiceUuid ! characteristic.characteristicUuid.toString()) {return null;}Listint value await characteristic.read();log.w(read characteristic: ${value.toString()});}///依据指定的UUID写入特征值void writeCharacteristics (BluetoothCharacteristic characteristic) async{if(PrivateKey.writeCharacteristicUuid ! characteristic.characteristicUuid.toString()) {return null;}Listint value [12,13,14];await characteristic.write(value,withoutResponse: false);log.w(write characteristic: ${value.toString()});}3.2 运行效果
上面示例代码中把读写操作封装成了独立的方法这样可以降低代码的耦合性。同时还指定了characteristic的uuid。这样可以对特定uuid的characteristic进 行读写操作。 我们还在代码中监听了读写操作的结果以便我们了解读写操作的情况。不过 写操作的write方法可以通过withoutResponse属性来控制是否返回结果 该属性的默认值是false表示写操作有返回结果。
4. 经验总结
Service,Characteristic和Descriptor都是蓝牙设备的属性而且每个蓝牙都有这些属性Service,Characteristic和Descriptor环环相扣:获取到Service后才能获取Characteristic,获取到Characteristic后才能获取Descriptor;一个蓝牙设备可能会有多个service我们可以通过它的uuid来区分不同的service;一个serice可能会有多个characteristic,我们可以通过它的uuid来区分不同的characteristic;一个characteristic可以具备读写属性中的任意一种或者二种属性都具备 分享完这些经验后我们回头再看看代码中的各种for循环和if条件判断语句它们都是为了遍历多个值. 看官们与通过蓝牙发送数据的细节相关的内容就介绍到这里欢迎大家在评论区交流与讨论!