Peripheral — คืออุปกรณ์ในสถาปัตยกรรม Bluetooth Low Energy ที่โฆษณาบริการของตนผ่านแพ็กเก็ต advertising และรอการเชื่อมต่อจาก Central ในระบบนิเวศ IoT Peripheral — มักจะเป็นอุปกรณ์ที่ใช้พลังงานจำกัด: เซ็นเซอร์วัดอุณหภูมิ หลอดไฟอัจฉริยะ สายรัดข้อมือฟิตเนส บีคอน (Beacon) Bluetooth Core Specification 5.4 (2023) กำหนดโปรโตคอลการโฆษณา: Peripheral จะส่งแพ็กเก็ต advertising เป็นระยะ ซึ่งประกอบด้วยชื่ออุปกรณ์ รายการบริการ และข้อมูลผู้ใช้ ส่วน Central จะสแกนแพ็กเก็ตเหล่านี้และตัดสินใจว่าจะเชื่อมต่อหรือไม่ หลังจากสร้างการเชื่อมต่อแล้ว Peripheral จะทำหน้าที่เป็น GATT-เซิร์ฟเวอร์ โดยให้บริการและคุณลักษณะสำหรับการอ่านและเขียน
ประเด็นสำคัญ
Peripheral — คืออุปกรณ์ BLE ที่ implement GATT-เซิร์ฟเวอร์และโฆษณาความสามารถของตนผ่านช่องสัญญาณ advertising แตกต่างจาก Central ที่ค้นหาอุปกรณ์อย่าง-active Peripheral จะรอการเชื่อมต่อแบบพาสซีฟ นี่คือโมเดลแบบอสมมาตรที่ถูกปรับให้เหมาะสมสำหรับประสิทธิภาพการใช้พลังงานของอุปกรณ์ที่ใช้แบตเตอรี่
Peripheral สามารถอยู่ในหลายโหมด: advertising (การโฆษณา), connected (เชื่อมต่อกับ Central), sleeping (สลีปโดยปิดการโฆษณา) ในโหมด advertising Peripheral จะส่งแพ็กเก็ตข้อมูลสั้น ๆ เป็นระยะ โดยใช้พลังงานน้อยที่สุด หลังจากเชื่อมต่อ Peripheral จะเปลี่ยนเป็นโหมด connected ซึ่งจะแลกเปลี่ยนข้อมูลกับ Central ตาม connection interval ที่ตกลงร่วมกัน
ตาม Bluetooth Core Specification 5.4 (2023) อุปกรณ์สามารถสลับระหว่างบทบาท Peripheral และ Central ได้อย่างไดนามิก แต่ในแต่ละช่วงเวลาสำหรับการเชื่อมต่อหนึ่งบทบาทจะถูกกำหนดคงที่ สถานการณ์ทั่วไป: เซ็นเซอร์ IoT ทำงานในบทบาท Peripheral อย่างต่อเนื่อง ในขณะที่สมาร์ทโฟนจัดการการเชื่อมต่อในฐานะ Central
นักพัฒนาควรเข้าใจ: Peripheral เป็นตัวกำหนดว่า บริการและคุณลักษณะใดบ้างที่พร้อมใช้งาน และจัดการการเข้าถึงบริการเหล่านั้น โครงสร้าง GATT-เซิร์ฟเวอร์บน Peripheral กำหนดว่า Central สามารถอ่านข้อมูลใดและเขียนคำสั่งใดได้บ้าง
Advertising (การโฆษณา) — เป็นกลไกที่ Peripheral ใช้ประกาศการมีอยู่ของตน Peripheral จะส่งแพ็กเก็ต advertising บนช่องสัญญาณที่กำหนดสามช่อง (37, 38, 39) ด้วยช่วงเวลาตั้งแต่ 20 ms ถึง 10.24 วินาที แต่ละแพ็กเก็ตโฆษณาประกอบด้วยข้อมูลคงที่และสามารถรวมข้อมูลเพิ่มเติมได้
แพ็กเก็ตโฆษณามีสองประเภท: advertising PDU (แพ็กเก็ตหลัก) และ scan response PDU (การตอบสนองต่อคำขอของ Central) แพ็กเก็ตหลักประกอบด้วยฟิลด์บังคับ: ประเภทแพ็กเก็ต ที่อยู่ผู้ส่ง ข้อมูล หาก Central ส่ง scan request Peripheral จะตอบกลับด้วยแพ็กเก็ตเพิ่มเติมที่มีข้อมูลครบถ้วนมากขึ้น — เช่น ชื่อเต็มของอุปกรณ์
พารามิเตอร์ advertising ส่งผลต่อความเร็วในการตรวจจับและการใช้พลังงาน Advertising interval — คือเวลาระหว่างการส่งแพ็กเก็ต ยิ่งช่วงเวลาสั้นเท่าใด Central ก็จะตรวจจับอุปกรณ์ได้เร็วขึ้นเท่านั้น แต่ Peripheral จะใช้พลังงานมากขึ้น ช่วงเวลาที่แนะนำ: 100–1000 ms สำหรับอุปกรณ์ส่วนใหญ่
| พารามิเตอร์ | ช่วง | ผลกระทบ | คำแนะนำ |
|---|---|---|---|
| Advertising Interval | 20 ms – 10.24 s | ความเร็วในการตรวจจับ, พลังงาน | 100–1000 ms เพื่อความสมดุล |
| Advertising Channels | 37, 38, 39 | ความน่าเชื่อถือในการตรวจจับ | ทั้ง 3 ช่องสัญญาณจำเป็น |
| Tx Power | -20 – +10 dBm | ระยะทาง, การรบกวน | 0 dBm สำหรับภายใน, +4 dBm สำหรับภายนอก |
| Advertising Timeout | 0 – 180 วินาที | ระยะเวลาการโฆษณา | 0 (ไม่จำกัด) สำหรับบีคอน |
แพ็กเก็ตโฆษณา BLE มีข้อจำกัดที่ 31 ไบต์สำหรับ advertising PDU และอีก 31 ไบต์สำหรับ scan response ภายในแพ็กเก็ตข้อมูลถูกจัดระเบียบในรูปแบบ AD Structure (Advertising Data Structure): แต่ละฟิลด์มีประเภท (1 ไบต์), ความยาว (1 ไบต์) และค่า
AD Type ที่ใช้บ่อยที่สุด: Flags (0x01) — โหมดการเชื่อมต่อและการตรวจจับ, Local Name (0x08 หรือ 0x09) — ชื่ออุปกรณ์, Service UUID List (0x02–0x07) — รายการ UUID ของบริการ, Manufacturer Specific Data (0xFF) — ข้อมูลผู้ผลิต การบรรจุข้อมูลในแพ็กเก็ต 31 ไบต์อย่างถูกต้องเป็นงานสำคัญของนักพัฒนาอุปกรณ์ฝังตัว
สำหรับอุปกรณ์ที่ต้องการส่งข้อมูลมากขึ้น มี extended advertising (BLE 5.0+) ซึ่งเพิ่มขนาดแพ็กเก็ตโฆษณาเป็น 251 ไบต์และเพิ่มประเภทแพ็กเก็ตใหม่ Extended advertising ยังรองรับช่องสัญญาณแบบเข้ารหัส (coded PHY) เพื่อเพิ่มระยะทางสูงสุด 1 กม. ในพื้นที่เปิด
เมื่อออกแบบแพ็กเก็ตโฆษณาให้พิจารณา: ยิ่งมีข้อมูลใน advertising-แพ็กเก็ตมากเท่าใด โอกาสเกิดการชนกับอุปกรณ์อื่นก็ยิ่งสูงขึ้นเท่านั้น สำหรับการตรวจจับที่รวดเร็ว แนะนำให้ใส่เฉพาะ ข้อมูลสำคัญ (Service UUID) ใน advertising PDU และข้อมูลเพิ่มเติมใน scan response
GATT-เซิร์ฟเวอร์ บน Peripheral ประกอบด้วยบริการและคุณลักษณะทั้งหมดที่ Central สามารถค้นพบและโต้ตอบได้ หลังจากเชื่อมต่อ Central จะค้นพบบริการ (discover services) จากนั้นค้นพบคุณลักษณะ (discover characteristics) และโต้ตอบกับบริการเหล่านั้นผ่าน GATT-โปรโตคอล
Peripheral ในฐานะ GATT-เซิร์ฟเวอร์ต้องประมวลผลคำขอจาก Central อย่างถูกต้อง: การอ่าน (read request), การเขียน (write request), การแจ้งเตือน (notification) และการแจ้งเตือนแบบยืนยัน (indication) แต่ละคำขอผ่าน GATT-ตาราง ซึ่งแต่ละแอตทริบิวต์ (บริการ, คุณลักษณะ, descriptor) จะมี Handle — ที่อยู่ 16-บิต
นักพัฒนา Peripheral กำหนด สิทธิ์การเข้าถึง สำหรับแต่ละแอตทริบิวต์: อ่านอย่างเดียว, เขียนอย่างเดียว, อ่านและเขียน, พร้อมการเข้ารหัสหรือไม่ สำหรับข้อมูลที่ละเอียดอ่อน (ข้อมูลส่วนบุคคล, ตัวชี้วัดทางการแพทย์) แนะนำให้เปิดใช้งานการเข้ารหัสผ่าน MITM Protection
CBPeripheralManager — คลาสของ Core Bluetooth สำหรับการ implement บทบาท Peripheral บน iOS โดยจัดการ GATT-เซิร์ฟเวอร์ เผยแพร่บริการและคุณลักษณะ ประมวลผลคำขอจาก Central แตกต่างจาก CBCentralManager ตรงที่ CBPeripheralManager ไม่สแกน — มันเพียงโฆษณาและให้บริการการเชื่อมต่อเท่านั้น
ขั้นตอนหลักในการ implement Peripheral บน iOS: เริ่มต้น CBPeripheralManager, เพิ่มบริการผ่าน add, เริ่มการโฆษณาผ่าน startAdvertising, ประมวลผลคำขอจาก Central ผ่าน delegate CBPeripheralManagerDelegate
import CoreBluetooth
class BLEPeripheralManager: NSObject, CBPeripheralManagerDelegate {
private var peripheralManager: CBPeripheralManager!
func startAdvertising() {
let advertisementData: [String: Any] = [
CBAdvertisementDataLocalNameKey: "BLE Sensor",
CBAdvertisementDataServiceUUIDsKey: [
CBUUID("180F")
]
]
peripheralManager.startAdvertising(advertisementData)
}
func peripheralManagerDidUpdateState(
_ peripheral: CBPeripheralManager
) {
if peripheral.state == .poweredOn {
startAdvertising()
}
}
}
iOS อนุญาตให้ Peripheral ทำงานใน โหมดพื้นหลัง หากมีคีย์ bluetooth-peripheral ใน Background Modes ในพื้นหลัง iOS สามารถโฆษณาด้วยข้อมูลที่จำกัดและให้บริการการเชื่อมต่อ สำหรับการโฆษณาที่ยาวนาน (มากกว่า 180 วินาที) ให้ใช้ตัวเลือก CBAdvertisementDataWaitForResponseFromCentral เพื่อประหยัดพลังงาน
Android มี BluetoothLeAdvertiser สำหรับการทำงานในบทบาท Peripheral (ตั้งแต่ API 21) API อนุญาตให้เริ่มการโฆษณาด้วยพารามิเตอร์ที่ปรับแต่งได้: กำลังส่ง, ช่วงเวลาโฆษณา, ข้อมูลแพ็กเก็ต Android ยังรองรับ extended advertising (BLE 5.0) บนอุปกรณ์ที่เข้ากันได้
import android.bluetooth.le.*;
private BluetoothLeAdvertiser advertiser;
public void startPeripheral() {
BluetoothAdapter adapter =
BluetoothAdapter.getDefaultAdapter();
advertiser = adapter.getBluetoothLeAdvertiser();
AdvertiseData data = new AdvertiseData.Builder()
.setIncludeDeviceName(true)
.addServiceUuid(
new ParcelUuid(
UUID.fromString("0000180F-0000-1000-8000-00805F9B34FB")
)
)
.build();
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
.build();
advertiser.startAdvertising(
settings, data, advertiseCallback
);
}
บน Android การรองรับ Peripheral ขึ้นอยู่กับ ผู้ผลิตและเวอร์ชัน OS อุปกรณ์บางรุ่นไม่รองรับ BluetoothLeAdvertiser — ให้ตรวจสอบผ่าน adapter.isMultipleAdvertisementSupported() ตั้งแต่ Android 10 เป็นต้นไป จำเป็นต้องมีสิทธิ์ BLUETOOTH_ADVERTISE สำหรับการทำงานในบทบาท Peripheral รวมถึงคำขอ runtime สำหรับแอปที่มี target SDK 31+
ประสิทธิภาพการใช้พลังงาน — คือข้อได้เปรียบหลักของ BLE และ Peripheral มีบทบาทสำคัญในเรื่องนี้ อุปกรณ์สามารถทำงานจากแบตเตอรี่ CR2032 (220 mAh) ได้นานกว่าหนึ่งปีด้วยการใช้พลังงานที่ปรับให้เหมาะสม โดยส่วนใหญ่ Peripheral จะอยู่ในโหมดสลีปโดยปิดการโฆษณา จะตื่นขึ้นมาเฉพาะเมื่อต้องส่งแพ็กเก็ตโฆษณาหรือประมวลผลคำขอจาก Central
การใช้พลังงานของ Peripheral ในโหมดต่าง ๆ: โหมดสลีปลึก (deep sleep) — 1–5 µA, idle พร้อมตัวจับเวลา — 10–50 µA, advertising — 5–15 mA (ในช่วงเวลาส่งแพ็กเก็ต), connected — 5–10 mA (ในช่วง connection event) ที่ advertising interval 1000 ms และระยะเวลาแพ็กเก็ต 4 ms กระแสเฉลี่ยอยู่ที่ประมาณ 50–100 µA
ตาม Texas Instruments Application Report (SWRA478, 2024) การปรับ advertising interval จาก 100 ms เป็น 1000 ms ช่วยลดการใช้พลังงานเฉลี่ยลง 90% การประหยัดเพิ่มเติมทำได้โดยใช้ slave latency (การข้าม connection events), การลด Tx Power ในระยะใกล้ และการปิดโฆษณาหลังการเชื่อมต่อ (connectable advertising)
คำถามที่พบบ่อย
ได้ ผ่านกลไก การแจ้งเตือน (Notify/Indicate) แม้ว่าผู้เริ่มต้นการเชื่อมต่อจะเป็น Central เสมอ แต่หลังจากเชื่อมต่อแล้ว Peripheral สามารถส่งข้อมูลผ่าน GATT-การแจ้งเตือนโดยไม่ต้องมีคำขอชัดเจนจาก Central โดย Central ต้องสมัครสมาชิกล่วงหน้าผ่าน CCCD
ระยะเวลาการโฆษณาไม่ได้ถูกจำกัดโดยข้อกำหนด แต่ในทางปฏิบัติถูกจำกัดโดย พลังงานแบตเตอรี่ ใน iOS Peripheral สามารถโฆษณาในพื้นหลังได้ไม่เกิน 180 วินาทีต่อเซสชันโดยไม่ต้องตั้งค่าเพิ่มเติม บน Android การโฆษณาสามารถทำงานได้ไม่จำกัด แต่จะลดอายุการใช้งานแบตเตอรี่อย่างมาก
เพิ่ม advertising interval (แนะนำ 500–1000 ms), ใช้ slave latency เพื่อข้าม connection events, ปิดโฆษณาหลังการเชื่อมต่อ และเลือก Tx Power ขั้นต่ำที่เพียงพอสำหรับการสื่อสารที่เสถียรในระยะที่ต้องการ
Non-connectable advertising — คือโหมดที่ Peripheral โฆษณาแต่ไม่รับคำขอเชื่อมต่อ ใช้สำหรับบีคอน (Beacon) ที่ส่งข้อมูลเท่านั้น (เช่น ตัวระบุร้านค้า) โดยไม่ต้องสร้างการเชื่อมต่อสองทาง ประหยัดพลังงานเมื่อเทียบกับ connectable advertising
ใน 31 ไบต์สามารถรวม: แฟล็ก (3 ไบต์), ชื่ออุปกรณ์ (สูงสุด 28 ไบต์ในรูปแบบย่อ), รายการ UUID ของบริการ (2–16 ไบต์ต่อ UUID), ข้อมูลผู้ผลิต (สูงสุด 26 ไบต์) กลยุทธ์ที่เหมาะสมที่สุด — ใส่ UUID ของบริการใน advertising PDU สำหรับการกรอง และชื่อเต็มใน scan response
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม