內容來源:2018 年 6 月 28 日,中移物聯網 Android開發高級工程師程磊在「droidcon上海2018安卓技術大會」進行《當安卓遇到物聯網》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。android
閱讀字數:3114 | 8分鐘閱讀微信
本文會先簡要介紹物聯網這一律念,接着引入平臺化的物聯網解決方案,最後是對Android Things的探討。網絡
世界公認的物聯網設備目前公認誕生在1982年,是一臺CMU的可樂機,能夠經過電腦實時監測可樂機中的可樂存量以及溫度。不過當時尚未物聯網這一律念,直到1999年由Kevin Ashton在寶潔公司的一次內部講座中提出。他觀點認爲計算機很是善於處理信息,可是採集信息的方式過於依賴人類,而人類的精力有限且容易犯錯,不善於處理這類事情,若是能讓計算機自行感知世界,就能將人類解放出來作本身擅長的事情。app
其實物聯網設備普遍存在與咱們身邊,好比ATM機、監控攝像頭等,不過在消費品市場方面長久以來都處於空白。我的認爲主要有兩方面緣由,一是移動網絡的發展限制,只有4G的高帶寬、低延時、低功耗的特性才能知足物聯網的絕大部分需求。二是智能手機出現以前衆多的物聯網設備沒有統一的管理方式。2010年以後智能手機的普及配合移動網絡的升級共同促進了物聯網的發展,現階段物聯網的應用領域主要涵蓋消費、企業、基礎設施以及其餘方面應用。工具
我所在部門的業務是物聯網平臺,圍繞該平臺咱們提供了設備端的多協議接入支持,完善的設備端和應用端SDK,應用的定製化開發以及數據展示和數據分析服務。網站
接入咱們平臺的客戶大概能夠分爲三類。第一類是有本身的研發能力,可以實現設備接入和整套應用層面的開發。第二類只關注設備接入,應用程序的開發交由咱們定製。第三類也是隻關注設備接入,不一樣是他們不想要應用的定製化開發,而是想經過系統配置自動生成App產品界面。加密
中移和物這款產品就是爲了解決第三類人員的需求,所面臨的問題有兩個。一是設備如何聯網,二是App控制界面如何展現。操作系統
上圖是常見的手機鏈接wifi的界面,但智能設備一般來講沒有這樣一個交互界面。3d
我想到的第一個解決方案就是參考路由器讓物聯網設備擁有無線AP功能,而後手機鏈接上熱點打開網頁進行配置或者提供專用app。這種方案雖然可行不過應用場景存在侷限,不太適用於多設備配網。調試
第二種配網方式是串口AT指令,這比前面的方案更加不便,從圖中能夠看到須要電腦或手機經過串口線鏈接到設備,一樣只能一次給一臺設備配網,假設要配網的產品是一個智能燈泡的話可想而知會有多麻煩。
目前業界主流的配網方式是第三種Smart Config,智能手機經過UDP廣播的方式將wifi的參數發給設備。無線局域網是開放的網絡環境,wifi芯片有兩種工做模式,標準和混雜。標準模式下它會丟棄全部目標IP地址和自身不一樣的數據包,混雜模式下接受全部通過它的數據包。
上圖是wifi芯片獲取的UDP數據包的數據格式,一共有7個字段,根據協議應用層可以編輯的字段只有DAT。因爲大部分無線路由器都是加密的,所以DAT字段實際上是密文沒法直接使用。不過Length字段會隨着DAT字段的長度產生變化,這樣咱們就能夠利用長度來攜帶信息。好比要發送一個length值爲256的數字,只需向DAT字段中填充256字節長度的數據,代碼表示以下。
因爲加密的緣故實際數據長度和要發送的長度並不一致,所以在發送正式數據前要發送一份先導包,先分別發送一、二、3個字節長度的數據,再根據wifi芯片實際接收的Length長度計算出加密緻使的長度差值。
除了用長度攜帶數據以外還能夠利用UDP組播。UDP組播的地址其實是一個範圍,向該範圍中任意的IP地址發送數據都能實現組播的效果,而IP中後面的3個字節能夠用來攜帶數據。一般的作法是用第二個字節表示UDP包的順序,後面兩個字節攜帶實際數據,這種方式還不用考慮路由器加密的問題。以下所示。
如何在同一個app中展現不一樣設備的界面也是一個難題,若是採用原生方式開發成本相對比較高也很差維護,每次接入一個新的設備用戶都要更新一次app顯然是不合理的。咱們想到了兩個技術方案,混合開發(HTML5+WebView)、React Native/Weex。
和物這款產品在內部迭代了兩個版本,初版的時候React Native還處於早期發展階段,因而咱們採用了混合開發方案。如今發佈的版本使用的則是Weex。
上圖是開發者後臺的截圖,設備廠商能夠在這裏爲產品定義數據模型,定製設備控制界面,而後經過掃描二維碼的方式進行預覽調試。
前面提到的這些其實和本次的主題關係並非很大,接下來咱們正式談談安卓在物聯網中的應用。我的更感興趣的是Google在2016年發佈的一款物聯網操做系統android things,在此以前他們還發布過一款叫Brillo的產品,不過反響不太好。Android things相比Brillo新增了Java API Framework、Google Service、應用層等,這意味着Android things支持的更多新的特性和功能。
Android things的官方網站上有一個構建Android things app的教程,這裏咱們一塊兒來簡單看下。
第一步是新建Android Studio工程,SDK API版本要高於27,工具版本高於25.0.3。由於標準的SDK中沒有Android things的API,因此要經過腳本的形式集成開發套件。
接着進行配置,從圖中能夠看到activity中有兩個Intent-filter,第一個是安卓開發者都比較熟悉的啓動界面配置,第二個聲明瞭當前開發的應用能夠做爲launch存在。
第二步開始鏈接硬件,這裏的GPIO(通用輸入輸出),能夠簡單的理解成筆記本上的擴展塢
第三步編寫與設備交互的代碼,引入核心類PeripheraManager(外設管理器)。
上面三張圖展現的是監聽按鈕事件的所有代碼。先經過PeripheraManager的OpenGpio方法傳入按鈕的編號的到按鈕的Gpio對象,配置該對象爲輸入設備,接着設置事件類型,註冊監聽器,而後在回調方法中打印一條日誌代表按鈕被按下,最後就是釋放資源。
這樣的例子對於有過安卓開發經驗的人來講並無什麼看不懂的地方,能夠說Android things的出現必定程度上下降了物聯網設備的開發門檻。
若是說一臺手機搭載Android或iOS後就能被稱爲智能手機,那麼普通設備搭載Android things後也就能夠被稱爲智能設備。不過現階段的物聯網設備管理還過於依賴於人類,好消息是Android things原生支持TensorFlow。
(須要指出的是因爲我的並無實際的應用Android things進行過開發,因此只能經過官方案例和你們一塊兒來展望下)