遇到的問題
在使用藍牙的過程中,我們需要獲取藍牙設備的Mac
地址。在Android
設備上,onBluetoothDeviceFound
方法中,deviceId
是藍牙設備的Mac
地址。而在 iOS
設備上,deviceId
則是藍牙設備的uuid
。我們想要在iOS
設備上獲取Mac
地址,就需要自己想辦法。
解決的方法
通過查閱一些相關資料,發現有些藍牙設備有180A
這個服務id
,該服務id
中的2A23
特征值可以獲取藍牙設備的Mac
地址。具體操作參考下面的代碼:
function array2String(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return `${hexArr[7]}:${hexArr[6]}:${hexArr[5]}:${hexArr[2]}:${hexArr[1]}:${hexArr[0]}`
}
// 連接藍牙
wx.createBLEConnection({
deviceId,
success: res => {
// 獲取服務id
wx.getBLEDeviceServices({
deviceId,
success: res => {
let serviceId = ''
for (let i = 0, len = res.services.length; i < len; i++) {
// 使用包含 180A 的服務id
if (~res.services[i].uuid.indexOf('180A')) {
serviceId = res.services[i].uuid
// 獲取對應的特征值
wx.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success: res => {
let characteristicId = ''
for (let i = 0, len = res.characteristics.length; i < len; i++) {
// 使用含有 2A23 對應的特征值
if (~res.characteristics[i].uuid.indexOf('2A23')) {
characteristicId = res.characteristics[i].uuid
}
}
wx.readBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
success: res => {
console.log('mac read ----------', res)
}
})
wx.notifyBLECharacteristicValueChange({
deviceId,
serviceId,
characteristicId,
state: true,
})
wx.onBLECharacteristicValueChange(function (characteristic) {
// 當特征值是查詢 Mac 地址時
if (~characteristic.characteristicId.indexOf('2A23')) {
let macInfo = (array2String(characteristic.value)).toUpperCase()
console.log('mac info -----------', macInfo)
}
})
}
})
}
}
}
})
}
})
后續
當獲取到藍牙設備Mac
地址后,我們一般還是要繼續使用藍牙的。這個時候需要重新獲取藍牙設備的服務id
,以及新的特征值。
wx.getBLEDeviceCharacteristics({
deviceId,
// 新的服務id, 通過 getBLEDeviceServices 獲取
serviceId: newServiceId,
success: res => {
wx.notifyBLECharacteristicValueChange({
state: true,
deviceId,
serviceId: newServiceId,
// 新的特征值
characteristicId: newCharacteristicId
})
// 監聽低功耗藍牙連接的錯誤事件
wx.onBLEConnectionStateChange(res => { })
}
})