日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

android ble mesh,Android 蓝牙Mesh组网代码详解

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android ble mesh,Android 蓝牙Mesh组网代码详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄前言Mesh組網基本理解掃描設備組網meshAddress添加與重連UUID連接登錄修改信息控制與接收設備數據總結

前言

上面的幾篇文章都是在說Android網絡編程方面的內容,我本來就有打算做成一個系列。但最近因為工作的原因,一直在研究藍牙mesh組網對藍牙設備進行控制,研究了近兩個星期,總算有了點自己的理解。先對藍牙Mesh 組網做一個總結,下面的文章會繼續寫Android 網絡編程方面的內容。網上關于Mesh 組網的理論解釋倒是很多,但是很少有關于Android 代碼具體實現的,這篇文章將基于Android Mesh 組網的代碼實現進行講解,希望能帶給大家一些幫助。

Mesh組網基本理解

藍牙技術聯盟寫了解密藍牙mesh系列,一共10篇文章 講述了藍牙mesh理論內容以及整個流程 ,想要詳細了解的可以點擊查看。下面我們簡單介紹下Mesh組網到底是什么:

MESH是一種新型的無線網絡架構,藍牙Mesh組網內每臺設備均通過低功耗藍牙無線連接進行通信,而這些設備被稱之為節點。每個節點都能發送和接收消息,消息能夠在節點之間被中繼,從而讓消息傳輸至比無線電波正常傳輸距離更遠的位置。歸結成一句話:藍牙Mesh組網 就是一種在同一個網絡內任意藍牙設備都進行數據交互的技術。這樣的話,APP 只要能發現組網內的任何一臺設備,就能由設備發現組網內的其他Mesh設備,并和任何一臺設備建立連接并控制。

其實,我對藍牙Mesh 的組網也僅僅限于上面的理解。作為一個Android 開發人員,我更關注的是Android 代碼到底如何去實現藍牙設備的組網。在網上也找到了一些項目和代碼,仔細研究了下也是很迷茫。后來找到了泰凌微提供的藍牙Mesh燈項目以及開放的Mesh 組網流程的源碼,才真正的算是實現了Android 組網。我將這個資料上傳到了百度網盤 ,提取碼是6i57。也上傳到了資源,點擊即可下載,里面有一個Android Mesh組網的項目及具體源碼、SDK開發手冊以及加密手冊。當然,這個項目的知識產權還是歸泰凌微所有,如果有任何侵權行為聯系本人,本人將立即下架這兩個項目,發布的原因還是想給大家普及一下Android 如何實現Mesh 組網的,沒有任何盈利行為。

掃描設備

因為下面的分析是基于上面項目的代碼去分析的,所以需要你們下載下來項目跑起來。

無論是連接已經完成組網設備還是將一個待組網設備進行組網,APP 做的第一步永遠是掃描,掃描到所有的藍牙設備,然后拿到指定的Mesh組網的設備進行組網操作。下面是代碼分析:

在掃描界面執行: startScan(params) 啟動掃描,然后會執行一個循環任務EventLoopTask,在循環任務中每200毫秒查詢一次狀態,然后 startLeScan() 方法中判斷設備是否正在掃描,如果沒有,則在LeBluetooth類中開啟掃描startScan()。

在注冊TelinkLightService的時候,會創建一個LightAdapter并啟動,會設置設備的掃描結果回調setLeScanCallback(LeScanCallback callback),然后當上面的掃描開啟后,會將掃描得到的設備返回的這個回調中的onLeScan()方法中.在這個方法中,會先對設備本身返回的信息進行處理和判斷,符合標準的設備返回到在掃描界面設置監聽的performed方法中的,然后執行onLeScan(),掃描這一步就完成了。

掃描完拿到三個信息 device rssi 以及scanRecord 。藍牙設備的地址可以根據device.getAddress()直接獲取 比如說我拿到的燈設備 scanRecord 的數據如下:

02:01:05:05:09:4D:65:73:68:09:FF:11:02:11:02:35:43:68:38:1E:FF:11:02:11:02:35:43:68:38:21:43:01:35:00:10:19:44:45:4C:20:68:73:65:4D:20:47:53:54:42:4A:00:00:00:00:00:00:00:00:00:00:00:00

? 在DefaultAdvertiseDataFilter類中可以看到 有meshName,meshAddress,meshUUID,productUUID等數據。很明顯我們可以根據這些數據分析當前設備在哪個mesh 下,地址又是什么。

總結:執行SDK提供的開始掃描接口startScan()的時候,可以從設備發現的回調中拿到具體的藍牙設備和廣播。mac 地址和設備名稱等信息可以從設備中拿到,而設備所屬的Mesh 組網名稱、設備的MeshAddress(設備在組網內的唯一標識,通訊地址)等信息可以在廣播中獲取到。其中productUUID是指的產品類型,可以在設備中自定義這個類型。而meshUUID則是廠商默認設置的值,至于status 這個值是廠商的預留值,也是可以在設備中自定義的信息,總的來說,在這個APP 的代碼中,并沒有實際用到這三個參數。

組網

meshAddress

在onLeScan() 方法里,會調用一個mesh.getDeviceAddress() 的方法,這個方法很重要,這里面拿到的meshAddress就是后面要修改新加入組網設備的meshAddress,他在后面會被設為newMeshAddress然后保存下來。因為在藍牙mesh組網下,meshAddress是用來確定設備的,他在這個組網內是唯一固定的。那這個方法實現的邏輯是怎樣的呢?比如說要加入一個新設備要加入當前的組網,不管他原先的meshAddress是多少 ,只看我當前組網下的meshAddress。比如說有兩個設備,地址分別是 1、3,在這個方法里,會遍歷1-254的值,然后就會返回一個2 ,這個2就是要設置的新meshAddress。meshAddress的范圍就是1-254,當然了你也可以修改這個范圍。

添加與重連

組網的時候,SDK提供了兩個接口,一個是添加新的設備進行組網,調用的是TelinkLightService.Instance().updateMesh(params);更新接口,這個接口能夠更改設備本身出廠時的參數meshName、password、ltk三個信息,這三個信息修改成功, 就標志著設備已經組?網成功,將設備成功加入到新的組網下。另一個是如果當前設備的meshName,password是你要組?網的名稱,可以執?**TelinkLightService.Instance().autoConnect(connectParams);**自動重連接口,直接把APP 跟設備連接起來。

UUID

在組網之前,我們需要知道UUID。UUID是根據一定算法,計算得到的一長串數字,這個數字的產生使用了多種元素,所以使得這串數字不會重復,每次生成都會產生不一樣的序列,所以可以用來作為唯一標識。

在藍牙協議中,UUID被用來標識藍牙設備所提供的服務,并非是標識藍牙設備本身哦,一個藍牙設備可以提供多種服務,比如A2DP(藍牙音頻傳輸)、HEADFREE(免提)、PBAP(電話本)、SPP(串口通信)等等,每種服務都對應一個UUID,其中在藍牙協議棧里,這些默認提供的profile是都有對應的UUID的,也就是默認的UUID,比如SPP,00001101-0000-1000-8000-00805F9B34FB就是一個非常 well-known的UUID,基本上所有的藍牙板不修改的話都是這個值。但是,不同的設備也不同的UUID,如果是與一個藍牙開發板進行通信,需要APP 和 藍牙設備的UUID 保持一致。而APP代碼中的UuidInformation類里面就可以設置你要控制的低功耗藍牙設備的UUID。一般都要修改服務、狀態通知、控制、OTA、加密這五個UUID。下面進行的登錄,修改參數、控制設備等等操作都需要UUID 的驗證。

下面我們主要講一下更新接口的實現,其實自動重連接口就是比更新接口少了修改設備信息這一步。

連接

發現設備后,拿到要組網的設備的本身的信息,然后就開始進行連接了。其實就是走的低功耗藍牙設備的connectGatt(this, false, mGattCallback); 連接方法。

更新參數執行updateMesh()?法來更新設備的meshName、password、ltk,也還是會執?行一個循環任務 EventLoopTask,在循環任務中每200毫秒查詢一次狀態,然后update()方法中進行connect(),然后在LightController類中執行connect(),最終會執行Peripheral類的connect()?法,然后通過此BluetoothDevice的connectGatt(this, false, mGattCallback)方法獲取設備連接。?論當連接上設備或者失去連接時會回調onConnectionStateChange(),當連接成功后調用discoverServices函數嘗試發現服務,當設備是否找到服務時,會回調onServicesDiscovered()函數,然后會在LightPeripheral類中的onServicesDiscovered()回調給LightController,最后發給 LightAdapter類CONNECT_SUCCESS. 連接成功后會執行登錄的?法。

登錄

登錄的過程是一個比較復雜的過程,涉及到多次的加密驗證。這個驗證之間的過程就會用到我們上面說的服務特征值UUID以及加密特征值UUID。

在LightAdapter類執行登錄login的方法,最終的實現是在LightController類中的login方法.參考了BLE_LIGHT加密流程簡介V1.9.pdf文檔,登錄校驗的具體實現如下:

根據 meshName、password、randm 這 3 個參數生成一個 sk,然 后把 randm 和生成的 sk 的低 8 個 byte(校驗用)一起發送給設備

設備獲取到發過來的 randm 并和 BLE Light 本身存儲的 meshname 和 password 進行加密獲取一個 sk,將生成的 sk 的低 8Byte 和 Master 發過來的 sk 進行比較,如果正確,則表示認證成功。

設備也會隨機生成8Byte的 rands、以及本地存儲的 mesh name、password 這 3 個參數加密生成一個 sk,會把sk 和 rands 傳給APP,然后在本地會根據 randm、rands、meshname、password 共同生成一個新的sk,后續的加密和解密都將使用剛剛生成的 sk。

APP 拿到設備發過來的sk后會進行校驗,校驗成功后獲取8Byte的 rands,并根據該 rands 和randm、mesh name、password共同生成一個 sk,此時,APP 和 設備 兩邊的 sk 都是一樣的,也就可以進行正常的加密和解密,同時的,登錄的過程也就完成了。

修改信息

我上面說過,加新設備進行組網的過程就是修改meshName、password、ltk,這三個參數的過程。其實這么說也并不是特別準確,其實在修改這三個參數之前還需要對比meshAddress(就是掃描設備拿到的meshAddress)與上面保存的newMeshAddress 要不要修改,因為我們上面說過,因為在藍牙mesh組網下,meshAddress是用來確定設備的,他在這個組網內是唯一固定的。修改成功后才能進行下面三個參數的修改,這三個參數修改完成就標志這新設備已經成功組網。

上面我說到LTK,可能有的朋友不知道這個是什么東西,meshName、password都很好理解,是mesh 組網的名稱和密碼,而LTK 是節點之間的通信秘鑰,只要LTK一致,同一個組網間的設備就能正常通信。但是在代碼中updateMesh(params)方法中,我們并沒有給LTK賦值,所以當我們設置的時候將使用廠商默認LTK值。如果要修改自定義的LTK,可以調用params.setLtk() 方法進行賦值。

下面是代碼分析:

登錄的sk校驗會出現在LightController類的LoginCommandCallback里面,然后在LightAdapter里面的ConnectionListener() 返回一個登錄成功或者失敗的回調。登錄成功后要修改meshName, password, ltk這三個信息,這三個信息就是組網的標志。修改的過程發生在LightController類的reset方法,會先判斷設備的meshAddress要不要修改,如果要修改的話就先修改meshAddress,然后在onDeviceAddressNotify()方法里繼續執行reset方法。通過加密的方法將這三個參數發送給設備,具體的加密過程也可以參照上面的BLE_LIGHT加密流程簡介V1.9.pdf 文檔去解析下,最后發發送了一個重新檢查的命令,等待設備解密并修改完成發出的確認信息就完成了信息的修改。修改命令的回調都在ResetCommandCallback里,收到最后的TAG_RESET_MESH_CHECK的確認后,繼續往下執行,會發出一個RESET_MESH_SUCCESS事件 ,然后在ResetMeshListener的回調里設置STATUS_UPDATE_MESH_COMPLETED,表明已完成信息更新,掃描到的這個設備組網完成,最后在掃描界面onDeviceStatusChanged的方法里面繼續執行加燈操作,直到掃不到設備。

控制與接收設備數據

控制與接收設備數據這里的代碼就比較簡單了,都有特定的方法去實現,唯一需要注意的一點就是發送數據的協議,一定要是當前設備的協議,否則無法進行控制。具體的實現可以參照下面的流程:

總結

以上就是藍牙Mesh 組網的整個流程了,下面引用一張我們ios 同事畫的流程圖理解一下:

喜歡這篇文章或者對你有幫助的話希望能點個贊!

總結

以上是生活随笔為你收集整理的android ble mesh,Android 蓝牙Mesh组网代码详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。