关于android读取BLE设备信息

    研究了半个月的扫描蓝牙设备信息,从开始的不明白为什么读取不到任何的信息,到后来慢慢的深入,中间走了很多的弯路,总结一下,以后的自己遇到不至于忘了这会测试的一切。

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设备,因为只专注了半个月,这只是自己所有的实践结果。有错误欢迎指正。谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值