-
本<安信可ble mesh藍牙模組TB-02模組專題>系列博客學習由官方博客 CSDN安信可博客 潛心所力所寫。如有不對之處,請留言,我們及時更改。
文章目錄
一、材料準備
這裏務必聲明一下,硬件對接需要一點成本請自行出資,並不像純軟件就可以搞的!
- ble藍牙模塊一個,可從淘寶購買!我使用的是安信可TB02模塊開發版-普通版;
- 微信小程序開發賬號,自行從微信公衆號註冊!請自行入門小程序哦!
- 微信小程序源碼鏈接:GitHub :https://github.com/Ai-Thinker-Open/AiTBxxForWeChat
二、實現過程
這裏不涉及到單片機編程,直接用串口助手模擬單片機;
- 藍牙模塊開啓 從機模式,等待連接;
- 微信小程序開始搜索設備,之後成功連接;
- 之後讀取設備服務service列表,再讀取指定服務的特徵列表 characters;
- 根據硬件廠商指定通訊的特徵通道來做數據的收、發和通知特性;
注意:一個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 字段中加上自定義數據,這樣就可以跨平臺搜索設備回調時候,通過判斷這個字段是否爲我想要搜索的設備;
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('發送成功')
}
})