泰凌微ble mesh蓝牙模组天猫精灵学习之旅④如何在Android开发低功耗蓝牙ble控制 TB-02 模块,代码工程全部开源!(附带Demo)
- 本<泰凌微ble mesh藍牙模組天貓精靈學習之旅>系列博客學習由半顆心臟 潛心所力所寫,僅僅做個人技術交流分享,不做任何商業用途。如有不對之處,請留言,本人及時更改。
1、小白也癡迷,如何在 Linux環境搭建編譯燒錄 安信可TB02,點亮一盞LED燈;
2、如何實現 微信小程序藍牙控制 Ble Mesh模組 安信可TB02,全部開源!
3、簡單入門安信可TB-02開發開發板輕松接入天貓精靈,語音控制冷暖燈so easy!
4、如何在Android開發低功耗藍牙ble控制 TB-02 模塊,代碼工程全部開源!
5、 初認識阿里天貓精靈官方Genie BT mesh Stack框架, windows平臺搭建打印Hello World!
文章目錄
- 前言
- 一、材料準備
- 二、藍牙模塊初始化
- 三、App開發過程
- 4.1 搜索設備
- 4.2 連接設備
- 4.3 獲取服務列表和其特征列表
- 4.4 主動訂閱通知
- 4.5 如何接受設備發來的數據
- 4.6 如何發送數據到設備
- 另外,不要把我的博客作為學習標準,我的只是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
前言
????工作了三年,職業之路不能偏離方向,當海浪掀起,周圍會有一些美麗的風景在吸引著你,抑或有誘惑在向你招手,請不要沉迷,請不要迷戀,走走停停,每一段旅程都應該有它的歸屬;
????一直在從事智能家居領域,對無線對接語音平臺,微信控制什么的,小家電很熟,但是對 Linux 驅動等一些工業級的應用開發,一竅不通;這是我這個月的反思,等做好這個Ble Mesh的熟悉之后,會逐漸地轉 Linux 和 服務器開發,因為我個人是喜歡敲代碼的,即使老去了,看著曾經敲過的代碼,無比喜悅!
????好了,今天就給大家我最近做的一個《安信可Android藍牙APP控制TB02》的過程分享吧!
????最后共勉大家一句話: 生命意義在于折騰,生命價值在于奉獻;
一、材料準備
????這里務必聲明一下,硬件對接需要一點成本請自行出資,并不像純軟件就可以搞的!下面推薦的藍牙模塊自行某寶購買哈!
????這里不涉及到單片機編程,直接用串口助手模擬單片機;
???? 注意:一個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 模式下收到數據 |
三、App開發過程
???? Android開發的藍牙ble API文檔還是很齊全的!為了減少開發工作量,我使用了第三方庫,實現 動態授權和 ble連接發現以及設備通訊;
???? APP源碼已經在底部貼出,請知悉!
4.1 搜索設備
???? 搜索前務必要開啟 藍牙權限,而在安卓 6.0(包括6.0) 系統以上,務必開啟定位權限,否則也是無法搜索到藍牙設備的呢!
//動態授權 PermissonUtil.checkPermission(this, new PermissionListener() {@Overridepublic void havePermission() {initBleScan();}@Overridepublic void requestPermissionFail() {Toast.makeText(mContext, "您拒絕了開啟權限", Toast.LENGTH_SHORT).show();finish();}}, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.ACCESS_FINE_LOCATION);???? 第一步肯定是搜索設備,通過 調用 object.scanBle() 來發現設備,入參可以指定 UUID,注意設備列表的回調是通過 onSuccess() 方法回調。
mBleController.scanBle(0, new ScanCallback() {@Overridepublic void onSuccess() {//判斷獲取到的設備藍牙列表是否大于0if (bluetoothDevices.size() > 0) {mDeviceList.setAdapter(new DeviceListAdapter(MainActivity.this, bluetoothDevices));mDeviceList.setOnItemClickListener(MainActivity.this);} else {Toast.makeText(MainActivity.this, "Search Device Lists empty!", Toast.LENGTH_SHORT).show();}}@Overridepublic void onScanning(BluetoothDevice device, int rssi, byte[] scanRecord) {//過濾是否含有 Ai-Thinker 名字的藍牙設備if (device.getName() != null && device.getName().contains("Ai-Thinker"))if (!bluetoothDevices.contains(device)) {bluetoothDevices.add(device);}}});4.2 連接設備
????上步我們已經拿到了周圍的藍牙設備列表,那么如何判斷哪個是我們想要的呢?一般為名字,TB02的廣播名字一般為 Ai-Thinker,于是乎,調用 connect() ,入參為搜索到的設備的 mac地址!
//連接設備mBleController.connect(0, address, new ConnectCallback() {@Overridepublic void onConnSuccess() {Toast.makeText(MainActivity.this, "connected!", Toast.LENGTH_SHORT).show();}@Overridepublic void onConnFailed() {Toast.makeText(MainActivity.this, "connect fail!", Toast.LENGTH_SHORT).show();}});4.3 獲取服務列表和其特征列表
????上面說了,一個設備可擁有多個服務service,我們在獲取時候,是在已連接成功的情況下再獲取哦!
????下面獲取到了服務列表,并通過判斷其 uuid 是否和我們一致,從而判斷是否Tb01設備,否則,就是連接了其他設備。
????也許你會問,如何獲取這個uuid是否一致。參考uuid一般是廠商提供的,如下:
//TODO 這里是TB02開發板提供的各種UUID,請勿修改private static final String BLUETOOTH_S = "00010203-0405-0607-0809-0a0b0c0d1910";private static final String BLUETOOTH_NOTIFY_C = "00010203-0405-0607-0809-0a0b0c0d2b10";private static final String BLUETOOTH_WRITE_C = "00010203-0405-0607-0809-0a0b0c0d2b10";????如果獲取了服務,那么我們下一步就是要獲此這個服務下的特征列表;
????同樣道理,也是要獲取到其特征的uuid,在 TB01模塊里面的這個服務,只有一個特征好吧。所以只取元素第一個即可!
????下面是代碼,其實這些早已經封裝在另外一個庫了,如有興趣可以去翻閱看看品讀;
//服務被發現了@Overridepublic void onServicesDiscovered(BluetoothGatt gatt, int status) {if (null != mBluetoothGatt && status == BluetoothGatt.GATT_SUCCESS) {List<BluetoothGattService> services = mBluetoothGatt.getServices();int serviceSize = services.size();for (int i = 0; i < serviceSize; i++) {HashMap<String, BluetoothGattCharacteristic> charMap = new HashMap<>();BluetoothGattService bluetoothGattService = services.get(i);String serviceUuid = bluetoothGattService.getUuid().toString();List<BluetoothGattCharacteristic> characteristics = bluetoothGattService.getCharacteristics();int characteristicSize = characteristics.size();for (int j = 0; j < characteristicSize; j++) {charMap.put(characteristics.get(j).getUuid().toString(), characteristics.get(j));if (characteristics.get(j).getUuid().toString().equals(BLUETOOTH_NOTIFY_C)) {if (enableNotification(true, characteristics.get(j))) {isConnectResponse = true;connSuccess();} else {reConnect();}}}servicesMap.put(serviceUuid, charMap);}}}4.4 主動訂閱通知
????下面程序中的調用 wx.notifyBLECharacteristicValueChange()方法目的是 主動監聽此通道的數值變化,通俗來說就是:設備一旦發送數據在此通道,就會立刻收到通知;
if (!mBluetoothGatt.setCharacteristicNotification(characteristic, enable))return false;4.5 如何接受設備發來的數據
????上一點已經主動監聽到了某通道的數值變化,這點必須要做的;
????然后,就可以調用下面方法,接收到數據打印出來。注意:接收到的是十六進制格式,還需要轉下!
// TODO 接收數據的監聽mBleController.registReciveListener(REQUESTKEY_SENDANDRECIVEACTIVITY, new OnReceiverCallback() {@Overridepublic void onRecive(byte[] value) {// 這里為了演示方便,把 byte數組轉字符串顯示String string = new String(value);mReciveString.append(string + "\r\n");mReciveText.setText(mReciveString.toString());}});4.6 如何發送數據到設備
????發送數據時候,必須確定所在的通道是否可寫 write ;發送數據時候,務必把字符串轉為byte數組,再傳進去;
String sendText = mSendEdit.getText().toString().trim();if (TextUtils.isEmpty(sendText)) {Toast.makeText(this, "send text cannot be null" , Toast.LENGTH_SHORT).show();return;} else {//這里把字符串格式轉byte數組byte[] bytes = sendText.getBytes();mBleController.writeBuffer(bytes, new OnWriteCallback() {@Overridepublic void onSuccess() {Toast.makeText(SendAndReciveActivity.this, "send OK!", Toast.LENGTH_SHORT).show();}@Overridepublic void onFailed(int state) {Toast.makeText(SendAndReciveActivity.this, "send Fail!", Toast.LENGTH_SHORT).show();}});}- 最后共勉,源碼地址:https://github.com/Ai-Thinker-Open/AiTBxxForWeChat
- 編譯后可直接安裝的APK:https://docs.ai-thinker.com/_media/ble/spec/ai-thinker_ble_tool.rar
另外,不要把我的博客作為學習標準,我的只是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
- 玩轉esp8266帶你飛、加群QQ群,不喜的朋友勿噴勿加:434878850
- 個人郵箱:xuhongv@yeah.net 24小時在線,有發必回復!
- esp8266源代碼學習匯總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代碼學習匯總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp32
- 關注下面微信公眾號二維碼,干貨多多,第一時間推送!
總結
以上是生活随笔為你收集整理的泰凌微ble mesh蓝牙模组天猫精灵学习之旅④如何在Android开发低功耗蓝牙ble控制 TB-02 模块,代码工程全部开源!(附带Demo)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 泰克Tektronix示波器软件TDS2
- 下一篇: Android高仿QQ消息列表、侧拉删除