vivos12pro微信小程序蓝牙连不上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vivos12pro微信小程序蓝牙连不上相关的知识,希望对你有一定的参考价值。

可参考以下无法连接蓝牙设备处理步骤:
1、确认蓝牙设备电量与连接范围
确认蓝牙设备电量充足,蓝牙连接有效距离一般为10米左右,如果双方设备距离较远或中间存在障碍物,则可能搜索不到蓝牙设备。
2、确认蓝牙设备连接状态
确保没有其他手机连接此蓝牙设备。
3、重新配对蓝牙设备
请参考蓝牙设备说明书操作,确保设备处于可配对状态,并重新配对设备。
注:
1)vivo TWS 1/vivo TWS Neo/vivo TWS 2/vivo TWS 2e配对方法:将两只耳机放入充电盒内,打开盒盖,长按充电盒功能键2秒直至指示灯呈白色闪烁,手机蓝牙搜索配对。或者长按充电盒功能键15秒,指示灯呈橙色并快速闪烁,耳机恢复出厂设置并重新进入配对状态。
2)vivo WATCH配对方法:【初次配对】通过手机扫描手表屏幕二维码,下载安装“健康”App,打开软件,注册登录vivo帐号,点击设备页,添加设备,配对vivo WATCH。健康App是连接管理手表的必备应用,vivo手机用户前往应用商店下载并安装App,苹果手机用户前往App Store搜索下载安装App。【后期配对】按压vivo WATCH上键--设置--系统菜单--恢复配对,通过健康App搜索连接,或按压vivo WATCH上键--设置--系统菜单--恢复出厂,再通过健康App搜索连接。
3)其他品牌和型号的蓝牙设备,可以查看对应产品说明书了解配对方法。
4、进行对比测试
同时使用两个无配对记录的手机搜索,如果其他手机也不能搜索到设备,则可能是蓝牙设备故障。
5、重置网络设置
进入设置--系统管理--备份与重置--重置网络设置--重置设置,再使用查看。


注:重置网络设置会重置WLAN、移动数据网络和蓝牙连接记录。
6、升级系统版本
请您将手机升级至最新版本使用查看。


7、再次点击已配对的蓝牙设备进行连接时,会提示“请确认“XX设备”已打开,在通信范围内,且未连接其他设备”:两台设备的蓝牙进行配对成功即可使用蓝牙的相关功能,不需要再次点击蓝牙设备进行连接,此提示并非手机异常,请您放心使用。
8、服务中心检测
若以上方法未能解决问题,请提前备份好手机数据,携带手机和购机凭证前往vivo客户服务中心检测,进入浏览器搜索vivo官网--服务--服务中心--查看全部--选择省市查询当地的服务中心地址以及联系方式。

参考技术A vivos12pro微信小程序蓝牙连不上怎么办?
当打开手机蓝牙后去连接蓝牙,会出现连接不上情况,报错10003,此时不管是重启小程序还是重新关闭打开蓝牙,都不能正常连接蓝牙设备。10003是微信蓝牙连接经常碰到的问题,微信官方给出的文档中就简单的描述为“connection fail”,备注为“连接失败”。然而,实际上出现连接失败的状况有很多,比如蓝牙设备被占用或者上次蓝牙连接未断开导致无法连接;根据deviceId连接蓝牙时,蓝牙设备未开启或异常导致无法连接。
既然是因为没有断开蓝牙连接导致的,那就在关闭手机蓝牙时去断开蓝牙;然而,在蓝牙状态监听中调用断开连接函数,返回错误(10001(not available)当前蓝牙适配器不可用)。
没有找到现成的解决方案,就只有跟踪代码了,在关键方法中加日志;发现,在顶部栏关闭手机蓝牙时,小程序中无法断开蓝牙连接,报错(10001(not available)当前蓝牙适配器不可用);后来又在偶然情况下,清除了蓝牙设备的绑定关系,重新进入蓝牙搜索页面,发现这样操作后竟然能成功连接上蓝牙。

微信小程序--蓝牙连接开发总结

这个模块做了2周,找了很多资料文档,看示例看别人的demo,最后发现其实还是得靠自己,不吐槽了,开正文。我实现的小程序模块自动连接(根据需要,可改手动),是在小程序初始化完成时开始自动调用执行。

大致流程:

1、 开启蓝牙适配
2、 获取蓝牙适配器状态,判断设备蓝牙是否可用。
3、 判断蓝牙适配器可用时开启扫描蓝牙设备和开启获取已连接的蓝牙设备
4、 如果开启扫描蓝牙设备失败5s后自动再次开启扫描
5、 开启扫描蓝牙设备成功后开启监听已扫描的设备
6、 如果已扫描到的新设备含FeiZhi名(个人产品需要)的设备则开始连接该设备
7、 开启获取已连接蓝牙设备开启获取设备成功后判断以获取的设备名包含FeiZhi(个人产品需要)字符串的设备则开始连接该设备
8、 开始获取已连接蓝牙设备没有成功获取到已连接的蓝牙设备5s后自动重新开启获取。
9、 开始连接某设备时停止扫描设备,停止循环获取已连接设备。
10、连接成功后停止扫描设备,停止循环获取已连接设备。

点击查看:蓝牙模块连接流程图

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

startConnect: function () {

 var that = this;

 wx.showLoading({

 title: ‘开启蓝牙适配‘

 });

 wx.openBluetoothAdapter({

 success: function (res) {

 console.log("初始化蓝牙适配器");

 console.log(res);

 that.getBluetoothAdapterState();

 },

 fail: function (err) {

 console.log(err);

 wx.showToast({

 title: ‘蓝牙初始化失败‘,

 icon: ‘success‘,

 duration: 2000

 })

 setTimeout(function () {

 wx.hideToast()

 }, 2000)

 }

 });

 wx.onBluetoothAdapterStateChange(function (res) {

 var available = res.available;

 if (available) {

 that.getBluetoothAdapterState();

 }

 })

 }

2、初始化蓝牙适配器成功,调用this.getBluetoothAdapterState() 获取本机蓝牙适配器状态,判断是否可用,available为false则因为用户没有开启系统蓝牙。同时判断程序还没有开始搜索蓝牙设备,调用this.startBluetoothDevicesDiscovery();开始扫描附近的蓝牙设备,同时调用this.getConnectedBluetoothDevices() 开启获取本机已配对的蓝牙设备。

getBluetoothAdapterState: function () {

 var that = this;

 wx.getBluetoothAdapterState({

 success: function (res) {

 var available = res.available,

 discovering = res.discovering;

 if (!available) {

 wx.showToast({

 title: ‘设备无法开启蓝牙连接‘,

 icon: ‘success‘,

 duration: 2000

 })

 setTimeout(function () {

 wx.hideToast()

 }, 2000)

 } else {

 if (!discovering) {

 that.startBluetoothDevicesDiscovery();

 that.getConnectedBluetoothDevices();

 }

 }

 }

 })

 }

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

startBluetoothDevicesDiscovery: function () {

 var that = this;

 wx.showLoading({

 title: ‘蓝牙搜索‘

 });

 wx.startBluetoothDevicesDiscovery({

 services: [],

 allowDuplicatesKey: false,

 success: function (res) {

 if (!res.isDiscovering) {

 that.getBluetoothAdapterState();

 } else {

 that.onBluetoothDeviceFound();

 }

 },

 fail: function (err) {

 console.log(err);

 }

 });

 }

4、获取已配对的蓝牙设备。此方法特别说明参数services(Array)是必填的,但是官方示例中以及各种坑爹demo里从没见过有谁填写,但是不填写这个属性此方法无法获取到任何已配对设备。如果要调用此方法则是需要连接特定设备,并且知道该设备的一个主服务serviceId。如果未知可以先手动连接一次想要连接的设备,然后获取service列表,记录属性primary为true的值至少一个。

getConnectedBluetoothDevices: function () {

 var that = this;

 wx.getConnectedBluetoothDevices({

 services: [that.serviceId],

 success: function (res) {

 console.log("获取处于连接状态的设备", res);

 var devices = res[‘devices‘], flag = false, index = 0, conDevList = [];

 devices.forEach(function (value, index, array) {

 if (value[‘name‘].indexOf(‘FeiZhi‘) != -1) {

 // 如果存在包含FeiZhi字段的设备

 flag = true;

 index += 1;

 conDevList.push(value[‘deviceId‘]);

 that.deviceId = value[‘deviceId‘];

 return;

 }

 });

 if (flag) {

 this.connectDeviceIndex = 0;

 that.loopConnect(conDevList);

 } else {

 if (!this.getConnectedTimer) {

 that.getConnectedTimer = setTimeout(function () {

 that.getConnectedBluetoothDevices();

 }, 5000);

 }

 }

 },

 fail: function (err) {

 if (!this.getConnectedTimer) {

 that.getConnectedTimer = setTimeout(function () {

 that.getConnectedBluetoothDevices();

 }, 5000);

 }

 }

 });

 }

5、开启蓝牙搜索功能失败,则回到第2步重新检查蓝牙是适配器是否可用,开启蓝牙搜索功能成功后开启发现附近蓝牙设备事件监听。this.onBluetoothDeviceFound()

onBluetoothDeviceFound: function () {

 var that = this;

 console.log(‘onBluetoothDeviceFound‘);

 wx.onBluetoothDeviceFound(function (res) {

 console.log(‘new device list has founded‘)

 console.log(res);

 if (res.devices[0]) {

 var name = res.devices[0][‘name‘];

 if (name != ‘‘) {

 if (name.indexOf(‘FeiZhi‘) != -1) {

 var deviceId = res.devices[0][‘deviceId‘];

 that.deviceId = deviceId;

 console.log(that.deviceId);

 that.startConnectDevices();

 }

 }

 }

 })

 }

此方法可自定义过滤一些无效的蓝牙设备比如name为空的,个人产品开发中需要过滤devices name 不含有FeiZhi字符串的设备。

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

startConnectDevices: function (ltype, array) {

 var that = this;

 clearTimeout(that.getConnectedTimer);

 that.getConnectedTimer = null;

 clearTimeout(that.discoveryDevicesTimer);

 that.stopBluetoothDevicesDiscovery();

 this.isConnectting = true;

 wx.createBLEConnection({

 deviceId: that.deviceId,

 success: function (res) {

 if (res.errCode == 0) {

 setTimeout(function () {

 that.getService(that.deviceId);

 }, 5000)

 }

 },

 fail: function (err) {

 console.log(‘连接失败:‘, err);

 if (ltype == ‘loop‘) {

 that.connectDeviceIndex += 1;

 that.loopConnect(array);

 } else {

 that.startBluetoothDevicesDiscovery();

 that.getConnectedBluetoothDevices();

 }

 },

 complete: function () {

 console.log(‘complete connect devices‘);

 this.isConnectting = false;

 }

 });

 }

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

7、连接成功后根据deiviceId获取设备的所有服务。this.getService(deviceId);
getService: function (deviceId) {

 var that = this;

 // 监听蓝牙连接

 wx.onBLEConnectionStateChange(function (res) {

 console.log(res);

 });

 // 获取蓝牙设备service值

 wx.getBLEDeviceServices({

 deviceId: deviceId,

 success: function (res) {

 that.getCharacter(deviceId, res.services);

 }

 })

 }

8、读取服务的特征值。

getCharacter: function (deviceId, services) {

 var that = this;

 services.forEach(function (value, index, array) {

 if (value == that.serviceId) {

 that.serviceId = array[index];

 }

 });

 wx.getBLEDeviceCharacteristics({

 deviceId: deviceId,

 serviceId: that.serviceId,

 success: function (res) {

 that.writeBLECharacteristicValue(deviceId, that.serviceId, that.characterId_write);

 that.openNotifyService(deviceId, that.serviceId, that.characterId_read);

 },

 fail: function (err) {

 console.log(err);

 },

 complete: function () {

 console.log(‘complete‘);

 }

 })

 }

9、如果扫描到的设备中没有想要连接的设备,可以尝试使用系统蓝牙手动配对,然后再小程序中调用getConnectedBluetoothDevices() 获取本机已配对的蓝牙设备,然后过滤设备(可能获取多个已配对的蓝牙设备)。将以获取的蓝牙设备deviceId放入到一个数组中调用自定义方法this.loopConnect(); 思路:通过递归调用获取已配对蓝牙设备的deviceId,如果获取到了就去连接,devicesId[x] 为空说明上传调用getConnectedBluetoothDevices()时获取到的已配对设备全部连接失败了。则开启重新获取已配对蓝牙设备,并开启扫描附近蓝牙设备。

loopConnect: function (devicesId) {

 var that = this;

 var listLen = devicesId.length;

 if (devicesId[this.connectDeviceIndex]) {

 this.deviceId = devicesId[this.connectDeviceIndex];

 this.startConnectDevices(‘loop‘, devicesId);

 } else {

 console.log(‘已配对的设备小程序蓝牙连接失败‘);

 that.startBluetoothDevicesDiscovery();

 that.getConnectedBluetoothDevices();

 }

 }

10、**startConnectDevices(‘loop‘, array)方法,是当获取已配对蓝牙设备进行连接时这样调用。其中的处理逻辑上文已经贴出,意思就是在连接失败后fail方法里累加一个全局变量,然后回调loopConnect(array)方法。

**11、手动连接,上文介绍的方法是为了直接自动连接,如果不需要自动连接,可在使用方法getBluetoothDevices() 将会获取到已扫描到的蓝牙设备的列表,可以做个页面显示出设备名,点击该设备开始连接。

注意:

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

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

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

最后本文属于个人开发者的一点总结,欢迎留言指导讨论,也可以加入微信小程序联盟群一起探讨学习。

以上是关于vivos12pro微信小程序蓝牙连不上的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序怎么移到桌面

微信小程序怎么拒绝快速登录

把git上微信小程序项目拉到本地运行

Mac上微信小程序官方开发工具卡死的问题

微信小程序蓝牙好用吗

断网了,如何让微信小程序,可以用蓝牙