小程序中,iOS設備獲取藍牙設備的Mac地址


遇到的問題

在使用藍牙的過程中,我們需要獲取藍牙設備的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 => { })
  }
})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM