我正在开发一款定期扫描BLE设备的Android应用,并将信标信息用于进一步的处理。我需要抓住距离最近的灯塔。
// Scan for bluetooth devices and parse results
private void scanLeDevice() {
// Stops scanning after a pre-defined scan period.
if(!mScanning){
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d(TAG, "stop scanning");
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
Log.v(TAG, "closing scan. beacon found:" + beaconFound);
broadcastLocalUpdate();
beaconFound = false;
stopSelf();
}
}, SCAN_PERIOD);
proximity=null;
totalDevices=0;
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
Log.d(TAG, "start scanning");
}
}
我使用的信标:
在我的一个测试设备上,索尼Xperia z2,这是有效的。我得到了一长串具有Beacon信息和RSSI值的设备。每次扫描都会多次发现每个信标。
在我的另一个测试设备上,Motorolla Moto G(第2代),这种扫描表现得非常不可预测。在大多数扫描中,仅发现2或3个设备。其他场合它发现了大约10个设备(包括重复)。无论这些设备是近还是远,都无关紧要。
答案 0 :(得分:0)
扫描结果针对每个收到的副词。不管是什么rssi。 天线是大多数手机上的共享资源。 Wifi,bt classic,ble。所以手机只能在Windows中监听。只有当adv落入这个窗口才会得到回调。手机必须通过3个频道收听。 因此,尝试使用您的adv间隔和adv包装尺寸。如果你在同一个房间里有很多人,你不应该使用太快的adv间隔,因为adv通道将被填充并且会发生碰撞。 尝试关闭wifi并重新测试。 避免使用经典的bt连接。 如果你能保持adv包短,请将名称放在scanresponse中。
答案 1 :(得分:0)
您的信标不经常播放频道,创造了一个非常真实的机会,即当接收机监控其频率时不会发生传输。每秒至少尝试10次传输,但如果你有外部电源,最好更多。
当然,发射器并不是全部 - 安卓手机在检测BLE广告时接收的数量差别很大,并且可能在相同条件下报告截然不同的信号电平。
您可能希望在短时间内通过多次扫描收集结果,并查看汇总数据,而不仅仅是单次扫描的数据。