2016-12-08 35 views
1

我正在研究如何設計數據格式,以通過GSM將微控制器設備發送到後端服務的傳感器數據(溫度,gps,加速度計等)。物聯網的額外光數據格式

我創建了一個簡單的JSON HTTP API,但有效負載非常重,我希望儘可能輕以基本提高設備的電池壽命:節省設備上的處理時間以創建數據,減少數據量提交以及發送這些數據所需的時間等。

我會用MQTT以二進制格式發送文本消息,但是如何格式化文本消息? 例如,我可以使用CSV格式,或者爲每個傳感器使用固定數量的字節。 我只能發送更改(例如,如果GPS座標都是一樣的,我不要再發送出去。對於日期/時間,如果休息沒有因爲先前的傳感器數據移動只送上我秒)的傳感器數據。

我期待找到一個可以滿足所有需求的協議。 BUT only standards I found are xml/json based

有這個specific protocol used for drones to exchange commands,我們可以重做,但我的需求稍有不同:我只想發送傳感器數據組(10x/100x)(每隔幾秒鐘)。

你知道任何可以回答這個問題的東西,這樣我們就不會重新發明輪子嗎?

+0

如果它歸結爲它,你不能只發送原始數據?也許有一個定點值和一對奇偶校驗位?這些傳感器產生多少數據,聽起來只有幾個字節。 – Iluvatar

+0

JSON數據實際上並不那麼低效 - 與可讀性和實用性相比。這是不必要的優化?只是我的2c價值:) – Monza

+1

@Monza看到奧爾登的美麗答案:你可以用你的初始JSON負載的大小除以5 :)。我最初也是這麼想的,雖然我是一名軟件工程師,而且我被幾位硬件工程師告知我錯了);那些事情很重要! – Jeremie

回答

0

這裏有一對夫婦的想法:

跳過HTTP協議。 HTTP在標題中發送額外的數據,並且由於您知道設備發送的數據,因此不必要。只需連接到TCP服務器併發送您的數據。

用ASCII表示您的數據效率不高。例如,數字4294967295需要10個字節來表示,但是二進制只需要4個字節。

沒有壓縮,您的原始數據是成功發送消息所需的字節數的最小限制。通常,高效協議就像幾位或幾個字節一樣簡單,用於描述在預定義位置中發送的數據後面是何種數據。

我的建議,如果你確信你提高效率勝過麻煩,是定義一個已知的發送者和接收者一個或多個數據包格式和傳輸過來一個TCP連接。看看transaction layer for protocols such as PCI Express可能會有所幫助。他們比你需要的更復雜,但會給你一個總的想法,就是保持它一般非常簡單。

作爲一個例子,下面的JSON數據會消耗270個字節加上用於HTTP頭也許50字節:

{"sensor1":{"coordinates":[12345,12345],"time":"2016-12-9T08:50:11"}"sensor2":{"coordinates":[12345,12345],"time":"2016-12-9T08:50:11"}"sensor3":{"coordinates":[12345,12345],"time":"2016-12-9T08:50:11"}"sensor4":{"coordinates":[12345,12345],"time":"2016-12-9T08:50:11"}} 

同樣的數據可以與數據流來表示,如下所示:

number of sensors (1 byte) 
sensor1 lat (4 bytes) 
sensor1 lng (4 bytes) 
sensor1 time (4 bytes) 
sensor2 lat (4 bytes) 
sensor2 lng (4 bytes) 
sensor2 time (4 bytes) 

共27個字節,包括全部時間的每次傳輸。

如果您提供了您正在使用的語言,則可能會在實際實施中獲得更多幫助。

+0

感謝@Alden爲您的答案! 我同意HTTP,想擺脫它,但仍然想使用MQTT而不是原始TCP連接。因爲最後我想使用IOT集線器解決方案來處理縮放/認證/加密,這樣我就不會浪費時間在這個上。 微控制器上的C代碼,在後端側的Java彈簧啓動應用程序 我會看看PCI Express並回來給你:) – Jeremie

+1

thx爲你的答案傢伙! 我們使用了@Alden的命題組合:爲設備和後端+壓縮數據之間的通信定義了幾種數據包格式,就像他提供的那樣。 ,因爲我想快速完成sthing +使用標準協議/框架來證明未來(並且我不想冒着通過打開TCP連接重新發明輪子的風險),我們將這些二進制文件放在HTTP請求的主體中,我們稍後將把它放在MQTT消息的主體中 – Jeremie

0

您可以使用谷歌的Protocol Buffers。這是基於包含正在發送的數據字段的預定義消息。數據傳輸是二進制壓縮。字段也可以標記爲可選字段,因此您可能需要發送自上次消息以來具有新數據的字段。

一個缺點是他們沒有框架。如果您使用TCP/IP等流媒體,則必須實現自己的開始和結束消息指示符。

nanopb項目可以生成用於編碼和解碼將在微控制器上運行的消息的代碼。