相比移動(dòng)領(lǐng)域,Android能否也為物聯(lián)網(wǎng)打開一片新天地
掃描二維碼
隨時(shí)隨地手機(jī)看文章
我與Android Things的24小時(shí)
我正在參與一個(gè)基于Android的物聯(lián)網(wǎng)商用項(xiàng)目,它運(yùn)行在Raspberry Pi 3上。最近發(fā)生了一件很有意思的事情,Google發(fā)布了 Android Things 的第一個(gè)預(yù)覽版,他們的SDK主要針對(duì)3個(gè)開發(fā)板(Single Board Computers),Pi 3、Intel的Edison和NXP Pico。在Pi和Android之間無法建立端口連接,我們只能忍受自制固件的各種問題,這種痛苦真的是無以言表。其中一個(gè)最大的問題是它們不支持觸摸屏,甚至連 Element 14 官方出售的版本也不行。我知道Android正在向Pi靠攏,而之前Google向AOSP項(xiàng)目提交的一個(gè) 聲明 更是讓每個(gè)人為之動(dòng)容。2016年12月12號(hào),Google發(fā)布了“Android Things”,外加一個(gè)可下載的SDK。于是我開始著手研究,并在門上掛上“勿擾”的牌子……
關(guān)于Android Things的疑問
在經(jīng)歷了大量Android工作和一些Pi項(xiàng)目之后(包括現(xiàn)在的這個(gè)項(xiàng)目),對(duì)于Android和Pi,我不禁有很多疑問。后面我會(huì)逐個(gè)說明,不過第一個(gè)最大的疑問現(xiàn)在已經(jīng)得到了回答——Android Studio完全支持Pi,Pi正式成為一個(gè)支持ADB連接的設(shè)備。是的!Android Studio那些超級(jí)好用的強(qiáng)大特性最終支持了真實(shí)的物聯(lián)網(wǎng)硬件,我們可以使用布局預(yù)覽、調(diào)試系統(tǒng)、源代碼檢查器、自動(dòng)化測(cè)試等等。我為此感到很激動(dòng)。直到現(xiàn)在,我的很多Pi板載程序都是使用Python來開發(fā),使用運(yùn)行在Pi上面的編輯器(MC)來進(jìn)行SSH連接。這種方式是可行的,而且毋庸置疑,Pi和Python大神們會(huì)提出更好的方式,不過這仍然會(huì)讓人感覺回到了80年代的軟件開發(fā)時(shí)代。我的項(xiàng)目需要為控制Pi的手持設(shè)備編寫Android程序,如果使用之前的方式等于往傷口上灑鹽,而我后來使用Android Studio來開發(fā)“真正”的Android程序,然后使用SSH來完全其它工作,一直到現(xiàn)在。
所有的例子都是有關(guān)上述的3個(gè)開發(fā)板,Pi 3是其中一個(gè)。通過Build.DEVICE常量可以在運(yùn)行時(shí)決定是哪一種設(shè)備,所以你會(huì)看到很多類似這樣的代碼:
public static String getGPIOForButton() {
switch (Build.DEVICE) {
case DEVICE_EDISON_ARDUINO:
return "IO12";
case DEVICE_EDISON:
return "GP44";
case DEVICE_RPI3:
return "BCM21";
case DEVICE_NXP:
return "GPIO4_IO20";
default:
throw new IllegalStateException(“Unknown Build.DEVICE “ + Build.DEVICE);
}
}
這里對(duì)GPIO的處理很有意思,因?yàn)槲抑粚?duì)Pi比較熟悉,所以我只能假設(shè)其它開發(fā)板也是以這種方式工作的??梢栽谶@些地方定義輸入和輸出,并作為到外部世界的主要接口。Pi所使用的Linux發(fā)行版完全支持Python的讀寫操作,但對(duì)于Android來說,你必須使用NDK來編寫C++驅(qū)動(dòng),然后通過JNI與Java進(jìn)行交互。這樣做不僅增加了難度,還讓構(gòu)建過程變得更加復(fù)雜。Pi設(shè)計(jì)了兩個(gè)針腳的I2C接口,分別是時(shí)鐘和數(shù)據(jù),需要額外的工作來處理它們。I2C是一個(gè)強(qiáng)大的可尋址總線系統(tǒng),它可以把多個(gè)針腳的數(shù)據(jù)串行化到一個(gè)針腳上面。讓我們感到驚喜的是,我們現(xiàn)在可以直接在Android Things里完成這些工作。你只需要調(diào)用read()或write()方法來訪問GPIO針腳,而I2C的操作也很簡(jiǎn)單:
public class HomeActivity extends Activity {
// I2C Device Name
private static final String I2C_DEVICE_NAME = ...;
// I2C Slave Address
private static final int I2C_ADDRESS = ...;
private I2cDevice mDevice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Attempt to access the I2C device
try {
PeripheralManagerService manager = new PeripheralManagerService();
mDevice = manager.openI2cDevice(I2C_DEVICE_NAME, I2C_ADDRESS)
} catch (IOException e) {
Log.w(TAG, "Unable to access I2C device", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mDevice != null) {
try {
mDevice.close();
mDevice = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close I2C device", e);
}
}
}
}
Android Things是基于哪個(gè)Android版本?
應(yīng)該是Android 7.0,我們因此可以使用完整的Material Design UI、優(yōu)化工具、安全增強(qiáng)以及之前版本的所有特性,真是太棒了!那么問題來了:未來的平臺(tái)更新將以什么方式放出?我們需要單獨(dú)對(duì)它們進(jìn)行管理嗎?不要忘了,這些設(shè)備不會(huì)一直在線,我們也無法奢望總是有移動(dòng)網(wǎng)絡(luò)或WiFi可用,哪怕是不穩(wěn)定的無線網(wǎng)絡(luò)。
我所擔(dān)心的另一個(gè)問題是,從名字上看,Android Things只是Android的一個(gè)衍生產(chǎn)物,它的誕生只是為了振奮Arduino市場(chǎng),而并非為了做出一個(gè)強(qiáng)大的操作系統(tǒng)。不過它所給出的 示例 立馬打消了這個(gè)疑慮,示例里有些地方甚至使用SVG作為resource(這是Android最近才有的),而不是使用傳統(tǒng)的位圖,雖然使用傳統(tǒng)的位圖也很方便。
既然Android Things是基于Android的,那么Android的一些問題也會(huì)不可避免地出現(xiàn)在Android Things上,比如權(quán)限問題。Android Things是為了固定的硬件設(shè)備而設(shè)計(jì)的,一旦構(gòu)建完成,用戶一般不會(huì)在上面安裝應(yīng)用,所以用戶不會(huì)被詢問權(quán)限問題,因?yàn)樵O(shè)備上可能連UI都沒有!所以,在應(yīng)用被安裝到設(shè)備上時(shí),它會(huì)被授予所有的權(quán)限。一般情況下,這些設(shè)備都是單應(yīng)用設(shè)備,在設(shè)備啟動(dòng)時(shí),只有一個(gè)應(yīng)用會(huì)在上面運(yùn)行。
Brillo發(fā)生了什么?
Brillo是前Google物聯(lián)網(wǎng)操作系統(tǒng)的代號(hào),看起來應(yīng)該是Android Things之前的代號(hào)。事實(shí)上,你還是能夠看到很多地方在使用Brillo這個(gè)名字,特別是GitHub上Android Things示例代碼里的源代碼文件夾名稱。不過這樣的情況會(huì)越來越少,因?yàn)橐磺姓谙蛐碌耐跽呖待R!
UI指南?
Google發(fā)行了大量關(guān)于Android智能手機(jī)和平臺(tái)應(yīng)用的指南,比如如何在屏幕上布局按鈕等等。當(dāng)然,如果能夠遵循這些最佳實(shí)踐是再好不過了,不過現(xiàn)在我們?cè)僖膊荒芟褚郧澳菢?。默認(rèn)情況下,屏幕上什么也沒有,應(yīng)用開發(fā)者需要自己管理所有的組件。包括頂部的狀態(tài)欄、底層的導(dǎo)航欄以及其它所有的組件。多年來,Google告訴Android應(yīng)用開發(fā)者不要自己去渲染一個(gè)返回按鈕,因?yàn)槠脚_(tái)會(huì)為我們提供一個(gè)這樣的按鈕,不過現(xiàn)在連這個(gè)按鈕也沒有了,因?yàn)?Android Things有可能連UI都沒有 !
關(guān)于Google將會(huì)提供的服務(wù)支持,我們將作何期待?
我們可以有很多期待,但不包括所有事情。Android Things的首個(gè)預(yù)覽版不支持藍(lán)牙,也不支持NFC,而對(duì)于物聯(lián)網(wǎng)來說,藍(lán)牙和NFC是非常重要的。而開發(fā)板就支持這些功能,所以我認(rèn)為在不久的將來Android Things也會(huì)支持它們。因?yàn)闆]有通知欄,所以也不會(huì)有通知。地圖也不會(huì)有。沒有默認(rèn)的軟鍵盤,需要自己安裝一個(gè)。因?yàn)闆]有應(yīng)用商店,所以必須通過ADB安裝應(yīng)用,還要做很多其它操作。
在使用Android Things進(jìn)行開發(fā)時(shí),我嘗試著把為Pi開發(fā)的APK安裝到普通的設(shè)備上,但沒有成功。有個(gè)錯(cuò)誤被拋了出來:“com.google.android.things”庫不存在,說明為Android Things設(shè)備開發(fā)的應(yīng)用無法安裝到其它設(shè)備上。這個(gè)看起來是合理的,因?yàn)橹挥蠥ndroid Things設(shè)備需要這些東西,不過這也會(huì)有點(diǎn)局限,因?yàn)椴粌H僅智能手機(jī)或平臺(tái)沒有這些庫,其它的模擬器也沒有。也就是說,你只能在Android Things物理設(shè)備上運(yùn)行和測(cè)試Android Things應(yīng)用……直到Google在它的物聯(lián)網(wǎng)開發(fā)者社區(qū) 上回答了我所提出的疑問,并提供了一個(gè)變通方案。
關(guān)于Android Things生態(tài)系統(tǒng)的演化,我們將做何期待?
我期待能夠看到更多的基于傳統(tǒng)Linux服務(wù)器的應(yīng)用被移植到Android Things平臺(tái)上,雖然這些應(yīng)用對(duì)于智能手機(jī)和平板來說毫無意義。例如,Web服務(wù)器?,F(xiàn)在已經(jīng)有一些這樣的服務(wù)器,不過還沒有像Apache或Nginx這樣的重型服務(wù)器。物聯(lián)網(wǎng)設(shè)備可能不會(huì)有本地的UI,不過可以通過瀏覽器來管理它們,這樣做是可行的,所以需要一種方式來展現(xiàn)Web面板。對(duì)于那些著名的通信應(yīng)用來說,它們需要麥克風(fēng)和揚(yáng)聲器,從理論上說,可以支持任何一款視頻通話應(yīng)用,比如Due、Skype、Facebook等等。事態(tài)將會(huì)發(fā)展到何種程度都只是我們的猜測(cè)。是否會(huì)出現(xiàn)應(yīng)用商店?是否會(huì)出現(xiàn)廣告?我們能夠避免被黑客控制?從消費(fèi)者的角度來看,物聯(lián)網(wǎng)設(shè)備就是一些具有觸摸屏的聯(lián)網(wǎng)設(shè)備,而且每個(gè)人都習(xí)慣了智能手機(jī)的工作方式。
我期待能夠看到硬件的飛速發(fā)展,特別是開發(fā)板設(shè)備,而且能夠處在一個(gè)較低的成本水平。Raspberry Pi Zero只要5美元,這個(gè)價(jià)格低得讓人不可思議,不過它那可憐的CPU和內(nèi)存甚至都無法保證能夠運(yùn)行Android Things。它們什么時(shí)候才能運(yùn)行Android Things?很顯然,很多開發(fā)板產(chǎn)商把目標(biāo)瞄準(zhǔn)了Android Things,而且隨著規(guī)?;a(chǎn),一些外圍設(shè)備,比如觸摸屏,很可能只需要2美元左右。
不過,我不認(rèn)為我們會(huì)如飛一般跳躍。如果我們把Android Things看成一個(gè)無所不包的物聯(lián)網(wǎng)操作系統(tǒng),那么知道一些Android架構(gòu)方面的知識(shí)有助于我們了解這個(gè)系統(tǒng)。它仍然使用Java語言開發(fā),Java因?yàn)樗睦厥胀nD時(shí)間飽受詬病。不過這只是其中的一個(gè)方面。一個(gè)真正的實(shí)時(shí)操作系統(tǒng)對(duì)時(shí)效性具有非常嚴(yán)格的要求,它不能是一個(gè)關(guān)鍵性任務(wù)系統(tǒng)。想想那些醫(yī)療應(yīng)用、安全監(jiān)視器、工業(yè)控制器等。從理論上說,如果有必要,Android系統(tǒng)上的Activity或服務(wù)隨時(shí)會(huì)被停掉。對(duì)于手機(jī)來說,用戶可以重啟應(yīng)用,清除其它應(yīng)用,或者重啟設(shè)備。擁有一個(gè)心跳監(jiān)測(cè)器是很重要的。如果前臺(tái)的Activity或服務(wù)正在監(jiān)聽一個(gè)GPIO針腳,而信號(hào)得不到及時(shí)的處理,就會(huì)發(fā)生錯(cuò)誤。Android需要做一些很基礎(chǔ)的修改來支持心跳監(jiān)測(cè),不過到目前為止還沒有聽說有這方面的計(jì)劃。
過去的24小時(shí)
那么,讓我們回到我的項(xiàng)目上來。我想我可以把之前所做的工作盡可能地移植過來,如果不可避免地碰到一些問題,我可以到G+開發(fā)社區(qū)上尋求幫助。不過除了無法在非Android Things設(shè)備上運(yùn)行應(yīng)用這個(gè)問題以外,還沒有碰到其它問題。目前一切運(yùn)行良好!這個(gè)項(xiàng)目還用了一些奇怪的東西,比如自定義字體和一些精準(zhǔn)的計(jì)時(shí)器,這些東西在Android Studio里都得到了完美的支持。我這次給Google打滿分。之后我會(huì)做一些實(shí)實(shí)在在的原型,而不只是視頻或截圖。
藍(lán)圖
物聯(lián)網(wǎng)操作系統(tǒng)目前看起來非常的碎片化。這個(gè)領(lǐng)域目前還沒有出現(xiàn)市場(chǎng)領(lǐng)導(dǎo)者,雖然我們經(jīng)常聽到一些天花亂墜的大肆宣傳,但這些還為時(shí)過早。Google能否在物聯(lián)網(wǎng)領(lǐng)域也能做得像他們?cè)谝苿?dòng)領(lǐng)域所做的那樣?要知道,他們已經(jīng)占據(jù)了90%的移動(dòng)市場(chǎng)。我相信他們會(huì)的。而如果這個(gè)成為現(xiàn)實(shí),那么Android Things的出現(xiàn)就是一個(gè)起點(diǎn)。
讓我們想想開放軟件和私有軟件之間的戰(zhàn)爭(zhēng),比如Apple和Google。Apple從來沒有完整開放過他們的軟件,而Google的開源軟件已經(jīng)為很多人帶來了好處。現(xiàn)在這個(gè)問題又出現(xiàn)了,要讓Apple開發(fā)出一個(gè)免費(fèi)的物聯(lián)網(wǎng)系統(tǒng),就好比讓它發(fā)布一款免費(fèi)的iPhone一樣難。
物聯(lián)網(wǎng)操作系統(tǒng)的游戲已經(jīng)開始了,而競(jìng)爭(zhēng)對(duì)手們甚至都還沒有做好準(zhǔn)備……