- 本<泰淩微ble mesh藍牙模組天貓精靈學習之旅>系列部落格學習由非官方人員 半顆心髒 潛心所力所寫,僅僅做個人技術交流分享,不做任何商業用途。如有不對之處,請留言,本人及時更改。
1、小白也癡迷,如何在 Linux環境搭建編譯燒錄 安信可TB02,點亮一盞LED燈;
2、如何實作 微信小程式藍牙控制 Ble Mesh模組 安信可TB02,全部開源!
文章目錄
-
- 前言
- 一、材料準備
- 二、實作過程
- 三、藍牙子產品初始化
- 四、微信小程式程式設計
-
- 4.1 搜尋裝置
- 4.2 連接配接裝置
- 4.3 擷取服務清單
- 4.4 擷取服務下的特征清單
- 4.5 如何接受裝置發來的資料
- 4.6 如何發送資料到裝置
- 另外,不要把我的部落格作為學習标準,我的隻是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL0ElaNVzZU10djR0Tvh2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzEDOzATN1UTM0AzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
前言
接着上篇環境搭建,我們這篇玩下如何通過微信小程式藍牙控制TB02開發闆;
接觸微信硬體生态已經有2年了,微信用戶端如果能夠實作以藍牙控制裝置,無非是從微信公衆号或微信小程式入手,但微信公衆号藍牙控制裝置,那麼裝置必須支援AirSync協定;
AirSync協定已經很久很久沒有維護了,個人認為官網已經不維護了!如果想要通過微信公衆号藍牙控制裝置,那麼裝置必須支援AirSync協定,而且要經過微信硬體平台認證才可以釋出!而安信可TB02開發闆暫不開放支援AirSync協定!
微信AirSync協定介紹: https://iot.weixin.qq.com/wiki/new/index.html?page=4-2-1
而安信可TB02開發闆支援ble 普通連接配接控制,是以,支援低功耗藍牙連接配接和控制,幸運,我就花了半天時間做出來了,并以此分享出來!共勉!!!
欲要了解更多微信控制硬體,清關注我的微信硬體專題:點我通路。
一、材料準備
這裡務必聲明一下,硬體對接需要一點成本請自行出資,并不像純軟體就可以搞的!下面推薦的藍牙子產品自行某寶購買哈!本人寫技術文章,不是帶貨寫,而是正真分享出來實作過程,不喜勿噴!
- ble藍牙子產品一個,可從淘寶購買!我使用的是安信可TB02子產品開發版-普通版;
- 微信小程式開發賬号,自行從微信公衆号注冊!請自行入門小程式哦!
二、實作過程
這裡不涉及到單片機程式設計,直接用序列槽助手模拟單片機;
- 藍牙子產品開啟 從機模式,等待連接配接;
- 微信小程式開始搜尋裝置,之後成功連接配接;
- 之後讀取裝置服務service清單,再讀取指定服務的特征清單 characters;
- 根據硬體廠商指定通訊的特征通道來做資料的收、發和通知特性;
注意:一個ble藍牙裝置可擁有多個服務和特征,涉及到讀取裝置的服務和特征,都是需要需要裝置廠商指定的!如果未能列出,那麼此特征的權限是 可讀可寫可通知,一般為一個特征擁有此三個權限;如果不是,那需要具體問裝置廠商啦!!
三、藍牙子產品初始化
如果您的闆子并沒燒錄AT固件,請按照第一篇文章,編譯
example/at
工程,燒錄到闆子即可!
預設波特率等設定,上電後會有資訊列印,如下圖所示:
本人不玩AT指令開發,因做微信小程式,是以需了解此裝置的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('發送成功')
}
})
最後貼上源碼連結:GitHub :https://github.com/Ai-Thinker-Open/AiTBxxForWeChat
有任何疑問聯系本人下方郵箱或加qq群或文章留言,不要私信我,我已經屏蔽私信!多多支援!
另外,不要把我的部落格作為學習标準,我的隻是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
- 玩轉
帶你飛、加群esp8266
群,不喜的朋友勿噴勿加:434878850QQ
- 個人郵箱:[email protected] 24小時線上,有回必回複!
- esp8266源代碼學習彙總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代碼學習彙總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp32
- 關注下面微信公衆号二維碼,幹貨多多,第一時間推送!