本帖最后由 香水城 于 2017-8-11 15:01 编辑
STM32+BLE通过 Notification与 Android应用程序通信的例程 前言
BLE通信中,常见的操作有请求、响应、命令、指示、通知、确认,可根据不同的操作完成不同的应用功能设计。
应用原理
BLE 协议栈中,有两种角色,一种是客户端(Client),一种是服务端(Server)。服务端提供数据,客户端使用数据。客户端发送获取数据请求后,服务端对客户端做出应答,并数据发送给客户端。
服务端发送带有数据的通知到客户端,通知不需要客户端做出响应。
硬件环境
• STM32L152RE-NUCLEO
• BlueNRG扩展板X-NUCLEO-IDB04A1
软件设计
BLE协议栈基于ST的BlueNRG DK软件。
服务端(Server)代码设计
创建一个Service,其UUID为“03366e80-cf3a-11e1-9ab4-0002a5d5c51b”,该Service包含的Characteristic的UUID为("e33e78a0-cf4a-11e1-8ffc-0002a5d5c51b"。
这里定义了Characteristic的值的长度为6个字节,支持Read和Notification属性。
添加了Characteristic后,再定义当Client读取 Characteristic值的处理函数,如下所示。
这里固定的写6个字节0x66,可根据要传输的数据进行填充。
添加服务端Characteristic值Notification处理,代码如下。
完成了服务端的软件设计后,先用手机端的LightBlue软件和设备端配合测试下设备端软件是否正常。使用LightBlue连接设备后,以下红色部分是LightBlue获取到的设备端的服务和该服务下的Characteristic的UUID。
界面中点击该Characteristic,在进入的界面中再点击“Listen for notification”来监听服务端的数据,可以看到LightBlue界面中连续收到了服务端发送过来的数据0x666666666666。
从测试结果看,服务端端软件工作正常,下一步是编写Android手机端的软件,配合设备端一起使用。
Android客户端(Client)代码设计
Android手机使用Samsung Galaxy S6,系统更新到Android-6.0.1。
以下介绍实现Notification功能的核心部分Android软件。首先定义客户端Characteristic的UUID。
扫描完蓝牙设备后,从ArrayList中获取对应UUID的索引,将其存起来。
setCharacteristicNotification方法中,使能Notification功能。
onCharacteristicChanged方法用来监测来自服务端的数据。
以下是调试应用程序时Logcat打印的Log信息。
从Log信息看,手机端(客户端)已经正确收到来自设备端(服务端)的数据0x666666666666,至此服务端和客户端的 Notification数据通信部分调试完成。
总结
支持BLE的设备和手机端通信方法中,常见的是手机主动读取设备的Characteristic UUID的数据。对于一些周期性的或需要设备主动发送数据到手机端且又不需要手机端做出应答的应用,使用Notification方法能够满足这样的应用。
对应的PDF: STM32_BLE通过Notification与Android应用程序通信的例程
更多实战经验请看:【ST MCU实战经验汇总贴】
|