小程序获取所有已发现的蓝牙设备(getBluetoothDevices)

2018年08月12日 09:31 | 15993次浏览 作者原创 版权保护

我们在上一章节分享了微信小程序实现搜索周边蓝牙设备(startBluetoothDevicesDiscovery),既然微信小程序已经实现了搜索这边蓝牙设备,那么本章节就介绍获取搜索到的蓝牙设备的一些信息,这些被微信小程序搜索到的蓝牙设备是如何获得呢,大家不要急,首先看微信小程序官方文档给的接口使用说明:


wx.getBluetoothDevices(OBJECT)

获取在小程序蓝牙模块生效期间所有已发现的蓝牙设备,包括已经和本机处于连接状态的设备。

OBJECT参数说明:

参数类型必填说明
successFunction成功则返回本机蓝牙适配器状态
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success返回参数:

参数类型说明
devicesArrayuuid 对应的的已连接设备列表
errMsgString成功:ok,错误:详细信息

devices 对象

蓝牙设备信息

参数类型说明
nameString蓝牙设备名称,某些设备可能没有
deviceIdString用于区分设备的 id
RSSINumber当前蓝牙设备的信号强度
advertisDataArrayBuffer当前蓝牙设备的广播数据段中的ManufacturerData数据段 (注意:vConsole 无法打印出 ArrayBuffer 类型数据)
advertisServiceUUIDsArray当前蓝牙设备的广播数据段中的ServiceUUIDs数据段
localNameString当前蓝牙设备的广播数据段中的LocalName数据段
serviceDataArrayBuffer当前蓝牙设备的广播数据段中的ServiceData数据段

示例代码:

// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
  var hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function(bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('');
}
wx.getBluetoothDevices({
  success: function (res) {
    console.log(res)
    if (res.devices[0]) {
      console.log(ab2hex(res.devices[0].advertisData))
    }
  }
})

Bug & Tip

1、tip: Mac系统可能无法获取advertisData及RSSI,请使用真机调试

2、tip: 开发者工具和 Android 上获取到的deviceId为设备 MAC 地址,iOS 上则为设备 uuid。因此deviceId不能硬编码到代码中

3、tip: 注意该接口获取到的设备列表为小程序蓝牙模块生效期间所有搜索到的蓝牙设备,若在蓝牙模块使用流程结束后未及时调用 wx.closeBluetoothAdapter 释放资源,会存在调用该接口会返回之前的蓝牙使用流程中搜索到的蓝牙设备,可能设备已经不在用户身边,无法连接。

4、tips: 蓝牙设备在被搜索到时,系统返回的 name 字段一般为广播包中的LocalName字段中的设备名称,而如果与蓝牙设备建立连接,系统返回的 name 字段会改为从蓝牙设备上获取到的GattName。若需要动态改变设备名称并展示,建议使用localName字段。


根据官方文档编写实现代码

1,打开微信小程序开发工具,编写lanya.wxml  实际上此页面类似于html页面一样,代码如下

<view class="content">
<view>日志信息:
<textarea style='border:1px solid #ccc'>
{{msg}}
</textarea>
</view>

<button type="primary" class="button" bindtap="lanya1">1初始化蓝牙适配器</button>
<button type="primary" class="button" bindtap="lanya2">2本机蓝牙适配状态</button>
<button type="primary" class="button" bindtap="lanya3">3搜索周边蓝牙设备</button>
<button type="primary" class="button" bindtap="lanya4">4获取所有周边蓝牙设备信息</button>

</view>

如上述代码所示,我们新增了一个按钮,名字叫获取所有周边蓝牙设备信息,绑定的js函数为lanya4,接下来我们来编写lanya4的实现代码

2、打开lanya.js文件,实现wx.getBluetoothDevices(OBJECT)接口函数的代码如下:

// 获取所有已发现的设备  www.vxzsk.com 原创 V型知识库 
lanya4: function () {
var that = this;
wx.getBluetoothDevices({
success: function (res) {
that.setData({
msg: "搜索设备" + JSON.stringify(res.devices),
devices: res.devices
})
console.log('搜到的蓝牙设备数目:' + res.devices.length)
console.log('获取到周边搜到的设备信息:' + JSON.stringify(res.devices))
}
})
}

如上述代码所示,我们加了两行日志,搜索的蓝牙设备个数以及设备信息的对象devices,具体devices数组对象里面含有什么,请参考上述微信小程序官方文档的解释说明,由于我开发的设备主服务UUID为"FEE7",所以周边设备只搜索到FEE7的设备,其它蓝牙设备已排除,如果用户不知道主服务UUID为何物,可略过,在这里不影响,但通过本接口可以确认到你的设备是那一台,进而主服务UUID也可以查看到,具体方法请继续看此文章。


启动硬件蓝牙设备(例如蓝牙打印机,蓝牙锁等),打开手机蓝牙,打开手机微信app,然后点击微信小程序开发工具头部的预览按钮,会出现一个二维码,用微信app扫描此二维码


效果如下


如上图所示,deviceId,设备名称name 以及主服务UUID都已经获取到了,如上图所示的0000FEE7-XXXXXX可以看出来我的主服务UUID便为FEE7,如果你的手机是安卓用户,那么在这里deviceId便是蓝牙设备的mac地址。


lanya.wxml源码

<view class="content">
<view>日志信息:
<textarea style='border:1px solid #ccc'>
{{msg}}
</textarea>
</view>

<button type="primary" class="button" bindtap="lanya1">1初始化蓝牙适配器</button>
<button type="primary" class="button" bindtap="lanya2">2本机蓝牙适配状态</button>
<button type="primary" class="button" bindtap="lanya3">3搜索周边蓝牙设备</button>
<button type="primary" class="button" bindtap="lanya4">4获取所有周边蓝牙设备信息</button>

</view>


lanya.js源码

// pages/lanya/lanya.js www.vxzsk.com V型知识库原创
Page({

/**
   * 页面的初始数据
   */
data: {
},

/**
   * 生命周期函数--监听页面加载
   */
onLoad: function (options) {
},

/**
   * 生命周期函数--监听页面初次渲染完成
   */
onReady: function () {
},

/**
   * 生命周期函数--监听页面显示
   */
onShow: function () {
},

/**
   * 生命周期函数--监听页面隐藏
   */
onHide: function () {
},

/**
   * 生命周期函数--监听页面卸载
   */
onUnload: function () {
},

/**
   * 页面相关事件处理函数--监听用户下拉动作
   */
onPullDownRefresh: function () {
},

/**
   * 页面上拉触底事件的处理函数
   */
onReachBottom: function () {
},

/**
   * 用户点击右上角分享
   */
onShareAppMessage: function () {
},
// 初始化蓝牙适配器
lanya1: function () {
var that = this;
wx.openBluetoothAdapter({
success: function (res) {
console.log('初始化蓝牙适配器返回' + JSON.stringify(res))
//页面日志显示
that.setData({
msg: JSON.stringify(res)
})
},
fail:function(res){
console.log('初始化蓝牙适配器失败' + JSON.stringify(res))
}
})
},
// 本机蓝牙适配器状态
lanya2: function () {
var that = this;
wx.getBluetoothAdapterState({
success: function (res) {
//页面日志显示
that.setData({
msg: "本机蓝牙适配器状态" + "/" + JSON.stringify(res.errMsg) + "==是否可用:" +  res.available

})
},
fail:function(res){
//页面日志显示
that.setData({
msg: "本机蓝牙适配器状态" + "/" + JSON.stringify(res.errMsg) + "==是否可用:" + res.available


})

}
})
},
//搜索设备
lanya3: function () {
var that = this;
wx.startBluetoothDevicesDiscovery({
services: ['FEE7'],
success: function (res) {
that.setData({
msg: "搜索设备" + JSON.stringify(res),
})
console.log('搜索设备返回' + JSON.stringify(res))
}
})
},
// 获取所有已发现的设备
lanya4: function () {
var that = this;
wx.getBluetoothDevices({
success: function (res) {
that.setData({
msg: "搜索设备" + JSON.stringify(res.devices),
devices: res.devices
})
console.log('搜到的蓝牙设备数目:' + res.devices.length)
console.log('获取到周边搜到的设备信息:' + JSON.stringify(res.devices))
}
})
}
})


小说《我是全球混乱的源头》
此文章本站原创,地址 https://www.vxzsk.com/1861.html   转载请注明出处!谢谢!

感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程