蓝牙4.0 小程序 ,
BLE蓝牙测试工具是学习和理解蓝牙通信的小程序。
连接蓝牙成功之后,会返回蓝牙设备ID,根据蓝牙设备ID可以选择蓝牙服务ID,一个蓝牙设备对应N个蓝牙服务,一个蓝牙服务对应N个蓝牙特征ID,一个蓝牙特征ID对应N个蓝牙特征值,一个蓝牙特征值对应N个蓝牙描述符,一个蓝牙描述符对应N个蓝牙描述符值,蓝牙描述符值是蓝牙设备和手机之间的通信数据。
// 初始化蓝牙模块
wx.openBluetoothAdapter({
success: function(res) {
// 开始扫描附近的设备
wx.startBluetoothDevicesDiscovery({
services: [],
allowDuplicatesKey: false,
success: function(res) {
// 扫描到新设备时触发方法
wx.onBluetoothDeviceFound(function(device) {
if (device.name == 'myDevice') {
// 停止扫描
wx.stopBluetoothDevicesDiscovery();
// 连接设备
wx.createBLEConnection({
deviceId: device.deviceId,
success: function(res) {
// 获取设备的服务列表
wx.getBLEDeviceServices({
deviceId: device.deviceId,
success: function(res){
for(var i = 0; i < res.services.length; i++){
if(res.services[i].uuid == "1234"){
// 获取设备的指定服务
wx.getBLEDeviceCharacteristics({
deviceId: device.deviceId,
serviceId: res.services[i].uuid,
success: function(res){
for(var j = 0; j < res.characteristics.length; j++){
if(res.characteristics[j].uuid == "4567"){
// 监听从设备传输过来的数据
wx.onBLECharacteristicValueChange(function(res){
var dataView = new DataView(res.value.buffer);
var value = dataView.getUint8(0);
console.log(value);
});
// 向设备发送数据
var buffer = new ArrayBuffer(1);
var dataView = new DataView(buffer);
dataView.setUint8(0, 1);
wx.writeBLECharacteristicValue({
deviceId: device.deviceId,
serviceId: res.services[i].uuid,
characteristicId: res.characteristics[j].uuid,
value: buffer,
success: function(res){
console.log(res.errMsg);
}
});
}
}
}
});
break;
}
}
}
});
}
});
}
})
}
})
}
});
低功耗蓝牙的每个数据包大小最大为20个字节,如果需要传输的数据大小超过了20个字节,那么需要进行分包传输。
分包传输的基本思路是将需要传输的数据按照一定规则进行分割,分割成多个20字节大小的数据包进行传输,接收方再将这些数据包按照序列号进行组装,得到完整的数据。以下是一个简单的代码示例,演示如何在微信小程序中实现低功耗蓝牙的数据分包传输:
```javascript
// 数据分包传输
function sendData(data, deviceId) {
let len = data.length;
let dataView = new DataView(data.buffer);
let packetSize = 20;
let packetCount = Math.ceil(len / packetSize);
let index = 0;
// 循环发送每个数据包
for (let i = 0; i < packetCount; i++) {
let packetData = data.slice(index, index + packetSize);
let packetLength = packetData.length;
// 将包头信息和包内容合并成一个buffer
let buffer = new ArrayBuffer(packetLength + 3);
let header = new DataView(buffer, 0);
header.setUint8(0, i);
header.setUint16(1, len);
let packetContent = new Uint8Array(buffer, 3);
packetContent.set(packetData);
// 调用蓝牙发送数据API
wx.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: buffer,
success: function (res) {},
fail: function (res) {}
});
// 更新数据包索引
index += packetSize;
}
}
```
以上代码中,我们首先获取传入数据的长度和内容,根据20字节大小进行数据分割,将每个分割后的数据包加上包头信息后进行发送。在每个数据包的包头信息中,包含了该包的序列号和完整数据长度。接收方将收到的数据包根据包头信息中的序列号进行组装,并判断是否已经组装完成完整的数据。
希望这个简单的示例可以帮助您了解如何在微信小程序中实现低功耗蓝牙的数据分包传输。