最近公司分派了一个项目,让我用一款国产的蓝牙MCU和一个血糖仪进行蓝牙通信获取血糖值,这款国产蓝牙MCU和NRF51822代码上绝大多数很相似,所以先在nrf51822上进行验证。
一、熟悉血糖仪的蓝牙通信流程
血糖仪厂商有一款APP和它进行蓝牙通信,我暂时不清楚里面的通信细节,所以需要先进行蓝牙嗅探。蓝牙嗅探大体步骤是先打开手机的“开发者模式”,然后打开进入“开发者选项”,选择“启用蓝牙HCI信息收集日志”,接着打开血糖仪配对的手机APP,按正常APP操作流程配对血糖仪,获取到血糖值,这样后我们就可以去获取安卓系统下蓝牙具体操作的日志了。再次进入“开发者选项”,点击“错误报告”,选择“互动式报告”就可以了,等待压缩包生成。我们想要的日志在压缩包FS\data\misc\bluetooth\logs目录下。
a、打开Wireshark,将btsnoop_hci.log文件拖进去,然后一直下拉找到有血糖仪蓝牙名的一组通信日志,如下
b、打开nrf connect,搜索血糖仪的蓝牙名,并连接,查看相关蓝牙服务和所属信息
c、通过wireshark里的日志,我们发现,需要先对,主设备进行CCCD配置,然后,发送0x01配置“Notification”属性
d、通过血糖仪原厂给到的协议,我们对比发现“主机”在发送给对应的UUID相关数据后,血糖仪就返回了相应的血糖值
e、在获取到相应流程后我们也可以按照日志里的步骤通过nrf connect验证下
二、在熟悉了相应的透传流程后,我们通过nrf51822进行代码验证
SDK:nRF51_SDK_10.0.0_dc26b5e 例程:examples\ble_central\ble_app_multilink_central
1、主机派发函数ble_evt_dispatch 内新增加了三个派发函数:
ble_db_discovery_on_ble_evt(&m_ble_db_discovery, p_ble_evt);//蓝牙数据发现事件
ble_nus_c_on_ble_evt(&m_ble_nus_c,p_ble_evt);//串口主机连接事件
on_ble_evt(p_ble_evt); //蓝牙处理应用事件派发
这三个函数是整个蓝牙主从交