本文讲述小程序使用蓝牙进行数据的读写。
这篇将是全代码,但关键地方都会有注释。
- initBLE:function(back) {
- wx.openBluetoothAdapter({ success(res){
- // ===== 打开成功 =====
- this.searchBLE(); // 开始搜索蓝牙外设
- // 在蓝牙打开的情况下突然关闭
- wx.onBluetoothAdapterStateChange(function (res) {
- if (!res.available) { //蓝牙适配器是否可用
- this.setData({
- tipsBox: "tipsBox",
- tipsTitle: "温馨提示",
- tipsContent: "蓝牙未打开,请重新打开蓝牙"
- })
- }
- })
- },fail(err) {
- wx.showToast({
- title: '请检查手机蓝牙是否打开',
- icon: 'none',
- })
- }
- })
- },
-
- // 开始搜索
- searchBLE() {
- let that =this;
- BLEMag.bluetoothMag.startMonitorBluetoothSearch({
- success(res) {
- that.monitorSearchDevice(); // 监听蓝牙搜索回调
- that.searchDevice(); // 开始蓝牙搜索
- }
- });
- },
-
- // 监听蓝牙搜索回调
- monitorSearchDevice() {
- var that = this;
- wx.startBluetoothDevicesDiscovery({
- allowDuplicatesKey: true,
- interval: 0,
- // ===== 搜索打开成功 =====
- success: function () {
- that.setData({
- showProgress: false
- })
- },
- // ===== 搜索打开失败 =====
- fail: function (res) {
- that.failCallback('蓝牙设备服务发现失败')
- that.printLog("蓝牙设备服务发现失败: " + res.errMsg);
- }
- })
- },
-
- // 搜索蓝牙
- searchDevice:function(back) {
- var that = this;
- var deviceArr = [];
- wx.onBluetoothDeviceFound(function (res) {
- res.devices.forEach(device => {
- // TODO
- // 做搜索到设备的处理
- wx.stopBluetoothDevicesDiscovery(); // 停止搜索设备
- })
- })
- },
-
- // 先关闭再连接蓝牙
- createBLE: function (deviceID) {
- var that = this;
-
- // 先断开设备连接
- wx.closeBLEConnection({ deviceId: deviceID, success: function (res) {
- console.log('断开设备成功 = ', res)
- that.connectionBluetooth(deviceID);
- },fail: function (error) {
- if (error.errCode === 10006 && error.errMsg === "closeBLEConnection:fail:no connection"){
- console.log('断开设备失败1 = ', error)
- }else{
- console.log('断开设备失败2 = ', error)
- }
- console.log('断开设备失败 = ', error)
- }})
- },
-
- // 连接蓝牙
- connectionBluetooth:function(deviceID, deviceType, back) {
- var that = this;
- console.log(' 正在连接设备ID = ',deviceID);
- wx.createBLEConnection({ deviceId: deviceID, success: function (res) {
- console.log(' ============== 连接成功 ============== ',res);
- if (BLE_state === "关") { return }
- // 这里可以申请MTU
- wx.setBLEMTU({ deviceId: deviceID, mtu: 135, success: function (res){
- console.log(' ============== 申请MTU成功 ============== ',res);
- back.success("连接成功");
- that.getBLEServiceId(deviceID); // 连接设备后获取蓝牙设备服务
- },fail: function (error){
- console.log(' ============== 申请MTU失败 ============== ',error);
- back.success("连接失败");
- }});
- },fail: function (error) {
- if (BLE_state === "关") { return }
- if (error.errMsg === "closeBLEConnection:fail:no connection") {
- console.log(' ============== 连接失败 ============== ', error);
- }
- }})
- },
-
- // 获取蓝牙服务
- getBLEServiceId: function (deviceID) {
- var that = this;
- that.printLog("获取设备[" + deviceID + "]服务列表")
- wx.getBLEDeviceServices({
- deviceId: deviceID,
- // ===== 获取服务成功 =====
- success: function (res) {
- var services = res.services;
- that.printLog('找到设备服务列表个数: ' + services.length);
- if (services.length <= 0) {
- that.printLog("未找到主服务列表")
- return;
- }
- if (services.length == 1) {
- var service = services[0];
- that.printLog("服务UUID:[" + service.uuid + "]");
- that.printLog("Primary:" + service.isPrimary);
- that.setData({currServiceID: service.uuid})
- that.getBLECharactedId(deviceID, service.uuid); // 获取服务特征值
- } else { // 多个主服务
- // TODO 如果有多个主服务,可以硬编码比对 ServiceUUID
- var service = null;
- for (var i = 0; i < services.length; i++) {
- if (services[i].uuid == '服务uuid') {
- service = services[i];
- break;
- }
- }
- if (service == null) {
- service = services[0];
- }
- that.printLog("服务UUID:[" + service.uuid + "]");
- that.printLog("Primary:" + service.isPrimary);
- that.getBLECharactedId(deviceID, service.uuid); // 获取服务特征值
- }
- },
- // ===== 获取服务失败 =====
- fail: function (res) {
- that.failCallback('获取设备蓝牙服务列表失败,请重试')
- that.printLog("获取设备服务列表失败" + res.errMsg);
- }
- })
- },
-
- // 获取服务特征
- getBLECharactedId: function (deviceID, serviceId) {
- var that = this;
- that.printLog("获取设备特征值")
- wx.getBLEDeviceCharacteristics({
- deviceId: deviceID,
- serviceId: serviceId,
- // ===== 获取特征值成功 =====
- success: function (res) {
- console.log(res);
- var chars = res.characteristics;
- if (chars.length <= 0) {
- that.printLog("未找到设备特征值")
- return;
- }
- that.printLog("找到设备特征值个数:" + chars.length);
-
- var char = chars[0];
- that.printLog("特征值[" + char.uuid + "]")
- var prop = char.properties;
-
- // 这里会获取到两个特征值,一个用来写,一个用来读
- for (var i = 0; i < chars.length; i++) {
- var char = chars[i];
- // 这里可以对特征值的uuid进行判断,具体看实际情况
- if(char.uuid=='特征的uuid值'){
- var prop = char.properties;
- if (prop.notify == true) { // 读
- that.printLog("该特征值属性: Notify");
- that.recvBLECharacterNotice(deviceID, serviceId, char.uuid);
- } else if (prop.write == true) { // 写
- that.printLog("该特征值属性: Write");
- that.setData({currCharId: char.uuid})
- that.sendBLEData(deviceID, serviceId, char.uuid);
- } else {
- that.printLog("该特征值属性: 其他");
- }
- }
- }
- },
- // ===== 获取特征值失败 =====
- fail: function (res) {
- console.log('获取设备特征值失败,', res);
- }
- })
- },
-
- // 蓝牙特征值变化通知
- recvBLECharacterNotice: function (deviceId, serviceId, charId) {
- var that = this;
- that.printLog("注册Notice 回调函数");
- // state:true 启用Notify功能
- wx.notifyBLECharacteristicValueChange({
- deviceId: deviceId,
- serviceId: serviceId,
- characteristicId: charId,
- state: true,
- // ===== 蓝牙特征值监听成功 =====
- success: function (res) {
- that.printLog("启用低功耗蓝牙设备特征值变化时的 notify 功能 success");
- // 监听低功耗蓝牙设备的特征值变化 characteristic
- wx.onBLECharacteristicValueChange(function (res) { // 监听回调
- console.log(res);
- that.printLog("收到Notify数据: " + plugin.ab2hex(res.value));
- });
- },
- // ===== 蓝牙特征值监听失败 =====
- fail: function (res) {
- // console.log(res);
- // that.printLog("特征值Notice 接收数据失败: " + res.errMsg);
- // that.failCallback('设备蓝牙特征值接收数据失败,请重试')
- // 这里需要注意,这样写是因为会报一个错但是还是能监听到数据
- wx.onBLECharacteristicValueChange(function (res) { // 监听回调
- console.log(res);
- that.printLog("收到Notify数据: " + plugin.ab2hex(res.value));
- });
- }
- })
- },
-
- // 发送数据
- sendBLEData(deviceId, serviceId, charId){
- // 这里我举例发个数据(注意最后发送的是个十进制数组)
- let array = [];
- for (var i = 0; i < data.length; i++) {
- array.push(data.charAt(i).charCodeAt())
- }
- var buffer = new Uint8Array(array).buffer;
- var that = this;
- wx.writeBLECharacteristicValue({
- deviceId: deviceId,
- serviceId: serviceId,
- characteristicId: charId,
- value: buffer,
- success: function (res) {
- that.printLog("向蓝牙发送数据");
- },
- fail: function (res) {
- console.log(res);
- },
- complete: function () {
- }
- })
- },
-