广播内容的自定义是蓝牙BLE开发的基本技能,用户最多能够设置31字节。但是用户定义是必须要遵循BLE协议的。另外,ibeacon应用和一些特定的应用要利用广播来传递数据,而且不同时间段的广播内容还会改变,如ibeacon的major/minor和电量显示等待。本文即阐述蓝牙的广播数据格式和动态改变。
参考文档:bluetooth specification version 4.0, p1735-p1738
一、广播数据格式
总共31字节,由一个或者多个广播结构单元组成,每个单元由长度Length、广播内容类型AD Type、广播数据AD Data组成;长度为AD Type加上AD Data的长度,不包括长度自身所占字节。
二、常见广播内容类型AD Type
1.flag
AD Type是0x1,代表广播模式。LElimited Discoverable(AD data是0x0)是有限时间广播,而General Discoverable(AD data是0x1)是无限广播,直到被主动停止广播。
2. Manufacture specific data
AD Type是0xff,代表厂商数据,自定义的数据可以写到这里。很多第三方场景应用都是利用这个字段来进一步定义应用协议格式,如微信的airsync协议和ibeacon协议。
3. service
代表服务的UUID,一般用16bit的UUID。如微信airsync协议的ServiceUUID是0xFEE7。
4. TX POWER LEVEL
发射功率,主机根据它和RSSI就可以计算主机到从机的距离,ibeacon室内定位即是利用这点。
5. local name
设备名称
常见的广播内容类型就是上面五种,其他的不常见就不讲了。
三、广播动态改变
动态改变其实跟各个蓝牙单芯片的sdk事件处理机制有关,但是对于CC2541、DA14580和nrf52832等平台来说,他们的处理基本是一样的:
1)要想改变广播内容,必须先停止广播,再进行广播内容更新,然后重新广播生效。
2)必须要等到底层BLE协议栈完全停止广播后,发送确认信息给应用层之后,才能改变广播内容并重新广播。
以DA14580来举例,其在一直广播过程中,在需要改变广播内容时,要先向GAPM(广播属于GAP层管理)发送GAPM_CANCEL_CMD取消广播,底层处理完会受到一个GAPM_CMP_EVT完成的事件,在该事件处理中修改广播内容,并重新发送GAPM_START_ADVERTISE_CMD命令开始广播。
四、广播TIMEOUT
对于DA14580来说,其默认是一直广播下去的,直到被取消或者转到连接状态。如果希望只广播一定时间就进入睡眠,则需要定义一个timer。
对于nrf52832来说,其接口内置一个定时器,可以设置无线广播,也可以设置一个时间,时间到了就会收到一个TIMEOUT事件。
- 关注微信公众号:嵌入式企鹅圈,获得上百篇物联网技术原创。