1.设备入网
设备上报的通用入网Topic:/sys/device/join 智能设备在进行正式的数据通信之前,必须先向 IoT 平台请求入网。设备应主动与IoT 平台建立 TCPSocket 链接。在成功建立链接后,设备必须向平台发送请求入网数据帧,以让平台为设备分配通信资源;否则平台将拒绝与设备进行通信。 请求入网数据帧使用的Command 为 2;数据帧格式和内容如下所示: { "MessageId" : 1231, "HeaderCtrl":2, //命令码 "Mode":0, //0:不加密, 1:加密 "Nonce":10, //1-128 随机数 "Payload":{ "OpenID":"E0C040B1", "ProductID":"A4BC6002", "NodeEui":"....", //设备标识 "ClientID":"....", //认证后返回的 ClientID "Type":0,//0:一型一密免注册,1:一型一密预注册,2:一机一密预注册 "Sign":"FE448731" } } 设备向 IoT 平台发起的入网请求数据帧中包含了 Payload 域,用于携带额外的信息。 Payload 域中包含的内容及说明如下所示: | 硬件设备所属厂商的唯一标识 ID,固定 8 位 16 进制字符串并由 IoT 平台分配。 | | 硬件设备所属产品的唯一标识 ID,固定 8 位 16 进制字符串并由 IoT 平台分配。 | | 智能硬件设备的唯一标识 ID,可以根据不同的应用场景,由 IoT 平台、硬件设备所属厂商 或者应用集成商来分配. | | 硬件设备类型,0:一型一密免注册,1:一型一密预注册,2:一机一密预注册 | | 硬件设备向IoT平台请求入网的时候,使用加密算法对特定字段进行加密运算所生成的数据, 提交给平台。平台据此判断是否允许该设备入网 |
平台收到入网请求后,根据当前产品类型是免注册还是预注册,重新计算Sign 并与设备上报的 Sign 值进行对比,不同类型设备的Sign 计算规则详见第二小节 平台收到智能设备的入网请求数据帧并成功认证设备身份后,会为该设备分配通信资源 ,然后使用同样的Command(2)响应设备 。IoT平台返回Topic: /sys/{openId}/{productId}/{deviceId}/downlink,响应智能设备入网请求的数据如下: {"HeaderCtrl":2, //命令码 "MessageId": 1231, "Mode":0,//0:不加密, 1:加密 "Nonce":10,//1-128 随机数 "Payload":{ "Code":0, "SessionID":"4655434B" } } Join 指令的Code 说明: 对于智能设备请求入网指令(Join),Code定义为平台回复设备的入网请求的响应码。 响应码定义如下表所示: | | 0 | 入网请求处理成功:表示 IoT 平台成功处理请求并成功为设备分配通 信资源,允许设备入网。 | 1 | 入网请求处理失败:IoT 平台系统繁忙,暂时无法处理入网请求。建 议智能设备重试。 | 2 | 入网请求处理失败:入网所使用的产品未注册,无法处理入网请求。 建议检查 OpenID 和 ProductID 是否正确。 | 3 | 入网请求处理失败:设备入网请求的签名(Sign)值不正确。建议 检查 ProductKey 是否正确,或者签名算法是否使用正确。 | 4 | | 5 | 参数 type 错误,请检查 type 参数和,后台产品 type 一致 |
如果智能设备发送了入网请求,等待超时后没有收到平台的任何回复,则有可能是网络 问题导致数据丢失,建议检查网络并重试。只有响应码(Code)值为0 的时候,响应数据中的 Payload 中所携带的SessionID 才是 IoT 平台分配的有效的SessionID: | | SessionID | 后续跟 IoT 平台进行通信的会话 ID,用于计算应用数据的加密密钥 SessionKey;如果使用非加密模式可以忽略此值。 |
设备成功入网后,IoT 平台返回了 SessionID。设备需要使用入网安全密钥 ProductKey 和本次回复中的随机数 Nonce 来计算生成后续与 IoT 平台进行通信过程中用于加密用户应 用数据的密钥(SessionKey),计算方法如下描述(伪代码): 加密方式:AES128_ECB_PKCS5PaddingSessionKey = ENCRYPT( ProductKey , SessionID + Nonce); 示例如下: ProductKey :A0 1A 24 79 67 25 73 DF 84 53 7D F4 C7 3D 3F CC SessionID:46 55 43 4B Nonce(123):7B 则拼接结果为:46 5543 4B 7B 加密运算结果为:40 8C79 0F 85 BF 60 E6 D4 F1 C1 3C 6A 5C 4C 8B SessionKey =408C790F85BF60E6D4F1C13C6A5C4C8B 如果使用非加密模式进行应用数据的传输,则可以忽略此步骤,即不需要计算 SessionKey 的值。 特别注意:智能设备的入网请求数据如果设置了Mode 为1,则平台会在设备心跳和设备数据上行时检查设备的 SessionKey 是否过期,如果平台监测到设备的 SessionKey 过期,则会主动更新设备 SessionKey 并下发给设备;如果入网请求数据设置了 Mode 位为 0,则平台不会检查设备的 SessionKey 是否过期。 备注: 设备每次与 IoT 平台建立新的 MQTT 链接后(首次连接或者断线重连),都必须向平台重新请求入网,否则平台将拒绝与设备进行通信。 2. 2. 入网sing值计算2.1 一型一密免注册加密方式:AES128_ECB_PKCS5Padding Sign = AES128(ProductKey, OpenID + ProductID +NodeEui + Nonce); 示例如下: ProductKey(十六进制):A0 1A 24 79 67 25 73 DF 84 53 7D F4C7 3D 3F CC OpenID(十六进制):11 15 43 4B ProductID(十六进制):11 1E 1B C8 NodeEui(11100001):31 31 31 30 30 30 30 31 (十六进制) Nonce(123):7B (十六进制) 则拼接结果为:11 1543 4B 11 1E 1B C8 31 31 31 30 30 30 30 31 7B 加密运算结果为: 5A59C8629543138F2479A2D482CE8CA3FA55300DC69B40A93516DE439425E757 则Sign值为运算结果高4bytes:5A 59 C8 62 2.2 一型一密预注册 or 一机一密预注册加密方式:AES128_ECB_PKCS5Padding Sign = AES128(ProductKey, OpenID + ProductID +DeviceSecret + Nonce); 示例如下: ProductKey(十六进制):A0 1A 24 79 67 25 73 DF 84 53 7D F4C7 3D 3F CC OpenID(十六进制):11 15 43 4B ProductID(十六进制):11 1E 1B C8 DeviceSecret(十六进制): F2 05 C3 81 36 60 A0 8A BB 8A 87 90 FA 3F A3 BA Nonce(123):7B (十六进制) 则拼接结果为: 11 15 43 4B 11 1E 1B C8 F2 05 C3 81 36 60 A0 8A BB8A 87 90 FA 3F A3 BA 7B 加密运算结果为: 611A805300FF5DA40DE11A9C6647FB30CA1447621F415393974DD7C9A76595F9 则Sign值为运算结果高4bytes:61 1A 80 53
3. AT示例流程AT+MQTTCFG="host",0,"mqtt.xiot.senthink.com",1883
OK
AT+MQTTCFG="clientid",0,"B6E092A55**********6D694AD5"
OK
[11:31:16.270]发→◇AT+MQTTCONN=0,0,0,"5D*****E-3******9-865186*********","6387**********F9A0*******051"
+MQTTCONNACK: 0,0,0
OK
AT+MQTTSUB=0,1,"/sys/5D*****E/3*******9/865186*******/downlink",1
+MQTTSUBACK: 0,1,0
OK AT+MQTTPUB=0,1,0,0,"/sys/device/join","{"MessageId":1231,"HeaderCtrl": 2,"Mode": 1,"Nonce":123,"Payload": {"OpenID": "5D*****E","ProductID": "3*******9","NodeEui":"865186*******","ClientID":"B6E092A55**********6D694AD5", "Type":2,"Sign": "1fb6a0da"}}"
[11:40:42.489]收←◆ +MQTTPUBACK: 0,1,0
OK
+MQTTRECV:0,3,1,0,/sys/5D*****E/3*******9/865186*******/downlink,{"HeaderCtrl":2,"Mode":1,"Nonce":14,"Payload":{"Code":0,"SessionID":"75FC7DC3"},"MessageId":1231}
AT+MQTTPUB=0,1,0,0,"/sys/5D*****E/3*******9/865186*******/uplink","{"MessageId" :1231,"HeaderCtrl":4,"Mode":1,"Nonce":10,"Payload":"CB96395F5065FD121D88B1593EFE"}"
+MQTTPUBACK: 0,1,0
OK
+MQTTRECV:0,4,1,0,/sys/5D*****E/3*******9/865186*******/downlink,{"MessageId":1231,"HeaderCtrl":4,"Code":"200","Msg":"SUCCESS"}
+MQTTRECV:0,5,1,0,/sys/5D*****E/3*******9/865186*******/downlink,{"HeaderCtrl":7,"Mode":0,"Nonce":48,"Payload":"wwdwdwd","MessageId":751504437} 备注: 设备上报数据可在运行日志中查看;下发透传数据可在在线调试中实现。 |