sidebar_position: 1

MQTT协议

本文章介绍如何通过MQTT进行遥测和属性数据上传以及RPC控制的实现。

发送属性和遥测数据

设备分直连设备和网关设备, 发送数据方式也有所不同。 telemetry 为 遥测, attributes表示属性,客户端上传的属性在服务器端永远为 ClientSide , 即客户端侧属性。 不推荐在服务端修改。

直连设备发送遥测数据

  1. devices/me/telemetry
  2. devices/me/attributes

网关设备发送遥测数据

  1. devices/{设备名称}/telemetry
  2. devices/{设备名称}/attributes

{设备名称} 则是隶属当前网关设备处理的设备名称。 MQTT的负载为如下格式

  1. {
  2. "stringvalue":"here is strvalue",
  3. "intvalue":234
  4. }

网关设备批量发送设备遥测数据和属性数据

  1. gateway/telemetry
  2. gateway/attributes

批量发送数据格式如下:

  1. {
  2. "subdevice1": [
  3. {
  4. "ts": 637834108219892435,
  5. "devicestatus": 0,
  6. "values": {
  7. "string": "this string",
  8. "float": 22.222
  9. }
  10. }
  11. ],
  12. "subdevice2": [
  13. {
  14. "ts": 637834108219892435,
  15. "devicestatus": 0,
  16. "values": {
  17. "intvalue": 22
  18. }
  19. }
  20. ]
  21. }

这里是一个C#合成批量上传的例子

  1. Dictionary<string, List<Playload>> pairs = new Dictionary<string, List<Playload>>();
  2. var plst = new List<Playload>();
  3. var values = new Dictionary<string, object>();
  4. values.Add("string", "this string");
  5. values.Add("intvalue",22);
  6. plst.Add(new Playload() { DeviceStatus = DeviceStatus.Good, Ticks = DateTime.Now.Ticks, Values = values });
  7. values.Add("float", 22.222);
  8. plst.Add(new Playload() { DeviceStatus = DeviceStatus.Bad, Ticks = DateTime.Now.Ticks, Values = values });
  9. pairs.Add("subdevice1",plst);
  10. pairs.Add("subdevice2", plst);
  11. var str= Newtonsoft.Json.JsonConvert.SerializeObject(pairs);
  12. Console.WriteLine(str);

订阅属性

直连设备请求属性

发布请求

  1. devices/me/attributes/request/{请求唯一标识}

订阅结果

  1. devices/me/attributes/response/{请求唯一标识}

网关设备请求属性

发布请求

  1. devices/{设备名称}/attributes/request/{请求唯一标识}

订阅结果

  1. devices/{设备名称}/attributes/response/{请求唯一标识}

发起上行RPC远程控制

上行RPC控制是指 终端设备远程调用服务端的内容, IoTSharp 收到此请求则调用规则链, 你可以在规则链中处理此请求, 关于规则链请查看相关章节。

  1. devices/{设备名称}/rpc/request/{方法名称}

设备名称这里如果是直连设备, 则为me, 如果是网关设备, 则是设备名称, {方法名称}用于区别调用了何种方法, 这里交由规则链处理。 通过规则链, 你可以调用 内部服务, 也可以调用外部服务等, 发挥你的想象就好。

发起下行RPC远程控制

下行RPC是指平台端或者第三方服务调用IoTSharp进行远程控制终端设备的方法。

通过MQTT发起时, 先订阅response, 然后发布request。

  1. devices/{设备名称}/rpc/request/{方法名称}/{请求唯一标识}
  2. devices/{设备名称}/rpc/response/{方法名称}/{请求唯一标识}

第三方服务调用时我们建议通过通过 Web Api 发起, 示例如下

  1. curl -X 'POST' \
  2. 'https://cloud.iotsharp.net/api/Devices/{设备的TOKEN}/Rpc/{方法名称}?timeout={超时时间}' \
  3. -H 'accept: application/json' \
  4. -H 'Content-Type: application/json' \
  5. -d '"{参数, 可以是json}"'