我準備了一個專題Android與物聯網裝置通訊,分為十來個小節完成。泛指Android連線其它硬體裝置建立通訊。之前的部落格比較零零散散,這算是一次小小的挑戰。儘量在工作回家後和週末來完成。
面對陌生的事物,舉步維艱只是表象。時間會教你的。 --大雞排
章節
- Android與物聯網裝置通訊-概念入門
- Android與物聯網裝置通訊-資料傳遞的本質
- Android與物聯網裝置通訊-網路模型分層
- Android與物聯網裝置通訊-UDP協議原理
- Android與物聯網裝置通訊-TCP協議原理
- Android與物聯網裝置通訊-基於TCP/IP自定義報文
- Android與物聯網裝置通訊-什麼是位元組序
- Android與物聯網裝置通訊- 位元組報文組裝與解析
- Android與物聯網裝置通訊-利用UDP廣播來做裝置查詢
- Android與物聯網裝置通訊-實現遠端控制Android客戶端
- Android與物聯網裝置通訊-Android做小型伺服器
- Android與物聯網裝置通訊-除錯技巧
- Android與物聯網裝置通訊-並行序列與佇列
- Android與物聯網裝置通訊-資料安全
- Android與物聯網裝置通訊-心跳
- Android與物聯網裝置通訊-網路IO模型
目錄
- 基本概念
- 指令的本質
基本概念
透過現象去看本質,Android終端與物聯網裝置開發就是:
在某種可到通訊的媒介下,使用一種可控的協議,使Android終端與硬體裝置端交換資料。
關鍵字:通訊媒介、傳輸協議、交換資料。
-
物理層(真實媒介):藍芽、紅外、聲波、WiFi、網口、串列埠等
-
傳輸層協議:TCP UDP
-
應用層協議:ModBus、MQTT、私有協議等
-
交換資料(透傳):業務類資料互動(在協議體內)
有點蒙圈不?先別管那些協議是什麼通訊媒介如何傳輸的,我們先放一邊。慢慢來。現在你只需要記住有這麼個東西。
指令的本質
現在假設我們有一臺android裝置和一塊獨立的硬體。我們傾向於把做某件事、任務、命令當做一個包來從一端(Server)傳送給另一端(Client)。
比如手機控制某個裝置關閉螢幕:
Android裝置傳送命令:{關閉螢幕}
客戶端收到命令:{關閉螢幕}
複製程式碼
指令有些像是這樣的:
功能碼:
0x01 //關閉螢幕
0x02 //重啟裝置
0x03 //開啟熱感應紅外
0x04 //關閉熱感應紅外
複製程式碼
上面這段0x1則表示關閉螢幕,如果服務端傳送一條功能碼為0x01的指令給裝置,裝置就會執行關閉螢幕動作。從接受指令到動作執行。
我們需要弄明白的是,為什麼要這樣設計,因為更多的時候是我們需要自己定義。
- 1.報文頭和尾在不穩定的傳輸中可以用來標識一段資訊結束和開始。
- 2.長度欄位則用來標識長度欄位往後的內容整體長度。
- 3.校驗可以用來驗證資料的完整性。
- 4.功能碼和資料用來完成工作定義業務。
上面這次通訊裝置會完成以下幾個步驟:
- 1.把資料讀乾淨,並校驗資料的完整性。
- 2.按照定義好的格式去切割讀取欄位。
- 3.根具協議體內的功能完成相應的動作。
- 4.按照協議回覆服務端表示執行完畢。
這裡只提到了功能碼,真實的業務場景會比這個複雜一些。會帶上更多的資料體。我們會再後面的章節展開講,這裡只做初步的認識。
一般來說我們和硬體進行互動要儘量保持通訊的內容簡短,包的內容越小越好。這樣的話就可以減少和避免產生切割包、丟包重發的情況。因為媒介的環境是不可控的,比如聲波、紅外會收到干擾,造成資料丟失或外界干擾紊亂。
這樣一來,我們對於硬體裝置這種特殊的通訊採用位元組流的方式就會使包變得很小,比如ModBus的協議,簡單來說就是傳送的包命令,按照事先確定好的。切割成不同的段來作為識別。我們把這種東西叫做報文。通常會包含報文頭、內容長度、內容、報文尾(校驗)。
好了,今天先講這麼多消化一下。我也是因為近兩年的工作需要才真正接觸到Android和物聯網裝置通訊的。把自己學到的一些經驗分享出來,網上少有看到較好的介紹。一路摸索的過程中踩了不少坑。我儘量保持採用通俗易懂又循序漸進的方式來完成後續的文章。
扯一個跟主題有關的東西,大多數Java或Android程式設計師因為沒有接觸過太低層的通訊。有些概念一知半解,聽說過但也沒能實際用過。如果有讀者恰巧看到我這篇文章,又正好是淺嘗或者工作需要。建議買書從基礎的網路通訊原理看起。然後再投入到工作中使用。網上的資料零零散散成體系的不多,通訊層面上的錯誤和坑如果沒有一定的經驗,一般難以排查到問題。切記