【TB-02模組專題③】微信小程序藍牙通訊 Ble 藍牙Mesh TB02模組;

在這裏插入圖片描述

一、材料準備

    這裏務必聲明一下,硬件對接需要一點成本請自行出資,並不像純軟件就可以搞的!

  1. ble藍牙模塊一個,可從淘寶購買!我使用的是安信可TB02模塊開發版-普通版
  2. 微信小程序開發賬號,自行從微信公衆號註冊!請自行入門小程序哦!
  3. 微信小程序源碼鏈接:GitHub :https://github.com/Ai-Thinker-Open/AiTBxxForWeChat

在這裏插入圖片描述

二、實現過程

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9UfBSkZ1-1586527137502)(/api/project/918313/files/19200364/imagePreview)]

    這裏不涉及到單片機編程,直接用串口助手模擬單片機;

  1. 藍牙模塊開啓 從機模式,等待連接;
  2. 微信小程序開始搜索設備,之後成功連接;
  3. 之後讀取設備服務service列表,再讀取指定服務的特徵列表 characters;
  4. 根據硬件廠商指定通訊的特徵通道來做數據的收、發和通知特性;

     注意:一個ble藍牙設備可擁有多個服務和特徵,涉及到讀取設備的服務和特徵,都是需要需要設備廠商指定的!如果未能列出,那麼此特徵的權限是 可讀可寫可通知,一般爲一個特徵擁有此三個權限;如果不是,那需要具體問設備廠商啦!!


三、藍牙模塊初始化


     如果您的板子並沒燒錄AT固件,請按照第一篇文章,編譯 example/at 工程,燒錄到板子即可!

     默認波特率等設置,上電後會有信息打印,如下圖所示:

在這裏插入圖片描述

     如需瞭解具體的AT指令集,點我
     下面爲大家列下主要指令:

序號 指令 功能
1 AT 測試 AT
2 ATE 開關回顯
3 AT+GMR 查詢固件版本
4 AT+RST 重啓模組
5 AT+SLEEP 深度睡眠
6 AT+ RESTORE 恢復出廠設置 恢復後將重啓
7 AT+BAUD 查詢或設置波特率 重啓後生效
8 AT+NAME 查詢或設置藍牙廣播名稱 重啓後生效
9 AT+MAC 設置或查詢模組 MAC 地址 重啓後生效
10 AT+STATE 查詢藍牙連接狀態
11 AT+SEND AT 模式下發送數據
12 +DATA AT 模式下收到數據

四、微信小程序編程


     微信小程序開發的API文檔還是很齊全的,具體的API使用詳情,請移步!點我進去查看!

4.1 搜索設備

     第一步肯定是搜索設備,通過 調用 wx.startBluetoothDevicesDiscovery(Object object) 來發現設備,入參可以指定 UUID,注意設備列表的回調是通過 wx.onBluetoothDeviceFound 方法回調。

4.2 連接設備

    上步我們已經拿到了周圍的藍牙設備列表,那麼如何判斷哪個是我們想要的呢?一般爲名字,TB02的廣播名字一般爲 Ai-Thinker,於是乎,調用 wx.createBLEConnection() ,入參爲搜索到的設備的 deviceID,注意這個參數不是唯一的!同一個設備對於不同手機會有不同而言,對應安卓手機是固定的 藍牙mac地址,而對於IPhone手機又是不一樣的,因爲蘋果手機不暴露設備的mac地址,再外加了一層!

    那麼,我們如果做產品,又是如何適配這種多平臺的障礙呢?我有個想法,設備在廣播時候的數據的 advertisData 字段中加上自定義數據,這樣就可以跨平臺搜索設備回調時候,通過判斷這個字段是否爲我想要搜索的設備;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XKWfODzU-1586527137504)(/api/project/918313/files/19200501/imagePreview)]

4.3 獲取服務列表

    上面說了,一個設備可擁有多個服務service,我們在獲取時候,是在已連接成功的情況下再獲取哦!

    下面獲取到了服務列表,並通過判斷其 uuid 是否和我們一致,從而判斷是否Tb01設備,否則,就是連接了其他設備。

    也許你會問,如何獲取這個uuid是否一致。參考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
          /* 判斷是否是我們需要的00010203-0405-0607-0809-0A0B0C0D1910*/
          if (ergodic_UUID == '00010203-0405-0607-0809-0A0B0C0D1910') {
            index_uuid = index;
          };
        };
        if (index_uuid == -1) {
          wx.showModal({
            title: '提示',
            content: '非我方出售的設備',
            showCancel: false,
            success: function(res) {
              that.setData({
                searching: false
              })
            }
          })
        }

4.4 獲取服務下的特徵列表

    上面已經獲取了服務,那麼我們下一步就是要獲此這個服務下的特徵列表;

    同樣道理,也是要獲取到其特徵的uuid,在 TB01模塊裏面的這個服務,只有一個特徵好吧。所以只取元素第一個即可!

    下面程序中的調用 wx.notifyBLECharacteristicValueChange()方法目的是 主動監聽此通道的數值變化,通俗來說就是:設備一旦發送數據在此通道,就會立刻收到通知;

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

4.5 如何接受設備發來的數據

    上一點已經主動監聽到了某通道的數值變化,這點必須要做的;

    然後,就可以調用下面方法,接收到數據打印出來。注意:接收到的是十六進制格式,還需要轉下!

wx.onBLECharacteristicValueChange(function(res) {
      console.log('接收到數據:' + app.buf2string(res.value))
    })

4.6 如何發送數據到設備

    發送數據時候,必須確定所在的通道是否可寫 write ;發送數據時候,務必轉爲buffer,再傳進去;

var buffer = new ArrayBuffer(that.data.inputText.length)
      var dataView = new Uint8Array(buffer)
      for (var i = 0; i < that.data.inputText.length; i++) {
        dataView[i] = that.data.inputText.charCodeAt(i)
      }
      wx.writeBLECharacteristicValue({
        deviceId: that.data.connectedDeviceId,
        serviceId: that.data.serviceId,
        characteristicId: that.data.characteristics[0].uuid,
        value: buffer,
        success: function(res) {
          console.log('發送成功')
        }
      })

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-liBSPanx-1586527137505)(/api/project/918313/files/19200472/imagePreview)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章