發布日期:2022-04-20 點擊率:35
引言
隨著智能設備的發展與移動終端的普及,物聯網技術逐漸在生活生產中得到廣泛的應用,近距離無線組網技術備受關注。但現有的解決方案缺乏統一的技術標準,開發者需要實現通信的框架、協議與承載的平臺,存在著獨立開發的技術不能相互適配和連通、開發成本高昂等缺點。高通的AllJoyn開源框架針對現有的問題提出了一套完整的解決方案,在操作系統、開發語言、物理網絡和通信協議上具有獨立性叫本文以開發者的角度從整體的高度分析了AllJoyn的軟件框架與在C++語言下的應用,并利用AllJoyn框架,通過WiFi-Direct的連接方式實現了搭載Windows系統的終端間的組網通信實驗,與VMware虛擬機下Windows與Linux間的跨平臺通信實驗。
AllJoyn與物聯網技術
物聯網技術的工作流程是使用各類集成化的傳感器實時感知和采集所需的信息,經過信息處理基站對信息進行分析、處理,并通過自組織的無線通信網絡以“多跳中繼”的方式將信息傳送到用戶終端。AllJoyn是一個獨立于操作系統、開發語言、通信協議的通用軟件框架,提供了一種廣播和發現服務的抽象,簡化了定位和應用服務的流程,適合用來組建無線通信網絡。
AllJoyn的優勢
AllJoyn作為開源的中性平臺系統,是一個“能夠使連接設備間進行互操作的通用軟件框架和系統服務核心集”,在操作系統、開發語言、物理網絡和通信協議上具有獨立性。并且在框架內部集成了對網絡拓撲結構、通信協議的實現與管理,不需要上層應用程序的開發人員對每種網絡技術的特性進行了解,近距離傳輸速度快,組網流程簡單,并且為“握手”模式的安全通信模型提供框架(PasswordManager類)。
3AllJoyn基本概念
3.1總線與總線附件
AllJoyn總線是AllJoyn通信框架的基本抽象,是所有通信過程的承載。它的作用類似于工業上的數據總線,為消息在分布式系統上的傳遞提供了一個精簡高效的消息序列。總線附件(BusAttachment)是應用程序進程與AllJoyn總線連接的媒介,可分別作為服務端、客戶端或著作為通信的對等點。
3.2總線對象與總線接口
總線對象(BusObject)實現總線接口(Interface)與總線方法(Method),是通信的發起點與終點,使用時需要在總線附件中注冊。總線接口定義了接口規范(ajn::InterfaceDescription類),并將總線方法、總線信號、總線屬性及相關的類型簽名封裝到一個消息組(ajn::MsgArg類)中。
3.3總線守護進程
總線守護進程(Daemon)是運行在操作系統中用來實現分布式邏輯總線段的進程。分布式總線段的連接實質上就是守護進程間通信的建立,除了使用庫文件中的綁定守護進程(BundledDaemon)完成底層網絡連接的實現,還可以為瘦客戶端(ThinClient)編程實現精簡易用的守護進程。
AllJoyn會話
會話的建立由服務器的半連接(會話選項、總線名稱、會話端口)與客戶端的半連接(會話選項、唯一名稱、會話ID)的組合實現,產生唯一的AllJoyn通信路徑。在客戶端捜尋到由服務器廣播出來的服務名之后,需要通過加入AllJoyn會話才能進行通信。
AllJoyn通信原理
圖1所示是總線消息模式示意圖。處于分布式總線段上的兩個應用程序,釆用廣播與發現well-known服務名(如圖1中的org.alljoyn.sample.service)的方式發現遠程設備,并通過連接遠程AllJoyn守護進程創建的總線建立通信,以加入AllJoyn會話的方式確定一條信息的傳遞路徑。信息的發送由總線對象的成員函數ajn::BusObject::Signal完成,信息的接收由向總線附件注冊的信息處理函數來完成(注冊由庫函數ajn::BusAttachment::RegisterSignalHandler完成)。
4AllJoyn軟件框架
AllJoyn的軟件框架由上層應用程序、基本服務框架、路
由結點(服務器)、客戶端與底層網絡構成。應用層可由開發者使用不同的開發語言,通過使用基本服務框架與調用AllJoyn庫函數實現,圖2所示是AllJoyn軟件框架示意圖。
5開發環境的構建
Windows7平臺:安裝VisualStudio2010;從官網下載VisualStudio2010版本的預編譯SDK(或使用源碼包編譯[9]);打開samples目錄下的VC2008Win7工程,并按提示自動轉換(庫與頭文件的路徑在工程中都已經添加);復制一個示例工程并刪除其中的示例項目,得到一個完整的開發環境。
Fedora19平臺可從官網下載源碼包(或使用git工具克隆—鏡像工程:gitclonehttps://git.allseenalliance.org/gerrit/p/All-Projects.git),并安裝工具與依賴庫:“yuminstallgccdoxygengraphvizopenssl-develbluez-libs-devel”(根據錯誤提示安裝其他的依賴庫),同時使用scons工具編譯,編譯選項參考“sconsOS=linuxCPU=x86DOCS=devBINDINGS=cpp,cWS=offVARIANT=release”,編譯成功后,在源碼目錄下的build目錄中能找到編譯出的release版本的AllJoyn庫文件;在samples中將Makefile的示例復制出來,并在“LIBS”項后添加“-lalljoyn../../lib/BundledRouter.o-lajrouter”,使程序運行時使用編譯好的綁定守護進程(BundledDaemon);再使用make工具編譯源碼得到可執行程序。
6組網通信實驗
WiFi-Direct傳輸文件實驗
在兩臺搭載Windows系統的終端上進行該實驗,利用Windows7自帶的WiFi-Direct進行連接,其中一臺在網絡與共享中心里設置新的無線網絡連接,另一臺捜索相應的無線網絡并連接,并分別使用ipconfig與ping來測試連接。
完成無線網絡的連接后,在作服務器的終端上運行cpp/bin/samples/FileTransferService.exe
服務端 |
客戶端 |
|定義相關變量 |
_| |定義相關變量| |
|獲取并分割文件 |
| | 連接守護進程 | |
|連接守護進程 |
I丿搜尋服務名| |
| 廣播服務名 |
FJ連接AllJoyn會話| |
創建AllJoyn會話 |
K|等待會話的連接| |
|發送帶數據信號 |
I~h逐條接收信號| |
斷開連接并退出 |
生成文件并退出 |
圖3文件傳輸流程示意圖
經過多次實驗統計,可得到表1所列的統計結果。測試結果說明,在同等距離下,單次傳輸大文件的平均速度慢于傳輸小文件的速度;小文件的傳輸速度存在著一定的不穩定性;傳輸的平均速度隨距離的增大而減小。
表1文件傳輸速度分布表 | |||
距離(m) |
文件大小(M |
1B) 平均速度(KB/s) |
方差(KB/s) |
0 |
552.96 |
649.35 |
17.09 |
0 |
10.45 |
1136.68 |
41.82 |
0 |
114.48 |
876.59 |
24.15 |
5 |
114.48 |
567.81 |
14.42 |
10 |
114.48 |
418.86 |
20.49 |
實驗說明:示例文件中的FileTransferService.exe在傳輸文件時可能會崩潰,原因在于在源代碼移植過程中沒有處理好Windows平臺下的數據類型轉換,在FileTransfer()函數中將變量bufferLength的從std::streamsize類型強制轉換為unsignedint就能解決崩潰的問題,在目前最新的14.02.00版本中該問題仍然存在。
6.2跨平臺通信實驗
該實驗使用示例文件chat.exe測試Windows與Linux平臺間的通信。實驗的流程與圖3類似,所不同的是chat程序集成了服務器與客戶端,并使用main函數參數對功能進行選擇。經對比后發現,在Linux平臺下編譯所使用的chat.cc源碼與Windows下的完全一致,體現出AllJoyn框架下源碼的可移植性強。
由于Fedora19平臺被搭建在VMware虛擬機中,所以使用NAT的網絡連接方式就能實現Windows主機與Linux虛擬機的網絡連接(通過VMware虛擬以太網配適器Vment8連接)[11]。在Windows終端中輸入chat.exe-sROOM創建名為ROOM的服務名,Linux終端中輸入./chat-jROOM&搜索名為ROOM服務名,并加入相應AllJoyn會話中,從而建立起Windows與Linux間的通信。
實驗說明:運行時有可能會出現找不到動態庫liballjoyn.so的錯誤提示,可將$PWD../../lib/中的liballjoyn.so拷貝至$PWD,并在Makefile的LIBS后添加-Wl,-rpath=”./”來修正錯誤。
7結語
AllJoyn的獨立性通信場景可以經過移植并推廣到通過Bluetooth、Zigbee等不同的通信協議進行通信,同時也可以推廣到搭載Android、iOS、ARM-Linux等主流操作系統上,或以瘦客戶協ThinClient)的方式推廣到實時操作系統RTOS)移動終端的通信上,對構建局域無線通信網絡具有較高的應用價值。
20211221_61c1bc4fe972f__基于AllJoyn框架的跨平臺局域無線組網技術的實現
下一篇: PLC、DCS、FCS三大控
上一篇: 船舶企業電能智能化管