收藏
回答

调用蓝牙模块API的不一致性?

先说一下需求,公司项目需要操作两个不同类型的蓝牙设备,蓝牙打印机和蓝牙电子秤。两厂家都提供对应操作蓝牙设备的SDK,一整捣鼓后终于能同时连接两个不同类型的蓝牙设备,但是问题出现了!先连接的设备怎么没有数据??? 单独连接某一个打印机或者秤没问题能打印,也能读取电子秤重量数据。

一系列蓝牙API测试后终于发现了问题....

检查API入下(重点!下列API有坑有大坑!!!):

onBluetoothAdapterStateChange

onBluetoothDeviceFound

onBLEConnectionStateChange

onBLECharacteristicValueChange


两厂家提供的SDK都操作了上述某些API将会导致冲突!!!,下面我用UNIAPP来做代码测试。

1.第一个案例,猜猜寻找到新设备后 callback1 和 callback2 都会执行吗?

答案是不会!因为onBluetoothDeviceFound后面注册的回调会覆盖前面注册回调!

2.第二个案例,猜猜蓝牙适配器变化后 callback1 和 callback2 都会执行吗?

答案是!因为每次调用onBluetoothAdapterStateChange注册的回调是独立的!

经过测试 onBluetoothDeviceFound ,onBLECharacteristicValueChange 重复调用会覆盖之前的回调。onBluetoothAdapterStateChange , onBLEConnectionStateChange 不会覆盖之前的回调,而是独立的回调。

看完上述两个案例基本上已经确认为什么会导致冲突出现了。两厂家提供的SDK都会去操作相同的API,有些API只会全局注册一次,但是API的特性不一致这一始料未及的操作留下的隐患被我踩到了! onBLECharacteristicValueChange 这个重要的API双方厂家的SDK都会调用,导致后调用的把先调用的覆盖掉了程序上就鬼畜了。

最后希望官方能够统一这些API调用效果,保留onBluetoothAdapterStateChange ,onBLEConnectionStateChange 这种独立回调的特性,不需要的时候调用off传入参数关闭指定回调,这样我只操作我自己注册的回调而不是把别人的回调一起关闭了!!!



最后一次编辑于  10-23
回答关注问题邀请回答
收藏
登录 后发表内容