ข้ามไปยังเนื้อหา

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):

ยังไม่พบตัวเทียบใน SDK สาธารณะ: การเข้ารหัส JSON telemetry แบบ bs_mqtt_telem_encode_json_* และตาราง topic ใน NVM (cm33_mqtt_nvm_*)


เมื่อเรียนจบ คุณควรทำได้ดังนี้:

  1. อธิบายหลักการ MQTT และความต่างจาก MQTTs (MQTT over TLS)
  2. อธิบาย Broker, Client, Topic, QoS, Retained Message
  3. ตั้งค่าและสั่งเชื่อมต่อ MQTT ผ่าน TESA Firmware SDK (เส้นทาง CM55 → IPC → CM33)
  4. ชี้ broker ได้ทั้งของสาธารณะ / LAN / คลาวด์ทั่วไป (ฟิลด์คอนฟิกชุดเดียวกัน)
  5. Publish telemetry / event จากอุปกรณ์
  6. Subscribe เพื่อรับคำสั่งกลับมาควบคุมอุปกรณ์
  7. ออกแบบ payload ที่เหมาะสม (JSON เป็นเส้นทางหลักใน SDK ปัจจุบัน)
  8. อธิบายแนวทางความปลอดภัย: TLS, root CA, username/password
  9. ทำแบบฝึกบนบอร์ดจริงและตรวจด้วยเครื่องมือโฮสต์

Snippet ในบทนี้ อ้างชื่อฟังก์ชันจาก TESA Firmware SDK — ใช้ร่วมกับโปรเจกต์ตัวอย่างหรือตัวอย่างบน Developer Hub
ดูตัวอย่างโฮสต์เพิ่ม: TESAIoT Developer Hub · Hackathon web-app/ MQTT labs · Bitstream Studio

เอกสาร ใช้เมื่อ
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 / รอสถานะ

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 (plain) MQTTs
ชั้นขนส่ง TCP TCP + TLS
พอร์ตที่พบบ่อย 1883 8883
ใน SDK นี้ tls = 0 tls = 1 (+ root CA)

Key phrase
MQTTs ไม่ใช่โปรโตคอลคนละตัว — คือ MQTT ที่ห่อด้วย TLS

อ่านเสริม: HiveMQ MQTT Essentials


บทบาท คอร์ 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──► Broker

MQTT จะไม่ขึ้นเองถ้า Wi‑Fi ยังไม่ CONNECTED — ต้อง join AP ก่อนทุกครั้ง


#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


#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
Bit ความหมายโดยสรุป
AUTO_CONNECT พยายามเชื่อมเมื่อเงื่อนไขพร้อม
TELEMETRY_PUBLISH อนุญาต publish ค่าเซ็นเซอร์ขึ้น broker
MQTT_ENABLED เปิดโมดูล MQTT

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 ตรง ๆ — ตามคู่มือของเครื่องมือ


#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 ตามคอนฟิก
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);
แนวคิดในสเปก MQTT ในเส้นทาง telemetry ของ SDK ปัจจุบัน
QoS 0/1/2 Publish telemetry ใช้ QoS 0 เป็นหลัก
Retain Telemetry publish มัก retain = false
QoS ใน topic table มีผลกับ subscribe / คอนฟิกบางจุด

อธิบาย QoS/retain ให้ครบในทฤษฎี — แล้วฝึกตามพฤติกรรมจริงของเฟิร์มแวร์ตัวอย่าง

#include "cm33_mqtt_stack.h"
if (cm33_mqtt_stack_is_connected()) {
(void)cm33_mqtt_stack_publish(
"bitstream/AABBCCDDEEFF/sensors",
"{\"hello\":1}", 11);
}

เส้นทาง 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 ในเครื่อง

ชั้น ในหลักสูตรนี้
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 ที่เชื่อถือได้, หมุนรหัสผ่านในแล็บ, แยกเครือข่ายแล็บออกจากเครือข่ายใช้งานจริง


คำถามผู้เรียน คำตอบสั้น
ต้องมี “TESA cloud API” พิเศษไหม? คอนฟิก broker ชุดเดียวชี้ไปที่โฮสต์ใดก็ได้
ใช้ AWS IoT / Azure / HiveMQ Cloud ได้ไหม? ได้ในหลักการ ถ้า endpoint,พอร์ต, TLS และ auth ตรงกับที่คอนฟิกรองรับ
แล็บมาตรฐานใช้อะไร? มักเป็น public/LAN broker ก่อน แล้วค่อย cloud จริง

#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


  1. MQTT = pub/sub; MQTTs = MQTT + TLS
  2. Wi‑Fi ก่อน MQTT เสมอ
  3. สั่งจาก CM55 ด้วย cm55_trigger_mqtt_*; เซสชันจริงอยู่ CM33
  4. Topic แบบ bitstream/<MAC>/… + policy bits
  5. Payload หลัก = JSON; telemetry publish เป็น QoS0 ในพาธปัจจุบัน
  6. ความปลอดภัย = TLS + CA + (optional) user/pass
  7. ต่อไป M07 BLE แล้ว M08 Capstone รวมแล็บและเอกสารหลักสูตร
  1. ทำแบบฝึก: Lab
  2. เก็บแผ่นสรุป: Cheatsheet
  3. เมื่อพร้อม ไปต่อ M07 — Bluetooth Low Energy (BLE) (บทเรียน M07) แล้วจบด้วย M08 Capstone

  1. TESAIoT Developer Hub
  2. Bitstream Studio
  3. TESAIoT_Hackathon — MQTT web examples ex09–ex15
  1. MQTT.org
  2. HiveMQ MQTT Essentials
  3. HiveMQ — Public Broker (ใช้สำหรับทดสอบเท่านั้น)
  1. M05 — Sensor Data and Edge AI Preparation
  2. M04 — RTOS Programming

คำถามสั้นสามข้อใน quiz.yaml ผูกกับเป้าหมายของบทเรียนนี้ข้อละหนึ่งคำถาม ลองตอบเองก่อน แล้วค่อยเทียบกับเฉลยและคำอธิบายในไฟล์

ลงมือต่อที่ แล็บ: Wi-Fi, MQTT connect, publish และ subscribe

Lab · Cheatsheet · ← Table of Contents · ← M05 · M07 BLE →

ลองของจริงบน TESAIoT Dev Kit: เปิดตัวอย่างบน Developer Hub เพื่ออ่านโค้ด ดาวน์โหลด หรือ flash เฟิร์มแวร์สำเร็จรูป

คำถามทบทวน

ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย

  1. MQTTs ต่างจาก MQTT อย่างไรตามบทเรียน (เป้าหมายข้อ 1)

    1. เป็นโปรโตคอลคนละตัวที่ไม่ใช้ broker
    2. ใช้ UDP แทน TCP
    3. ใช้ได้เฉพาะกับ BLE
    4. คือ MQTT ที่ห่อด้วย TLS และมักใช้พอร์ต 8883
    ดูเฉลย

    คำตอบ: D. คือ MQTT ที่ห่อด้วย TLS และมักใช้พอร์ต 8883

    Key phrase ในหัวข้อ 1: MQTTs ไม่ใช่โปรโตคอลคนละตัว แต่เป็น MQTT ที่ห่อด้วย TLS (พอร์ตที่พบบ่อย 8883)

  2. สั่ง MQTT connect แล้วสถานะไม่ขึ้น CONNECTED ทั้งที่คอนฟิก broker ถูก สิ่งแรกที่ควรตรวจคืออะไร (เป้าหมายข้อ 2)

    1. BLE advertising เปิดอยู่หรือไม่
    2. Wi-Fi ขึ้นสถานะ CONNECTED แล้วหรือยัง
    3. QoS ตั้งเป็น 2 หรือยัง
    4. retain เป็น true หรือยัง
    ดูเฉลย

    คำตอบ: B. Wi-Fi ขึ้นสถานะ CONNECTED แล้วหรือยัง

    หัวข้อ 2: MQTT จะไม่ขึ้นเองถ้า Wi-Fi ยังไม่ CONNECTED ต้อง join AP ก่อนทุกครั้ง

  3. เส้นทาง telemetry หลักในเฟิร์มแวร์ของบทเรียนใช้ payload และ QoS แบบใด (เป้าหมายข้อ 3)

    1. CBOR และ QoS 2
    2. binary และ QoS 1 พร้อม retain
    3. XML และ QoS 1
    4. 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 ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA