diff --git "a/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/\345\274\200\345\217\221\345\211\215\345\207\206\345\244\207.md" "b/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/\345\274\200\345\217\221\345\211\215\345\207\206\345\244\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..b2a42e0811d8c0f261463b9cef54c05b8ff8ea3c --- /dev/null +++ "b/\345\233\275\346\260\221\345\267\245\344\275\234\350\277\233\345\261\225\345\221\250\346\212\245/\345\274\200\345\217\221\345\211\215\345\207\206\345\244\207.md" @@ -0,0 +1,64 @@ +# 开发前准备 +## 1. 设备需要与服务器交换的字段 +a. SN码————设备的唯一标识 + +b. 设备的类型 + + I. 传感器型 + II. 门禁型 + III. 智能互联设备 + +c. DH密钥交换——得到通信的对称密钥 + +d. 用于双方数字签名的公钥 + + + +## 2. 注册过程 + +1. 设备主动向服务器发起注册请求 +2. 设备生成公私钥对,并将公钥发送给服务器(一次发送) +3. 服务器收到注册信息后,也生成公私钥对,并将公钥发送给设备(二次发送) +4. 设备收到服务器发送的公钥后,此时双方利用对方的公钥以及自身的私钥结合,生成相同的对称密钥 +5. 设备利用得到的对称密钥发送测试数据给服务器(三次发送) +6. 服务器验签,确认对称密钥可以解密并且双方公钥没有被篡改,注册成功,发送验证成功回调给设备(四次发送) +7. 设备将服务器发送的公钥,以及自己的私钥,以及得到的对称密钥存放起来。 +8. 服务器将设备发送的公钥,以及自己的私钥,以及得到的对称密钥存放起来。 + + +## 3. 通信过程 + +1. 组成消息体的基本结构 +```json +{ + "type": 0, + "topic": "temperture", + "payload": "35.8", + "timestamp": 1641611982391, + "SNNo": "device000001" +} +``` + +| 字段名 | 类型 | 注释 | +| --- | --- | --- | +| type | int | 类型: 0为通信信息,1为注册信息 | +| topic | str | 上传消息的主题 | +| payload | str | 消息内容主体 | +| timestamp | int | 时间戳 | +| SNNo | str | 设备唯一标识SN码 | + +2. 利用对称密钥对消息体进行加密 +3. 加密后的消息内容取哈希后利用私钥加密,结合加密后的消息内容一并发送 +```json +{ + "plain": "加密后的内容", + "sign": "签名后的内容" +} +``` +4. 接收方取得消息后验签,确认消息合法性后,在执行后续操作 + +5. PS: 发送消息时,MQTT主题需带上自己的设备号信息,以供接收方确认发送方消息 + + 如设备device001发送信息,则发布主题应为 /device001/message + +