當安卓遇到物聯網

當安卓遇到物聯網

內容來源:2018 年 6 月 28 日,中移物聯網 Android開發高級工程師程磊在“droidcon上海2018安卓技術大會”進行《當安卓遇到物聯網》演講分享。IT 大咖說作為獨家視頻合作方,經主辦方和講者審閱授權發佈。

閱讀字數:3114 | 8分鐘閱讀

嘉賓演講視頻及PPT,請複製:http://t.cn/Rk0PvUu,粘貼至瀏覽器呢。

當安卓遇到物聯網

摘要

本文會先簡要介紹物聯網這一概念,接著引入平臺化的物聯網解決方案,最後是對Android Things的探討。

物聯網

世界公認的物聯網設備目前公認誕生在1982年,是一臺CMU的可樂機,可以通過電腦實時監測可樂機中的可樂存量以及溫度。不過當時還沒有物聯網這一概念,直到1999年由Kevin Ashton在寶潔公司的一次內部講座中提出。他觀點認為計算機非常善於處理信息,但是採集信息的方式過於依賴人類,而人類的精力有限且容易犯錯,不善於處理這類事情,如果能讓計算機自行感知世界,就能將人類解放出來做自己擅長的事情。

其實物聯網設備廣泛存在與我們身邊,比如ATM機、監控攝像頭等,不過在消費品市場方面長久以來都處於空白。個人認為主要有兩方面原因,一是移動網絡的發展限制,只有4G的高帶寬、低延時、低功耗的特性才能滿足物聯網的絕大部分需求。二是智能手機出現之前眾多的物聯網設備沒有統一的管理方式。2010年之後智能手機的普及配合移動網絡的升級共同促進了物聯網的發展,現階段物聯網的應用領域主要涵蓋消費、企業、基礎設施以及其他方面應用。

中移和物

我所在部門的業務是物聯網平臺,圍繞該平臺我們提供了設備端的多協議接入支持,完善的設備端和應用端SDK,應用的定製化開發以及數據展現和數據分析服務。

接入我們平臺的客戶大概可以分為三類。第一類是有自己的研發能力,能夠實現設備接入和整套應用層面的開發。第二類只關注設備接入,應用程序的開發交由我們定製。第三類也是隻關注設備接入,不同是他們不想要應用的定製化開發,而是想通過系統配置自動生成App產品界面。

中移和物這款產品就是為了解決第三類人員的需求,所面臨的問題有兩個。一是設備如何聯網,二是App控制界面如何展示。

配網

當安卓遇到物聯網

上圖是常見的手機連接wifi的界面,但智能設備通常來說沒有這樣一個交互界面。

我想到的第一個解決方案就是參考路由器讓物聯網設備擁有無線AP功能,然後手機連接上熱點打開網頁進行配置或者提供專用app。這種方案雖然可行不過應用場景存在侷限,不太適用於多設備配網。

當安卓遇到物聯網

第二種配網方式是串口AT指令,這比前面的方案更加不便,從圖中可以看到需要電腦或手機通過串口線連接到設備,同樣只能一次給一臺設備配網,假設要配網的產品是一個智能燈泡的話可想而知會有多麻煩。

當安卓遇到物聯網

目前業界主流的配網方式是第三種Smart Config,智能手機通過UDP廣播的方式將wifi的參數發給設備。無線局域網是開放的網絡環境,wifi芯片有兩種工作模式,標準和混雜。標準模式下它會丟棄所有目標IP地址和自身不同的數據包,混雜模式下接受所有經過它的數據包。

當安卓遇到物聯網

上圖是wifi芯片獲取的UDP數據包的數據格式,一共有7個字段,根據協議應用層能夠編輯的字段只有DAT。由於大部分無線路由器都是加密的,因此DAT字段其實是密文無法直接使用。不過Length字段會隨著DAT字段的長度產生變化,這樣我們就可以利用長度來攜帶信息。比如要發送一個length值為256的數字,只需向DAT字段中填充256字節長度的數據,代碼表示如下。

當安卓遇到物聯網

由於加密的緣故實際數據長度和要發送的長度並不一致,因此在發送正式數據前要發送一份先導包,先分別發送1、2、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 app

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進行過開發,所以只能通過官方案例和大家一起來展望下)

以上為今天的分享內容,謝謝大家!


分享到:


相關文章: