MQTT และ MQTTs บนอุปกรณ์ Edge
Course 1 · Module 6
Suggested time: ประมาณ 3.5–4 ชั่วโมง (แนวคิด + Wi‑Fi + MQTT บนบอร์ด / โฮสต์)
Format: บทเรียนเชิงปฏิบัติ — เชื่อมอุปกรณ์กับ broker, publish telemetry, subscribe คำสั่ง
Lab · Cheatsheet · ← Table of Contents · ← M05 · M07 BLE →
หมายเหตุ: โค้ดในบทนี้เขียนสำหรับเฟิร์มแวร์ชุดใด (ตรวจสอบเมื่อ 26 ก.ย. 2026)
โค้ด C ในบทนี้เรียก API ของเฟิร์มแวร์ TESAIoT Bitstream ที่ต้นฉบับเรียกว่า “TESA Firmware SDK” ซึ่งเผยแพร่เป็นไฟล์ HEX สำเร็จรูป (
tesaiot-bitstream-<version>.hex) คู่กับ Bitstream Studio ในแพ็กแล็บ TESAIoT_Hackathon ซอร์สโค้ดของเฟิร์มแวร์ชุดนี้ยังไม่เปิดเผยต่อสาธารณะ ฟังก์ชันอย่างcm55_trigger_connect,cm55_get_wifi_status,cm55_trigger_mqtt_connect,cm55_get_mqtt_status,cm55_trigger_mqtt_policy_set,cm33_mqtt_nvm_*,cm33_mqtt_stack_publish,bs_mqtt_telem_encode_json_*จึงยังไม่มี header ให้เปิดดูหรือนำไป build เอง ให้อ่าน snippet เป็นแนวคิดและลำดับการเรียกใช้ ส่วนการเรียก FreeRTOS และ Infineon PDL (เช่นxTaskCreate,vTaskDelay,Cy_GPIO_*) เป็น API สาธารณะตามปกติถ้าต้องการโค้ดที่อ่านและ build ได้จากซอร์สเปิด ให้ดู tesaiot-pse84-devkit-sdk (Apache-2.0) ซึ่งเป็นคนละโค้ดเบสและตั้งชื่อ API ต่างกัน ตัวอย่างที่ตรวจแล้วว่าทำงานเรื่องเดียวกับบทนี้ (commit
ef72c1b):
proj_cm33_ns/examples/connectivity/10_wifi_join.c— join Wi-Fi บน CM33_NS (app_wifi_init,app_wifi_connect_direct,app_wifi_get_ipv4,cy_wcm_*)proj_cm55/examples/connectivity/01_wifi_join_and_remember.c— join Wi-Fi จาก CM55 ผ่าน IPC ไป CM33_NS (wifi_manager_*) — แนวคิดเดียวกับ “CM55 สั่ง CM33 เป็นเจ้าของวิทยุ” ในบทนี้bento_libs/claw/common/modules/tesaiot_mqtt/— client MQTT แบบ TLS บน CM33_NS มีtesaiot_mqtt_connect/tesaiot_mqtt_publish/tesaiot_mqtt_is_connected/tesaiot_mqtt_disconnect(อ่าน README ของโมดูลก่อนใช้)ยังไม่พบตัวเทียบใน SDK สาธารณะ: การเข้ารหัส JSON telemetry แบบ
bs_mqtt_telem_encode_json_*และตาราง topic ใน NVM (cm33_mqtt_nvm_*)
เป้าหมาย (Learning Outcomes)
หัวข้อที่มีชื่อว่า “เป้าหมาย (Learning Outcomes)”เมื่อเรียนจบ คุณควรทำได้ดังนี้:
- อธิบายหลักการ MQTT และความต่างจาก MQTTs (MQTT over TLS)
- อธิบาย Broker, Client, Topic, QoS, Retained Message
- ตั้งค่าและสั่งเชื่อมต่อ MQTT ผ่าน TESA Firmware SDK (เส้นทาง CM55 → IPC → CM33)
- ชี้ broker ได้ทั้งของสาธารณะ / LAN / คลาวด์ทั่วไป (ฟิลด์คอนฟิกชุดเดียวกัน)
- Publish telemetry / event จากอุปกรณ์
- Subscribe เพื่อรับคำสั่งกลับมาควบคุมอุปกรณ์
- ออกแบบ payload ที่เหมาะสม (JSON เป็นเส้นทางหลักใน SDK ปัจจุบัน)
- อธิบายแนวทางความปลอดภัย: TLS, root CA, username/password
- ทำแบบฝึกบนบอร์ดจริงและตรวจด้วยเครื่องมือโฮสต์
Snippet ในบทนี้ อ้างชื่อฟังก์ชันจาก TESA Firmware SDK — ใช้ร่วมกับโปรเจกต์ตัวอย่างหรือตัวอย่างบน Developer Hub
ดูตัวอย่างโฮสต์เพิ่ม: TESAIoT Developer Hub · Hackathonweb-app/MQTT labs · Bitstream Studio
Read alongside this chapter
หัวข้อที่มีชื่อว่า “Read alongside this chapter”| เอกสาร | ใช้เมื่อ |
|---|---|
| MQTT Essentials (HiveMQ) | แนวคิด broker / topic / QoS / retain |
| MQTT version 5.0 / 3.1.1 OASIS overview | สเปกโปรโตคอล |
| TESAIoT_Hackathon | ex09–ex15 MQTT ในเบราว์เซอร์ + broker ใน Studio |
| Bitstream Studio | Start broker / telemetry / MQTT panel |
| M05 — Sensor / AI prep | แหล่งค่าที่จะ publish |
| M04 — RTOS | task ที่เรียก trigger / รอสถานะ |
1. MQTT in One Page
หัวข้อที่มีชื่อว่า “1. MQTT in One Page”MQTT เป็นโปรโตคอล publish/subscribe บน TCP เหมาะกับ IoT ที่แบนด์วิดท์และพลังงานจำกัด
| คำ | ความหมาย |
|---|---|
| Broker | ตัวกลางรับ/ส่งข้อความตาม topic |
| Client | อุปกรณ์หรือแอปที่เชื่อม broker |
| Topic | ชื่อช่องข้อความแบบลำดับชั้น (เช่น bitstream/<id>/sensors) |
| Publish | ส่งข้อความเข้า topic |
| Subscribe | ลงทะเบียนรับข้อความจาก topic |
| QoS | ระดับการรับประกันการส่ง (0 / 1 / 2 ในสเปก) |
| Retain | broker เก็บข้อความล่าสุดของ topic ให้ subscriber ใหม่ |
MQTT vs MQTTs
หัวข้อที่มีชื่อว่า “MQTT vs MQTTs”| MQTT (plain) | MQTTs | |
|---|---|---|
| ชั้นขนส่ง | TCP | TCP + TLS |
| พอร์ตที่พบบ่อย | 1883 | 8883 |
| ใน SDK นี้ | tls = 0 |
tls = 1 (+ root CA) |
Key phrase
MQTTs ไม่ใช่โปรโตคอลคนละตัว — คือ MQTT ที่ห่อด้วย TLS
อ่านเสริม: HiveMQ MQTT Essentials
2. Where MQTT Lives in TESA Firmware
หัวข้อที่มีชื่อว่า “2. Where MQTT Lives in TESA Firmware”| บทบาท | คอร์ | API ที่ผู้เรียนเรียกบ่อย |
|---|---|---|
| Wi‑Fi STA | CM33 | ผ่าน IPC จาก CM55: cm55_trigger_connect … |
| MQTT client + TLS | CM33 | mqtt_manager_* / cm33_mqtt_stack_* (เจ้าของจริง) |
| สั่งเชื่อม / อ่านสถานะจากแอป | CM55 | cm55_trigger_mqtt_*, cm55_get_mqtt_status |
| เข้ารหัส JSON telemetry | CM55 | bs_mqtt_telem_encode_json_* |
[Sensors / App on CM55] │ cm55_trigger_mqtt_* / JSON encode ▼ IPC to CM33 │ ▼[Wi‑Fi + cy_mqtt_* stack on CM33] ──TCP/TLS──► BrokerMQTT จะไม่ขึ้นเองถ้า Wi‑Fi ยังไม่ CONNECTED — ต้อง join AP ก่อนทุกครั้ง
3. Wi‑Fi First (Prerequisite)
หัวข้อที่มีชื่อว่า “3. Wi‑Fi First (Prerequisite)”#include "cm55_ipc_app.h"
(void)cm55_trigger_connect("YOUR_SSID", "YOUR_WIFI_PASSWORD", 0U);
ipc_wifi_status_t st;if (cm55_get_wifi_status(&st) && st.state == (uint8_t)IPC_WIFI_LINK_CONNECTED) { /* ready for MQTT */}หรือผ่านตัวอย่าง Wi‑Fi ของโปรเจกต์ตัวอย่าง:
#include "example_wifi.h"
example_wifi_ipc_register();example_wifi_ui_connect("YOUR_SSID", "YOUR_WIFI_PASSWORD");ใช้ค่า SSID/รหัสผ่านของเครือข่ายที่คุณใช้ — อย่า commit ความลับลง Git
4. Connect, Status, Disconnect (CM55 API)
หัวข้อที่มีชื่อว่า “4. Connect, Status, Disconnect (CM55 API)”#include "cm55_ipc_app.h"#include "ipc_mqtt_types.h"
(void)cm55_trigger_mqtt_policy_set(IPC_MQTT_POLICY_FACTORY_DEFAULT); /* often 0x07 */(void)cm55_trigger_mqtt_connect();
ipc_mqtt_status_t mqtt;if (cm55_get_mqtt_status(&mqtt) && mqtt.state == 2U) { /* CONNECTED */ /* mqtt.broker_host, mqtt.port, mqtt.tls, mqtt.effective_client_id */}
(void)cm55_trigger_mqtt_disconnect();mqtt.state (แนวทาง) |
ความหมาย |
|---|---|
| 0 | DISCONNECTED |
| 1 | CONNECTING |
| 2 | CONNECTED |
| 3 | ERROR |
Policy bits (factory often enables all three)
หัวข้อที่มีชื่อว่า “Policy bits (factory often enables all three)”| Bit | ความหมายโดยสรุป |
|---|---|
AUTO_CONNECT |
พยายามเชื่อมเมื่อเงื่อนไขพร้อม |
TELEMETRY_PUBLISH |
อนุญาต publish ค่าเซ็นเซอร์ขึ้น broker |
MQTT_ENABLED |
เปิดโมดูล MQTT |
5. Broker Configuration (Any Cloud / LAN)
หัวข้อที่มีชื่อว่า “5. Broker Configuration (Any Cloud / LAN)”SDK ใช้คอนฟิกชุดเดียวชี้ไปยัง broker ใดก็ได้ — ไม่มี hostname “TESA cloud” แยกต่างหากในเฟิร์มแวร์
ค่าโรงงานสาธิตที่พบบ่อย: host สาธารณะพอร์ต plain 1883 (เช่น HiveMQ public) — ให้ยึดค่าที่คุณตั้งไว้
#include "cm33_mqtt_nvm.h"
cm33_mqtt_config_v3_t cfg;(void)cm33_mqtt_nvm_get_config(&cfg);
(void)strncpy(cfg.broker_host, "YOUR_BROKER_HOST", sizeof(cfg.broker_host) - 1U);cfg.port = 1883U; /* หรือ 8883 เมื่อใช้ TLS */cfg.tls = 0U; /* 1 = MQTTs */cfg.client_id_mode = CM33_MQTT_CLIENT_ID_MODE_AUTO_MAC;(void)strncpy(cfg.username, "YOUR_USER", sizeof(cfg.username) - 1U);(void)strncpy(cfg.password, "YOUR_PASSWORD", sizeof(cfg.password) - 1U);cfg.keepalive_seconds = 60U;cfg.root_ca_len = 0U; /* เมื่อ tls=1 และ len=0 อาจใช้ embedded root CA (เช่น ISRG Root X1) */
(void)cm33_mqtt_nvm_set_config(&cfg);| สถานการณ์แล็บ | แนวตั้งค่า |
|---|---|
| Demo สาธารณะ | host สาธารณะ, 1883, tls=0 |
| Broker ใน LAN / เครื่องในแล็บ | IP หรือ hostname ในเครือข่าย, 1883 |
| MQTTs | tls=1, พอร์ต 8883, CA พร้อม |
| Auth | กรอก username/password เมื่อ broker บังคับ |
บนโฮสต์อาจตั้งค่าผ่าน Bitstream Studio / BS2 MQTT commands แทนการแก้ NVM ตรง ๆ — ตามคู่มือของเครื่องมือ
6. Topics, Publish, Subscribe
หัวข้อที่มีชื่อว่า “6. Topics, Publish, Subscribe”6.1 MAC-based topic helpers
หัวข้อที่มีชื่อว่า “6.1 MAC-based topic helpers”#include "cm33_mqtt_client_id.h"
char topic[CM33_MQTT_TOPIC_MAX];(void)cm33_mqtt_format_mac_topic(mac, CM33_MQTT_TOPIC_SUFFIX_SENSORS, topic, sizeof(topic));/* → "bitstream/<MAC12>/sensors" */| Suffix ที่พบบ่อย | ใช้ทำอะไร |
|---|---|
sensors |
telemetry จากอุปกรณ์ |
actuators |
คำสั่งเข้าอุปกรณ์ (subscribe) |
status |
สถานะ / LWT ตามคอนฟิก |
6.2 Topic table (publish + subscribe slots)
หัวข้อที่มีชื่อว่า “6.2 Topic table (publish + subscribe slots)”cm33_mqtt_topic_table_t topics = {0};topics.publish_count = 1U;topics.telemetry_publish_slot = 0U;(void)strncpy(topics.publish[0].topic, topic, sizeof(topics.publish[0].topic) - 1U);topics.publish[0].qos = 0U;
topics.subscribe_count = 1U;(void)cm33_mqtt_format_mac_topic(mac, CM33_MQTT_TOPIC_SUFFIX_ACTUATORS, topics.subscribe[0].topic, sizeof(topics.subscribe[0].topic));topics.subscribe[0].qos = 0U;(void)cm33_mqtt_nvm_set_topic_table(&topics);6.3 QoS and retain — สเปก vs พฤติกรรม telemetry ใน SDK
หัวข้อที่มีชื่อว่า “6.3 QoS and retain — สเปก vs พฤติกรรม telemetry ใน SDK”| แนวคิดในสเปก MQTT | ในเส้นทาง telemetry ของ SDK ปัจจุบัน |
|---|---|
| QoS 0/1/2 | Publish telemetry ใช้ QoS 0 เป็นหลัก |
| Retain | Telemetry publish มัก retain = false |
| QoS ใน topic table | มีผลกับ subscribe / คอนฟิกบางจุด |
อธิบาย QoS/retain ให้ครบในทฤษฎี — แล้วฝึกตามพฤติกรรมจริงของเฟิร์มแวร์ตัวอย่าง
6.4 Owner-path publish (CM33)
หัวข้อที่มีชื่อว่า “6.4 Owner-path publish (CM33)”#include "cm33_mqtt_stack.h"
if (cm33_mqtt_stack_is_connected()) { (void)cm33_mqtt_stack_publish( "bitstream/AABBCCDDEEFF/sensors", "{\"hello\":1}", 11);}7. Payload Design: JSON (Primary Path)
หัวข้อที่มีชื่อว่า “7. Payload Design: JSON (Primary Path)”เส้นทาง telemetry หลักใน SDK คือ JSON ข้อความ
ยังไม่มี เส้นทาง CBOR สำเร็จรูปใน MQTT path ปัจจุบัน — ถ้าต้องการ binary ให้เป็นขั้นออกแบบเพิ่มนอกแล็บมาตรฐาน
#include "bitstream_mqtt_telemetry_json.h"
char json[512];uint16_t len = 0U;int16_t values[2] = {2500, 5500}; /* ตัวอย่างค่าสเกลจากเซ็นเซอร์ */
(void)bs_mqtt_telem_encode_json_readable( /* sensor_id */ 2U, /* mask */ 0x03U, /* counter */ 1U, /* t_ms */ 1000U, values, 2U, "bitstream-AABBCCDDEEFF", json, sizeof(json), &len);ทางเลือก: bs_mqtt_telem_encode_json_scalar(...) สำหรับรูปแบบ values: [...]
ส่งต่อจากเซ็นเซอร์ (สถาปัตยกรรม)
หัวข้อที่มีชื่อว่า “ส่งต่อจากเซ็นเซอร์ (สถาปัตยกรรม)”sensor EVT (M05) → encode JSON on CM55 → relay to CM33 → publish to brokerเปิด TELEMETRY_PUBLISH ใน policy เพื่อให้เส้นทางนี้ทำงานตามที่ตั้งค่าไว้
ตรวจบนโฮสต์
หัวข้อที่มีชื่อว่า “ตรวจบนโฮสต์”| เครื่องมือ | ใช้เมื่อ |
|---|---|
| MQTTX / mosquitto_sub | subscribe topic ของบอร์ด |
Hackathon ex09–ex15 |
แล็บ MQTT ในเบราว์เซอร์ (repo) |
| Bitstream Studio broker | เมื่อต้องการใช้ broker ในเครื่อง |
8. Security: TLS, Certificates, Authentication
หัวข้อที่มีชื่อว่า “8. Security: TLS, Certificates, Authentication”| ชั้น | ในหลักสูตรนี้ |
|---|---|
| TLS (MQTTs) | cfg.tls = 1, พอร์ต 8883 |
| Server trust | PEM ใน NVM หรือ embedded root CA เมื่อ root_ca_len = 0 |
| Client auth | username / password ในคอนฟิก (ถ้า broker ต้องการ) |
| Mutual TLS (client cert) | ยังไม่มี ฟิลด์ client cert/key ในคอนฟิก v3 มาตรฐาน |
| Transport บนอากาศ | Wi‑Fi ของตัวเอง + อย่าฝังรหัสผ่านใน repo |
#include "cm33_mqtt_embedded_ca.h"
const char *ca = cm33_mqtt_embedded_root_ca();size_t ca_len = cm33_mqtt_embedded_root_ca_size();แนวปฏิบัติ: ใช้ broker ที่เชื่อถือได้, หมุนรหัสผ่านในแล็บ, แยกเครือข่ายแล็บออกจากเครือข่ายใช้งานจริง
9. Cloud Providers: TESA vs Others
หัวข้อที่มีชื่อว่า “9. Cloud Providers: TESA vs Others”| คำถามผู้เรียน | คำตอบสั้น |
|---|---|
| ต้องมี “TESA cloud API” พิเศษไหม? | คอนฟิก broker ชุดเดียวชี้ไปที่โฮสต์ใดก็ได้ |
| ใช้ AWS IoT / Azure / HiveMQ Cloud ได้ไหม? | ได้ในหลักการ ถ้า endpoint,พอร์ต, TLS และ auth ตรงกับที่คอนฟิกรองรับ |
| แล็บมาตรฐานใช้อะไร? | มักเป็น public/LAN broker ก่อน แล้วค่อย cloud จริง |
10. Optional: CM33 Owner Stack (Deeper)
หัวข้อที่มีชื่อว่า “10. Optional: CM33 Owner Stack (Deeper)”#include "cm33_mqtt_manager.h"#include "cm33_mqtt_stack.h"
(void)mqtt_manager_init();(void)mqtt_manager_start();(void)mqtt_manager_request_connect();/* … */(void)mqtt_manager_request_disconnect();ชั้นล่างสุดเป็น Infineon cy_mqtt_* — ผู้เรียนทั่วไปใช้ cm55_trigger_mqtt_* ก็เพียงพอสำหรับแล็บ
ใต้ฝา: BS2 UART ยังมีชุดคำสั่ง MQTT (MQTT_CONNECT ฯลฯ) สำหรับโฮสต์ — ใช้เมื่อทำงานผ่านแผง Bitstream Studio
11. Module Summary
หัวข้อที่มีชื่อว่า “11. Module Summary”- MQTT = pub/sub; MQTTs = MQTT + TLS
- Wi‑Fi ก่อน MQTT เสมอ
- สั่งจาก CM55 ด้วย
cm55_trigger_mqtt_*; เซสชันจริงอยู่ CM33 - Topic แบบ
bitstream/<MAC>/…+ policy bits - Payload หลัก = JSON; telemetry publish เป็น QoS0 ในพาธปัจจุบัน
- ความปลอดภัย = TLS + CA + (optional) user/pass
- ต่อไป M07 BLE แล้ว M08 Capstone รวมแล็บและเอกสารหลักสูตร
Next Steps
หัวข้อที่มีชื่อว่า “Next Steps”- ทำแบบฝึก: Lab
- เก็บแผ่นสรุป: Cheatsheet
- เมื่อพร้อม ไปต่อ M07 — Bluetooth Low Energy (BLE) (บทเรียน M07) แล้วจบด้วย M08 Capstone
References and Further Reading
หัวข้อที่มีชื่อว่า “References and Further Reading”Course portals
หัวข้อที่มีชื่อว่า “Course portals”- TESAIoT Developer Hub
- Bitstream Studio
- TESAIoT_Hackathon — MQTT web examples
ex09–ex15
MQTT concepts
หัวข้อที่มีชื่อว่า “MQTT concepts”- MQTT.org
- HiveMQ MQTT Essentials
- HiveMQ — Public Broker (ใช้สำหรับทดสอบเท่านั้น)
Prior modules
หัวข้อที่มีชื่อว่า “Prior modules”เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”คำถามสั้นสามข้อใน quiz.yaml ผูกกับเป้าหมายของบทเรียนนี้ข้อละหนึ่งคำถาม ลองตอบเองก่อน แล้วค่อยเทียบกับเฉลยและคำอธิบายในไฟล์
ลงมือต่อที่ แล็บ: Wi-Fi, MQTT connect, publish และ subscribe
Lab · Cheatsheet · ← Table of Contents · ← M05 · M07 BLE →
ตัวอย่างบน TESAIoT Developer Hub
หัวข้อที่มีชื่อว่า “ตัวอย่างบน TESAIoT Developer Hub”ลองของจริงบน TESAIoT Dev Kit: เปิดตัวอย่างบน Developer Hub เพื่ออ่านโค้ด ดาวน์โหลด หรือ flash เฟิร์มแวร์สำเร็จรูป
- TESA IoT Device → Platform (Server-TLS) — HTTPS or MQTTS via Mongoose — Unified, beginner-friendly C example that can send telemetry over either:
- TESA IoT Device → Platform (mTLS) — HTTPS or MQTTS via Mongoose — Unified, intermediate-level C example that can send telemetry over either:
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
MQTTs ต่างจาก MQTT อย่างไรตามบทเรียน (เป้าหมายข้อ 1)
- เป็นโปรโตคอลคนละตัวที่ไม่ใช้ broker
- ใช้ UDP แทน TCP
- ใช้ได้เฉพาะกับ BLE
- คือ MQTT ที่ห่อด้วย TLS และมักใช้พอร์ต 8883
ดูเฉลย
คำตอบ: D. คือ MQTT ที่ห่อด้วย TLS และมักใช้พอร์ต 8883
Key phrase ในหัวข้อ 1: MQTTs ไม่ใช่โปรโตคอลคนละตัว แต่เป็น MQTT ที่ห่อด้วย TLS (พอร์ตที่พบบ่อย 8883)
-
สั่ง MQTT connect แล้วสถานะไม่ขึ้น CONNECTED ทั้งที่คอนฟิก broker ถูก สิ่งแรกที่ควรตรวจคืออะไร (เป้าหมายข้อ 2)
- BLE advertising เปิดอยู่หรือไม่
- Wi-Fi ขึ้นสถานะ CONNECTED แล้วหรือยัง
- QoS ตั้งเป็น 2 หรือยัง
- retain เป็น true หรือยัง
ดูเฉลย
คำตอบ: B. Wi-Fi ขึ้นสถานะ CONNECTED แล้วหรือยัง
หัวข้อ 2: MQTT จะไม่ขึ้นเองถ้า Wi-Fi ยังไม่ CONNECTED ต้อง join AP ก่อนทุกครั้ง
-
เส้นทาง telemetry หลักในเฟิร์มแวร์ของบทเรียนใช้ payload และ QoS แบบใด (เป้าหมายข้อ 3)
- CBOR และ QoS 2
- binary และ QoS 1 พร้อม retain
- XML และ QoS 1
- JSON ข้อความ และ QoS 0
ดูเฉลย
คำตอบ: D. JSON ข้อความ และ QoS 0
หัวข้อ 6.3 และ 7: telemetry เป็น JSON และ publish ด้วย QoS 0 เป็นหลัก ยังไม่มีเส้นทาง CBOR สำเร็จรูป
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"MQTT และ MQTTs บนอุปกรณ์ Edge" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "MQTT and MQTTs on an Edge Device" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0
ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/firmware-sdk-edge-ai/m06-mqtt/l01-mqtt-and-mqtts/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/drsanti/TESAIoT-Courses/blob/287c21814ba8c75f693136616dcd270349a15966/C1/M06/README.md · Original content by Asst. Prof. Dr. Santi Nuratch (ผศ.ดร.สันติ นุราช), KMUTT. Course 1 (C1/) of drsanti/TESAIoT-Courses. TESA funded the work and holds the rights; published here under CC BY-NC 4.0. The upstream repository carries no licence file. Text kept faithful; structure, front matter, quizzes and notes added by TESA Open Knowledge.
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA