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