你好,我最近在做一个项目是这样的:一个蓝牙设备做从机设备,十个蓝牙设备做主机设备;从机设备通过发送广播包控制主机设备;
但是出现主机设备扫描广播包会丢包,概率约为10%(测试10台同时扫描,其中一台出现丢包概率约是10%)。
我看了代码,发现cc2541扫描时间无法一直持续,其中#define DEFAULT_SCAN_DURATION 4000 表示扫描持续时间是4000ms,最大值只能设置为65535ms,时间一到就停止扫描;我为了实现连续扫描,在每次停止扫描的时候,重新开启了扫描。基于这样的操作,我认为扫描关闭、再开启可能导致丢包,所以我想请问下,有没有什么办法,可以让主机设备一直处于扫描状态?此外,我的协议栈是1.4.2.
谢谢!
da qin zheng sheng:
非常难!试试蓝牙私有协议
Viki Shi:
主机扫描结束后,应用层任务会收到响应的事件通知。
你可以在这个事件通知的处理中重新开启扫描,这样就实现了循环扫描了。
jianqiang zeng:
回复 Viki Shi:
我就是这样处理的,但是依旧会丢包。我看其他ble平台,例如cypress的,可以直接一直处于扫描状态,ti的协议栈没法支持这样的吗?
jianqiang zeng:
回复 da qin zheng sheng:
你好,能说具体点吗?
lkingz lin:
理论上讲,蓝牙扫描一定存在一定概率扫描不到的:
“这个时间是scan的时长,并不是能扫描到多少个设备的时间。扫描的时间越短,能够扫描到全部外设的可能性就越小。具体需要多少时间其实也是不一定的,因为广播端实际是在三个信道上轮询广播,只是切换时间很短所以如果以秒级来看就是在同一时间广播三个信道。对于搜索端,也是在三个信道上轮询搜索,所以要扫描到一个设备,有时候花的时间长有时候短。”
改善方法,可参考我回答的:
http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/109771.aspx
而且要注意,一次扫描,同一设备只出结果一次,只有重新扫描,再会再出同一设备的结果;
user5855679:
我遇到跟你一样的问题,请问你的问题现在解决了没呢?
YiKai Chen:
回复 user5855679:
每次扫描结束,应用层任务会收到响应的事件通知,可以在这个事件通知的处理中重新开启扫描就可以实现循环扫描
user5855679:
回复 YiKai Chen:
case GAP_DEVICE_INFO_EVENT: // 获取广播数据中的数据段 { SimpleBLECentral_StartDiscovery( DEFAULT_DISCOVERY_MODE, DEFAULT_DISCOVERY_ACTIVE_SCAN, // 开始扫描广播数据 DEFAULT_DISCOVERY_WHITE_LIST ); // if filtering device discovery results based on service UUID if ( DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE ) { if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID, pEvent->deviceInfo.pEvtData, pEvent->deviceInfo.dataLen)) { simpleBLEAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);
}
}
}
}
应该是这样吧!但是还是不会持续扫描。
YiKai Chen:
回复 user5855679:
是在 case GAP_DEVICE_DISCOVERY_EVENT:
user5855679:
回复 YiKai Chen:
还是 会有丢包的,丢包率 20% 左右