微信小程序蓝牙 API教程完整版

微信小程序蓝牙 API教程完整版

1. 首先是要初始化蓝牙: openBluetoothAdapter()

if (wx.openBluetoothAdapter) {
	wx.openBluetoothAdapter({
	success: function(res) {
	/ 获取本机的蓝牙状态 /
	setTimeout(() => {
	getBluetoothAdapterState()	
}, 1000)	
},
	fail: function(err) {
	// 初始化失败	
}	
})	
} else {
	
}

2. 检测本机蓝牙是否可用:

 初始化蓝牙成功之后回调里调用
getBluetoothAdapterState() {
	var that = this;
	that.toastTitle = '检查蓝牙状态'
	wx.getBluetoothAdapterState({
	success: function(res) {
	startBluetoothDevicesDiscovery()	
},
	fail(res) {
	console.log(res)	
}	
})	
}

3. 开始搜索蓝牙设备:

startBluetoothDevicesDiscovery() {
	var that = this;
	setTimeout(() => {
	wx.startBluetoothDevicesDiscovery({
	success: function(res) {
	/ 获取蓝牙设备列表 /
	that.getBluetoothDevices()	
},
	fail(res) {
	
}	
})	
}, 1000)	
}

4. 获取搜索到的蓝牙设备列表

/ that.deviceName 是获取到的蓝牙设备的名称, 因为蓝牙设备在安卓和苹果手机上搜到的蓝牙地址显示是不一样的, 所以根据设备名称匹配蓝牙 /
getBluetoothDevices() {
	var that = this;
	setTimeout(() => {
	wx.getBluetoothDevices({
	services: [],
	allowDuplicatesKey: false,
	interval: 0,
	success: function(res) {
	if (res.devices.length> 0) {
	if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {
	for (let i = 0; i <res.devices.length; i++) {
	if (that.deviceName === res.devices[i].name) {
	/ 根据指定的蓝牙设备名称匹配到 deviceId /
	that.deviceId = that.devices[i].deviceId;
	setTimeout(() => {
	that.connectTO();	
}, 2000);	
};	
};	
} else {
	
}	
} else {
	
}	
},
	fail(res) {
	console.log(res, '获取蓝牙设备列表失败 =====')	
}	
})	
}, 2000)	
},

5. 连接蓝牙

匹配到的蓝牙设备 ID 发送连接蓝牙的请求, 连接成功之后 应该断开蓝牙搜索的 API, 然后去获取所连接蓝牙设备的 service 服务

connectTO() {
	wx.createBLEConnection({
	deviceId: deviceId,
	success: function(res) {
	that.connectedDeviceId = deviceId;
	/ 4. 获取连接设备的 service 服务 /
	that.getBLEDeviceServices();
	wx.stopBluetoothDevicesDiscovery({
	success: function(res) {
	console.log(res, '停止搜索')	
},
	fail(res) {
	
}	
})	
},
	fail: function(res) {
	
}	
})	
}

6. 获取蓝牙设备的 service 服务

获取的 serviceId 有多个要试着连接最终确定哪个是稳定版本的 service 获取服务完后获取设备特征值

getBLEDeviceServices() {
	setTimeout(() => {
	wx.getBLEDeviceServices({
	deviceId: that.connectedDeviceId,
	success: function(res) {
	that.services = res.services
	/ 获取连接设备的所有特征值 /
	that.getBLEDeviceCharacteristics()	
},
	fail: (res) => {
	
}	
})	
}, 2000)	
}

7. 获取蓝牙设备特征值

获取到的特征值有多个, 最后要用的事能读, 能写, 能监听的那个值的 uuid 作为特征值 id

getBLEDeviceCharacteristics() {
	setTimeout(() => {
	wx.getBLEDeviceCharacteristics({
	deviceId: connectedDeviceId,
	serviceId: services[2].uuid,
	success: function(res) {
	for (var i = 0; i <res.characteristics.length; i++) {
	if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) &&
	(res.characteristics[i].properties.read && res.characteristics[i].properties.write)) {
	console.log(res.characteristics[i].uuid, '蓝牙特征值 ==========')
	/ 获取蓝牙特征值 /
	that.notifyCharacteristicsId = res.characteristics[i].uuid
	// 启用低功耗蓝牙设备特征值变化时的 notify 功能
	that.notifyBLECharacteristicValueChange()	
}	
}	
},
	fail: function(res) {
	
}	
})	
}, 1000)	
}

8. 启动 notify 蓝牙监听功能

然后使用 wx.onBLECharacteristicValueChange 用来监听蓝牙设备传递数据
#接收到的数据和发送的数据必须是二进制数据, 页面展示的时候需要进行转换

notifyBLECharacteristicValueChange() { // 启用低功耗蓝牙设备特征值变化时的 notify 功能
        var that = this;
        console.log('6. 启用低功耗蓝牙设备特征值变化时的 notify 功能')
        wx.notifyBLECharacteristicValueChange({
            state: true,
            deviceId: that.connectedDeviceId,
            serviceId: that.notifyServicweId,
            characteristicId: that.notifyCharacteristicsId,
            complete(res) {
                /* 用来监听手机蓝牙设备的数据变化 */
                wx.onBLECharacteristicValueChange(function(res) {
                    /**/
                    that.balanceData += that.buf2string(res.value)
                    that.hexstr += that.receiveData(res.value)
                })
            },
            fail(res) {
                console.log(res, '启用低功耗蓝牙设备监听失败')
                that.measuringTip(res)
            }
        })
    },
    /* 转换成需要的格式 */
     buf2string(buffer) {
                var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)
                return arr.map((char, i) => {
                    return String.fromCharCode(char);
                }).join('');
    },
      receiveData(buf) {
                return this.hexCharCodeToStr(this.ab2hex(buf))
      },
      /* 转成二进制 */
       ab2hex (buffer) {
          var hexArr = Array.prototype.map.call(
              new Uint8Array(buffer), function (bit) {
                  return ('00' + bit.toString(16)).slice(-2)
              }
          )
          return hexArr.join('')
      },
      /* 转成可展会的文字 */
      hexCharCodeToStr(hexCharCodeStr) {
          var trimedStr = hexCharCodeStr.trim();
          var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;
          var len = rawStr.length;
          var curCharCode;
          var resultStr = [];
          for (var i = 0; i < len; i = i + 2) {
              curCharCode = parseInt(rawStr.substr(i, 2), 16);
              resultStr.push(String.fromCharCode(curCharCode));
          }
          return resultStr.join('');
      },

9. 向蓝牙设备发送数据

sendData(str) {
	let that = this;
	let dataBuffer = new ArrayBuffer(str.length)
	let dataView = new DataView(dataBuffer)
	for (var i = 0; i < str.length; i++) {
	dataView.setUint8(i, str.charAt(i).charCodeAt())	
}
	let dataHex = that.ab2hex(dataBuffer);
	this.writeDatas = that.hexCharCodeToStr(dataHex);
	wx.writeBLECharacteristicValue({
	deviceId: that.connectedDeviceId,
	serviceId: that.notifyServicweId,
	characteristicId: that.notifyCharacteristicsId,
	value: dataBuffer,
	success: function (res) {
	console.log('发送的数据:' + that.writeDatas)
	console.log('message 发送成功')	
},
	fail: function (res) {
	
},
	complete: function (res) {
	
}	
})	
},

10.当不需要连接蓝牙了后就要关闭蓝牙, 并关闭蓝牙模块

// 断开设备连接
closeConnect() {
	if (that.connectedDeviceId) {
	wx.closeBLEConnection({
	deviceId: that.connectedDeviceId,
	success: function(res) {
	that.closeBluetoothAdapter()	
},
	fail(res) {
	
}	
})	
} else {
	that.closeBluetoothAdapter()	
}	
},
// 关闭蓝牙模块
closeBluetoothAdapter() {
	wx.closeBluetoothAdapter({
	success: function(res) {
	
},
	fail: function(err) {
	
}	
})	
},

11.蓝牙设备通信流程图

在这里插入图片描述

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值