背景
偶然在doc/readme目錄裏看到readme/分佈式通訊子系統README.md · OpenHarmony/docs - 碼雲 - 開源中國 對這個仍是比較感興趣的,因此決定把這個部分拿出來解讀下,加上尚未看到有人寫。 特定到網上搜了下「分佈式通訊子系統 鴻蒙」,只搜到一篇,我以爲仍是比較相關的,講了分佈式通訊的需求來源,解析鴻蒙操做系統,不過他這個題目起的有點隨意。git
理解計劃
如何閱讀理解分佈式通訊子系統的源代碼呢? 這邊的思路主要是:算法
- 閱讀文檔入手;
- 繪製思惟導圖;
- 經過關鍵詞定位源代碼,經過調用關係肯定執行流程(流程圖可視化)
- 流程,剩下的基本就是數據結構和算法方面的事情了;
思惟導圖
用思惟導圖的樹形結構就夠了(下圖裏的藍色方塊就是這篇博文關注的部分):json
在線瀏覽連接 markdown
事實上這個文檔讀起來仍是比較費力的,可是軟件畢竟數學,工程的東西,你多重複讀幾遍沒有看不懂的。session
先說幾個名詞的我的理解: 能力:能力應該是一種擬人化的說法,其實就是功能吧,能力的使用者是服務。 服務:服務是一個平常口語,我理解就是現代流行的以人爲本的抽象,好比爲人民服務,這裏的服務就多了去了,需求方式人民,政府和人民之間的抽象層就是服務,固然服務有不少服務,因此能夠都給起個名字。 會話:又是一個平常口語,若是服務相對靜態,會話就是一次具體的服務,如何稱呼呢?分配一個會話id就行了,會話完成什麼事呢,從底層來說就是二進制流,層次再高點就是字節流,層次再高點就是數據流,層次再高點就是業務數據流。因此會話就是完成數據傳輸。數據結構
執行流程
看了上面的思惟導圖,仍是不放心,不知道具體是怎麼實現的。 下面按照文檔裏的使用步驟,根據關鍵詞到代碼裏搜一下,整理成流程圖,若是可能再拷貝出來造成demo執行下。 134個倉庫已經從網上下載下來了,把【涉及倉】拷貝到單獨文件夾,而後經過vscode打開文件夾。 數據結構和算法
1. 設備發現
用戶使用發現功能時,須要保證發現端設備與被發現端設備在同一個局域網內,而且互相能收到對方如下流程的報文。分佈式
(1) 發現端設備,發起 discover 請求後,使用coap協議在局域網內發送廣播。
這部分代碼是如何實現的?也就是這篇在vscode裏搜 discover 能夠發現確實搜到了不少函數,代碼很少,最好的方法就是把代碼所有看一下,再註釋下,流程就基本清楚了,否則也沒其餘方法了。 把目錄裏的的.git .gitee刪除後,而後上傳到了gitee,零散地地作了一些註釋: https://gitee.com/eatcosmos/openharmony-comment-communication.git
按照理解計劃,下面就先註釋代碼吧: 發現代碼雖然很少,可是這麼沒有方向的註釋仍是很難進行下去,因此註釋了會,想到markdown文檔裏有個coap的截圖,裏面有關鍵字,能夠用來定位下:
可是discovery_service.c裏沒搜到json_payload.h裏聲明的兩個函數,奇怪,你沒調用,爲何還include個json_payload.h ? 先註釋下下函數 discovery_service.c: PublishService(),由於看這個函數名顯然是發佈服務的意思,不過第一步不是發佈服務而是發起 發現請求,因此應該在discovery_service.c裏面搜索 discover,不過沒找到含discovery的函數名(後面能夠看出,其實discover功能命令確實是從這個源文件發出的,只不過是其餘函數內部調用的):
由於那個協議截圖裏的內容其實確定用到了 json_payload.c 裏函數,因此若是要搜代碼的話,這是一個突破口,因此這邊是從 json_payload.h 裏的一個函數 ParseServiceDiscover() 出發:
函數
能夠定位到ParseServiceDiscover() 的調用者是 GetServiceDiscoverInfo(): 操作系統
其餘操做和截圖裏相似,就是經過不斷搜索上一層調用函數,就能夠把調用流程畫出來,用代碼閱讀軟件應該能智能作到這一步,不過手工的方法印象會更深入,流程圖以下:
截圖裏相同顏色表示相同的源文件,能夠發現一個發送 discover 請求的執行函數仍是不少的,不過他這個函數分解仍是挺好理解的,好像每一個函數都是須要的。
具體的函數內部代碼怎麼調用的尚未看,感受能夠用到了看看,應該對代碼實現能力有幫助。
(2)被發現端設備使用PublishService接口發佈服務,接收端收到廣播後,發送coap協議單播給發現端。
佔位
(3)發現端設備收到報文會更新設備信息。
佔位
1. 傳輸
軟總線提供統一的基於Session的傳輸功能,業務能夠經過sessionId收發數據或獲取其相關基本屬性。當前本項目只實現被動接收Session鏈接的功能,業務可根據自身須要及Session自身屬性判斷是否接受此Session,如不接受,能夠主動拒絕此鏈接。本項目暫未提供打開Session的相關能力。 佔位