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