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

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 (commit f5f09a6) ระบุว่า python-app/, ble-react/ และ ble-flet/ เป็นของผู้ดูแลและไม่อยู่ใน repo สาธารณะ ให้ใช้เส้นทางสำรองที่บทเรียนเสนอไว้แล้ว คือ GATT explorer ทั่วไป เช่น nRF Connect, LightBlue หรือ AIROC™ Bluetooth® Connect


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

  1. อธิบายบทบาท BLE ในผลิตภัณฑ์ Edge (local / phone / desktop) เทียบกับ MQTT (cloud / broker)
  2. อธิบายคำสำคัญ: GAP, GATT, Peripheral, Central, Advertising, Connection, Notification
  3. ชี้ได้ว่าใน TESA Firmware SDK CM33 เป็นเจ้าของ BLE stack และ CM55 สั่งผ่าน IPC
  4. อ่านสถานะ peripheral ด้วย cm55_ble_periph_status_get_sync / cm55_get_ble_periph_status
  5. สั่ง advertising ด้วย cm55_ble_periph_adv_ctrl_sync (stop / start / restart)
  6. อธิบายเส้นทาง scan (CM55 ขอสแกน → CM33 รายงานผล) สำหรับโหมด observer
  7. ใช้โฮสต์แล็บ: TESAIoT_Hackathon ble-flet/ หรือแอปสแกน GATT ทั่วไป
  8. ทำแบบฝึกบนบอร์ดจริงและเก็บหลักฐานลิงก์

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

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

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


บน 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 ในห้องจริง


ก่อน “เชื่อมกับมือถือ” ให้ยืนยันว่าโปรไฟล์ 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;
#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 = ปกติ)

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 อธิบายอาการนี้)


เมื่อบทบาทเป็น สแกนหาอุปกรณ์อื่น (ไม่ใช่แค่เป็น 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 / โปรเจกต์ตัวอย่างของเฟิร์มแวร์


แพ็ก TESAIoT_Hackathon มีแอปเดสก์ท็อป Python + Flet + bleak:

  1. Flash HEX ที่เปิด BLE module profile
  2. รัน ble-flet ตาม README ใน repo
  3. แอปจะ hunt ชื่อ TESAIoT-* → connect → สตรีม

เหมาะกับแล็บที่ต้องการ หลักฐาน live โดยไม่พึ่ง Web Bluetooth ในเบราว์เซอร์

  • nRF Connect / LightBlue / AIROC™ Bluetooth® Connect (ตามตัวอย่าง Infineon Find Me)
  • ใช้ยืนยันว่าอุปกรณ์ advertise และเชื่อมได้ แม้ยังไม่ decode BS2

Bitstream Studio เป็นโฮสต์หลักของหลักสูตรสำหรับ USB/UART และ MQTT — ใน M07 ใช้เป็น คู่เทียบ ว่าเมื่อไรเลือก BLE local แทนสายหรือ broker

โฮสต์แล็บอ้างอิง service/characteristic ตระกูล BS2 (UUID คงที่ใน ble-flet) และชื่อ ADV ขึ้นต้น TESAIoT- — อย่า hardcode UUID ในเอกสารผลงานถ้าไม่จำเป็น; ระบุว่าใช้แพ็ก Hackathon เวอร์ชันใด


หัวข้อ แนวปฏิบัติ
Pairing / bonding แล็บมักใช้ลิงก์สั้น ๆ — อย่าสมมติว่าเป็น production secure pairing
ข้อมูลบนอากาศ BLE ไม่ผ่าน broker แต่ยังอยู่ในช่วงวิทยุของห้องที่ทำแล็บ
Secret ไม่มีรหัส Wi‑Fi ใน path นี้ — แต่ยังห้ามฝัง credential อื่นในไฟล์สาธารณะ
Central เดียว อย่าเปิด nRF Connect และ ble-flet พร้อมกันบนเครื่องเดียวไปที่บอร์ดเดียวกัน

เลือกอย่างน้อยหนึ่งเส้นทาง connectivity ใน Capstone:

Sensor task ──► window/filter ──► LED/UART
│
┌───────────┴───────────┐
▼ ▼
MQTT publish (M06) BLE notify / host (M07)
MQTT subscribe cmd BLE write / command

เกณฑ์ขั้นต่ำของ M08: MQTT หรือ BLE — ใช้ทั้งสองได้เป็นโบนัส


อาการ สาเหตุที่พบบ่อย
สแกนไม่เจอ BLE profile ปิด · ยังไม่ ADV · ADV timeout · อยู่ไกล/มีคลื่นรบกวน
Status sync timeout CM33 ยังไม่พร้อม · IPC ไม่ขึ้น · บิลด์ไม่มี BLE
Connect แล้วหลุด Central อีกตัวแย่ง · reboot บอร์ด · timeout นโยบายเฟิร์มแวร์
Wi‑Fi + BLE พร้อมกันแปลก ๆ Combo radio coexistence — ทดสอบแยกก่อนรวม
สับสนกับ MQTT คนละชั้นขนส่ง — อย่าหา broker ในแล็บ BLE

  1. ทำแล็บ: แล็บ
  2. เก็บแผ่นสูตร: ble-connectivity.md
  3. เมื่อพร้อม ไปต่อ M08 — Capstone (บทเรียน M08)

  1. Bluetooth LE overview
  2. Infineon mtb-example-psoc-edge-btstack-findme
  3. Infineon BLE + Wi‑Fi IoT gateway CE
  4. TESAIoT_Hackathon (ble-flet/)
  5. TESAIoT Developer Hub
  6. Bitstream Studio
  7. M06 MQTT · M08 Capstone
  8. PSOC™ Edge E84

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

ลงมือต่อที่ แล็บ: การเชื่อมต่อ BLE

Lab · Cheatsheet · ← Table of Contents · ← M06 · M08 →

คำถามทบทวน

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

  1. ข้อใดตรงกับ Key phrase ของบทเรียนเรื่อง BLE กับ MQTT (เป้าหมายข้อ 1)

    1. MQTT พาข้อมูลขึ้นเครือข่าย ส่วน BLE พาข้อมูลเข้ามือถือหรือพีซีที่อยู่ใกล้
    2. BLE ต้องมี broker เสมอ
    3. MQTT ไม่ต้องใช้ Wi-Fi
    4. BLE กับ MQTT เป็นชั้นขนส่งเดียวกัน
    ดูเฉลย

    คำตอบ: A. MQTT พาข้อมูลขึ้นเครือข่าย ส่วน BLE พาข้อมูลเข้ามือถือหรือพีซีที่อยู่ใกล้

    Key phrase ในหัวข้อ BLE vs MQTT และตาราง Common Pitfalls: คนละชั้นขนส่ง อย่าหา broker ในแล็บ BLE

  2. อุปกรณ์ที่ “สแกนแล้วเชื่อม” เช่นโทรศัพท์หรือพีซี มีบทบาทใด (เป้าหมายข้อ 2)

    1. Advertising
    2. Notification
    3. Central
    4. Peripheral
    ดูเฉลย

    คำตอบ: C. Central

    ตารางในหัวข้อ 1: Central คือโฮสต์ที่สแกนแล้วเชื่อม ส่วนบอร์ดมักเป็น Peripheral ที่ advertise

  3. ในเฟิร์มแวร์ของบทเรียนนี้ BLE stack รันบนคอร์ใด (เป้าหมายข้อ 3)

    1. CM33 โดย CM55 สั่งงานผ่าน IPC
    2. CM55 โดยตรง
    3. Ethos-U55
    4. 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 ฉบับเต็ม

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

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