物联网的超轻数据格式
extra light data format for IoT
我正在研究如何设计数据格式以通过 GSM 将传感器数据(温度、gps、加速度计等)从带有微控制器的设备发送到后端服务。
我创建了一个简单的 JSON HTTP API,但有效载荷确实很重,我想要尽可能轻的东西以从根本上提高我设备的电池寿命:节省设备上的处理时间以创建数据、减少提交的数据量和发送这些数据所需的时间等。
我会用MQTT发送二进制格式的短信,但是如何格式化短信呢?
例如,我可以使用 CSV 格式或为每个传感器使用固定数量的字节。
我只能发送已更改的传感器数据(例如,如果 GPS 坐标相同,我不会再发送它们。对于 date/time,我只发送秒数,如果自上次传感器数据以来其余部分没有移动)。
我期待找到一个协议来满足所有这些需求。 BUT only standards I found are xml/json based。
有一个 specific protocol used for drones to exchange commands,我们可以对其进行返工,但我的需求略有不同:我只想发送传感器数据组 (10x / 100x)(每隔几秒获取一次)。
你知道什么可以回答这个问题,这样我们就不会重新发明轮子吗?
这里有一些想法:
跳过 HTTP 协议。 HTTP 在 header 中发送额外的数据,因为您知道您的设备正在发送什么数据,所以这是不必要的。只需连接到 TCP 服务器并发送您的数据。
用 ASCII 表示数据效率低下。例如,数字 4294967295
需要 10 个字节来表示,但在二进制中它只需要 4 个字节。
如果不进行压缩,您的原始数据是成功发送消息所需字节数的最小限制。通常,一个高效的协议就像几个位或字节一样简单,用于描述正在发送的数据类型,然后是预定义位置的数据。
如果您确定提高效率比麻烦更重要,我的建议是定义一种或多种您的发送方和接收方已知的数据包格式,并通过 TCP 连接传输它。查看 transaction layer for protocols such as PCI Express 可能会有所帮助。它们比您需要的更复杂,但会为您提供总体思路,即保持总体上非常简单。
例如,以下 json 数据消耗 270 个字节加上 HTTP header 的 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个字节,包括每次传输的全部时间。
如果您提供您使用的语言,您可能会在实际实施方面获得更多帮助。
您可以使用 Google 的 Protocol Buffers。这是基于包含正在发送的数据字段的预定义消息。数据传输是二进制的,带有一些压缩。字段也可以标记为可选,因此您可能需要发送自上次消息以来具有新数据的字段。
一个缺点是它们没有框架。如果您使用 TCP/IP.
等流式传输,则必须实现自己的消息开始和消息结束指示符
nanopb 项目可以生成编码和解码消息的代码,这些代码将 运行 在微控制器上。
我正在研究如何设计数据格式以通过 GSM 将传感器数据(温度、gps、加速度计等)从带有微控制器的设备发送到后端服务。
我创建了一个简单的 JSON HTTP API,但有效载荷确实很重,我想要尽可能轻的东西以从根本上提高我设备的电池寿命:节省设备上的处理时间以创建数据、减少提交的数据量和发送这些数据所需的时间等。
我会用MQTT发送二进制格式的短信,但是如何格式化短信呢? 例如,我可以使用 CSV 格式或为每个传感器使用固定数量的字节。 我只能发送已更改的传感器数据(例如,如果 GPS 坐标相同,我不会再发送它们。对于 date/time,我只发送秒数,如果自上次传感器数据以来其余部分没有移动)。
我期待找到一个协议来满足所有这些需求。 BUT only standards I found are xml/json based。
有一个 specific protocol used for drones to exchange commands,我们可以对其进行返工,但我的需求略有不同:我只想发送传感器数据组 (10x / 100x)(每隔几秒获取一次)。
你知道什么可以回答这个问题,这样我们就不会重新发明轮子吗?
这里有一些想法:
跳过 HTTP 协议。 HTTP 在 header 中发送额外的数据,因为您知道您的设备正在发送什么数据,所以这是不必要的。只需连接到 TCP 服务器并发送您的数据。
用 ASCII 表示数据效率低下。例如,数字 4294967295
需要 10 个字节来表示,但在二进制中它只需要 4 个字节。
如果不进行压缩,您的原始数据是成功发送消息所需字节数的最小限制。通常,一个高效的协议就像几个位或字节一样简单,用于描述正在发送的数据类型,然后是预定义位置的数据。
如果您确定提高效率比麻烦更重要,我的建议是定义一种或多种您的发送方和接收方已知的数据包格式,并通过 TCP 连接传输它。查看 transaction layer for protocols such as PCI Express 可能会有所帮助。它们比您需要的更复杂,但会为您提供总体思路,即保持总体上非常简单。
例如,以下 json 数据消耗 270 个字节加上 HTTP header 的 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个字节,包括每次传输的全部时间。
如果您提供您使用的语言,您可能会在实际实施方面获得更多帮助。
您可以使用 Google 的 Protocol Buffers。这是基于包含正在发送的数据字段的预定义消息。数据传输是二进制的,带有一些压缩。字段也可以标记为可选,因此您可能需要发送自上次消息以来具有新数据的字段。
一个缺点是它们没有框架。如果您使用 TCP/IP.
等流式传输,则必须实现自己的消息开始和消息结束指示符nanopb 项目可以生成编码和解码消息的代码,这些代码将 运行 在微控制器上。