BLE สำหรับผลิตภัณฑ์ Edge
Course 1 · Module 7
Suggested time: ประมาณ 3–3.5 ชั่วโมง (แนวคิด + peripheral status/ADV + host demo)
Format: บทเรียนเชิงปฏิบัติ — เปรียบเทียบกับ MQTT (M06), เชื่อมโฮสต์ท้องถิ่นผ่าน BLE
Lab · Cheatsheet · ← Table of Contents · ← M06 · M08 →
หมายเหตุ: โค้ดในบทนี้เขียนสำหรับเฟิร์มแวร์ชุดใด (ตรวจสอบเมื่อ 26 ก.ย. 2026)
โค้ด C ในบทนี้เรียก API ของเฟิร์มแวร์ TESAIoT Bitstream ที่ต้นฉบับเรียกว่า “TESA Firmware SDK” ซึ่งเผยแพร่เป็นไฟล์ HEX สำเร็จรูป (
tesaiot-bitstream-<version>.hex) คู่กับ Bitstream Studio ในแพ็กแล็บ TESAIoT_Hackathon ซอร์สโค้ดของเฟิร์มแวร์ชุดนี้ยังไม่เปิดเผยต่อสาธารณะ ฟังก์ชันอย่างcm55_ble_periph_status_get_sync,cm55_ble_periph_adv_ctrl_sync,cm55_trigger_ble_periph_*,cm55_ble_request_scan_*,cm55_ble_ipc_set_event_handlerจึงยังไม่มี 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/ble/01_nus_bring_up_and_talk.c— BLE peripheral แบบ Nordic UART Service: advertise อ่านสถานะลิงก์ และส่งข้อมูล (ble_nus_init,ble_nus_get_state,ble_nus_rearm_advertising,ble_nus_send) — ไฟล์นี้ระบุเองว่ายังรันบน template ที่ส่งมอบไม่ได้ เพราะlibbento_secure.aยังไม่อยู่ในLDLIBSยังไม่พบตัวเทียบใน SDK สาธารณะ: เส้นทาง scan / observer (
cm55_ble_request_scan_*) —ble_nusใน SDK เป็นบทบาท peripheral อย่างเดียว
โฮสต์
ble-fletยังไม่เผยแพร่ — README ของ TESAIoT_Hackathon (commitf5f09a6) ระบุว่าpython-app/,ble-react/และble-flet/เป็นของผู้ดูแลและไม่อยู่ใน repo สาธารณะ ให้ใช้เส้นทางสำรองที่บทเรียนเสนอไว้แล้ว คือ GATT explorer ทั่วไป เช่น nRF Connect, LightBlue หรือ AIROC™ Bluetooth® Connect
เป้าหมาย (Learning Outcomes)
หัวข้อที่มีชื่อว่า “เป้าหมาย (Learning Outcomes)”เมื่อเรียนจบ คุณควรทำได้ดังนี้:
- อธิบายบทบาท BLE ในผลิตภัณฑ์ Edge (local / phone / desktop) เทียบกับ MQTT (cloud / broker)
- อธิบายคำสำคัญ: GAP, GATT, Peripheral, Central, Advertising, Connection, Notification
- ชี้ได้ว่าใน TESA Firmware SDK CM33 เป็นเจ้าของ BLE stack และ CM55 สั่งผ่าน IPC
- อ่านสถานะ peripheral ด้วย
cm55_ble_periph_status_get_sync/cm55_get_ble_periph_status - สั่ง advertising ด้วย
cm55_ble_periph_adv_ctrl_sync(stop / start / restart) - อธิบายเส้นทาง scan (CM55 ขอสแกน → CM33 รายงานผล) สำหรับโหมด observer
- ใช้โฮสต์แล็บ: TESAIoT_Hackathon
ble-flet/หรือแอปสแกน GATT ทั่วไป - ทำแบบฝึกบนบอร์ดจริงและเก็บหลักฐานลิงก์
Snippet ในบทนี้ อ้างชื่อฟังก์ชันจาก TESA Firmware SDK — ใช้ร่วมกับโปรเจกต์ตัวอย่างหรือตัวอย่างบน Developer Hub
ดูโฮสต์เพิ่ม: TESAIoT Developer Hub · Hackathon BLE · Bitstream Studio
Read alongside this chapter
หัวข้อที่มีชื่อว่า “Read alongside this chapter”| เอกสาร | ใช้เมื่อ |
|---|---|
| Bluetooth LE overview (Bluetooth SIG) | แนวคิด GAP / GATT |
| Infineon Find Me CE (PSoC Edge) | ตัวอย่างผู้ผลิต (peripheral + mobile app) |
| TESAIoT_Hackathon — ble-flet | Desktop BLE dashboard (scan → connect → stream) |
| Bitstream Studio | Host หลักมักใช้ USB/UART; เทียบกับ BLE lab |
| M06 — MQTT | คู่เปรียบเทียบ cloud connectivity |
| M04 — RTOS | task ที่รอสถานะ / เรียก IPC |
1. BLE in One Page
หัวข้อที่มีชื่อว่า “1. BLE in One Page”Bluetooth Low Energy (BLE) เป็นวิทยุระยะสั้นพลังงานต่ำ เหมาะกับโทรศัพท์ แท็บเล็ต และเดสก์ท็อปที่อยู่ใกล้บอร์ด — ไม่ต้องมี Wi‑Fi หรือ broker
| คำ | ความหมาย |
|---|---|
| Peripheral | อุปกรณ์ที่ โฆษณา (advertise) และรอให้โฮสต์เชื่อม (บอร์ด TESA มักเป็นบทบาทนี้) |
| Central | โฮสต์ที่ สแกน แล้วเชื่อม (phone / PC / ble-flet) |
| GAP | ชั้นค้นพบและเชื่อมต่อ (ชื่อ ADV, ที่อยู่, connection) |
| GATT | ชั้นบริการ/คุณลักษณะ (Service / Characteristic / Notify / Write) |
| Advertising | การประกาศตัวบนอากาศก่อนมี connection |
| Notification | Peripheral ส่งข้อมูลไป Central โดยไม่ต้องรอ poll ทุกครั้ง |
BLE vs MQTT (หลัง M06)
หัวข้อที่มีชื่อว่า “BLE vs MQTT (หลัง M06)”| BLE | MQTT | |
|---|---|---|
| ระยะ | ใกล้ (ห้อง / โต๊ะ) | ผ่านเครือข่าย / คลาวด์ |
| สะพานกลาง | ไม่บังคับ broker | ต้องมี broker |
| พลังงาน / setup | ไม่ต้อง join Wi‑Fi | ต้อง Wi‑Fi (+ TLS ถ้า MQTTs) |
| โฮสต์แล็บ | ble-flet, nRF Connect, AIROC app |
MQTTX, Studio broker, web-app |
| ใน Capstone (M08) | เส้นทาง local | เส้นทาง cloud |
Key phrase
MQTT พาข้อมูลขึ้นเครือข่าย — BLE พาข้อมูลเข้ามือถือ/พีซีที่อยู่ใกล้
อ่านเสริม: Bluetooth LE tech overview
2. Where BLE Lives in TESA Firmware
หัวข้อที่มีชื่อว่า “2. Where BLE Lives in TESA Firmware”บน Evaluation Kit วิทยุมักเป็น AIROC™ Wi‑Fi & Bluetooth® combo — สแต็ก BLE รันบน CM33; แอปเซ็นเซอร์บน CM55 สั่งผ่าน IPC
| บทบาท | คอร์ | API ที่ผู้เรียนเรียกบ่อย |
|---|---|---|
| BLE stack + GATT peripheral | CM33 | ble_periph_* (เจ้าของจริง) |
| สถานะ / สั่ง ADV จากแอป | CM55 | cm55_trigger_ble_periph_*, cm55_ble_periph_*_sync |
| สแกน (observer) | CM33 รันสแกน · CM55 ขอและรับ event | cm55_ble_request_scan_*, cm55_ble_ipc_set_event_handler |
| BS2 over BLE (โฮสต์แล็บ) | CM33 bridge + host GATT client | โฮสต์: Hackathon ble-flet |
[Phone / PC central] ──GATT──► [BLE peripheral on CM33] ▲ │ IPC │ [App on CM55] cm55_trigger_ble_periph_* cm55_ble_request_scan_*Honest note
Wi‑Fi (M06) และ BLE ใช้วิทยุชุดเดียวกันบนหลายคิต — อย่าคาดหวัง throughput สูงสุดทั้งสองพร้อมกันโดยไม่ทดสอบ coexistence ในห้องจริง
3. Peripheral Status (Diagnostic First)
หัวข้อที่มีชื่อว่า “3. Peripheral Status (Diagnostic First)”ก่อน “เชื่อมกับมือถือ” ให้ยืนยันว่าโปรไฟล์ BLE บนเฟิร์มแวร์ทำงาน
โครงสร้างสถานะ (สรุปฟิลด์ที่สำคัญ):
typedef struct { uint8_t profile_ble_active; uint8_t manager_inited; uint8_t stack_ready; uint8_t tx_notify_enabled; uint32_t last_error; uint16_t connection_id; /* 0 = ไม่มีลิงก์ */} ipc_ble_periph_status_t;อ่านสถานะแบบ sync (แนะนำในแล็บ)
หัวข้อที่มีชื่อว่า “อ่านสถานะแบบ sync (แนะนำในแล็บ)”#include "cm55_ipc_app.h"#include "ipc_ble_periph_types.h"
ipc_ble_periph_status_t st;
if (cm55_ble_periph_status_get_sync(&st, 5000U)) { /* ตรวจ stack_ready, connection_id, tx_notify_enabled */} else { /* timeout / IPC ไม่ตอบ — ตรวจว่า firmware เปิด BLE profile */}หรือยิงคำขอแบบไม่รอ แล้วอ่าน snapshot ทีหลัง:
(void)cm55_trigger_ble_periph_status_get();/* … รอ event / delay สั้น ๆ … */(void)cm55_get_ble_periph_status(&st);| ฟิลด์ | ความหมายโดยประมาณ |
|---|---|
profile_ble_active |
โปรไฟล์ BLE ของบิลด์เปิดอยู่ |
manager_inited / stack_ready |
สแต็กพร้อม |
tx_notify_enabled |
Central เปิด notify แล้ว (ลิงก์ใช้งานจริง) |
connection_id |
มี GATT connection เมื่อไม่ใช่ 0 |
last_error |
รหัสผิดพลาดล่าสุด (0 = ปกติ) |
4. Advertising Control
หัวข้อที่มีชื่อว่า “4. Advertising Control”Advertising ทำให้ Central มองเห็นอุปกรณ์ — ชื่อในแล็บ TESA มักขึ้นต้นด้วย TESAIoT-
uint8_t result = 0xFF;
/* action: 0 = stop, 1 = start, 2 = restart */if (cm55_ble_periph_adv_ctrl_sync(1U, &result, 5000U)) { /* result 0 = ok ตาม bridge */}action |
ความหมาย |
|---|---|
0 |
Stop advertising |
1 |
Start advertising |
2 |
Restart advertising (worker-safe) |
Key phrase จาก firmware
ขณะมี connection อยู่ การ stop ADV จะไม่ตัดลิงก์ — และ start ADV อาจไม่จำเป็นเพราะเชื่อมอยู่แล้ว
ถ้าโฮสต์ไม่เห็นอุปกรณ์หลังบูตนาน: ตรวจ ADV timeout / reboot บอร์ด (Hackathon ble-flet README อธิบายอาการนี้)
5. Scan Path (Optional Observer Lab)
หัวข้อที่มีชื่อว่า “5. Scan Path (Optional Observer Lab)”เมื่อบทบาทเป็น สแกนหาอุปกรณ์อื่น (ไม่ใช่แค่เป็น peripheral):
#include "cm55_ipc_app.h"
static void on_ble_ipc(const ipc_msg_t *msg, void *user){ (void)user; /* แยกประเภท event ตาม cmd ของ IPC_EVT_BLE_* */}
void ble_scan_lab_start(void){ cm55_ble_ipc_set_event_handler(on_ble_ipc, NULL); cm55_ble_request_scan_all(); /* หรือ scan_name / scan_addr */ /* หยุดด้วยคำสั่ง scan stop ตามตัวอย่าง SDK เมื่อครบเวลา */}ตัวช่วยที่พบบ่อย:
| API | ใช้เมื่อ |
|---|---|
cm55_ble_request_scan_all |
สแกนเต็ม ไม่กรอง |
cm55_ble_request_scan_name |
กรองตามชื่อย่อย |
cm55_ble_request_scan_addr |
กรองตามที่อยู่ 6 ไบต์ |
cm55_ble_ipc_set_event_handler |
รับผลสแกน/สถานะใน task |
ตัวอย่างในเฟิร์มแวร์ชุดนี้มักชื่อแนว example_ble (สลับสแกนเปิด/ปิดเป็นคาบ) — เปิดดูใน Developer Hub / โปรเจกต์ตัวอย่างของเฟิร์มแวร์
6. Host Tools for the Lab
หัวข้อที่มีชื่อว่า “6. Host Tools for the Lab”6.1 Recommended: Hackathon ble-flet
หัวข้อที่มีชื่อว่า “6.1 Recommended: Hackathon ble-flet”แพ็ก TESAIoT_Hackathon มีแอปเดสก์ท็อป Python + Flet + bleak:
- Flash HEX ที่เปิด BLE module profile
- รัน
ble-fletตาม README ใน repo - แอปจะ hunt ชื่อ
TESAIoT-*→ connect → สตรีม
เหมาะกับแล็บที่ต้องการ หลักฐาน live โดยไม่พึ่ง Web Bluetooth ในเบราว์เซอร์
6.2 Generic GATT explorers
หัวข้อที่มีชื่อว่า “6.2 Generic GATT explorers”- nRF Connect / LightBlue / AIROC™ Bluetooth® Connect (ตามตัวอย่าง Infineon Find Me)
- ใช้ยืนยันว่าอุปกรณ์ advertise และเชื่อมได้ แม้ยังไม่ decode BS2
6.3 Bitstream Studio
หัวข้อที่มีชื่อว่า “6.3 Bitstream Studio”Bitstream Studio เป็นโฮสต์หลักของหลักสูตรสำหรับ USB/UART และ MQTT — ใน M07 ใช้เป็น คู่เทียบ ว่าเมื่อไรเลือก BLE local แทนสายหรือ broker
GATT identity (แล็บ BS2 BLE)
หัวข้อที่มีชื่อว่า “GATT identity (แล็บ BS2 BLE)”โฮสต์แล็บอ้างอิง service/characteristic ตระกูล BS2 (UUID คงที่ใน ble-flet) และชื่อ ADV ขึ้นต้น TESAIoT- — อย่า hardcode UUID ในเอกสารผลงานถ้าไม่จำเป็น; ระบุว่าใช้แพ็ก Hackathon เวอร์ชันใด
7. Security and Lab Hygiene
หัวข้อที่มีชื่อว่า “7. Security and Lab Hygiene”| หัวข้อ | แนวปฏิบัติ |
|---|---|
| Pairing / bonding | แล็บมักใช้ลิงก์สั้น ๆ — อย่าสมมติว่าเป็น production secure pairing |
| ข้อมูลบนอากาศ | BLE ไม่ผ่าน broker แต่ยังอยู่ในช่วงวิทยุของห้องที่ทำแล็บ |
| Secret | ไม่มีรหัส Wi‑Fi ใน path นี้ — แต่ยังห้ามฝัง credential อื่นในไฟล์สาธารณะ |
| Central เดียว | อย่าเปิด nRF Connect และ ble-flet พร้อมกันบนเครื่องเดียวไปที่บอร์ดเดียวกัน |
8. Design Patterns for Capstone (Preview M08)
หัวข้อที่มีชื่อว่า “8. Design Patterns for Capstone (Preview M08)”เลือกอย่างน้อยหนึ่งเส้นทาง connectivity ใน Capstone:
Sensor task ──► window/filter ──► LED/UART │ ┌───────────┴───────────┐ ▼ ▼ MQTT publish (M06) BLE notify / host (M07) MQTT subscribe cmd BLE write / commandเกณฑ์ขั้นต่ำของ M08: MQTT หรือ BLE — ใช้ทั้งสองได้เป็นโบนัส
9. Common Pitfalls
หัวข้อที่มีชื่อว่า “9. Common Pitfalls”| อาการ | สาเหตุที่พบบ่อย |
|---|---|
| สแกนไม่เจอ | BLE profile ปิด · ยังไม่ ADV · ADV timeout · อยู่ไกล/มีคลื่นรบกวน |
| Status sync timeout | CM33 ยังไม่พร้อม · IPC ไม่ขึ้น · บิลด์ไม่มี BLE |
| Connect แล้วหลุด | Central อีกตัวแย่ง · reboot บอร์ด · timeout นโยบายเฟิร์มแวร์ |
| Wi‑Fi + BLE พร้อมกันแปลก ๆ | Combo radio coexistence — ทดสอบแยกก่อนรวม |
| สับสนกับ MQTT | คนละชั้นขนส่ง — อย่าหา broker ในแล็บ BLE |
Next Steps
หัวข้อที่มีชื่อว่า “Next Steps”- ทำแล็บ: แล็บ
- เก็บแผ่นสูตร: ble-connectivity.md
- เมื่อพร้อม ไปต่อ M08 — Capstone (บทเรียน M08)
References and Further Reading
หัวข้อที่มีชื่อว่า “References and Further Reading”- Bluetooth LE overview
- Infineon mtb-example-psoc-edge-btstack-findme
- Infineon BLE + Wi‑Fi IoT gateway CE
- TESAIoT_Hackathon (
ble-flet/) - TESAIoT Developer Hub
- Bitstream Studio
- M06 MQTT · M08 Capstone
- PSOC™ Edge E84
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”คำถามสั้นสามข้อใน quiz.yaml ผูกกับเป้าหมายของบทเรียนนี้ข้อละหนึ่งคำถาม ลองตอบเองก่อน แล้วค่อยเทียบกับเฉลยและคำอธิบายในไฟล์
ลงมือต่อที่ แล็บ: การเชื่อมต่อ BLE
Lab · Cheatsheet · ← Table of Contents · ← M06 · M08 →
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
ข้อใดตรงกับ Key phrase ของบทเรียนเรื่อง BLE กับ MQTT (เป้าหมายข้อ 1)
- MQTT พาข้อมูลขึ้นเครือข่าย ส่วน BLE พาข้อมูลเข้ามือถือหรือพีซีที่อยู่ใกล้
- BLE ต้องมี broker เสมอ
- MQTT ไม่ต้องใช้ Wi-Fi
- BLE กับ MQTT เป็นชั้นขนส่งเดียวกัน
ดูเฉลย
คำตอบ: A. MQTT พาข้อมูลขึ้นเครือข่าย ส่วน BLE พาข้อมูลเข้ามือถือหรือพีซีที่อยู่ใกล้
Key phrase ในหัวข้อ BLE vs MQTT และตาราง Common Pitfalls: คนละชั้นขนส่ง อย่าหา broker ในแล็บ BLE
-
อุปกรณ์ที่ “สแกนแล้วเชื่อม” เช่นโทรศัพท์หรือพีซี มีบทบาทใด (เป้าหมายข้อ 2)
- Advertising
- Notification
- Central
- Peripheral
ดูเฉลย
คำตอบ: C. Central
ตารางในหัวข้อ 1: Central คือโฮสต์ที่สแกนแล้วเชื่อม ส่วนบอร์ดมักเป็น Peripheral ที่ advertise
-
ในเฟิร์มแวร์ของบทเรียนนี้ BLE stack รันบนคอร์ใด (เป้าหมายข้อ 3)
- CM33 โดย CM55 สั่งงานผ่าน IPC
- CM55 โดยตรง
- Ethos-U55
- NNLite
ดูเฉลย
คำตอบ: A. CM33 โดย CM55 สั่งงานผ่าน IPC
หัวข้อ 2: สแต็ก BLE รันบน CM33 ส่วนแอปเซ็นเซอร์บน CM55 สั่งผ่าน IPC
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"BLE สำหรับผลิตภัณฑ์ Edge" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "BLE for Edge Products" 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/m07-ble/l01-ble-connectivity/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/drsanti/TESAIoT-Courses/blob/287c21814ba8c75f693136616dcd270349a15966/C1/M07/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