帖子
帖子
用户
博客
课程
显示全部楼层
45
帖子
0
勋章
213
Y币

[BUG] 关于BLE模块的问题集锦

[复制链接]
发表于 2017-7-25 15:27:34
BLE在IOS下出现一下几个问题:
一、getPeripheral函数返回的数据不全,每次只返回name和uuid,偶尔返回一个RSSI还是错误的
ble.getPeripheral(function(ret, err) {
        //toast(JSON.stringify(ret));
        if (ret) JSON.stringify(ret));

})
返回值Peripheral:{“name”:XXXXXXX,“uuid”:xxxxxxx},偶尔有"rssi"参数返回
二、retrievePeripheral函数,永远只返回name和uuid,那么这个name和uuid是从上一个函数得来的,那么这个函数没任何人的意义。
ble.retrievePeripheral({
    peripheralUUIDs: [uuid]
}, function(ret,err) {
    if (ret) {
        api.alert({ msg: JSON.stringify(ret) });
    }
});

返回值永远只有{“name”:XXXXXXX,“uuid”:xxxxxxx}
三、getPeripheralRssi函数,只返回错误的信息,正确的信息没有任何的回调数据。
ble.getPeripheralRssi({peripheralUUID:uuid},function(ret,err) {
                                        alert("ret"+JSON.stringify(ret))+alert("err"+JSON.stringify(err));;
                                            if (ret.status) {
                                        alert(JSON.stringify(ret));
                                    }
                })

当带入参数uuid=""时,err返回错误代码1,ret的值为“status":false
当带入参数uuid="1",1是一个错误的uuid,err则返回错误代码2,ret的值为“status":false
当泰如参数uuid等于正确的uuid时,err,ret均无返回值。

45
帖子
0
勋章
213
Y币
测试IOS版本10.2
rssi是Received Signal Strength Indication接收的信号强度

需要先connect才能获取该值

一,getPeripheral是封装的系统的接口,有rssi就返回给前端开发者,无此值则不返回

二,retrievePeripheral、retrieveConnectedPeripheral接口只针对ios平台上封装的接口,Android平台不支持。大多数开发者使用其它接口已经满足需求。有相关需求的开发者可使用这两个接口

三,先connect,即可获取其rssi
45
帖子
0
勋章
213
Y币
模块咨询-Turbo 发表于 2017-7-26 15:15
rssi是Received Signal Strength Indication接收的信号强度

需要先connect才能获取该值

你的回复牵强附会,
第一个我用lightblue和安卓都有RSSI信号,并没有连接,

二、我现在使用的就是IOS,你前一个函数没有返回,第二个函数也没有返回,我该用哪一个?

三,我测试的安卓和lightBlue均不需要连接connect,如果为了测试信号连接一下,其他手机就搜索不到了!!
45
帖子
0
勋章
213
Y币
模块咨询-Turbo 发表于 2017-7-26 15:15
rssi是Received Signal Strength Indication接收的信号强度

需要先connect才能获取该值

你说rssi要连接才有,是站不住脚的,为什么light会有,安卓会有,而且百分百准确,就是ble模块时有时没有?
本帖最后由 模块咨询-Turbo 于 2017-7-26 16:20 编辑
老柴228 发表于 2017-7-26 16:07
你的回复牵强附会,
第一个我用lightblue和安卓都有RSSI信号,并没有连接,

ble模块源码已经开源:
https://**.**/apicloudcom/ble

如果这个模块不符合你的需求,可以找模块开发者在这个模块源码上定制。
也可以完全自己开发。
本帖最后由 模块咨询-Turbo 于 2017-7-27 10:38 编辑
老柴228 发表于 2017-7-26 16:14
你说rssi要连接才有,是站不住脚的,为什么light会有,安卓会有,而且百分百准确,就是ble模块时有时没有 ...

getPeripheral、retrievePeripheral、retrieveConnectedPeripheral接口返回的rssi参数已经在ios8以后的系统版本废弃了(苹果官方废弃的),可以使用getPeripheralRssi接口获取,这个接口必须在ios8以后的系统版本才有效,详情参考ble模块接口文档:http://docs.apicloud.com/Client- ... e#getPeripheralRssi

注意:

ble模块是直接封装的苹果提供的蓝牙相关的接口,模块这一层并没有做处理,苹果提供什么接口就封装什么接口,苹果返回什么值模块就返回什么值。
在ios系统上要获取rssi值,必须先连接,否则获取不到,苹果官方文档说明如下:

While connected, retrieves the current RSSI of the link.


至于lightBlue如何获取到rssi值的,猜测有以下两种可能:
1,遍历搜索到的每个蓝牙设备,然后连接,获取到rssi之后再断开连接(这种方案非常耗费资源,估计这种实现方式的可能性不大)
2,用了某些私有接口(若是这样的话发布app到苹果商店的时候有被拒的风险)

若采用方案一,你自己调用ble模块现有接口即可实现。

若采用方案二,需要联系原生模块开发者定制模块。APICloud可以协助你找原生模块开发者。



getPeripheral   这个接口  第一次可以返回name   关闭蓝牙  在打开蓝牙  返回的数据没有name了
您需要登录后才可以回帖 登录

本版积分规则