Service UUID คือตัวระบุเฉพาะแบบ 16 หรือ 128 บิตของ Bluetooth Low Energy (BLE) ที่กำหนดบริการเชิงฟังก์ชันบนอุปกรณ์อย่างชัดเจน Bluetooth SIG ได้จัดสรร UUID 16 บิตมาตรฐานสำหรับบริการทั่วไป เช่น Battery Service (0x180F), Device Information (0x180A) และ Heart Rate (0x180D) ซึ่งช่วยลดความซับซ้อนในการทำงานร่วมกันข้ามแพลตฟอร์ม ตาม Bluetooth Core Specification 5.4 (2023) บริการที่กำหนดเองของนักพัฒนาบุคคลที่สามต้องใช้ UUID 128 บิต ซึ่งรูปแบบดังกล่าวรับประกันความเป็นเอกลักษณ์ระดับโลกโดยไม่ต้องมีทะเบียนกลาง การประกาศ Service UUID ที่ถูกต้องคือก้าวแรกสู่การทำงานที่ถูกต้องของเซิร์ฟเวอร์ GATT บนอุปกรณ์รอบข้าง
ประเด็นสำคัญ
Service UUID คือตัวระบุที่กำหนดให้กับบริการ GATT ของ Bluetooth Low Energy เพื่อให้อุปกรณ์อื่นจดจำได้อย่างชัดเจน ในสถาปัตยกรรม BLE แต่ละบริการจะแทนกลุ่มตรรกะของคุณลักษณะที่รวมกันด้วยฟังก์ชันทั่วไป ตัวอย่างเช่น Battery Service มีคุณลักษณะ Battery Level ซึ่งส่งค่าระดับแบตเตอรี่ปัจจุบัน
Bluetooth SIG (Special Interest Group) จัดการทะเบียนของ UUID 16 บิต มาตรฐานที่กำหนดให้กับบริการที่พบบ่อยที่สุด ซึ่งช่วยให้อุปกรณ์จากผู้ผลิตต่าง ๆ สามารถจดจำบริการของกันและกันได้โดยไม่ต้องกำหนดค่าล่วงหน้า เครื่องติดตามฟิตเนสของแบรนด์ใด ๆ สามารถประกาศ Heart Rate Service ด้วย UUID 0x180D และสมาร์ทโฟนทุกเครื่องจะเข้าใจว่านี่คือบริการอัตราการเต้นของหัวใจ
ตาม Bluetooth Core Specification 5.4 (2023) ช่วง UUID 16 บิต (0x0000–0xFFFF) แบ่งออกเป็นสองส่วน: 0x0001 ถึง 0xFFFE เป็นบริการมาตรฐานของ Bluetooth SIG และ 0xFFFF ถูกสงวนไว้ หากนักพัฒนาต้องการบริการเฉพาะที่ไม่มีในทะเบียน SIG พวกเขาจะใช้ UUID 128 บิต
ความแตกต่างระหว่าง UUID มาตรฐานและแบบกำหนดเองไม่ได้อยู่ที่ความยาวเท่านั้น: UUID 16 บิตช่วยประหยัด เวลาออกอากาศ ในแพ็กเก็ตโฆษณา เนื่องจากถูกส่งเป็น 2 ไบต์แทนที่จะเป็น 16 ไบต์ สำหรับอุปกรณ์ที่มีข้อจำกัดด้านขนาดแพ็กเก็ตโฆษณาที่เข้มงวด (สูงสุด 31 ไบต์) สิ่งนี้มีความสำคัญมาก
UUID 16 บิตมาตรฐาน ครอบคลุมหมวดหมู่หลักของอุปกรณ์ BLE: เซ็นเซอร์ทางการแพทย์ เครื่องติดตามฟิตเนส อุปกรณ์สวมใส่ และอุปกรณ์เสริม หากอุปกรณ์ใช้ฟังก์ชันมาตรฐาน นักพัฒนาควรใช้ UUID ที่เกี่ยวข้องจากทะเบียน Bluetooth SIG เพื่อความเข้ากันได้สูงสุด
ต่อไปนี้คือตัวอย่าง UUID บริการมาตรฐาน:
| UUID (hex) | ชื่อบริการ | วัตถุประสงค์ |
|---|---|---|
| 0x1800 | Generic Access | การควบคุมการเข้าถึง ชื่ออุปกรณ์ ลักษณะภายนอก |
| 0x180A | Device Information | ผู้ผลิต รุ่น หมายเลขซีเรียล เวอร์ชันเฟิร์มแวร์ |
| 0x180D | Heart Rate | การวัดชีพจร ตำแหน่งเซ็นเซอร์ พลังงานแบตเตอรี่ |
| 0x180F | Battery Service | ระดับประจุแบตเตอรี่เป็นเปอร์เซ็นต์ |
| 0x181A | Environmental Sensing | อุณหภูมิ ความชื้น ความดัน ความสว่าง |
| 0x181C | User Data | อายุ น้ำหนัก ส่วนสูง เพศ ชีพจรขณะพัก |
UUID 128 บิตแบบกำหนดเอง จำเป็นเมื่ออุปกรณ์ให้ฟังก์ชันการทำงานเฉพาะ ตัวอย่างเช่น ผู้ผลิตล็อคอัจฉริยะสร้างบริการ Lock Control ของตัวเองด้วย UUID ในรูปแบบ XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX UUID ดังกล่าวรับประกันว่าจะไม่ขัดแย้งกับบริการอื่น เนื่องจากพื้นที่ค่า 128 บิตนั้นแทบจะไม่หมด
UUID 128 บิต เขียนในรูปแบบมาตรฐาน UUID RFC 4122: อักขระฐานสิบหกแปดตัว ยัติภังค์ สี่ ยัติภังค์ สี่ ยัติภังค์ สี่ ยัติภังค์ สิบสองตัว สำหรับ BLE จะใช้เวอร์ชันที่ส่วนฐานของ UUID ของ Bluetooth SIG มีบิตคงที่
Bluetooth SIG กำหนด UUID ฐาน: 0000XXXX-0000-1000-8000-00805F9B34FB สำหรับบริการ 16 บิตมาตรฐาน ค่า UUID จะถูกแทนที่ในมาสก์นี้: ตัวอย่างเช่น 0x180F กลายเป็น 0000180F-0000-1000-8000-00805F9B34FB บริการที่กำหนดเองใช้ UUID ที่เป็นอิสระอย่างสมบูรณ์ซึ่งสร้างโดยนักพัฒนา
เมื่อสร้าง UUID ที่กำหนดเอง คุณสามารถใช้ตัวสร้าง UUID ใดก็ได้ (UUID v4) UUID v4 แบบสุ่มให้เอนโทรปี 122 บิต ทำให้การชนกันแทบจะเป็นไปไม่ได้ อย่าใช้เวอร์ชันที่แก้ไขของ UUID ฐาน Bluetooth SIG สำหรับบริการที่กำหนดเอง — ซึ่งละเมิดข้อกำหนด
การประกาศบริการ ด้วย UUID ทำได้ที่ฝั่ง Peripheral เมื่อสร้างเซิร์ฟเวอร์ GATT ใน iOS ใช้ Core Bluetooth ใน Android ใช้ android.bluetooth.le มาดูทั้งสองแนวทางกัน
ใน Swift บริการถูกสร้างขึ้นผ่าน CBMutableService โดยระบุ UUID จากนั้นจึงเพิ่มคุณลักษณะผ่าน CBMutableCharacteristic
import CoreBluetooth
// Standard 16-bit UUID
let batteryServiceUUID = CBUUID("180F")
// Custom 128-bit UUID
let customServiceUUID = CBUUID("E20A39F4-73F5-4BC4-A12F-17D1AD07A961")
let service = CBMutableService(
type: customServiceUUID,
primary: true
)
// Add characteristics
service.characteristics = [characteristic]
// Publish service via peripheralManager
peripheralManager.add(service)
บน Android บริการถูกลงทะเบียนผ่าน BluetoothGattServer และ BluetoothGattService UUID ถูกส่งเป็นสตริงผ่าน java.util.UUID.fromString
import android.bluetooth.*;
// Custom service UUID
private static final UUID CUSTOM_SERVICE_UUID =
UUID.fromString("E20A39F4-73F5-4BC4-A12F-17D1AD07A961");
BluetoothGattService service = new BluetoothGattService(
CUSTOM_SERVICE_UUID,
BluetoothGattService.SERVICE_TYPE_PRIMARY
);
// Add characteristics
service.addCharacteristic(characteristic);
// Register on GATT server
gattServer.addService(service);
การสแกนตาม Service UUID ช่วยให้อุปกรณ์ศูนย์กลางค้นหาอุปกรณ์ที่ให้บริการที่ต้องการโดยไม่ต้องเชื่อมต่อกับอุปกรณ์รอบข้างทั้งหมดที่ตรวจพบ แพ็กเก็ตโฆษณา BLE สามารถมีรายการ UUID ของบริการ ซึ่งช่วยให้อุปกรณ์ศูนย์กลางกรองอุปกรณ์ในขั้นตอนการสแกน
ใน iOS CBCentralManager สแกนอุปกรณ์ด้วยตัวกรองตาม UUID ของบริการ ซึ่งช่วยลดการใช้พลังงานและเร่งการค้นหาอุปกรณ์ที่ต้องการ
import CoreBluetooth
let centralManager = CBCentralManager()
func scanForHeartRateMonitor() {
let services: [CBUUID] = [
CBUUID("180D") // Heart Rate Service
]
centralManager.scanForPeripherals(
withServices: services,
options: nil
)
}
// Delegate receives only Heart Rate Service devices
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// peripheral has only devices with UUID 0x180D
}
บน Android การกรองตาม UUID ก็รองรับผ่าน ScanFilter.Builder เช่นกัน ซึ่งเป็นวิธีที่มีประสิทธิภาพในการจำกัดขอบเขตการค้นหาโดยไม่ต้องเชื่อมต่อกับแต่ละอุปกรณ์
import android.bluetooth.le.*;
ScanFilter filter = new ScanFilter.Builder()
.setServiceUuid(
new ParcelUuid(
UUID.fromString("0000180D-0000-1000-8000-00805F9B34FB")
)
)
.build();
BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
scanner.startScan(
Collections.singletonList(filter),
scanSettings,
scanCallback
);
อุปกรณ์ BLE หนึ่งเครื่อง สามารถประกาศบริการหลายรายการพร้อมกัน ตัวอย่างเช่น สายรัดข้อมือฟิตเนสอาจมี Battery Service (0x180F), Heart Rate Service (0x180D) และบริการที่กำหนดเองสำหรับซิงค์ข้อมูลกับคลาวด์ แต่ละบริการมี UUID ของตัวเองและชุดคุณลักษณะของตัวเอง
เมื่อมีบริการหลายรายการ สิ่งสำคัญคือต้องพิจารณา ข้อจำกัดของแพ็กเก็ตโฆษณา แพ็กเก็ตโฆษณา BLE สามารถมีข้อมูลได้สูงสุด 31 ไบต์ หาก UUID ของบริการใช้พื้นที่มากเกินไป บางรายการอาจไม่พอดีกับแพ็กเก็ตโฆษณา ในกรณีนี้ จะใช้การตอบสนองการสแกน — แพ็กเก็ตที่สองที่ส่งตามคำขอของอุปกรณ์ศูนย์กลาง
ตาม Bluetooth Core Specification 5.4 (2023) จำนวนสูงสุดของบริการหลักบนเซิร์ฟเวอร์ GATT หนึ่งเครื่องไม่ได้ถูกจำกัดโดยข้อกำหนด แต่ในทางปฏิบัติถูกจำกัดโดยหน่วยความจำอุปกรณ์และข้อกำหนดด้านประสิทธิภาพ สำหรับอุปกรณ์ฝังตัวที่มีหน่วยความจำแฟลช 256 KB แนะนำให้ไม่เกิน 5–10 บริการ
คำถามที่พบบ่อย
UUID 16 บิต ถูกสงวนโดย Bluetooth SIG สำหรับบริการมาตรฐานและใช้พื้นที่ 2 ไบต์ในแพ็กเก็ตโฆษณา UUID 128 บิตใช้สำหรับบริการที่กำหนดเองและใช้พื้นที่ 16 ไบต์ การเลือกขึ้นอยู่กับประเภทบริการ: ฟังก์ชันมาตรฐานใช้ UUID 16 บิต ฟังก์ชันเฉพาะใช้ UUID 128 บิต
ใช้ UUID v4 — UUID แบบสุ่มที่สร้างโดยเครื่องมือออนไลน์ คำสั่งเทอร์มินัล uuidgen หรือ API ของภาษาการเขียนโปรแกรมของคุณ ตัวอย่าง: UUID.fromString(UUID.randomUUID().toString()) ใน Java หรือ UUID() ใน Swift
ไม่ ไม่จำเป็นต้องลงทะเบียน Bluetooth SIG ลงทะเบียนเฉพาะ UUID 16 บิต UUID 128 บิตที่กำหนดเองถูกสร้างขึ้นโดยนักพัฒนาอย่างอิสระและรับประกันความเป็นเอกลักษณ์ด้วยพื้นที่ที่อยู่มหาศาล (ชุดค่าผสม 2^128)
ได้ บริการ GATT มาตรฐานสามารถมี คุณลักษณะจำนวนไม่จำกัด ตัวอย่างเช่น Battery Service สามารถมี Battery Level (0x2A19) และ Battery Power State (0x2A1A) แต่ละคุณลักษณะมี UUID และชุดคุณสมบัติของตัวเอง
หาก UUID ตรงกัน อุปกรณ์ศูนย์กลางจะไม่สามารถแยกแยะบริการหนึ่งจากอีกบริการหนึ่งได้หากไม่มีข้อมูลเพิ่มเติม ความน่าจะเป็นของการชนกันของ UUID v4 แบบสุ่มนั้นน้อยมาก — ประมาณ 5.3 × 10^−37 ใช้ตัวสร้าง UUID แบบสุ่ม อย่าคัดลอก UUID จากตัวอย่าง
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ