這篇文章將為大家詳細講解有關微信小程序如何實現藍牙連接,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
最近的項目需要使用小程序的藍牙功能與硬件設備進行連接相互傳送數據指令,聯調過程中發現一些問題,于是想著記錄下來,方便以后查看!
1、初始化藍牙設備
一般使用藍牙功能肯定是想連接某一個藍牙設備,所以需要知道這個藍牙設備的名稱,一般來說都是掃描二維碼連接,那么當你掃描這個設備二維碼的時候,就需要去初始化你手機上的藍牙模塊了
/**
* 初始化藍牙設備
*/
initBlue:function(){
var that = this;
wx.openBluetoothAdapter({//調用微信小程序api 打開藍牙適配器接口
success: function (res) {
// console.log(res)
wx.showToast({
title: '初始化成功',
icon: 'success',
duration: 800
})
that.findBlue();//2.0
},
fail: function (res) {//如果手機上的藍牙沒有打開,可以提醒用戶
wx.showToast({
title: '請開啟藍牙',
icon: 'fails',
duration: 1000
})
}
})
},2、搜索藍牙設備
手機藍牙初始化成功之后,就會去搜索周邊的藍牙設備
/**
*開始搜索藍牙設備
*/
findBlue(){
var that = this
wx.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
interval: 0,
success: function (res) {
wx.showLoading({
title: '正在搜索設備',
})
that.getBlue()//3.0
}
})
},3、獲取藍牙設備信息
搜索藍牙設備之后,需要獲取搜索到的藍牙設備信息,微信小程序提供了兩個方法可以獲取搜索到的藍牙設備信息,分別是:
wx.onBluetoothDeviceFound:監聽尋找到新設備的事件 ,表示只要找到一個新的藍牙設備就會調用一次該方法。
wx.getBluetoothDevices:獲取在藍牙模塊生效期間所有已發現的藍牙設備,包括已經和本機處于連接狀態的設備
看兩個方法的介紹我們知道他們的區別,但是不了解他們的區別會造成什么樣的問題?
第一次我使用的是wx.onBluetoothDeviceFound方法進行聯調,發現一切正常,由于調試的時候就只有一臺設備,發現第二次重新掃碼這個藍牙設備的時候,找不到這個設備了,因為對這個方法來說,這不是一個新的設備,以前連接上過;或者當你因為某些原因藍牙傳送數據指令的時候出錯了需要重新連接,再次連接的時候也找不到當前設備,還是同樣的原因,因為當前設備對這個方法來說不是一個新設備
所以后來我就用了wx.getBluetoothDevices方法
/**
* 獲取搜索到的設備信息
*/
getBlue(){
var that = this
wx.getBluetoothDevices({
success: function(res) {
wx.hideLoading();
for (var i = 0; i < res.devices.length; i++){
/*that.data.inputValue:表示的是需要連接的藍牙設備ID,簡單點來說就是我想要連接這個藍牙設備,所以我去遍歷我搜索到的藍牙設備中是否有這個ID*/
if (res.devices[i].name == that.data.inputValue || res.devices[i].localName == that.data.inputValue){
that.setData({
deviceId: res.devices[i].deviceId,
consoleLog: "設備:" + res.devices[i].deviceId,
})
that.connetBlue(res.devices[i].deviceId);//4.0
return;
}
}
},
fail: function(){
console.log("搜索藍牙設備失敗")
}
})
},4、連接藍牙設備
通過上一個步驟找到這個藍牙之后,通過藍牙設備的id進行藍牙連接
/**
* 獲取到設備之后連接藍牙設備
*/
connetBlue(deviceId){
var that = this;
wx.createBLEConnection({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId: deviceId,//設備id
success: function (res) {
wx.showToast({
title: '連接成功',
icon: 'fails',
duration: 800
})
console.log("連接藍牙成功!")
wx.stopBluetoothDevicesDiscovery({
success: function (res) {
console.log('連接藍牙成功之后關閉藍牙搜索');
}
})
that.getServiceId()//5.0
}
})
},5、獲取服務uuid
連接上需要的藍牙設備之后,獲取這個藍牙設備的服務uuid
getServiceId(){
var that = this
wx.getBLEDeviceServices({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId: that.data.deviceId,
success: function (res) {
var model = res.services[0]
that.setData({
services: model.uuid
})
that.getCharacteId()//6.0
}
})
},6、通過id查看藍牙設備的特征值
如果一個藍牙設備需要進行數據的寫入以及數據傳輸,就必須具有某些特征值,所以通過上面步驟獲取的id可以查看當前藍牙設備的特征值
getCharacteId(){
var that = this
wx.getBLEDeviceCharacteristics({
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId: that.data.deviceId,
// 這里的 serviceId 需要在上面的 getBLEDeviceServices 接口中獲取
serviceId: that.data.services,
success: function (res) {
for (var i = 0; i < res.characteristics.length; i++) {//2個值
var model = res.characteristics[i]
if (model.properties.notify == true) {
that.setData({
notifyId: model.uuid//監聽的值
})
that.startNotice(model.uuid)//7.0
}
if (model.properties.write == true){
that.setData({
writeId: model.uuid//用來寫入的值
})
}
}
}
})
},7、從后臺服務器獲取的指令
startNotice(uuid){
var that = this;
wx.notifyBLECharacteristicValueChange({
state: true, // 啟用 notify 功能
// 這里的 deviceId 需要已經通過 createBLEConnection 與對應設備建立鏈接
deviceId: that.data.deviceId,
// 這里的 serviceId 需要在上面的 getBLEDeviceServices 接口中獲取
serviceId: that.data.services,
// 這里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中獲取
characteristicId: uuid, //第一步 開啟監聽 notityid 第二步發送指令 write
success: function (res) {
// 設備返回的方法
wx.onBLECharacteristicValueChange(function (res) {
// 此時可以拿到藍牙設備返回來的數據是一個ArrayBuffer類型數據,所以需要通過一個方法轉換成字符串
var nonceId = that.ab2hex(res.value)
//拿到這個值后,肯定要去后臺請求服務(當前步驟根據當前需求自己書寫),獲取下一步操作指令寫入到藍牙設備上去
wx.request({
method: "POST",
data: {
xx:nonceId
},
url: url,
success: (res) => {
//res.data.data.ciphertext:我這邊服務返回來的是16進制的字符串,藍牙設備是接收不到當前格式的數據的,需要轉換成ArrayBuffer
that.sendMy(that.string2buffer(res.data.data.ciphertext))//8.0
// 服務器返回一個命令 我們要把這個命令寫入藍牙設備
}
})
}
})
},8、將從后臺服務獲取的指令寫入到藍牙設備當中
sendMy(buffer){
var that = this
wx.writeBLECharacteristicValue({
// 這里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中獲取
deviceId: that.data.deviceId,
// 這里的 serviceId 需要在上面的 getBLEDeviceServices 接口中獲取
serviceId: that.data.services,
// 這里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中獲取
characteristicId: that.data.writeId,//第二步寫入的特征值
// 這里的value是ArrayBuffer類型
value: buffer,
success: function (res) {
console.log("寫入成功")
},
fail: function () {
console.log('寫入失敗')
},
complete:function(){
console.log("調用結束");
}
})
},注:下面是需要使用到的兩個格式相互轉換的方法
/**
* 將字符串轉換成ArrayBufer
*/
string2buffer(str) {
let val = ""
if(!str) return;
let length = str.length;
let index = 0;
let array = []
while(index < length){
array.push(str.substring(index,index+2));
index = index + 2;
}
val = array.join(",");
// 將16進制轉化為ArrayBuffer
return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
return parseInt(h, 16)
})).buffer
},
/**
* 將ArrayBuffer轉換成字符串
*/
ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
},注:以上是藍牙連接的全部流程,但是我們在實際使用中肯定不會這么順暢,而且藍牙發送指令的設備都會有一個特性,就是當前藍牙設備有人連接上之后,其他人是搜索不到這個藍牙設備的,所以你需要考慮在某些個特殊情況,代碼里需要主動斷開藍牙連接把設備釋放出來供其他用戶使用,還有就是將指令寫入藍牙設備的時候很容易出問題,所以要寫個回調去多次寫入,保證成功性!
關于“微信小程序如何實現藍牙連接”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。