研究了半个月的扫描蓝牙设备信息,从开始的不明白为什么读取不到任何的信息,到后来慢慢的深入,中间走了很多的弯路,总结一下,以后的自己遇到不至于忘了这会测试的一切。
1、开始使用的是旧的apimBluetoothAdapter.startLeScan(mLeScanCallback)启动的扫描,发现在一些设备上面运行很正常,可能运行一天也不会中断,其中在6.0的机子上面运行,总会出现一段时间的中断,运行一段时间后自动停止扫描,也不 报任何的错误,这点现在还没有弄清楚,网上有的说是都有一定的休眠期,但是具体如何,没弄明白。另外,同时扫描好几个设备,每一个每分钟扫描的频率也不会一样,可能这一分钟几个设备都扫描到了,也可能这一分钟之后只扫描了其中的某个设备,另外的一个就扫描不到,但是下一分钟可能又正常。
2、后来改用新的api,mBLEScanner.startScan(leCallback);使用这种的在6.0设备上面运行的时间是稍微长了一点,但是还是会出现中间停顿的现象,并且应该是只支持5.0以上的设备,中间停顿之后就不自动重连了,可能是过了十几分钟之后又自动重新扫描了,这个时间是不固定的。
两种方式试了一下最后都不太满足需求,并且这个是只支持设备的进入,设备退出的话是没有提示的,需要自己实现一个退出的方法,目前使用的是计时的方式,超过一段时间该设备没信息之后就认为该设备已经远离当前范围,并且手动删除该设备。
也尝试过过一段时间就自动重启一下扫描,至少这样不会出现中间停了就不自动重连了,但是会出现某一分钟扫描不到的情况,不符合需求,所以pass掉了,可能是对设备的扫描频率要求的比较高吧。
试过扫描固定的设备,就是添加固定设备的UUID参数,但是发现这种的发现不了设备,重试了集中方式都不可以,不知道是不是自己的使用方式不太对。
后来把扫描设备信息的方法写到service里面,至少黑屏状态下不会被杀死,相对来说运行是比较稳定的,试了几款机型,都还可以,只是某分钟不读取的没解决,还是不能使用。
BluetoothAdapter.getScanMode()可以获取当前设备扫描的扫描模式,一共分为3种:
无功能状态 : int SCAN_MODE_NONE , 值为20, 查询扫描和页面扫描都失效, 该状态下蓝牙模块既不能扫描其它设备, 也不可见;
扫描状态 : int SCAN_MODE_CONNECTABLE , 值为21, 查询扫描失效, 页面扫描有效, 该状态下蓝牙模块可以扫描其它设备, 从可见性来说只对已配对的蓝牙设备可见, 只有配对的设备才能主动连接本设备;
可见状态 : int SCAN_MODE_CONNECTABLE_DISCOVERABLE, 值为23, 查询扫描和页面扫描都有效;
另外,在别的博客中看了可以修改这个值(http://www.2cto.com/kf/201312/261093.html)
不过修改这个值对扫描设备信息没多大的用处,因为我不需要被发现,而是主动发现设备,满足这个就可以,所以改完也没多大的效果,所以这边只是记录一下。
public void closeDiscoverableTimeout() {//21
BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();
try {
Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);
setDiscoverableTimeout.setAccessible(true);
Method setScanMode =BluetoothAdapter.class.getMethod("setScanMode", int.class,int.class);
setScanMode.setAccessible(true);
setDiscoverableTimeout.invoke(adapter, 1);
setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE,1);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setDiscoverableTimeout(int timeout) {//23
BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();
try {
Method setDiscoverableTimeout = BluetoothAdapter.class.getMethod("setDiscoverableTimeout", int.class);
setDiscoverableTimeout.setAccessible(true);
Method setScanMode =BluetoothAdapter.class.getMethod("setScanMode", int.class,int.class);
setScanMode.setAccessible(true);
setDiscoverableTimeout.invoke(adapter, timeout);
setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE,timeout);
} catch (Exception e) {
e.printStackTrace();
}
}
买的BLE设备,可以手动修改UUID、MINOR、MAJOR、发射频率等,并且可以给设备加密,防止别人链接,因为一台设备被连接之后别的手机就不能发现该设备了,链接设备之后也可以一直读取该设备的rssi值等一些信息了,不过有的需求中是不能被链接的,因为好多设备都是让很多人去发现的。因此,根据不同的需求去调整自己的代码。
总结如上,可能其中有一些错误是因为自己不了解BLE设备,因为只专注了半个月,这只是自己所有的实践结果。有错误欢迎指正。谢谢