一,发射器情况:有1个Service,Service下有2个Characteristic,其中1个Characteristic命名为writeCharacteristic(FFF1)具有read,write 2个属性,另外1个Characteristic命名为notifyCharacteristic(FFF2)具有notify属性
以上信息可以在获得Characteristic后用日志查看,代码如下:writeCharacteristic的Properties返回10,说明具有?PROPERTY_READ(和PROPERTY_WRITE (8)
输出结果如下:
二,任务:手机APP中输入指定命令,发送后,发射器会把执行结果返回到手机APP上显示
1蓝牙连接成功后,把所有Characteristic查找到
2执行下面代码使能notifyCharacteristic的notify, 将会在此通道(FFF2)产生有关命令操作的执行结果通知。
每产生一次采集结果后,将会在FFF2通道产生一个 notify 通知事件,附带了本次采集结果,
APP 可以直接在回调函数onCharacteristicChanged中进行处理和使用。处理完的结果通过广播返回到界面或者保存到数据库
4要考虑十六进制转换
(1)输入的命令转换为十六进制字节数组
mSCharacteristic.setValue(Conversion.hexStringToByteArray(theString));
mBluetoothLeService.writeCharacteristic(mSCharacteristic);
在App输入框中输入执行命令:0155AA00这是个字符串,并不代表你的真实目的,你是把这个字符串看成4个字节的16进制形式的命令:00000001? 01010101? 10101010? 00000000,但由于是String类型,计算机中每个字符是1个字节,所以计算机把你的输入当作11个字节的数据00000000?00000001 00000101 00000101 00001010 00001010 00000000 00000000,显然这是错误的,所以,首先需要把你输入的十六进制形式的命令转换为字节数组,代码如下:
(2)获取到的数据需要进行处理
三、执行结果
四、以上任务卡了3天做不出来,主要原因如下:
1,不清楚每个Characteristic的属性,fff1可读可写,fff2Notify,可以按一查看
2,不清楚流程:
(1)先使能notifyCharacteristic(二、2)
(2)对发射器进行write命令操作(二、3)
(3)子BluetoothGattCallback的onCharacteristicChanged方法里对发射器返回的数据进行处理。
mBluetoothGatt.writeCharacteristic(characteristic);如果把命令成功写到发射器,会触发:
BluetoothGattCallback的? onCharacteristicWrite方法,这里面不做什么可以不用要
执行代码writeCharacteristic对通道FFF1进行写命令操作,每产生一次采集结果后,
将会在FFF2通道产生一个 notify 通知事件,附带了本次采集结果, APP 可以直接在回调函数中进行处理和使用。
3,写到mSCharacteristic的值没有转成十六进制字符串(二、4)导致写进去的值是错误的
五、扫描广播、连接、绑定
1,Android手机为central,GATT client;发射器为peripheral,GATT server
Central vs. peripheral:? 中心设备和外围设备的概念针对的是BLE连接本身。Central角色负责scan advertisement。而peripheral角色负责make advertisement。
GATT server vs. GATT client:这两种角色取决于BLE连接成功后,两个设备间通信的方式。两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
?问:Client和Server节点是如何定义呢?
答:通俗地说吧,Server(服务器)就是数据中心,Client(客户端)就是访问数据者。特别说明,它与主/从设备是独立的概念:一个主设备既可以