转自大香瓜的博客
一、简介
本篇以SimpleBLEPeripheral工程为例,介绍实现连接时广播的方法。
二、实验平台
协议栈版本:BLE-CC254x-1.4.0
编译软件:IAR 8.20.2
硬件平台:Smart RF开发板
三、连接时广播有什么用?
答:自己想了两个理论上可行的功能,能不能实现还是要实践才知道,欢迎大家给我留言、私信补充:
用途一:广播出连接状态
主机1连上从机后,从机可通过改变广播数据,来告知主机2“本从机已经被连接”。
用途二:手机修改广播内容
主机1连上从机后,主机1给从机发送广播数据,从机再把广播数据广播出去。(需要配对加密,否则大家都可连接)
四、修改步骤
1、修改IAR设置中的宏
将xPLUS_BROADCASTER改为PLUS_BROADCASTER。
注:只修改这一句,手机连接时CC2541就仍能广播。但是手机断开后会出现两个问题:
1)CC2541的显示屏会显示“disconnected”。
2)CC2541的广播停了。
2、解决上面两个问题
修改peripheralStateNotificationCB函数的GAPROLE_WAITING代码(simpleBLEPeripheral.c中)
上述俩问题的原因是:当手机断开连接后,由于此时广播的相关变量仍显示从机在广播,所以协议栈的判断开广播的代码会开启不起来。
所以在这里从机超时后不进行当前广播状态的判断,直接紧接着开广播。
注:此时又出现了新的问题,也就是只有手机连接CC2541第一次时能“连接时广播”,第二次连接就没有广播数据了。
3、解决上述的“只在第一次连接时能广播”问题
修改peripheralStateNotificationCB函数的GAPROLE_CONNECTED代码(simpleBLEPeripheral.c中)
默认是只会在第一次连接时默认开广播,把红框中的语句注释掉以后每次连接时都能自动开广播。
注:用packet sniffer抓包。
1、CC2541上电广播时:广播包的间隔约为103127us(100ms),LCD显示“Adverting”。
2、手机连接CC2541时:有时候packet sniffer会看不到连接中的广播包,需要packet sniffer软件“停止-开始”地重开一下。此时广播包间隔约为1290036us(1.2S),LCD显示“Connected Adverting”,手机仍可正常与CC2541通信数据。
3、手机断开CC2541时:CC2541重新开始广播,间隔约为105628us(100ms),LCD显示“Aderting”。
所以,实现了连接时广播。