我正在研究如何设计数据格式,以便将带有微控制器的设备(温度,gps,加速度计等)通过GSM发送到后端服务。
我创建了一个简单的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 :(得分:0)
以下是一些想法:
跳过HTTP协议。 HTTP在标头中发送额外数据,因为您知道设备发送的数据是不必要的。只需连接到TCP服务器并发送数据。
以ASCII格式表示数据效率低下。例如,数字4294967295
需要10个字节来表示,但是在二进制中它只需要4个字节。
如果不进行压缩,原始数据是成功发送邮件所需的字节数的最小限制。通常,高效协议就像一些位或字节一样简单,用于描述正在发送的数据类型,然后是预定义位置的数据。
我建议,如果您确定提高效率超过了麻烦,则定义发送方和接收方已知的一种或多种数据包格式,并通过TCP连接进行传输。查看transaction layer for protocols such as PCI Express可能有所帮助。它们比你需要的更多,但会给你一般的想法,这是为了保持它一般非常简单。
例如,以下json数据消耗270个字节加上50个字节的HTTP标头:
{"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个字节,包括每次传输的全部时间。
如果您提供所使用的语言,您可以获得有关实际实施的更多帮助。
答案 1 :(得分:0)
您可以使用Google的Protocol Buffers。这基于包含正在发送的数据字段的预定义消息。数据传输是二进制的,有一些压缩。此外,字段可以标记为可选字段,因此您可能需要发送自上一条消息以来具有新数据的字段。
一个缺点是他们没有框架。如果使用TCP / IP等流式传输,则必须实现自己的开始和结束消息指示。
nanopb项目可以生成用于编码和解码将在微控制器上运行的消息的代码。