Nordic51822 被连接时打开广播
小潘 921537102
本文档为个人学习总结
只作为学习交流用途
欢迎大神指导纠正错误
很多朋友一直有个疑问:Nordic51822 蓝牙被连接了还能再打开广播吗?
关于这个问题可以参考查看蓝牙核心规范 coreV4.2 中的卷 6 PartB 1.11 小节的 BLE 链路层状
态机的说明,查看后可以知道由于以上的限制一个设备不可能同时成为两个主设备的从设备
的。但由于链路层的多状态机制,一个链路层的具体实现可以拥有多个独立的状态机,所以
理论上来说,通过配置可以同时成为从设备和广播者。
所以上述的问题的答案应该为:被连接的同时还是可以打开广播的,但是这个广播不能
被连接,即不可连接广播,被连接以后开启的广播只能作为 beacon 应用。关于广播各种模
式下的详细说明我总结在另一篇文档中,地址为:
http://download.csdn.net/detail/ccdehuiji/9835050?web=web
下面以 nrf51822 SDK10.0 的 ble_app_uart 例程为例尝试手机连接以后再打开广播
这里我们直接调用开始广播函数,直接开启广播是不行的,会导致检测异常复位的情况,查
看错误代码为 0x08
无效状态,操作不允许。
这是因为一般我们打开的广播都是普通可连接广播,所以我们要把广播配置成为不可连
接的广播模式,不可连接广播一般用于 beacon,应用场景为,距离近的情况推送一些广告
消息给 app 使用者,一般用于商场等地方。
这里我将 app_ble_beacon 例程的部分代码移到我实验的工程中。
广播的全局变量及 beacon 的自定义字段:
一些宏定义:
广播初始化函数
这里由于函数名重复,所以我将函数名重命名为 advertising_init1(void)
连接成功之后重新初始化广播,并打开该广播
断开连接之后停止 beacon 广播重新初始化回普通可连接广播
这里由于使用了 advertising 模块,断开连接时候已经帮我们自动打开广播了,这里由于
实验功能与之功能冲突,所以不需要这个功能。
APP 连接
连接之后在不断开连接的情况下回到扫描的界面
这时候的广播即为 beacon 广播,beacon 广播特定格式的广播数据,由程序可以看出,特定
的数据放在厂商自定义字段中,使用 nRF beacon APP 进行测试:
添加 beacon 设备,并设置 MAJOR MINOR 的值
设置完成以后 APP 会不断扫描该设备,当 APP 检测到当前距离值为设置的触发距离的时候,
弹出的蒙娜丽莎的消息。
对于 IOS 设备,测试 beacon 的时候需要将 APP_COMPANY_IDENTIFIER 公司标识 ID 号修改为
0x004C(苹果厂商 ID)
此时广播为标准 ibeacon,使用 IOS 版本 nrf beacon 可以解析出该广播数据。
由于例程中的 beacon 数据长度比较长,所以没有足够的长度放下广播的名称数据,要想使
beacon 设备设置名称,需要将广播配置成可扫描广播类型。该类型也为不可连接类型,但
是可以发送扫描回应数据,我们可以把名称数据放在扫描回应数据里面。
此时的 beacon 广播就带上名称了
使用苹果手机测试,近距离时候弹出的蒙娜丽莎: