當前位置:編程學習大全網 - 編程語言 - 微信小程序藍牙教程--完整版親測

微信小程序藍牙教程--完整版親測

#使用mpvue 開發小程序過程中 簡單介紹壹下微信小程序藍牙連接過程

#在藍牙連接的過程中部分api需要加定時器延時1秒到2秒左右再執行,原因為何不知道,小程序有這樣的要求

#1.首先是要初始化藍牙:openBluetoothAdapter()

```js

if (wx.openBluetoothAdapter) {

wx.openBluetoothAdapter({

success: function(res) {

/* 獲取本機的藍牙狀態 */

setTimeout(() => {

getBluetoothAdapterState()

}, 1000)

},

fail: function(err) {

// 初始化失敗

}

})

} else {

}

```

#2.檢測本機藍牙是否可用:

#? 要在上述的初始化藍牙成功之後回調裏調用

```js

getBluetoothAdapterState() {

var that= this;

that.toastTitle= '檢查藍牙狀態'

wx.getBluetoothAdapterState({

success: function(res) {

startBluetoothDevicesDiscovery()

},

fail(res) {

console.log(res)

}

})

}

```

#3. 開始搜索藍牙設備:

```js

startBluetoothDevicesDiscovery() {

var that= this;

setTimeout(() => {

wx.startBluetoothDevicesDiscovery({

success: function(res) {

/* 獲取藍牙設備列表 */

that.getBluetoothDevices()

},

fail(res) {

}

})

}, 1000)

}

```

#4. 獲取搜索到的藍牙設備列表

# /* that.deviceName 是獲取到的藍牙設備的名稱, 因為藍牙設備在安卓和蘋果手機上搜到的藍牙地址顯示是不壹樣的,所以根據設備名稱匹配藍牙*/

```js

getBluetoothDevices() {

var that= this;

setTimeout(() => {

wx.getBluetoothDevices({

services: [],

allowDuplicatesKey: false,

interval: 0,

success: function(res) {

if (res.devices.length> 0) {

if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {

for (let i = 0; i < res.devices.length; i++) {

if (that.deviceName === res.devices[i].name) {

/* 根據指定的藍牙設備名稱匹配到deviceId */

that.deviceId = that.devices[i].deviceId;

setTimeout(() => {

that.connectTO();

}, 2000);

};

};

} else {

}

} else {

}

},

fail(res) {

console.log(res, '獲取藍牙設備列表失敗=====')

}

})

}, 2000)

},

```

#5.連接藍牙

# 匹配到的藍牙設備ID 發送連接藍牙的請求, 連接成功之後 應該斷開藍牙搜索的api,然後去獲取所連接藍牙設備的service服務

```js

connectTO() {

wx.createBLEConnection({

deviceId: deviceId,

success: function(res) {

that.connectedDeviceId = deviceId;

/* 4.獲取連接設備的service服務 */

that.getBLEDeviceServices();

wx.stopBluetoothDevicesDiscovery({

success: function(res) {

console.log(res, '停止搜索')

},

fail(res) {

}

})

},

fail: function(res) {

}

})

}

```

#6. 獲取藍牙設備的service服務,獲取的serviceId有多個要試著連接最終確定哪個是穩定版本的service 獲取服務完後獲取設備特征值

```js

getBLEDeviceServices() {

setTimeout(() => {

wx.getBLEDeviceServices({

deviceId: that.connectedDeviceId,

success: function(res) {

that.services= res.services

/* 獲取連接設備的所有特征值 */

that.getBLEDeviceCharacteristics()

},

fail: (res) => {

}

})

}, 2000)

},

```

#7.獲取藍牙設備特征值

# 獲取到的特征值有多個,最後要用的事能讀,能寫,能監聽的那個值的uuid作為特征值id,

```js

getBLEDeviceCharacteristics() {

setTimeout(() => {

wx.getBLEDeviceCharacteristics({

deviceId: connectedDeviceId,

serviceId: services[2].uuid,

success: function(res) {

for (var i = 0; i < res.characteristics.length; i++) {

if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate) &&

(res.characteristics[i].properties.read && res.characteristics[i].properties.write)) {

console.log(res.characteristics[i].uuid, '藍牙特征值 ==========')

/* 獲取藍牙特征值 */

that.notifyCharacteristicsId = res.characteristics[i].uuid

// 啟用低功耗藍牙設備特征值變化時的 notify 功能

that.notifyBLECharacteristicValueChange()

}

}

},

fail: function(res) {

}

})

}, 1000)

},

```

#8.啟動notify 藍牙監聽功能 然後使用 wx.onBLECharacteristicValueChange用來監聽藍牙設備傳遞數據

#接收到的數據和發送的數據必須是二級制數據, 頁面展示的時候需要進行轉換

```js

notifyBLECharacteristicValueChange() { // 啟用低功耗藍牙設備特征值變化時的 notify 功能

var that= this;

console.log('6.啟用低功耗藍牙設備特征值變化時的 notify 功能')

wx.notifyBLECharacteristicValueChange({

state: true,

deviceId: that.connectedDeviceId,

serviceId: that.notifyServicweId,

characteristicId: that.notifyCharacteristicsId,

complete(res) {

/*用來監聽手機藍牙設備的數據變化*/

wx.onBLECharacteristicValueChange(function(res) {

/**/

that.balanceData += that.buf2string(res.value)

that.hexstr += that.receiveData(res.value)

})

},

fail(res) {

console.log(res, '啟用低功耗藍牙設備監聽失敗')

that.measuringTip(res)

}

})

},

/*轉換成需要的格式*/

buf2string(buffer) {

var arr = Array.prototype.map.call(new Uint8Array(buffer), x => x)

return arr.map((char, i) => {

return String.fromCharCode(char);

}).join('');

},

receiveData(buf) {

return this.hexCharCodeToStr(this.ab2hex(buf))

},

/*轉成二進制*/

ab2hex (buffer) {

? var hexArr = Array.prototype.map.call(

? new Uint8Array(buffer), function (bit) {

? return ('00' + bit.toString(16)).slice(-2)

}

)

? return hexArr.join('')

},

/*轉成可展會的文字*/

hexCharCodeToStr(hexCharCodeStr) {

? var trimedStr = hexCharCodeStr.trim();

? var rawStr = trimedStr.substr(0, 2).toLowerCase() === '0x' ? trimedStr.substr(2) : trimedStr;

? var len = rawStr.length;

? var curCharCode;

? var resultStr= [];

? for (var i = 0; i < len; i = i+ 2) {

? curCharCode = parseInt(rawStr.substr(i, 2), 16);

? resultStr.push(String.fromCharCode(curCharCode));

}

? return resultStr.join('');

},

```

# 向藍牙設備發送數據

```js

sendData(str) {

let that= this;

let dataBuffer = new ArrayBuffer(str.length)

let dataView = new DataView(dataBuffer)

for (var i = 0; i < str.length; i++) {

dataView.setUint8(i, str.charAt(i).charCodeAt())

}

let dataHex = that.ab2hex(dataBuffer);

this.writeDatas = that.hexCharCodeToStr(dataHex);

wx.writeBLECharacteristicValue({

deviceId: that.connectedDeviceId,

serviceId: that.notifyServicweId,

characteristicId: that.notifyCharacteristicsId,

value: dataBuffer,

success: function (res) {

console.log('發送的數據:' + that.writeDatas)

console.log('message發送成功')

},

fail: function (res) {

},

complete: function (res) {

}

})

},

```

# 當不需要連接藍牙了後就要關閉藍牙,並關閉藍牙模塊

```js

// 斷開設備連接

closeConnect() {

if (that.connectedDeviceId) {

wx.closeBLEConnection({

deviceId: that.connectedDeviceId,

success: function(res) {

that.closeBluetoothAdapter()

},

fail(res) {

}

})

} else {

that.closeBluetoothAdapter()

}

},

// 關閉藍牙模塊

closeBluetoothAdapter() {

wx.closeBluetoothAdapter({

success: function(res) {

},

fail: function(err) {

}

})

},

```

#在向藍牙設備傳遞數據和接收數據的過程中,並未使用到read的API 不知道有沒有潛在的問題,目前線上運行為發現任何的問題

#今天的藍牙使用心得到此結束,謝謝

  • 上一篇:復旦mta課程安排
  • 下一篇:linux搭建開發環境意義linux搭建開發環境
  • copyright 2024編程學習大全網