本文將詳細介紹微信小程序的藍牙開發流程(附源碼)
準備:
微信只支持低功耗藍牙也就是藍牙4.0,普通的藍牙模塊是用不了的,必定要注意。小程序
藍牙能夠連TTL接到電腦上,再用XCOM調試微信小程序
一開始定義的變量數組
var deviceId;
var i=0;
var serviceId=[];
var characteristicId=[];微信
藍牙開發流程:
1.打開藍牙適配器app
2.搜索周圍藍牙函數
3.獲取搜索過程當中所搜索到的設備信息ui
4.鏈接想要鏈接的設備prototype
5.獲取服務、特徵值調試
6.寫數據、讀數據開發
具體實現:
1.打開藍牙適配器
wx.openBluetoothAdapter({
success: function(res) {
console.log(res,"success")
},
fail: function (res) {
console.log("fail")
},
})
2.適配器打開後能夠開始搜索藍牙設備了
wx.startBluetoothDevicesDiscovery({
services: [],
success: function (res) {
console.log(res)
},
fail: function (res) {
console.log("fail")
},
})
sevices裏不要填參數,要否則只能搜索特定的設備
3.搜索一小段時間後能夠查看搜索到的設備,通常時間很短,1s都不用,搜不到能夠多等等
wx.getBluetoothDevices({
success: function (res) {
console.log(res)
i=0;
while (res.devices[i]) {
console.log(i);
console.log(res.devices[i].name,res.devices[i].deviceId);
if(res.devices[i].name=='YahBoom_BL'){
deviceId=res.devices[i].deviceId;
console.log(deviceId);
}
i++;
}
}
})
這一步將全部搜索到的設備的名字和ID輸出,並將名字爲'YahBoom_BL'的設備的Id存到deviceId裏去,這個設備就是我所須要使用的
4.如今咱們能夠獲取一個特定設備的全部服務了
wx.getBLEDeviceServices({
deviceId: deviceId,
success: function(res) {
console.log(res.services);
i=0;
while(res.services[i]){
serviceId[i]=res.services[i].uuid;
console.log(serviceId[i]);
i++;
}
},
})
這一步咱們獲取YahBoom_BL的全部服務並儲存到serviceId數組裏去
5.如今咱們能夠針對一個特定服務查看這個服務所支持的操做
wx.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId[1],
success: function (res) {
i=0;
while(res.characteristics[i]){
characteristicId[i]=res.characteristics[i].uuid;
console.log(characteristicId[i]);
i++;
}
}
})
在這裏咱們獲取YahBoom_BL的第二個服務(第一個服務下標爲0,選第二個由於個人設備的第二個服務的第一個特徵值支持notif、read、write,能夠把一個服務的全部特徵值打印出來查看)的特徵值,並將特徵值ID存到characteristicId數組裏去
6.開啓notify並讀取藍牙發過來的數據,開啓這個後咱們就能實時獲取藍牙發過來的值了
wx.notifyBLECharacteristicValueChange({
state: true,
deviceId: deviceId,
serviceId: serviceId[1],
characteristicId: characteristicId[0],
success: function (res) {
console.log('notifyBLECharacteristicValueChange success', res.errMsg)
}
})
function ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
wx.onBLECharacteristicValueChange(function (res) {
console.log('characteristic value comed:', ab2hex(res.value))
})
這裏第一個函數是開啓notify服務,deviceId、serviceId、characteristicId都是以前咱們獲取的,第二個函數是將bufferArray類型轉爲string類型,由於buffer不能直接在console.log裏輸出,會顯示null,第三個函數就是監聽藍牙發送過來的值了,藍牙每次發送一個值,都會回調這個函數,res.value就是一個bufferArray類型,存的是發送過來的值
7.寫數據到藍牙
let buffer = new ArrayBuffer(3)
let dataView = new DataView(buffer)
dataView.setUint8(1, 100)
wx.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId[1],
characteristicId: characteristicId[0],
value: buffer,
success: function (res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
}
})
傳數據給藍牙時只能用buffer類型,let buffer = new ArrayBuffer(3)這句話定義一個三個長度的buffer,dataView.setUint8(1, 100)這句話將第一個值設置爲100,因此傳遞過去的值就是00 64 00 (十六進制)
附錄(直接複製粘貼就能運行)
JS源碼:
var app = getApp();
var deviceId;
var i=0;
var serviceId=[];
var characteristicId=[];
Page({
data: {
},
onLoad:function(){
wx.onBluetoothAdapterStateChange(function (res) {
console.log('adapterState changed, now is', res)
})
},
openadapter:function(){
wx.openBluetoothAdapter({
success: function(res) {
console.log(res,"success")
},
fail: function (res) {
console.log(res,"fail")
},
})
// wx.getBluetoothAdapterState({
// complete: function (res) {
// console.log("currentstate:",res)
// }
// })
},
closeadapter: function () {
wx.closeBluetoothAdapter({
success: function (res) {
console.log(res, "success")
},
fail: function (res) {
console.log(res, "fail")
},
})
// wx.getBluetoothAdapterState({
// complete: function (res) {
// console.log("currentstate:", res)
// }
// })
},
opendiscovery:function(){
wx.startBluetoothDevicesDiscovery({
services: [],
success: function (res) {
console.log(res)
},
fail: function (res) {
console.log(res, "fail")
},
})
},
closediscovery:function(){
wx.stopBluetoothDevicesDiscovery({
success: function (res) {
console.log(res)
},
fail: function (res) {
console.log(res, "fail")
},
})
},
getdevice:function(){
function ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
wx.getBluetoothDevices({
success: function (res) {
console.log(res)
i=0;
while (res.devices[i]) {
console.log(i);
console.log(res.devices[i].name,res.devices[i].deviceId);
if(res.devices[i].name=='YahBoom_BL'){
deviceId=res.devices[i].deviceId;
console.log(deviceId);
}
i++;
}
}
})
},
getconnecteddevice:function(){
wx.getConnectedBluetoothDevices({
//services:[],
success: function (res) {
console.log(res)
}
})
},
connecteddevice:function(){
wx.createBLEConnection({
deviceId: deviceId,
success: function(res) {
console.log(res);
},
})
},
getservice:function(){
wx.getBLEDeviceServices({
deviceId: deviceId,
success: function(res) {
console.log(res.services);
i=0;
while(res.services[i]){
serviceId[i]=res.services[i].uuid;
console.log(serviceId[i]);
i++;
}
},
})
},
getcharacteristics:function(){
wx.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId[0],
success: function (res) {
console.log('device getBLEDeviceCharacteristics:', res.characteristics)
}
})
wx.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: serviceId[1],
success: function (res) {
i=0;
while(res.characteristics[i]){
characteristicId[i]=res.characteristics[i].uuid;
console.log(characteristicId[i]);
i++;
}
}
})
},
startread:function(){
wx.readBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId[1],
characteristicId: characteristicId[0],
success: function (res) {
console.log('readBLECharacteristicValue:', res.errCode)
}
})
},
startnotify:function(){
wx.notifyBLECharacteristicValueChange({
state: true,
deviceId: deviceId,
serviceId: serviceId[1],
characteristicId: characteristicId[0],
success: function (res) {
console.log('notifyBLECharacteristicValueChange success', res.errMsg)
}
})
function ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
wx.onBLECharacteristicValueChange(function (res) {
console.log('characteristic value comed:', ab2hex(res.value))
})
},
startwrite:function(){
let buffer = new ArrayBuffer(3)
let dataView = new DataView(buffer)
dataView.setUint8(1, 100)
wx.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId[1],
characteristicId: characteristicId[0],
value: buffer,
success: function (res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
}
})
}
})
WXML源碼:
<button bindtap='openadapter'>打開適配器</button><button bindtap='closeadapter'>關閉適配器</button><button bindtap='opendiscovery'>開始搜索</button><button bindtap='closediscovery'>關閉搜索</button><button bindtap='getdevice'>獲取設備</button><button bindtap='getconnecteddevice'>獲取已鏈接設備</button><button bindtap='connecteddevice'>鏈接個人設備</button><button bindtap='getservice'>獲取服務</button><button bindtap='getcharacteristics'>獲取特徵值</button><button bindtap='startread'>讀取值</button><button bindtap='startnotify'>開啓notify</button><button bindtap='startwrite'>寫數據</button>