轉戰物聯網·基礎篇03-從JSON數據到短指令談思維的轉變


  了解了物聯網項目的大體結構之后,我們先從物聯網的聯網相關部分說起,這也是物聯網項目中的關鍵環節。在聯網環節中,不僅要考慮如何連接上,還要考慮連接后如何傳輸數據。換句話說數據是以什么格式進行傳輸,對系統壓力和穩定性以及整體項目更有利。在互聯網項目開發中,多數情況大家習慣了用JSON數據包來進行網絡兩端的數據交互。轉入到物聯網項目中也自然會想到用JSON來交換數據,一些大廠的物聯網平台也是這樣做的,但是同時又提供了一種自定義字節串(字節流)的方式進行數據交換,這節我們就說這兩個的差別。

  字節(Byte),常用的是八位的字節,即它包含八位的二進制數(關於進制將在下一節中討論),也是互聯網傳輸數據的基本單位。在C語言中就是unsigned char類型,一個8位的無符號整數,數值范圍是0-255之間。字節串(也可以理解為字符串,后面會有針對性討論)也就是一個unsigned char類型的數組。其它編程語言中也有相對應數據類型,如Python語言中的bytes和bytearray、Go語言中的uint8(別名byte)、Java語言中的byte、PHP語言中以字節流方式接收到的字符串等。網絡中每傳輸一組數據,實際就是在傳輸N多個字節,至於這個字節代表的是什么,是由協議標准來定義的(后面會專門討論協議相關的),但是傳輸過程是不需要理會它是代表什么的,只要按照原值傳遞就可以了。磁盤保存文件也是如此,無論是文本文件,還是圖像音頻文件,磁盤只是按照每個字節對應的8個位來記錄0和1即可,不會去理會這個是什么類型的文件,因為這是數據的最底層數值。

  下面舉一個例子,設備要上報給服務端一個烘烤房的室內溫度值、工作時長和當前的電熱器的開關狀態,假設當前室溫是126℃,已經工作105分鍾,當前電熱器狀態是開啟的。

  常用JSON數據形式如下:

{
	"temp": 126,
	"time":105,
	"status": true
}

  總計37個字節需要傳輸,這里面最有價值的就是“126”、“105”和“true”,如果按照短指令格式傳輸則是如下形式:

0xXX 0xXX 0x7E 0x69 0x01 0xXX		//用16進制描述的,用10進制也可以,只是16進制是每個字節等寬書寫,便於交流

  總計6個字節需要傳輸,第一個0xXX是標志頭,第二個0xXX是指令代號,第三個0xXX是標志尾,取值在0x00--0xFF之間自己定義(自有協議指定后面會專門討論)。0x7E就是10進制的126,0x69就是10進制的105,0x01就是10進制的1,三個參數已經攜帶過去了,只需用順序位置定義具體代表什么即可。

  在物聯網信息交互中,復雜的數據關系嵌套很少用到,所以JSON的優勢就沒那么明顯了,反而造成傳輸字節變得太長。因為物聯網的聯網工作環境相對於互聯網應用要復雜和不穩定的多,所以就需要盡可能的減少單次數據傳輸的時間,來提高數據傳輸的可靠性。那么在數據結構上,使用短指令就有明顯的優勢。同時也減少了服務器並發的擁堵時間,單位時間內服務端接收的每條指令字節數越少,可接收處理的條數就越多,也相當於並發能力越強,承載能力越強。

  由於傳輸的是字節值,這個值直接代表了需要上報信息的具體數值,那么代碼在獲取的時候,直接以字節形式讀取即可,不需要編碼轉換等過程(不同開發語言獲取方法不同),也減少了計算量,進一步提高服務器的承載能力。

  在說一下為什么是優選MQTT或CoAP,而不是直接使用HTTP。一個主要原因還是因為數據量的原因,一個HTTP請求無論需要攜帶的內容有多少,單信息頭就會有幾百字節,這對物聯網要求的簡短快速結束一次通信來說,是太多了。而MQTT或CoAP的信息頭只有幾個字節,顯然針對的場景是不同的。大的數據量就會占用長的時間傳輸,就要求這段時間網絡必需保證穩定暢通,否則這一個數據包就會傳輸失敗。再者HTTP是無狀態請求,不利於實現服務端向硬件設備發送指令的及時傳送。

  寫習慣了互聯網的WEB項目,可能有人會說使用JSON便於維護,便於數據交換和溝通,這是高可維護的一項啊。之所以本文標題說是談思維的轉變,主要就是體現在這里。前面我強調過,物聯網不是單純的服務器上跑代碼,要有硬件設備與之配套運行。而硬件設備往往又是海量存在的,這就是涉及到成本問題。實際上制造硬件設備的企業,對成本控制是很嚴格的,只要技術性能上能滿足,那么能用8位單片機的絕對不用32位單片機,能用小內存的絕不用大內存的,主張夠用即可(非量產的產品或抬杠的請忽視這句話,看着就好)。因為成本不同,除非產品是不需要量產普及的。那么單片機的開發中,處理JSON數據雖然有現成的函數庫可用,但是對硬件要求就提高了不少,成本自然就上升了。還有處理速度也沒有短指令那么快,雖然單片機提高了一個檔次,但是因為要處理JSON數據,接收和發送指令時的速度並沒有得到顯著提升。所以不能因為用習慣了JSON就不顧及其他因素。

  關於可維護性,這個體現在開發過程中相關工具和文檔建立的是否夠完備,如果為項目中的短指令創建專門的生成和解析工具,並有完備的文檔同步更新,這同樣會事半功倍,維護性反而更好(后面會介紹如何創建短指令工具)。

  綜上所述,想要提高物聯網連接服務器性能,盡可能加大單台服務器的接入量(短指令代替JSON數據包的思路進行開發,對服務器承載能力擴大不只幾倍,優化好會提升10幾倍甚至更高),那么使用短指令是個必要的選擇,再配以相適應的開發方法,會是物聯網項目整體性能大幅提升。

  本節完,待續......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM