Alljoyn之管中窺豹
一、歷史:
Alljoyn是高通2011年推出的近距離P2P通訊技術,它為分布式應用程序在不同設備中提供了運行環境,特別是移動性、安全性和動態配置,支持Microsoft Windows、Linux、ios和Android等主流的操作系統平台,可以說AllJoyn是專門處理異構分布式系統中的難題而產生的,同時Alljoyn還是一項開源項目(項目地址http://www.alljoyn.org),按道理說應該很火才對,

(怎么就沒火起來呢???)
因此高通在2013年12月份將該項目貢獻了處理,並拉了一幫的大佬小弟(Linux 基金會、HTC、思科、LG、夏普、海爾、松下、Silicon Image、TP-Link等)成立了AllSeen聯盟,旨在建立、維護統一的設備間通訊標准也就是物聯網互聯架構,可以讓家中的電視、機上盒、路由器、智能照明系統和其他設備無縫地連接起來,並跨越iOS、Android、Windows 或 Mac 等不同的作業系統。

(我們一起來玩吧)
現在這個項目是由Linux 基金會來管理和運作,並添加一些功能模塊(之前只有通訊框架)如音頻推送,設備控制等,所以個人覺得比較靠譜,正好項目需要用到這方面的技術,也就來潛心研究學習下。——allseen的項目地址是 http://www.allseen.org
二、優點:
1、開源
這個是我們最喜愛它的原因,沒有之一。
2、操作系統的獨立性
AllJoyn提供了一個抽象層,允許AllJoyn及其應用程序運行在多個操作系統平台上。支持的系統包括Windows XP , Windows 7, Windows RT , and Windows 8,Android 2.2和更高版本,Linux發行版本如Ubuntu以及蘋果操作系統iOS 和OS X
3、開發語言的獨立性
目前,支持的語言有C++,Java, C#, JavaScript,和Objective-C.
4、物理網絡和協議的獨立性
現在,網絡設備支持許多的通信技術。AllJoyn提供了一個抽象層,它為底層網絡協議棧定義了統一的接口,使得軟件工程師可以相對容易地添加和安裝新的網絡。
Wi-Fi聯盟已經發布了一個Wi-Fi Direct規范,這將允許點對點的Wi-Fi連接。並且Wi-Fi Direct的網絡硬件模塊也正在積極開發中,它將為AllJoyn開發者增加Wi-Fi Direct功能和可用網絡選項的預關聯發現機制。
5、最重要的就是上面這幾點,當然還有其他很多。。。。。。
三、概念
1、AllJoyn總線
AllJoyn系統最基本的抽象就是AllJoyn總線。它為分布式系統提供了一個快速、輕量級的方式來傳遞消息序列。你可以將AllJoyn總線看作是消息傳遞的"高速公路"。圖2顯示了單一設備上AllJoyn總線實例在理論上的結構。總線用加粗的水平黑線表示。垂直線可以被認為是消息通過總線在源點和目的點之間傳遞的"出口"。
圖2所示的總線連接被描述為了六邊形(這是任意選擇的形狀)。正如高速公路的出口通常都具有編號,圖中每個連接都分配了唯一的連接名稱。為了清晰起見,這里使用連接名稱的簡化形式。
許多情況下,總線上的連接都可以被認為是進程的合作方。因此,在圖2的例子中,獨特的連接名稱:1.1可能被分配給應用程序實例進程的一個連接,而獨特的連接名稱:1.4可能被分配給其它應用程序實例進程的連接。AllJoyn總線的目標就是讓兩個應用程序進行通信,而無需處理底層機制的細節。其中一個連接可以認為是客戶端存根,另一方就可以認為是服務器存根。
圖2. 典型的AllJoyn總線

圖2顯示了AllJoyn總線的一個實例,說明了軟件總線如何給連接到總線上的組件提供進程間通信。AllJoyn總線的典型設備擴展如圖3所示。組件可根據需要,在Smartphone和Linux主機上的組件之間創建邏輯總線段之間的通信鏈路。
圖 3. AllJoyn處理設備到設備的通信
通信鏈路的管理由AllJoyn系統負責,並且由許多底層技術組成,例如Wi-Fi和藍牙技術。可能有不同的設備參與管理AllJoyn總線,但是這對分布式總線上的用戶都是透明的。對於總線上的某個組成部分,分布式AllJoyn系統看起來就像是本地設備中的總線。
圖4顯示了分布式總線對於總線上的用戶是如何呈現的。一個組件(例如,智能手機連接的名稱為1.1)可以創建一個進程來調用Linux主機上的名稱為1.7的組件,而無需擔心該組件的物理位置。
圖4. 分布式AllJoyn總線類似一條本地總線
圖3說明了邏輯分布式總線實際上被分成了若干個段,每個段都運行在不同的設備上。AllJoyn從功能上實現這些邏輯總線段的進程被稱為AllJoyn守護進程。
Unix派生系統中的長駐守護進程,通常用來描述運行在計算機系統中並提供一些必要功能的程序。在Windows系統中,長駐服務更加常見,但是我仍然是指AllJoyn在Windows系統中的守護進程。
圖5. 總線的相關氣泡圖形

為了讓AllJoyn守護進程更形象化,我們創建氣泡圖是很有用的。考慮兩段AllJoyn總線,一段位於Smartphone上而另一段位於Linux主機,如圖5所示。總線連接被標記為了客戶端(C)和服務器(S)基於RMI模型。執行分布式總線核心的守護進程被標記為(D)。圖5中的組件通常被解釋為如圖6所示的插圖。
圖6. AllJoyn氣泡圖形

氣泡可以被看作分布式系統上運行的計算機進程。左側的兩個客戶端(C)和一個服務(S)進程運行在Smartphone上。這三個進程與Smartphone上的AllJoyn守護進程通信,實現了分布式AllJoyn總線上的本地網段。在右側,也有一個守護進程,它在Linux主機上實現了AllJoyn總線的本地網段。這兩個守護進程將協調整個邏輯總線的消息流,如圖4所示,邏輯總線是單一的實體連接。類似Smartphone中的配置,Linux主機上有兩個服務組件和一個客戶端組件。
在此配置中,客戶端組件C1可以采用遠程方法來調用服務組件S1,就像它是一個本地對象。參數在源頭進行封裝,並由Smartphone上的守護進程送至本地總線段的路由。封裝參數通過網絡鏈接(從客戶端來看是透明的)發送至Linux主機上的守護進程。而Linux主機上運行的守護進程確定目的地是S1,並且對封裝參數進行拆封,然后通知服務去調用遠程方法。如果有返回值,那么將反向進行這個通信過程,把返回值傳回給客戶端。
由於守護進程在后台運行,並且客戶端和服務都運行在單獨的進程中,所以在每個單獨進程中必須有一個守護進程的"代理"。 AllJoyn將調用這些代理總線附件。
每個AllJoyn總線連接都需要一個特定的AllJoyn組件作為介質,它稱為總線附件。每個需要連接AllJoyn總線的進程都有一個總線附件。
當在硬件和軟件之間討論軟件組件時,往往會引出一個比喻。我們可以將分布式AllJoyn總線的本地網段想象為台式電腦的底板硬件總線。硬件總線本身就能傳遞電子信息,並且有一個可以插卡的點稱為連接器。AllJoyn中類似功能的連接器就是總線附件。
AllJoyn總線附件是本地指定語言的對象,它代表了分布式AllJoyn總線中的客戶端、服務或對等點。例如,這里有為用戶提供總線附件功能的C++語言實現,還有為用戶提供相同總線附件功能的Java語言實現。由於AllJoyn增加了語言支持,將會有更多這樣的具體語言實現。
AllJoyn基本上是一個面向對象的系統。在面向對象的系統中,人們將談論對象中的調用方法(因此對於分布式系統,人們將談論長駐遠程方法調用)。面向對象編程中的對象需要有成員。通常,還需要對象方法或屬性,在AllJoyn中就是BusMethods和BusProperties。AllJoyn同樣也有總線信號(BusSignal),它是對象中某些事件或狀態變化的異步通知。
為了使客戶端、服務和對等點之間的通信更加透明,那么總線方法和總線信號中的參數順序必須有一些規范,並且總線屬性中也必須有一些形式的類型信息。對於計算機科學,方法(或信號)輸入和輸出類型的申明或定義被稱為類型簽名。
類型簽名使用字符串來定義,包括所有的基本數字類型(對於大多數編程語言),以及從這些基本類型創建出的復合類型,例如數組和結構體。類型簽名的具體分配和使用超出了本文介紹的范圍,但是總線方法、信號或屬性的類型簽名將傳遞給AllJoyn底層系統,來實現總線上傳遞參數和封裝返回值的轉換。
在大多數面向對象的編程系統中,方法或屬性集合將合並到具備固有內在聯系的群組中。該集合函數的統一申明被稱為接口。接口為執行接口規范的實體與外界之間的連接提供服務。正因為如此,接口需要適當的標准結構來實現標准化。各種網站上可以找到眾多的接口服務規范,從電話到媒體播放器控制。D-Bus規范在XML中進行描述來指定接口。
接口規范會將總線方法、總線信號、總線屬性以及與它們相關的類型簽名組合到一個命名組中。而實際上,接口會由客戶端、服務或對等點進程來實現。如果實現了給定的命名接口,那么在這個實現和外界之間會有一個隱性契約,接口將會支持它所有的總線方法、總線信號和總線屬性。
接口名稱通常采用域名反轉形式。例如,這里有許多AllJoyn實現的標准接口。其中有一個標准接口是theorg.alljoyn.Businterface,將守護實現並為總線附件提供一些基本功能。
值得注意的是,接口名稱僅僅是相對自由形式的命名空間中的一個字符串,並且其它命名空間可能也有類似的外觀。接口名稱字符串提供的特定函數不應該和其它類似的字符串混淆,特別是總線名稱。例如,org.alljoyn.sample.chat可能是總線名稱常量,就是客戶端搜索的名字。但是也有可能org.alljoyn.sample.chat是接口名稱,它定義了總線對象采用特定的總線名稱連接到總線附件上時提供的方法、信號和屬性。如果存在給定接口名稱的接口就暗示了總線名稱的存在;但是,它們確實是兩個完全不同的東西,有時可能長得一模一樣。
總線接口提供了一種標准的方式來聲明分布式系統中的接口。總線對象提供橋接到可能實現給定接口規范的地方。總線對象存在於總線附件中,並作為通信的終點。
因為,在特殊的總線附件中特定的接口可能會有多種實現,所以必須增加額外的結構體來區分這些接口實現。這將由對象路徑來提供。
就像接口名稱是命名空間中的一個字符串,對象路徑同樣也存在於命名空間中。命名空間的結構就像一棵樹,路徑的思維模式就是文件系統的目錄樹。事實上,對象路徑的路徑分隔符使用的是斜杠字符,和Unix文件系統類似。由於總線對象是總線接口的實現,所以對象路徑可以遵循相應接口的命名約定。如果定義了一個磁盤控制器接口(exampleorg.freedesktop.DeviceKit.Disks),那么你就可以想象,對於同一系統中的兩個分開的物理磁盤,這個接口的不同實現應該遵循下面的對象路徑:
/org/freedesktop/DeviceKit/Disks/sda1
/org/freedesktop/DeviceKit/Disks/sda2
概念多了一下子也記不住,我的理解是:AllJoyn總線是對底層通信的抽象,我們在實際的應用中並不需要關注它;總線附件是與總線連接的接口,每一個ALLJoyn應用都需要創建一個總線附件來與總線通信;總線接口與面向對象編程中的接口類似,是應用服務的抽象,它包含有總線方法、總線屬性和總線信號;總線對象才是總線方法,總線信號處理函數的實現體,總線接口與總線對象都需要與總線附件綁定才能生效。下一篇分析代碼,來幫助我們更好地理解!
