iOS 微信客户端 6.5.6 版本开始支持,Android 6.5.7 版本开始支持
小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容。
开发者可以通过以下方式进行低版本的兼容:
https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html
蓝牙适配器模块生效周期为调用 wx.openBluetoothAdapter 至调用 wx.closeBluetoothAdapter 或小程序被销毁为止。
在小程序蓝牙适配器模块生效期间,开发者才能够正常调用蓝牙相关的小程序 API,并收到蓝牙模块相关的事件回调。
一、由于系统限制,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
//初始化蓝牙模块
wx.openBluetoothAdapter({
success: function (res) {
wx.showToast({
title: '蓝牙已开启,正在搜索设备',
icon: 'success',
duration: 800
});
},
//初始化蓝牙失败,蓝牙可能未开启
fail: function (res) {
wx.showToast({
title: '请开启蓝牙',
icon: 'fails',
duration: 1000
})
}
})
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、蓝牙名称 : 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服务器与设备通信设计: