在微控制器和MQTT上使用的数据格式

时间:2014-08-22 11:33:03

标签: arduino mqtt data-formats

我在 Arduino 上使用 MQTT 将传感器数据发送到Javascript页面。

到目前为止,我只发送了简单的数据格式:int或floats。

我可以使用哪种格式发送更复杂的结构化数据? 例如:

{ "temperature": 32, "humidity": 67 }

我想在一条MQTT消息上发送它。

我可以使用Json,但我担心Arduino会有点沉重。


更新

好的,似乎是对JSON的普遍共识,但是我有点担心内存需求。

我在Arduino上找到了两个用于json编码/解码的库:

ArduinoJson 声称内存消耗较少,但并不支持:

  • 从流中读取(Arduino MQTT库的latest versions支持接收 流中的消息)
  • 过滤传入的json(以选择性地解析所需的Json字段)

2 个答案:

答案 0 :(得分:0)

使用主题本身来构建数据:

/home/sensors/count 2
/home/sensors/sensor1/name Kitchen
/home/sensors/sensor1/temperature 21
/home/sensors/sensor1/humidity 47
/home/sensors/sensor2/name Upstairs
/home/sensors/sensor2/temperature 23
/home/sensors/sensor2/humidity 48

对于资源受限的Arduino,发布许多简单消息更容易。另一种方法是像你想的那样构建一些大的JSON字符串:

/home/sensors = {{"name":"Kitchen", "temperature": 21, "humidity": 47 },
                 {"name":"Upstairs", "temperature": 23, "humidity": 48 }}

此外,我认为主题是发布者和客户端更有用的设计(API)。对于Arduino方面,请考虑主题方法如何不强制每个位置同时具有温度和湿度传感器?对于客户端,主题方法允许仅显示湿度的用例。

答案 1 :(得分:0)

我这样做的方法就是将摄氏温度(或Faranheit)中的温度从Arduino发布到代理商,例如

/raw/sensorid temp

然后在代理上我将它全部转换为JSON,包括添加时间戳并重新发布到另一个主题。我发现这种方式更容易,因为如果我移动传感器或更换传感器,我不需要更改arduino代码。如果您感兴趣,Here是我使用的代码,它使用的是Onewire传感器。

例如;

Arduino Publishes:
/raw/DE24532156 10


On my broker I Transforms the data to:
/house/temps {"location":"outside","tempC":10,"tempF":50,"average":14,"max":16,"min":8,"timestamp":12234234}

我使用mqttwarn在python中进行所有转换。