native.js 可以调用蓝牙的数据吗

JavaScript08

native.js 可以调用蓝牙的数据吗,第1张

可以,其原理和安卓调用手机的蓝牙列表信息是一样的,只是native.js用js的方式封装了原生Android和OC语言,使js也能获得手机的原生api,但是现在大部分的浏览器不支持NJS

我实现的小程序模块自动连接(根据需要,可改手动),是在小程序初始化完成时开始自动调用执行。

大致流程:

开启蓝牙适配;

获取蓝牙适配器状态,判断设备蓝牙是否可用;

判断蓝牙适配器可用时开启扫描蓝牙设备和开启获取已连接的蓝牙设备;

如果开启扫描蓝牙设备失败 5 s 后,自动再次开启扫描;

开启扫描蓝牙设备成功后,开启监听已扫描的设备;

如果已扫描到的新设备,包含特定名称规律,则开始连接该设备;

开启获取已连接蓝牙设备,成功后,连接包含特定名称规律的设备;

两者都无法搜索到相应设备,则等待 5 s,重新搜索;

开始连接某设备时停止扫描设备,停止循环获取已连接设备;

连接成功后停止扫描设备,停止循环获取已连接设备。

​下面,我们一步步来完成这个流程。

开始连接蓝牙设备

1. 开启连接

app.js的onLaunch()方法里中,我们调用this.startConnect()来开启连接,弹出提示框,进行配对。如果失败,则提示设备蓝牙不可用,同时开启蓝牙适配器状态监听。

2. 获取本机蓝牙状态

调用this.getBluetoothAdapterState()获取本机蓝牙适配器状态,判断是否可用。若available为false,则为用户没有开启系统蓝牙。

同时,判断程序还没有开始搜索蓝牙设备,调用this.startBluetoothDevicesDiscovery()开始扫描附近的蓝牙设备,以及this.getConnectedBluetoothDevices(),获取本机已配对的蓝牙设备。

3. 开始搜索新设备

开始搜索蓝牙设备startBluetoothDevicesDiscovery(),提示蓝牙搜索。

4. 获取已配对的蓝牙设备

需要注意的是,参数services(Array)是必填的,但是官方示例中以及各种坑爹 demo 里从没见过有谁填写。不填写这个属性此方法,将无法获取到任何已配对设备。

如果要调用此方法,则代表需要连接特定设备,并且知道该设备的一个主服务serviceId。

如暂时不知道这个 ID,可以先手动连接一次想要连接的设备,然后获取service列表,记录属性primary为true的值至少一个。5. 处理搜索功能开启失败的情况

如果搜索功能启动失败,回到第 2 步,重新检查蓝牙适配器。如果可用,开启蓝牙搜索功能并开启发现附近蓝牙设备事件监听:this.onBluetoothDeviceFound()。

此方法可自定义过滤一些无效的蓝牙设备,比如name为空的,或是产品开发中,需要过滤设备名称不含有特定规律字符串的设备。

6. 自动配对设备

在第 5 步中发现了某个想配对的设备,则获取到该设备的deviceId,然后用this.startConnectDevices()接口,开始配对该设备。

开启连接后,为了避免出现冲突,一旦开启连接,则需要终止扫描附近蓝牙设备、终止读取本机已配对设备

7. 连接成功后握手

连接成功后,使用this.getService(deviceId)接口,获取设备的所有服务。

8. 读取服务的特征值

9. 意外处理

如果扫描到的设备中没有想要连接的设备,可以尝试使用系统蓝牙手动配对,然后再小程序中调用getConnectedBluetoothDevices()获取本机已配对的蓝牙设备,然后过滤设备(可能获取多个已配对的蓝牙设备)。

然后,将已获取的蓝牙设备deviceId列表放入到一个数组中,然后调用自定义方法this.loopConnect()

思路:通过递归调用获取已配对蓝牙设备的,如果获取到了就去连接,如果devicesId[x]为空,说明上传调用时,获取到的已配对设备全部连接失败了。

这时候,我们需要则开启重新获取已配对蓝牙设备,并开启扫描附近蓝牙设备。

10. 自动循环重试

startConnectDevices('loop', array)方法,是当获取已配对蓝牙设备进行连接时调用。

其中的处理逻辑上文已经贴出,意思就是在连接失败后fail方法里累加一个全局变量,然后回调loopConnect(array)方法。

11. 手动连接

上文介绍的方法是为了直接自动连接,如果不需要自动连接,可使用方法getBluetoothDevices(),获取已扫描到的蓝牙设备的列表。

开发者可以做个页面显示出设备名,用户点击某个设备后,才开始连接。

需要注意的事项

that.serviceId是在初始化时设置的,由于对需要连接设备的主服务serivceId和各种特征值都是已知的,因此可以这样做。如果不可知,可以做一个扫描方法自己检查特征值的用途。

连接成功后的writeBLECharacteristicValue和openNotifyService操作需要注意,如果同时开启这两项操作要先调用wirte再开启notify(原因未知,个人心得)。

3、经提醒,我发现还可以再完善一下在onBlueToothAdapterStateChange()监听蓝牙适配器状态,以此判断连接过程中、连接后用户开关了设备蓝牙。如果判断到关了蓝牙,发出开启蓝牙的提示;如果监听到开启了,就重新回到第 1 步。

灰米手机和JS蓝牙耳机具体的连接步骤如下:

一:灰米手机打开蓝牙功能,进去搜索蓝牙耳机状态。

二:使JS蓝牙耳机在开机状态,需要长按蓝牙耳机的开关按钮3-5秒左右。

三:直到指示灯:蓝灯,红灯交替闪烁再松开。

四:这个时候JS蓝牙耳机和灰米手机会进入一个配对状态。

五:等灰米手机上面显示JS蓝牙耳机后,点击确定即可连接使用了。

六:注意手机和蓝牙耳机有效使用距离要在10米内。

七:有的蓝牙耳机需要输入密码一般是:0000或8888。