1. 程式人生 > 實用技巧 >6.3藍芽透傳資料與微信小程式通訊

6.3藍芽透傳資料與微信小程式通訊

從藍芽4.0開始包含了兩個標準,傳統藍芽(Classic Buletooth)和低功耗藍芽(Bluetooth Low Energy)以下簡稱 BLE。
傳統藍芽支援音訊和資料兩大類協議,所以更適合音樂等資料量大的應用場景;傳統藍芽有3個功率級別,Class1、Class2、Class3,分別支援100m、10m、1m的傳輸距離。
BLE 更適用於實時性比較高,資料傳輸量小的場景,如遙控燈;BLE 無功率級別,一般傳送功率在7dBm,一般在空曠距離,達到20m應該是沒有問題的。
BLE 的基本概念
1 GATT
說到 BLE 就不得不提一下 GATT (Generic Attribute Profile) 通用屬性協議。GATT是一個在藍芽連線之上的傳送和接收很短的資料段的通用規範,GATT 按照層級定義了三個概念:Service、Characteristic 和描述 Descriptor,這些合起來稱為一個 Profile。
2 GAP
GAP(Generic Access Profile)通用訪問協議,用來控制裝置連線和廣播。GAP 使你的裝置被其他裝置可見,並決定了你的裝置是否可以或者怎樣與合同裝置進行互動。
在 GAP 中外圍裝置通過兩種方式向外廣播資料: Advertising Data Payload(廣播資料)和 Scan Response Data Payload(掃描回覆),每種資料最長可以包含 31 byte。這裡廣播資料是必需的,因為外設必需不停的向外廣播,讓中心裝置知道它的存在。掃描回覆是可選的,中心裝置可以向外設請求掃描回覆,這裡包含一些裝置額外的資訊,例如裝置的名字。
3 Service
Characteristic 的集合。比如某個 Service 可能叫“電量管理”,它可能包含多個Characteristics。
4 Characteristic
Characteristic 可以理解為一個數據型別,包含了一個 value 和零至多個對該 value 的描述。
5 Descriptor (可選)
對 Characteristic 的描述,例如範圍、計量單位等。
6 UUID
統一識別碼,service 和 characteristic 都需要一個唯一的 uuid 來標識, 它是 128bit 的值。
如何在小程式中使用,第一步先開啟藍芽配器。
wx.closeBluetoothAdapter({
complete: function(res) {
console.log(res)
wx.openBluetoothAdapter({
success: function(res) {
console.log(res)
wx.getBluetoothAdapterState({
success: function(res) {
console.log(res)
}
})
第二步 開始搜尋附近的藍芽裝置。
wx.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: function(res) {
console.log(res)
that.setData({
searching: true,
devicesList: []
})
}
})
第三步 獲取附近的藍芽裝置
wx.onBluetoothDeviceFound(function(devices) {

  var isnotexist = true
  
   if (devices.devices) {
    if (devices.devices[0].advertisData) {
      devices.devices[0].advertisData = app.buf2hex(devices.devices[0].advertisData)
    } else {
      devices.devices[0].advertisData = ''
    }
    console.log(devices.devices[0])
    for (var i = 0; i < that.data.devicesList.length; i++) {
      if (devices.devices[0].deviceId == that.data.devicesList[i].deviceId) {
        isnotexist = false
      }
    }
    that.data.devicesList.push(devices.devices[0])

  } 
  that.setData({
    devicesList: that.data.devicesList
  })
})

},
第四步 連線藍芽
deviceId 是對應藍芽裝置資訊的deviceId,系統是根據這個藍芽的deviceId,去找到這個藍芽並建立連線。在前面第三步中獲取的是所有搜尋到藍芽裝置列表,這個是對應的某一藍芽裝置的deviceId,注意: 一個藍芽有多個服務,一個服務有多個特徵值,如果我們想對藍芽進行寫、讀操作,那麼我們至少需要3個引數。
1、藍芽的deviceId
2、藍芽的某一服務的 uuid
3、藍芽某一服務下的某一特徵值的uuid
我們至少需要這3個,才能對藍芽的某一個功能進行操作。
Connect: function(e) {
var that = this
var advertisData, name
for (var i = 0; i < that.data.devicesList.length; i++) {
if (e.currentTarget.id == that.data.devicesList[i].deviceId) {
name = that.data.devicesList[i].name
advertisData = that.data.devicesList[i].advertisData
}
}
第五步 獲取藍芽的服務
藍芽的服務是由對應藍芽裝置設定的,這個是屬於硬體的設定。一個藍芽可以開啟多個服務,我們根據對應的服務操作相對應的功能。開啟主服務isPrimary的值為true,主服務是為了與其他服務區分開來,注意: 我們這裡是用對應的服務uuid去區分服務的。
wx.getBLEDeviceServices({
deviceId: that.data.connectedDeviceId,
success: function(res) {
var all_UUID = res.services;
var index_uuid = -1;
var UUID_lenght = all_UUID.length;
/* 遍歷服務陣列 */
for (var index = 0; index < UUID_lenght; index++) {
var ergodic_UUID = all_UUID[index].uuid; //取出服務裡面的UUID

//console.log('接收到ergodic_UUID資料:' + ergodic_UUID)
if (ergodic_UUID == '00001910-0000-1000-8000-00805F9B34FB') {
index_uuid = index;
};
};
第六步 獲取藍芽對應服務的特徵值
每一個不同的藍芽服務,對應的特徵值也不同,當該服務的特徵值為true時,我們才與之進行對應的操作,一般我們通過判斷 read 屬性是否為真,便可以知道能不能通過該服務讀取到藍芽的值,當write為真時,我們便可以對藍芽裝置進行寫資料操作。
wx.getBLEDeviceCharacteristics({
deviceId: options.connectedDeviceId,
serviceId: res.services[index_uuid].uuid,

      success: function(res) {
        that.setData({
          characteristics: res.characteristics,
        })
        wx.notifyBLECharacteristicValueChange({
          state: true,
          deviceId: options.connectedDeviceId,
          serviceId: that.data.serviceId,
          characteristicId: that.data.characteristics[1].uuid,
          success: function(res) {
            console.log('啟用notify成功')
          },
          fail(res) {
            console.log(res)
          }
        })
      }
    })
  }

第七步 獲取藍芽的返回資料
我們在與藍芽進行資料互動時,藍芽也常常需要對我們傳過去的引數進行相對應的回參,也就是對我們傳過去的資訊進行回覆,這樣我們才知道寫資料操作有沒有成功,我們需要啟用低功耗藍芽裝置特徵值變化時的notify 功能,用來監聽資料的返回。
wx.onBLECharacteristicValueChange(function(res) {
console.log('接收到資料:' + app.buf2string(res.value))
var time = that.getNowTime()
that.setData({
receiveText: that.data.receiveText + time + (app.buf2string(res.value))
})
})
},
接下來測試,我們編譯w800的藍芽程式,串列埠命令開啟藍芽功能,藍芽服務:

使用微信開發者工具,匯入微信小程式原始碼,匯入時選自己的測試號。手機微信掃描進入測試除錯。

找到WM開頭的,就是我們開發板產生的藍芽,連線。

連線成功,可以收到W800傳送過來的實時資料。

點擊發送可以發資料到開發板: