• 微信小程序使用蓝牙进行设备配网


    微信小程序蓝牙API

    微信小程序API:https://developers.weixin.qq.com/miniprogram/dev/framework/device/bluetooth.html

    版本支持:

    iOS 微信客户端 6.5.6 版本开始支持,Android 6.5.7 版本开始支持

    版本对比

    小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容。

    开发者可以通过以下方式进行低版本的兼容:

    https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html

    生命周期:

    蓝牙适配器模块生效周期为调用 wx.openBluetoothAdapter 至调用 wx.closeBluetoothAdapter 或小程序被销毁为止。
    在小程序蓝牙适配器模块生效期间,开发者才能够正常调用蓝牙相关的小程序 API,并收到蓝牙模块相关的事件回调。

    IOS和Android差异:

    一、由于系统限制,Android 上获取到的 deviceId 为设备 MAC 地址,iOS 上则为设备 uuid。因此 deviceId 不能硬编码到代码中。
    二、iOS 上对特征值的 read、write、notify操作,由于系统需要获取特征值实例,传入的 serviceId 与 characteristicId 必须由 wx.getBLEDeviceServices 与 wx.getBLEDeviceCharacteristics 中获取到后才能使用。建议双平台统一在建立连接后先执行 wx.getBLEDeviceServices 与 wx.getBLEDeviceCharacteristics 后再进行与蓝牙设备的数据交互。

    调试:

    目前不支持在开发者工具上进行蓝牙功能的调试,需要使用真机才能正常调用小程序蓝牙接口。

    //开启和关闭蓝牙模块
    wx.openBluetoothAdapter//初始化蓝牙模块
    wx.closeBluetoothAdapter //关闭蓝牙模块
    
    //获取和监听蓝牙状态
    wx.getBluetoothAdapterState //获取本机蓝牙适配器状态
    wx.onBluetoothAdapterStateChange //监听蓝牙适配器状态变化事件
    
    //搜索和停止蓝牙搜索
    wx.startBluetoothDevicesDiscovery //开始搜寻附近的蓝牙外围设备
    wx.stopBluetoothDevicesDiscovery //停止搜寻附近的蓝牙外围设备
    
    //获取和监听已发现的蓝牙设备
    wx.getBluetoothDevices //获取所有已发现的蓝牙设备
    wx.onBluetoothDeviceFound //监听发现新设备的事件
    
    //连接和断开蓝牙设备
    wx.createBLEConnection //连接蓝牙设备
    wx.closeBLEConnection //断开与蓝牙设备的连接
    
    //获取已连接的蓝牙设备
    wx.getConnectedBluetoothDevices
    //获取已连接的蓝牙设备的服务
    wx.getBLEDeviceServices
    //获取已连接的蓝牙设备的特征值
    wx.getBLEDeviceCharacteristics
    //读取已连接的蓝牙设备的二进制数据
    wx.readBLECharacteristicValue
    //向已连接的蓝牙设备发送二进制数据
    wx.writeBLECharacteristicValue
    //启用监听已连接的蓝牙设备的特征值变化
    wx.notifyBLECharacteristicValueChange
    //监听已连接的蓝牙设备的特征值变化
    wx.onBLECharacteristicValueChange
    //监听已连接的蓝牙设备的连接错误事件
    wx.onBLEConnectionStateChange 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    //初始化蓝牙模块
    wx.openBluetoothAdapter({
    	success: function (res) {
    		wx.showToast({
    			title: '蓝牙已开启,正在搜索设备',
    			icon: 'success',
    			duration: 800
    		});
    	},
    	//初始化蓝牙失败,蓝牙可能未开启
    	fail: function (res) {
    		wx.showToast({
    			title: '请开启蓝牙',
    			icon: 'fails',
    			duration: 1000
    		})
    	}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    wx.onBluetoothDeviceFound(function(devices) {
      console.log("蓝牙列表信息:");
      console.log(devices);
      //剔除重复设备,兼容不同设备API的不同返回值
      var isnotexist = true;
      if (devices.deviceId) {
        if (devices.advertisData) {
          devices.advertisData = buf2hex(devices.advertisData);
        } else {
          devices.advertisData = '';
        }
        for (var i = 0; i < devicesList.length; i++) {
          if (devices.deviceId == devicesList[i].deviceId) {
            isnotexist = false;
          }
        }
        if (isnotexist) {
          devicesList.push(devices);
        }
      } else if (devices[0]) {
        if (devices[0].advertisData) {
          devices[0].advertisData = buf2hex(devices[0].advertisData);
        } else {
          devices[0].advertisData = '';
        }
        for (var i = 0; i < devices_list.length; i++) {
          if (devices[0].deviceId == devicesList[i].deviceId) {
            isnotexist = false;
          }
        }
        if (isnotexist) {
          devicesList.push(devices[0]);
        }
      }
    })
    wx.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: true,
      services: ['FEB3'],//小程序开发者和嵌入式开发者约定的服务名
      success: function(res) {
        console.log("蓝牙列表信息:");
        console.log(res);
        devicesList.length = 0;
      },
      fail: function(res) {
    
      }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    接口
    在这里插入图片描述

    1、蓝牙名称 : OID01(大写,注意蓝牙发送的是将字符串转为16进制的数据)
    2、广播包数据格式:(长度+标志+数据,例如0x02,0x01,0x06 。0x02表示后面两个字节,标志位0x01,数据为0x06)
    0x02,0x01,0x06//可以发现可以连接
    0x03,0x02,0xB3,0xFE//UUID :0xFEB3
    0x06,0x09,0x4F,0x49,0x44,0x30,0x31//设备名称:OID01字符串转16进制
    建议扫描连接设备时判定UUID和设备名,一致则连接该设备
    2、蓝牙协议
    所有收发数据都是20个字节一包数据的形式发送!
    设备端创建服务一共三个:2个蓝牙标准服务和一个自定义服务
    蓝牙标准服务
    (1)、服务UUID:1800(16位UUID)
    特性UUID:2A00
    属性:可读
    用途:放置设备的蓝牙名称
    (2)、服务UUID:180F(16位UUID)
    特性UUID:2A19
    属性:可读
    用途:放置设备端电量百分比
    自定义服务:
    服务UUID:FEB3(16位UUID)
    特性UUID:FED4
    属性:可读
    用途:放置设备端的MAC地址,可以用于识别设备的唯一ID

    特性UUID:FED5
    属性:可读+可写
    用途:预留

    特性UUID:FED6
    属性:可读+notify
    用途:返回点读码的数据,点读码数据格式:0xFF+0x51+点读码码值(4个bytes)

    特性UUID:FED7
    属性:可读+WRITE_WITHOUT_RESPONSE
    用途:预留

    特性UUID:FED8
    属性:可读+notify
    用途:返回按键数据,按键数据格式键说明文档

    附java服务器与设备通信设计:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    less插件使用
    29、域名ICP备案查询API接口,免费好用
    R语言绘图—制作你的专属“足迹“图
    JVM本地方法栈介绍
    自动化测试 | Selenium自动化测试框架,实战遇到的坑都在这了,玩转自动化测试
    LeetCode HOT 100 —— 102.二叉树的层序遍历
    【Web开发】Flask框架基础知识
    实人认证API的出现,让电子化身份验证更加可靠
    【LeetCode每日一题】——1823.找出游戏的获胜者
    leetcode - 1838. Frequency of the Most Frequent Element
  • 原文地址:https://blog.csdn.net/u012643122/article/details/106807753