摘要: 總線(bus) 實作p2p通信的基礎 alljoyn 的底層協定類似于d-bus,相當于是跨裝置分布式的 d-bus 總線附件(bus attachment) 每一個連接配接到總線上的alljoyn應用程式被稱為總線附件,可用c++或java編寫 每個總線附件 ...
總線(bus)
實作p2p通信的基礎
alljoyn 的底層協定類似于d-bus,相當于是跨裝置分布式的 d-bus
總線附件(bus attachment)
每一個連接配接到總線上的alljoyn應用程式被稱為總線附件,可用c++或java編寫
每個總線附件有獨一的名稱(unique name),當每次連接配接到總線時自動配置設定
每個總線附件可以有一個易讀的名稱(well-known name),用于辨別服務,例如“org.alljoyn.bus.addressbook”
總線接口(bus interfaces)
類似于java中的接口,定義了方法、信号處理函數和屬性
所有總線方法(bus methods)可使用簡單或複雜的資料類型(數組、結構等)作為參數和傳回值
總線對象(bus objects)
用于實作總線接口,每個總線對象實作一個或多個總線接口
處理遠端方法調用(remote method calls)和發出信号(signals)、消息(messages)
總線對象通過總線附件注冊到總線上
每個總線對象有一個類似于檔案路徑的路徑名,例如/org/alljoyn/games/chess,用于遠端方法調用
代理總線對象(proxy bus object)
一旦總線附件之間建立連接配接,應用程式建立一個代理總線對象,實作遠端方法調用(remote method calls)并準備好從總線上接收信号(signals)
遠端方法調用是同步的,信号則是異步的且可以一對多(廣播)或一對一
service 和 client
p2p 應用中提供服務的一方稱為 service,使用服務的一方稱為 client
一個應用程式可以同時是 service 和 client(例如chat)
session
在宣告服務後,service 需建立一個或多個 session,client 發現服務後加入 session
每個 session 有一個 session port,類似于 socket 通信中的 port
session 的兩種情形:
point-to-point session:兩個 peer 之間互動
multipoint session:多個 peer 加入同一個 session,組成一個 group
alljoyn daemon——實作p2p通信的核心
daemon通過程序間通信(ipc)與應用程式通信,應用程式隻與 daemon打交道
daemon提供一個抽象層處理所有的網絡傳輸、消息路由、命名空間管理等
整個alljoyn系統相當于一個虛拟總線,連接配接多個alljoyn daemons和總線附件
daemon是用 c++編寫的 native程式,運作在不同作業系統上的 daemons可實作互聯
在應用程式啟動之前必須先啟動daemon
alljoyn daemon 在 android 上的三種實作形式
第一種:android app(alljoyn.apk)
隻支援 wifi/tcp 傳輸
無需 root 權限
第二種:純c++編寫的可執行程式,在 adb shell 下運作(alljoyn-daemon)
若使用 wifi 傳輸無需 root 權限
若使用 bluetooth 傳輸需 root 權限,且藍牙協定棧限定用 bluez
可在 init.rc 中自動加載
第三種:與應用程式捆綁在一起(bundle),不需要單獨啟動daemon
适用于釋出基于alljoyn開發的應用程式
裝置發現和建立連接配接的過程
注冊(register): 連接配接在總線上的對象為自身進行注冊
宣告(advertise): 連接配接在總線上的對象通過ip多點傳播(multicast)宣告自身的存在
發現(discover): 發現其他對象的存在
在使用藍牙時借助藍牙本身的 sdp 進行發現
裝置連接配接過程示意圖:

裝置之間通信的方式
遠端方法調用(同步)
signal(異步)
raw session(直接 socket 通信,應用程式可選擇基于 tcp 或 udp )
alljoyn的優勢
alljoyn是一個中性平台系統,旨在簡化鄰近異構分布式移動通信網絡系統。這裡的異構性不僅表示不同的裝置,而且可以是具有不同作業系統和不同類型的裝置(例如個人電腦、手機、平闆電腦和消費性電子産品),并且使用不同的通信技術。
alljoyn是在apache version 2.0 license授權下作為一個開源項目進行開發的。這代表所有的alljoyn代碼庫都是可供查閱的,并且鼓勵開發者進行補充和改進。如果alljoyn缺少某個功能,你可以對此作出改進和貢獻。如果你在嵌入式裝置中使用alljoyn,或者有任何技術性問題,我們開源社群中的衆多參都會願意提供幫助和指導。alljoyn的代碼庫可以在http://www.alljoyn.org中獲得。
alljoyn提供了一個抽象層,允許alljoyn及其應用程式運作在多個作業系統平台上。alljoyn支援大部分的标準linux發行版本包括ubuntu等,并可以運作在android 2.2和更高版本的智能手機和平闆裝置上。alljoyn還在常見版本的microsoft windows作業系統上進行了測試和驗證,包括windows xp和windows7。
目前,開發人員可以使用c++或java語言來建立應用程式。其它語言的支援也将很快面世。
現在,網絡裝置支援許多的通信技術。alljoyn提供了一個抽象層,它為底層網絡協定棧定義了統一的接口,使得軟體工程師可以相對容易地添加和安裝新的網絡。
最近,wi-fi聯盟釋出了一個wi-fi direct規範,這将允許點對點的wi-fi連接配接。并且wi-fi direct的網絡硬體子產品也正在積極開發中,它将為alljoyn開發者增加wi-fi direct功能和可用網絡選項的預關聯發現機制。
通常情況下,移動裝置在使用過程中會到達不同的地點,并不斷與各種網絡進行連接配接和斷開。這意味着它的ip(網際網路協定)位址可能會改變,網絡接口可能無法使用,服務可能是短暫性的。
alljoyn可以獲知目前服務的斷開和新服務的出現,并建立新的連接配接(如果需要)。alljoyn準備作為wi-fi hotspot 2.0技術的應用層,這種技術旨在提升手機和信号發射塔對wi-fi熱點的漫遊透明度。
有些情況下,網絡拓撲結構對分布式應用程式的性能至關重要。藍牙網絡配置成微微網會比配置成分布式網絡達到更好的性能。alljoyn在内部對這些配置進行管理,而不需要開發人員對每種網絡技術的具體特性進行任何了解。
當裝置需要互動時,必須進行某種形式的廣播和發現服務。在靜态網絡的時代,人作為管理者對裝置之間通信作出了精确的安排。最近,零配置網絡的概念已經得到了普及,尤其是蘋果的bonjour和微軟的plug and play技術。我們也看到,現有技術的發現機制如藍牙服務發現協定,和新興機制如wi-fi direct p2p發現規範。而alljoyn提供了一種廣播和發現服務的抽象,可以簡化定位和應用服務的流程。
分布式應用程式中安全性的固有模型是應用程式到應用程式的。不幸的是,在許多情況下,網絡安全模型并不比對這種固有的協定。例如,藍牙協定就要求必須在裝置之間進行配對。使用這種方法,一旦裝置配對成功,兩個裝置上的所有應用程式都會得到授權。但是當考慮更多比藍牙耳機更強大的裝置時,這就不可取了。例如,兩台筆記本電腦通過藍牙進行連接配接,那麼更精細的安全控制是非常有必要的。alljoyn在設計上對這種複雜的安全模型提供了廣泛的支援,特别是應用程式到應用程式的通信。
alljoyn采用了一種易于了解的對象模型和遠端方法調用(rmi)機制。alljoyn重新實作了總線協定,基于d-bus規範和擴充d-bus協定,以支援分布式裝置。
根據标準的對象模型和總線協定可以規範各種接口元件。java接口聲明提供的一個與本地實作執行個體進行互動的規範,也采用了大緻相同的方式。alljoyn對象模型中提供了一個獨立于語言的規範,來實作遠端互動。
規範中考慮了多種接口的實作,進而可以支援應用程式通信的标準定義。這對于軟體元件是可以實作的技術。軟體元件已經成為了許多現代系統的核心部分,例如android系統,它定義了四個主要的元件類型作為與android應用架構進行互動的唯一管道;或者在微軟系統中,它使用了元件對象模型(com)系統的子節點。
我們期待出現豐富的接口定義,以實作概述一節中描述的情景。alljoyn項目希望與使用者進行合作,共同定義和公布标準接口支援,并實作共享。