การเชื่อมต่ออุปกรณ์ด้วยโปรโตคอล Mqtt

ภาพรวมหน้านี้
ทางเข้าการเชื่อมต่อและขั้นตอนขั้นต่ำ
- สร้างและเผยแพร่ผลิตภัณฑ์ MQTT ในการจัดการผลิตภัณฑ์ ยืนยัน product ID, หมายเลขอุปกรณ์, บัญชี MQTT, รหัสผ่าน และรหัสอนุญาตอุปกรณ์
- อุปกรณ์หรือ MQTTX ใช้
clientId,userName,passwordที่กำหนดเชื่อมต่อกับบริการ MQTT - หลังเชื่อมต่อสำเร็จ ให้เผยแพร่
/info/postก่อน แล้วจึงเผยแพร่/property/postหรือ/event/post - ฝั่งแพลตฟอร์มยืนยันวงปิดของเส้นทางผ่านสถานะการทำงาน บันทึกเหตุการณ์ บันทึกคำสั่ง และกฎฉากในหน้ารายละเอียดอุปกรณ์
1. ขั้นตอนการเชื่อมต่อ
提示
- ซอร์สโค้ด SDK ฮาร์ดแวร์ ESP8266 สำหรับอ้างอิง FastBee Arduino SDK
- หากรูปแบบข้อความ Mqtt ของอุปกรณ์เป็นแบบคงที่ สามารถส่งต่อผ่าน Rule Engine เพื่อปรับเข้ากับแพลตฟอร์มได้
- netty-mqtt ในตัวของระบบ: รองรับการส่งต่อหัวข้อและเนื้อหา
- ใช้มิดเดิลแวร์ emqx: รองรับการส่งต่อเนื้อหา ส่วนหัวข้อสามารถส่งต่อผ่าน Rule Engine ในตัวของ emqx
1. การยืนยันตัวตนอุปกรณ์
- การยืนยันตัวตนแบบเข้ารหัส (แนะนำ)
- การยืนยันตัวตนแบบง่าย
2. การโต้ตอบของอุปกรณ์
- เผยแพร่หัวข้อ Mqtt ที่เกี่ยวกับ Thing Model ข้อมูลอุปกรณ์ และการซิงโครไนซ์เวลา
- สมัครรับหัวข้อ Mqtt ที่เกี่ยวกับ Thing Model การอัปเกรดอุปกรณ์ และการซิงโครไนซ์เวลา
3. การตั้งค่าเครือข่ายแบบ AP ของอุปกรณ์ (ไม่บังคับ เฉพาะอุปกรณ์ประเภท Wifi)
- อินเทอร์เฟซตรวจจับอุปกรณ์
- อินเทอร์เฟซกำหนดค่าอุปกรณ์
2. การยืนยันตัวตนอุปกรณ์
提示
- ประเภทการยืนยันตัวตน: S=การยืนยันตัวตนแบบง่าย, E=การยืนยันตัวตนแบบเข้ารหัส
- เมื่อผลิตภัณฑ์เปิดใช้รหัสอนุญาตอุปกรณ์ รหัสอนุญาตต้องไม่ว่าง
- User ID คือ ID ของผู้ใช้ที่เข้าสู่ระบบ การใช้ User ID ต่างกันทำให้อุปกรณ์เป็นของผู้ใช้คนละคน สามารถใช้บัญชี admin หมายเลข 1 ร่วมกัน แล้วค่อยจัดสรรอุปกรณ์ให้ผู้ใช้ต่าง ๆ ผ่านการตั้งค่าเครือข่ายหรือสแกนโค้ดภายหลัง
- หมายเลขอุปกรณ์มีสองวิธีในการรับ: 1. ใช้หมายเลขอุปกรณ์ที่ระบบสร้างเมื่อสร้างอุปกรณ์; 2. หากระบบไม่ได้สร้างอุปกรณ์ไว้ ฝั่งฮาร์ดแวร์สร้างหมายเลขเฉพาะเป็นหมายเลขอุปกรณ์ หลังยืนยันตัวตน ระบบจะลงทะเบียนเอนทิตีอุปกรณ์โดยอัตโนมัติ (เมื่อมีอุปกรณ์จำนวนมาก แนะนำวิธีนี้)
1. การยืนยันตัวตนแบบเข้ารหัส
รับหมายเลขผลิตภัณฑ์ บัญชี Mqtt รหัสผ่าน Mqtt และคีย์ผลิตภัณฑ์จากรายละเอียดผลิตภัณฑ์ รหัสผ่านถูกเข้ารหัส AES ด้วยคีย์ผลิตภัณฑ์แล้วส่งไปยังแบ็กเอนด์ แบ็กเอนด์ถอดรหัสด้วยคีย์ผลิตภัณฑ์เพื่อยืนยันตัวตน การเชื่อมต่อเซิร์ฟเวอร์ข้อความ Mqtt ต้องระบุ client ID, ชื่อผู้ใช้ และรหัสผ่านที่ไม่ซ้ำ รูปแบบโดยละเอียดมีดังนี้:
# client ID เท่ากับ ประเภทการยืนยันตัวตน + หมายเลขอุปกรณ์ + หมายเลขผลิตภัณฑ์ + user ID
clientId = E & deviceNumber & productId & userId
# ชื่อผู้ใช้
userName = fastbee
# รหัสผ่าน
password = รหัสผ่าน mqtt & เวลาหมดอายุ
password = รหัสผ่าน mqtt & เวลาหมดอายุ & รหัสอนุญาตอุปกรณ์ (รูปแบบเมื่อผลิตภัณฑ์เปิดใช้การอนุญาตอุปกรณ์)- Client ID เท่ากับ ประเภทการยืนยันตัวตน + หมายเลขอุปกรณ์ + หมายเลขผลิตภัณฑ์ + User ID เชื่อมด้วยเครื่องหมาย
&ไม่มีช่องว่างระหว่างกัน; - ชื่อผู้ใช้กรอกบัญชี Mqtt โดยตรง
- รหัสผ่านเท่ากับ รหัสผ่าน Mqtt + เวลาหมดอายุของรหัสผ่าน + รหัสอนุญาตอุปกรณ์ (ไม่บังคับ) แล้วเข้ารหัส AES เพื่อความปลอดภัย เวลาหมดอายุของรหัสผ่านควรอยู่ภายใน 24 ชั่วโมง ใช้รูปแบบการประทับเวลา ละเอียดถึงมิลลิวินาที
ตัวอย่างข้อมูลการกำหนดค่าบัญชี:
clientId = "E&D68329VL588&2&1"
userName = "fastbee"
password = "/W2A/4MK+9cEGBhyBDgr2K5c62DAjAK4m0b5pvwxX6FFMzI3h1pUmaDY3BH1P2mI"2. การยืนยันตัวตนแบบง่าย
รับบัญชี Mqtt และรหัสผ่าน Mqtt จากรายละเอียดผลิตภัณฑ์ แนะนำใช้ในสภาพแวดล้อมทดสอบ รูปแบบ client ID ของ Mqtt คล้ายกับการยืนยันตัวตนแบบเข้ารหัส เพียงเปลี่ยน E เป็น S
# client ID เท่ากับ ประเภทการยืนยันตัวตน + หมายเลขอุปกรณ์ + หมายเลขผลิตภัณฑ์ + user ID
clientId = S & deviceNumber & productId & userId
# ชื่อผู้ใช้
userName = fastbee
# รหัสผ่าน
password = รหัสผ่าน mqtt
password = รหัสผ่าน mqtt & รหัสอนุญาตอุปกรณ์ (รูปแบบเมื่อผลิตภัณฑ์เปิดใช้การอนุญาตอุปกรณ์)ตัวอย่างข้อมูลการกำหนดค่าบัญชี:
# client ID เท่ากับ ประเภทการยืนยันตัวตน + หมายเลขอุปกรณ์ + หมายเลขผลิตภัณฑ์ + user ID
clientId = "S&D68329VL588&2&1"
userName = "fastbee"
password = "PHYFED93WSFF1DAS"
password = "PHYFED93WSFF1DAS&ADBFCC8934864B26B55658C66F562AC5" (รูปแบบเมื่อผลิตภัณฑ์เปิดใช้การอนุญาตอุปกรณ์)3. อุปกรณ์รับเวลาปัจจุบัน
หากต้องการรับเวลาปัจจุบัน สามารถเรียกอินเทอร์เฟซเวลา NTP ของระบบ เมื่อร้องขออินเทอร์เฟซให้ส่งจำนวนมิลลิวินาทีที่อุปกรณ์ทำงานอยู่ ระบบจะส่งกลับเวลาที่อุปกรณ์ส่ง เวลาที่เซิร์ฟเวอร์รับ และเวลาที่เซิร์ฟเวอร์ส่ง จากนั้นรับจำนวนมิลลิวินาทีที่อุปกรณ์ทำงานอยู่เป็นเวลารับของอุปกรณ์ สุดท้ายใช้สูตรคำนวณเวลาปัจจุบันของอุปกรณ์ เวลาต้องมีหน่วยเป็นมิลลิวินาที เครื่องมือการประทับเวลาออนไลน์
# ค่า deviceSendTime คือจำนวนมิลลิวินาทีที่อุปกรณ์ทำงานอยู่
http://localhost:8080/iot/tool/ntp?deviceSendTime=35768
# การคำนวณเวลา
เวลาปัจจุบันของอุปกรณ์ = (เวลาที่เซิร์ฟเวอร์รับ + เวลาที่เซิร์ฟเวอร์ส่ง + เวลาที่อุปกรณ์รับ - เวลาที่อุปกรณ์ส่ง) / 24. คำอธิบายการเข้ารหัส AES
ใช้โหมดการเข้ารหัส CBC ของ AES ค่า offset คงที่เป็น wumei-smart-open 16 บิต ผลลัพธ์เป็น Base64 รหัสผ่านที่ใช้เข้ารหัสคือคีย์ผลิตภัณฑ์ สำหรับการทดสอบสามารถใช้: เครื่องมือเข้ารหัส/ถอดรหัสออนไลน์
โหมดเข้ารหัส: CBC
Padding: pkcs5padding
บล็อกข้อมูล: 128 บิต
ค่า offset: wumei-smart-open
ผลลัพธ์: base64
รหัสผ่าน: คีย์ผลิตภัณฑ์ของระบบที่สอดคล้องกัน
เนื้อหาที่เข้ารหัส: รหัสผ่าน mqtt & expireTime & รหัสอนุญาต(ไม่บังคับ)3. การโต้ตอบของอุปกรณ์
{productId} แทน product ID, {deviceNum} แทนหมายเลขอุปกรณ์ รับ product ID และหมายเลขอุปกรณ์ผ่านฝั่งเว็บ หากใช้การเพิ่มอุปกรณ์อัตโนมัติ หมายเลขอุปกรณ์สามารถใช้รหัสเฉพาะหรือที่อยู่ MAC ของอุปกรณ์ หลังอุปกรณ์ยืนยันตัวตนสำเร็จ แบ็กเอนด์จะเพิ่มเอนทิตีอุปกรณ์ที่สอดคล้องกันโดยอัตโนมัติ
1. หัวข้อที่สมัครรับ
| หัวข้อ | คำอธิบาย |
|---|---|
| /{productId}/{deviceNum}/function/get | สมัครรับคำสั่งจากแพลตฟอร์ม |
| /{productId}/{deviceNum}/info/get | สมัครรับข้อมูลอุปกรณ์ (เมื่อสมัครรับหัวข้อนี้ให้เผยแพร่ข้อมูลอุปกรณ์) |
| /{productId}/{deviceNum}/monitor/get | สมัครรับสัญญาณตรวจสอบแบบเรียลไทม์ (ตามจำนวนครั้งและช่วงเวลาของการตรวจสอบ แล้วเผยแพร่ข้อมูลตรวจสอบ) |
| /{productId}/{deviceNum}/ntp/get | สมัครรับการซิงโครไนซ์เวลา (ไม่บังคับ ใช้ซิงโครไนซ์เวลาปัจจุบันของอุปกรณ์) |
| /{deviceNum}/http/upgrade/set | สมัครรับการอัปเกรด OTA แบบ HTTPS (ใหม่) |
| /{deviceNum}/fetch/upgrade/set | สมัครรับการอัปเกรด OTA แบบแพ็กเกจไบนารี (ใหม่) |
| /{productId}/{deviceNum}/ota/get | สมัครรับการอัปเกรดอุปกรณ์ (เก่า) |
| /{productId}/{deviceNum}/property/get | เลิกใช้ใน 2.x สมัครรับคุณสมบัติ (เซิร์ฟเวอร์เผยแพร่ อุปกรณ์สมัครรับ) |
| /{productId}/{deviceNum}/property-online/get | เลิกใช้ใน 2.x สมัครรับคุณสมบัติ (โหมดออนไลน์ ฝั่งผู้ใช้เผยแพร่ อุปกรณ์สมัครรับ) |
| /{productId}/{deviceNum}/function-online/get | เลิกใช้ใน 2.x สมัครรับฟังก์ชัน (โหมดออนไลน์ ฝั่งผู้ใช้เผยแพร่ อุปกรณ์สมัครรับ) |
2. หัวข้อที่เผยแพร่
| หัวข้อ | คำอธิบาย |
|---|---|
| /{productId}/{deviceNum}/property/post | เผยแพร่ข้อมูล (แสดงแบบเรียลไทม์ ข้อมูลคุณสมบัติ/ฟังก์ชันและข้อมูลตรวจสอบ รายงานข้อมูลตรวจสอบตามเวลาได้) |
| /{productId}/{deviceNum}/info/post | เผยแพร่ข้อมูลอุปกรณ์ |
| /{productId}/{deviceNum}/event/post | เผยแพร่เหตุการณ์ |
| /{productId}/{deviceNum}/monitor/post | เผยแพร่ข้อมูลตรวจสอบแบบเรียลไทม์ (ใช้สำหรับแสดงกราฟตรวจสอบเรียลไทม์เท่านั้น ไม่จัดเก็บ) |
| /{productId}/{deviceNum}/ntp/post | เผยแพร่การซิงโครไนซ์เวลา (ไม่บังคับ) |
| /{deviceNum}/http/upgrade/reply | ตอบกลับการอัปเกรด OTA แบบ HTTPS (ใหม่) |
| /{deviceNum}/fetch/upgrade/reply | ตอบกลับการอัปเกรด OTA แบบแพ็กเกจไบนารี (ใหม่) |
| /{productId}/{deviceNum}/upgrade/reply | ตอบกลับการอัปเกรด OTA (เก่า) |
| /{productId}/{deviceNum}/function/post | เลิกใช้ใน 2.x เผยแพร่ฟังก์ชัน (แสดงแบบเรียลไทม์) |
3. รูปแบบข้อมูล
อุปกรณ์และระบบแลกเปลี่ยนข้อมูลในรูปแบบ JSON
- สมัครรับข้อมูลอุปกรณ์ หัวข้อที่สอดคล้อง:
/info/get
# คำอธิบาย: เมื่อสมัครรับข้อมูลอุปกรณ์ ให้เผยแพร่ข้อมูลอุปกรณ์ เพื่อแก้ปัญหาการซิงโครไนซ์สถานะอุปกรณ์
# เนื้อหาข้อความของอุปกรณ์ว่างเปล่า- เผยแพร่ข้อมูลอุปกรณ์ หัวข้อที่สอดคล้อง:
/info/post
# คำอธิบาย: 1. อุปกรณ์เผยแพร่ข้อมูลอุปกรณ์หลังเปิดเครื่อง; 2. อุปกรณ์เผยแพร่ข้อมูลอุปกรณ์หลังได้รับคำสั่งขอข้อมูลอุปกรณ์
# rssi สัญญาณอุปกรณ์ (สัญญาณดีมาก[-55— 0], สัญญาณดี[-70— -55], สัญญาณปานกลาง[-85— -70], สัญญาณแย่[-100— -85])
# status สถานะอุปกรณ์ คงที่เป็น 3 หมายถึงออนไลน์
# firmwareVersion เวอร์ชันเฟิร์มแวร์
# userId ID ของผู้ใช้ ตั้งเป็น user ID 1 (ผู้ดูแล) ได้ เมื่อตั้งค่าเครือข่ายจะจัดสรรอุปกรณ์ให้ผู้ใช้ที่เจาะจง
# longitude ไม่บังคับ ลองจิจูด ต้องอัปโหลดเมื่อใช้การระบุตำแหน่งอุปกรณ์
# latitude ไม่บังคับ ละติจูด ต้องอัปโหลดเมื่อใช้การระบุตำแหน่งอุปกรณ์
# iccid ไม่บังคับ หมายเลข ICCID ของซิม IoT อัปโหลดเมื่ออุปกรณ์ใช้ซิม IoT
# cardPlatformId ไม่บังคับ สอดคล้องกับหมายเลขแพลตฟอร์มซิมในการจัดการซิม IoT อัปโหลดเมื่ออุปกรณ์อัปโหลดหมายเลข ICCID หากไม่อัปโหลด ระบบจะวนค้นหาทุกแพลตฟอร์มซิมโดยค่าเริ่มต้น
# summary ไม่บังคับ สรุป ข้อมูลการกำหนดค่าของอุปกรณ์ ฯลฯ รูปแบบ json อ็อบเจกต์กำหนดเองได้
{
"rssi": -43,
"firmwareVersion": 1.2,
"status": 3,
"userId": 2,
"longitude": 0,
"latitude": 0,
"iccid": 898604293620C0000970,
"cardPlatformId": 0,
"summary": {
"name": "FastBee",
"chip": "ESP8266",
"author": "fastbee",
"deliveryTime": "2023-06-06",
"activeTime": "2022-10-01"
}
}- สมัครรับการตรวจสอบแบบเรียลไทม์ หัวข้อที่สอดคล้อง:
/monitor/get
# คำอธิบาย: สมัครรับข้อความตรวจสอบแบบเรียลไทม์ เผยแพร่ข้อมูลตรวจสอบแบบเรียลไทม์ตามจำนวนและช่วงเวลา
# count จำนวน
# interval ช่วงเวลา หน่วยเป็นมิลลิวินาที
{
"count": 60,
"interval": 1000
}- เผยแพร่การตรวจสอบแบบเรียลไทม์ หัวข้อที่สอดคล้อง:
/monitor/post
# คำอธิบาย: เผยแพร่ข้อมูลตรวจสอบตามจำนวนและช่วงเวลาที่ระบุจากข้อความตรวจสอบแบบเรียลไทม์ที่สมัครรับ
# id ตัวระบุ การตรวจสอบแบบเรียลไทม์เป็นคุณสมบัติใน Thing Model ดูตัวระบุในรายละเอียดผลิตภัณฑ์ สอดคล้องกับค่า id
# value ค่าที่อุปกรณ์รวบรวม ได้เฉพาะจำนวนเต็มหรือทศนิยม ส่งผ่านเป็นชนิดสตริง
# remark ว่างได้หรือใช้เวลาปัจจุบันของอุปกรณ์
[{
"id": "temperature",
"value": "27.43",
"remark": ""
}, {
"id": "humidity",
"value": "32.18",
"remark": ""
}]- สมัครรับคำสั่งจากแพลตฟอร์ม หัวข้อที่สอดคล้อง:
/function/get
# คำอธิบาย: คุณสมบัติ ฟังก์ชัน และเหตุการณ์ล้วนอยู่ใน Thing Model นิยาม Json เหมือนกัน ตัวอย่างเช่น เมื่อสมัครรับข้อความเปิดสวิตช์ อุปกรณ์ต่างก็ประมวลผลโดยเปิดสวิตช์
# id ตัวระบุ ดู Thing Model ในรายละเอียดผลิตภัณฑ์ สอดคล้องกับตัวระบุของ Thing Model
# value ค่า สอดคล้องกับนิยามใน Thing Model ส่งผ่านเป็นชนิดสตริง
# remark คำสั่งที่แจ้งเตือน Scene Linkage และการส่งลงตามเวลาบนแพลตฟอร์มมีข้อมูลหมายเหตุ
[{
"id": "gear",
"value": "1",
"remark": "ตั้งเวลาอุปกรณ์"
},{
"id": "switch",
"value": "0",
"remark": "ทริกเกอร์จาก Scene Linkage"
}]- เผยแพร่ข้อมูลและเหตุการณ์ หัวข้อที่สอดคล้อง:
/property/post,/event/post
# คำอธิบาย: คุณสมบัติ ฟังก์ชัน และเหตุการณ์ล้วนอยู่ใน Thing Model นิยาม Json เหมือนกัน หากค่าของ `value` เป็นชนิดบูลีน ค่าคือ "0" หรือ "1" แทนเปิด/ปิด; ชนิด enum สอดคล้องกับค่าคีย์ของรายการ enum (เช่น "1" แทนระดับความเร็วกลาง); ชนิดอาร์เรย์เป็นสตริงคั่นด้วยเครื่องหมายจุลภาคแบบอังกฤษ
# id ตัวระบุ ดู Thing Model ในรายละเอียดผลิตภัณฑ์ สอดคล้องกับตัวระบุของ Thing Model
# value ค่า สอดคล้องกับนิยามใน Thing Model ส่งผ่านเป็นชนิดสตริง
# remark ใช้ข้อมูลหมายเหตุที่สมัครรับได้โดยตรง ดูหมายเหตุนี้ได้ในข้อมูลบันทึกอุปกรณ์
[{
"id": "gear",
"value": "1",
"remark": "ตั้งค่าระดับสำเร็จ"
}, {
"id": "switch",
"value": "0",
"remark": "ปิดสวิตช์แล้ว"
}]คำอธิบาย Thing Model ที่เกี่ยวข้อง
- ID (ตัวระบุ) ของ Thing Model ทั้งหมดไม่ซ้ำกัน พยายามอย่าใช้อักขระพิเศษ ใช้ตัวอักษรและตัวเลขเป็นหลัก
- รูปแบบ ID (ตัวระบุ) โมเดลย่อยภายใต้ Thing Model ชนิดอ็อบเจกต์: parentId_childId ชนิดอาร์เรย์อ็อบเจกต์ก็เช่นกัน ID โมเดลย่อยเพิ่ม ID ของระดับแม่คั่นด้วยขีดล่าง เช่น:
# ID Thing Model ระดับแม่: power
# ID Thing Model ระดับลูก: power_light- Thing Model ชนิดอาร์เรย์ (รวมถึงชนิดอาร์เรย์อ็อบเจกต์) มี ID (ตัวระบุ) เพียงตัวเดียว ค่าของ Thing Model เป็นอาร์เรย์ (จัดเก็บเป็นสตริงคั่นด้วยเครื่องหมายจุลภาคแบบอังกฤษ) เช่น สตริง
98,100,50ดังนั้นการรายงานคุณสมบัติ/ฟังก์ชัน/เหตุการณ์ชนิดอาร์เรย์จึงค่อนข้างพิเศษ ID (ตัวระบุ) ต้องขึ้นต้นด้วยarray_indexindex เป็นตัวเลขสองหลัก เช่น:shell# รูปแบบอาร์เรย์ธรรมดา `array_00_RGB` # รูปแบบอาร์เรย์อ็อบเจกต์ `array_00_power_switch` # index 00 แทนองค์ประกอบแรกในอาร์เรย์ 02 / 03 ... 98 / 99 เรียงตามนี้ ความยาวอาร์เรย์ต้องไม่เกิน 100 [{ "id": "array_01_power_switch", // array_01 เป็นคำนำหน้า แทนองค์ประกอบที่สองในอาร์เรย์ "value": "1", "remark": "" }]
- เผยแพร่การซิงโครไนซ์เวลา หัวข้อที่สอดคล้อง:
/ntp/post
# คำอธิบาย: ไม่บังคับ เผยแพร่ข้อความซิงโครไนซ์เวลา เมื่อเซิร์ฟเวอร์สมัครรับแล้วจะส่งข้อความซิงโครไนซ์เวลาลง
# deviceSendTime เวลาที่อุปกรณ์ส่ง
{
"deviceSendTime": "1592361428000"
}- สมัครรับการซิงโครไนซ์เวลา หัวข้อที่สอดคล้อง:
/ntp/get
# คำอธิบาย: ไม่บังคับ เมื่อสมัครรับข้อความซิงโครไนซ์เวลา คำนวณเวลาปัจจุบัน = (เวลาที่เซิร์ฟเวอร์รับ + เวลาที่เซิร์ฟเวอร์ส่ง + เวลาที่อุปกรณ์รับ - เวลาที่อุปกรณ์ส่ง) / 2
# deviceSendTime เวลาที่อุปกรณ์ส่ง
# serverRecvTime เวลาที่เซิร์ฟเวอร์รับ
# serverSendTime เวลาที่เซิร์ฟเวอร์ส่ง
{
"deviceSendTime": "1592361428000",
"serverSendTime": "1592366463548",
"serverRecvTime": "1592366463548"
}- สมัครรับการอัปเกรด OTA หัวข้อที่สอดคล้อง:
/http/upgrade/setหรือ/fetch/upgrade/set
# คำอธิบาย: เมื่อสมัครรับข้อความอัปเกรดอุปกรณ์ ดาวน์โหลดเฟิร์มแวร์ผ่านคำขอ Http ตามที่อยู่ดาวน์โหลดเฟิร์มแวร์ แล้วอัปเกรด
# version หมายเลขเวอร์ชัน ใช้จับคู่เวอร์ชันเฟิร์มแวร์ได้
# downloadUrl ที่อยู่ดาวน์โหลดเฟิร์มแวร์
{
"taskId": 26,
"url": "/profile/iot/1/2024-0824-001954.bin",
"version": 1.2,
"status": 1
}4. การตั้งค่าเครือข่ายของอุปกรณ์ (ไม่บังคับ เฉพาะอุปกรณ์ประเภท Wifi)
提示
- อุปกรณ์ใช้การตั้งค่าเครือข่ายแบบ AP ขณะตั้งค่าเครือข่าย อุปกรณ์เปิดฮอตสปอตและให้บริการเว็บ ฝั่งมือถือส่งข้อมูลการกำหนดค่าผ่านบริการเว็บที่อุปกรณ์จัดเตรียม
- ที่อยู่ฮอตสปอตฝั่งอุปกรณ์ตั้งเป็น: 192.168.4.1
- อ้างอิง SDK ของโปรเจกต์ได้
1. อินเทอร์เฟซตรวจจับอุปกรณ์
ฝั่งอุปกรณ์มีอินเทอร์เฟซตรวจจับ ฝั่งมือถือใช้อินเทอร์เฟซนี้ทำฟังก์ชันค้นพบอุปกรณ์ เหมาะกับการตั้งค่าเครือข่ายอุปกรณ์เดียว
# เมธอดคำขอ: Get
# ที่อยู่อินเทอร์เฟซ: http://192.168.4.1/status
# พารามิเตอร์: ไม่มี
# ข้อมูลตอบกลับ: รหัสสถานะ HTTP 200 หมายถึงตรวจพบอุปกรณ์2. อินเทอร์เฟซกำหนดค่า
ฝั่งอุปกรณ์มีอินเทอร์เฟซกำหนดค่าเพื่อรับข้อมูล ฝั่งมือถือส่งข้อมูลการกำหนดค่า พารามิเตอร์ส่งผ่านแบบ Url โดย SSID, password, userId เป็นพารามิเตอร์ที่จำเป็น
# เมธอดคำขอ: Post
# ที่อยู่อินเทอร์เฟซ: http://192.168.4.1/config
# พารามิเตอร์มีดังนี้:
SSID # ชื่อ Wifi
password # รหัสผ่าน Wifi
userId # หมายเลข/ID ผู้ใช้
deviceNum # ไม่บังคับ หมายเลขอุปกรณ์
authCode # ไม่บังคับ รหัสอนุญาต
extra # ไม่บังคับ ข้อมูลเสริม
# ข้อมูลตอบกลับ: รหัสสถานะ HTTP 200 หมายถึงตั้งค่าเครือข่ายสำเร็จ; รหัสสถานะ HTTP 500 หมายถึงตั้งค่าเครือข่ายล้มเหลว;
# ตัวอย่าง URL คำขอ อุปกรณ์รับพารามิเตอร์ผ่าน Url นี้และบันทึกลงในอุปกรณ์
http://192.168.4.1/config?SSID=mywifi&password=mywifipassword&userId=1
http://192.168.4.1/config?SSID=mywifi&password=mywifipassword&userId=1&deviceNum=D68329VL588&authCode=6688&extra=open5. เช็กลิสต์ตรวจรับการทดสอบร่วม
การเชื่อมต่ออุปกรณ์ MQTT แนะนำให้ตรวจรับตามลำดับต่อไปนี้ เพื่อเลี่ยงกรณีที่เห็นแค่การเชื่อมต่อสำเร็จแต่ข้อมูลธุรกิจไม่เข้าสู่แพลตฟอร์ม
| ขั้นตอน | เนื้อหาที่ตรวจรับ | ผลลัพธ์ที่สำเร็จ |
|---|---|---|
| 1 | ผลิตภัณฑ์ได้รับการเผยแพร่แล้ว | สถานะผลิตภัณฑ์เป็นเผยแพร่แล้ว |
| 2 | MQTTX หรืออุปกรณ์เชื่อมต่อ | คอนโซล EMQX มีการเชื่อมต่อไคลเอนต์ |
| 3 | สถานะอุปกรณ์ | รายละเอียดอุปกรณ์แสดงออนไลน์หรือเวลาออนไลน์ล่าสุดรีเฟรช |
| 4 | /info/post | ฟิลด์ข้อมูลอุปกรณ์ สัญญาณ เวอร์ชัน และอื่น ๆ ได้รับการอัปเดต |
| 5 | /property/post | สถานะการทำงานแสดงค่าคุณสมบัติ Thing Model |
| 6 | /event/post | บันทึกเหตุการณ์มีเหตุการณ์ที่รายงาน |
| 7 | /function/get | อุปกรณ์ได้รับคำสั่งหลังแพลตฟอร์มส่งลง |
| 8 | ส่งผลลัพธ์กลับ | อุปกรณ์ส่งกลับตามผลการส่งลง สถานะแพลตฟอร์มรีเฟรช |
| 9 | กฎ/ฉาก | กฎ ฉาก และการแจ้งเตือนที่เกี่ยวข้องถูกกระตุ้นได้ |
6. ข้อผิดพลาดที่พบบ่อย
การเชื่อมต่อถูกปฏิเสธ
ตรวจสอบก่อน:
- พอร์ต
1883ของเซิร์ฟเวอร์เปิดอยู่หรือไม่ - EMQX หรือบริการ MQTT ในตัวเริ่มทำงานหรือไม่
clientIdตรงตามรูปแบบS&device-number&product-id&user-idหรือรูปแบบการยืนยันตัวตนแบบเข้ารหัสหรือไม่- ผลิตภัณฑ์เปิดใช้การอนุญาตอุปกรณ์หรือไม่ หากเปิดใช้ รหัสผ่านมีรหัสอนุญาตหรือไม่
- อุปกรณ์ถูกปิดใช้งานหรือไม่
อุปกรณ์ออนไลน์แต่คุณสมบัติไม่รีเฟรช
ตรวจสอบก่อน:
- หัวข้อที่เผยแพร่เป็น
/{productId}/{deviceNum}/property/postหรือไม่ productIdใช้ product ID ไม่ใช่หมายเลขผลิตภัณฑ์หรือไม่deviceNumตรงกับหมายเลขอุปกรณ์ทุกประการหรือไม่- เนื้อหาข้อความเป็นอาร์เรย์หรือไม่
idตรงกับตัวระบุ Thing Model ทุกประการหรือไม่valueตรงกับชนิดข้อมูลหรือไม่
แพลตฟอร์มส่งลงแล้วแต่อุปกรณ์ไม่ได้รับ
ตรวจสอบก่อน:
- อุปกรณ์สมัครรับ
/{productId}/{deviceNum}/function/getหรือไม่ - MQTTX หรือการเชื่อมต่ออุปกรณ์ยังออนไลน์อยู่หรือไม่
- Thing Model เป็นฟังก์ชันที่เขียนได้หรือคุณสมบัติที่ส่งลงได้หรือไม่
- ผู้ใช้มีสิทธิ์ดูรายละเอียดอุปกรณ์และส่งคำสั่งลงหรือไม่
- Device Shadow ส่งผลต่อการตัดสินปัจจุบันหรือไม่
กฎหรือการแจ้งเตือนไม่ถูกกระตุ้น
ตรวจสอบก่อน:
- ข้อมูลอุปกรณ์เข้าสู่สถานะการทำงานของแพลตฟอร์มหรือไม่
- ผลิตภัณฑ์ อุปกรณ์ และตัวแปรที่ผูกกับฉากหรือกฎถูกต้องหรือไม่
- นิพจน์เงื่อนไขตรงกับชนิดของค่าที่รายงานหรือไม่
- การกำหนดค่าการแจ้งเตือนเปิดใช้งานอยู่หรือไม่
7. ทางเข้าการพัฒนาต่อยอด
| ประเภท | เส้นทางหรืออินเทอร์เฟซ | คำอธิบาย |
|---|---|---|
| การยืนยันตัวตน MQTT | /iot/tool/mqtt/auth, /iot/tool/mqtt/webhook | ทางเข้าการยืนยันตัวตนและ Webhook ของ EMQX |
| อินเทอร์เฟซอุปกรณ์ | /iot/device | อุปกรณ์ออนไลน์ สถานะ รายละเอียด |
| อินเทอร์เฟซ Thing Model | /iot/model | นิยามและการแม็ปโมเดล |
| โมดูลโปรโตคอล | springboot/fastbee-protocol | การแยกวิเคราะห์และแปลงข้อความ MQTT |
| โมดูลข้อมูล | springboot/fastbee-iot-data | การประมวลผลข้อมูลคุณสมบัติ เหตุการณ์ และการตรวจสอบ |
| หน้าฟรอนต์เอนด์ | vue3/src/views/iot/device | รายละเอียดอุปกรณ์ สถานะการทำงาน การดีบักข้อมูล |
| API ฟรอนต์เอนด์ | vue3/src/api/iot | การห่อหุ้มคำขออุปกรณ์และ Thing Model |


