環信隋云怡:環信ONE SDK架構全解析
環信即時通訊SDK自2014年6月正式發布2.0版本至今已走過一個年頭,從基本的單聊功能,到群聊功能,再到聊天室的實現,SDK不管是功能,穩定性,還是易集成性都在一步一步的走向完善與穩定,感謝開發者們給與提供的反饋與幫助,使我們的SDK迅速的在諸多方面得到提高與改進。
隨著現在物聯網的興起,環信現在的SDK的架構對應對未來物聯網平臺還是略有不足,使我們不得不在今年年初就考慮到如何去改善我們的架構,使之能夠較容易的適配到各個主流平臺和物聯網平臺。
現在的Android, IOS, SDK都是各自維護了自己邏輯,給2.0開發帶來了很多不便,相同的功能需要維護兩份代碼,同一個bug要在不同的平臺修復兩次,由于不同平臺的實現,導致Android,IOS架構設計不統一,API不一致,再加上在不同的平臺開發的工程師之間由于不同的實現導致溝通問題諸多,這樣導致的問題就是,不同平臺的開發進度大多數情況下都不相同。
所以針對以上的問題,我們今年年初就計劃我們SDK3.0的開發,我們稱之為ONE SDK,基本的理念就是我們實現共同IM 內核,使代碼可被不同的平臺***化的重用,但是設計和實現卻是面臨著巨大的挑戰,如何適配到不同的平臺,如何***化的重用代碼都是要面臨的問題。
ONE SDK 架構設計
總體設計
ONE SDK的設計總體分為3層,平臺層-Platfrom layer,適配層-Porting layer,核心層-Common layer.
平臺層會根據各平臺的不同,實現不同的接口,開放符合平臺層的API給第三方開發者。
適配層主要要適配到ONE SDK 核心層所需要的一些接口,起到承上啟下的作用。
核心層主要提供IM 功能和業務邏輯,保證***化的代碼重用。
考慮到跨平臺共享代碼,我們ONE SDK主要是用C++這種跨平臺的語言來實現。
平臺層
我們計劃要支持的平臺為Android,IOS,MAC OS,Windows,Windows phone, Linux,Embedded Linux, 還有較為廣泛應用的物聯網平臺-IOT OS。
我們會針對不同平臺提供給開發者,和平臺一致API規范,使各平臺的開發者無難度的集成SDK,例如我們會提供JAVA給Android,Objective-C 給IOS和MAC, C++ 給Linux, IOT平臺。
適配層
適配層主要就是各平臺需要實現核心層所需要的一些接口類例如,上圖給出的線程模型,定時器模型,數據庫模型,還有HTTP模型。
這些模型都是和平臺相關的,例如有的平臺提供sqllite的訪問,有的沒有,有的線程模型和定時器模型都有自己的實現方式例如物聯網IOT OS,所以實現了上述的模型,就可以使核心層可以工作,不過也可能會遇到一些問題,這都會在具體的實現中會具體的應對,但結構是清晰的。
其實例如Android,Linux, IOS, Mac OS,Windows都是支持C++11,也就是說都是支持C++11所提供的線程模型,所以這幾個操作系統的線程模型的實現應該是同樣的,所以代碼是可以共享的, 但是數據庫Anroid NDK是不支持sqlite訪問,所以這部分Android有兩種策略一個是集成sqlite源代碼,二是回調給JAVA層,前一種策略是代碼邏輯清晰,但壞處就是增加了代碼量。
還有就是HTTP模型,默認的android,iOS,Mac OS,windows都有自己的API提供,所以ONE SDK策略就是如果有平臺有原生的HTTP API 支持我們就會盡量用平臺的,但是類似linux,就需要第三方庫的支持例如libcurl.
所以綜上所述適配層的意義重大,保證我們ONE SDK代碼共享***化的目的。
核心層
核心層是具體實現環信相關功能的模塊,它里面也包含的幾個部分,核心業務邏輯API實現,抽象協議層,和獨立實時音視頻模塊。
Core Common
業務邏輯層,負責提供基本的IM功能。
·會話管理
·消息收發
·登錄鑒權
·連接管理
Audio/Video Call
實時音視頻模塊是一個獨立的模塊,可以單獨存在,這樣可以靈活處理,不需要時不用加載此模塊。
·實時音視頻
·多人語音
Abstract Protocol Layer
協議抽象層,主要用來處理具體的IM底層協議,這層是比較獨立的主要實現環信定義的IM傳輸協議,也為為日后協議改造,擴展提供承上啟下的作用。
·定義抽象消息載體
·基本的消息發送
·基本的消息回調
·定義基本的通知
上述ONE SDK架構是我們計劃要實現的,現在一些基本的設計已經在Linux SDK上得到了實現,下面讓我們繼續了解下Linux SDK。
Linux SDK
經過幾個月的開發,我們已經推出了Linux SDK測試版,有興趣的開發者可以小試一下去我們的官網http://www.easemob.com/downloads 下載。
通過EMChatClient Facade類開發者可以訪問到任何IM停供的功能
·登錄注冊
·消息收發,支持TXT, IMAGE, VIDEO, AUDIO, FILE, LOCATION, 類型的message
·會話管理
·聯系人管理
在開發linux SDK的時候我們利用了C++11提供的很多優良feature,例如lambda,shared ptr,thread等較新的功能,通過這些功能的使用,讓我們能夠迅速并且高效的開發出Linux SDK測試版。
Lambda是我們的代碼邏輯閱讀起來更清楚,shared ptr使我們對內存的管理更為簡單,thread的使用使我們能迅速的建立好線程模型,加快開發的速度。
我們在Linux SDK porting layer實現了線程模型,數據庫模型,定時器模型和HTTP模型
線程模型,利用C++11的thread進行封裝
數據庫模型,使用Linux的sqlite
HTTP模型,我們使用了Libcurl進行了封裝
定時器模型,我們使用了C++11進行了封裝
我們對Linux SDK還在緊鑼密鼓,夜以繼日的緊張開發中,群組和實時音視頻功能還在開發中,但是在開發過程中我們也遇到了些的問題,例如不linux平臺對庫的支持也不盡相同,所以勢必會對我們的架構有些改變,有些重構的工作也在進行中,我們希望8月底能夠實現大部分的功能。
選擇linux SDK為開始主要是因為大多數的嵌入式智能平臺還是以linux為主,所以首先開發Linux 版SDK也是必先的一步,感謝我們的工程師,我么的Linux SDK已經能夠支持樹莓派的開發環境,這對于很多開發者來說確實是個好消息。
如果想了解如何集成Linux SDK請參考環信IM Linux SDK 集成說明
展望
Linux SDK 只是實現我們ONE SDK 的***步,我們下半年還要實現基于ONE SDK 的Android ,IOS,MAC OS, 還有主流物聯網平臺的SDK,通過借鑒Linux SDK的實現方式,我們認為實現ONE SDK是可以做到的。
我們還會進一步和主要IOT平臺供應商合作,實現某個具體IOT平臺的環信SDK,使環信即時通訊平臺生態圈更加壯大。























