一个蓝牙设备能发送多个服务(支持多个service UUID),每个服务(service UUID)能有多个特征(Characteristic UUID),下面还可以扩展多个属性(Property)
(一)使用安卓APP蓝牙调试器查看 SensorTile.box 蓝牙服务
我把 SensorTile.box 开发包里面的例程烧录入板卡,初始化后出现BBS_110的蓝牙设备。
安卓设备不能够直接匹配该设备,必须使用专门的蓝牙调试器。
蓝牙调试器监听空气中的2.4G蓝牙信号,找到五个服务(service)UUID,每个服务UUID都有多个特征(Characteristic)UUID
经过测试,00000000-0001-11e1-9ab4-0002a5b5c51b 这个服务(service)UUID是发送数据使用的,其下有三个特征UUID,分别是发送电池电量、环境传感器、运动传感器数据的
上图为环境传感器UUID:
(二)从源码分析数据格式
从初始化出分析
Init_BlueNRG_Custom_Services 函数 BlueNRG 的三个应用:
Add_HW_SW_ServW2ST_Service
Add_ConsoleW2ST_Service
Add_ConfigW2ST_Service
其中 Add_HW_SW_ServW2ST_Service 里面定义了 AccGyroMagCharHandle 这个 charhandle,蓝牙的UUID就是在这里定义的。
AccGyroMag即运动学相关传感器UUID信息:COPY_ACC_GYRO_MAG_W2ST_CHAR_UUID(uuid);
环境传感器:COPY_ENVIRONMENTAL_W2ST_CHAR_UUID(uuid);
电池传感器:COPY_BAT_W2ST_CHAR_UUID(uuid);
从每次发送分析:
1-调用 AccGyroMag_Update(&ACC_Value,&GYR_Value,&MAG_Value);
2-里面使用 ACI_GATT_UPDATE_CHAR_VALUE 即 aci_gatt_update_char_value(这是 BlueNRG 协议栈API)发送
3-发送的内容是2+3*3*2的buff,也就是一次信息20位,
STORE_LE_16(buff ,(HAL_GetTick()>>3));
STORE_LE_16(buff+2 ,Acc->x);
STORE_LE_16(buff+4 ,Acc->y);
STORE_LE_16(buff+6 ,Acc->z);
Gyro->x/=100;
Gyro->y/=100;
Gyro->z/=100;
STORE_LE_16(buff+8 ,Gyro->x);
STORE_LE_16(buff+10,Gyro->y);
STORE_LE_16(buff+12,Gyro->z);
STORE_LE_16(buff+14, Mag->x);
STORE_LE_16(buff+16, Mag->y);
STORE_LE_16(buff+18, Mag->z);
组织方式,前两位是时间戳,后是传感器信息。
小端模式
依次分析后发现:
电池信息是9个字节一次
环境信息是10个字节一次:uint8_t buff[2+4/*Press*/+2/*Hum*/+2/*Temp*/];
运动学传感器是20个字节一次:uint8_t buff[2+3*3*2];
(三)linux下开发蓝牙接收软件
N年前学的安卓和JAVA,只会写个界面,想来想去还是在linux下开发
找了点资料,发现linux下都是基于bluez框架的,整个linux驱动都用它。
如果是命令行交互的话,bluez有一系列工具,包括gatttool、hcitool、bluetoothctl等,但其余都是过时软件,只有 bluetoothctl 是最新的,因此首先使用 bluetoothctl 进行开发
1-命令行输入 bluetoothctl 进入交互
2-power on
3-agent on
4-Defaultagent
5-scan on
6-pair <SensorTile.box mac>
但是这里遇到了问题,无论如何配对,都是超时,修改了/etc/bluetooth/main.conf 里面配对的方式
ControllerMode = bredr
三个方式都试过,都不行。
咨询了一些从事BLE开发的前辈,说是 bluetoothctl 工具只针对几个简单的 service UUID,类似 keyboard 这类大众化的UUID才能匹配成功,ST SENSOR的都是自定义的UUID,无法被识别。
至于编程接口,bluez的编程接口在V4.xx之后都是通过dbus,这个编程难度非常高,我把源码的一个工程提取出来跑了一遍,蓝牙访问被禁止了,使用了sudo也不行,束手无策,看来只能写到TF卡里面再拿出来了。 |