Bluetooth Low Energy [2] ( BLE บางแห่งเรียก Bluetooth Smart) ถูกออกแบบมาเพื่อความประหยัด ( low power, low bandwidth, low cost และ low complexity) เป็นส่วนหนึ่งของมาตรฐาน Bluetooth 4.0 เริ่มต้นการพัฒนาจาก Wibree [3] โดย Nokia ปัจจุบันได้รับการดูแล กำหนดการสร้างมาตรฐานด้วย Bluetooth Special Interest Group (SIG) [4]
การเติบโตของตลาดโทรศัพท์เคลื่อนที่ และ Tablet ทำให้ความนิยมใน BLE เติบโตตามไปด้วย ในช่วงแรกยังคงเป็นสื่อสารกันเองระหว่างโทรศัพท์เคลื่อนที่ด้วยก้นหรือระหว่างโทรศัพท์เคลื่อนที่กับ Tablet ต่อมาแนวคิดการสร้างระบบ Internet Of Things (IoT) ได้เติบโตขึ้นมา และมีการนำเอา BLE มาติดตั้งกับอุปกรณ์อิเล็คทรอนิกส์อื่น เช่น Raspberry Pi เป็นต้น ทำให้เกิดการเชื่อมโยงจากข่ายงาน PAN Bluetooth ออกไปยังข่ายงาน IoT ด้วย
ความรู้ทั่วไปเกี่ยวกับการสื่อสารของ BLE
รูปแบบการสื่อสาร
BLE สื่อสารกันในสองลักษณะคือ1. Broadcasting & Observing
2. Connections
Broadcasting & Observing เป็นการสื่อสารแบบทางเดียว ไม่มีการเชื่อมต่อระหว่างอุปกรณ์อย่างสมบูรณ์ รูปแบบนี้แบ่งหน้าที่ของอุปกรณ์ออกเป็นสองหน้าที่คือ
- Broadcaster ทำหน้าที่ปล่อยข้อมูลออกมา
- Observer ทำหน้าที่รับฟังและเก็บข้อมูล
รูปแบบนี้เหมาะกับการสื่อสารที่มีขนาดข้อมูลเล็ก และ ความรวดเร็วในการสื่อสาร
Connections เป็นการสื่อสารแบบสองทาง มีการสร้างเส้นทางการสื่อสารระหว่างอุปกรณ์ที่ชัดเจน ใช้ส่งข้อมูลที่มีขนาดใหญ่กว่าแบบแรก แบ่งหน้าที่อุปกรณ์ออกเป็นสองหน้าที่คือ
- Central (Master) มักหมายถึงอุปกรณ์ที่มีความสามารถสูง เช่น โทรศัพท์เคลื่อนที่ Tablet หรือ PC จะคอยตรวจสอบสัญญาณความต้องการการสื่อสารเป็นระยะ
- Peripheral (Slave) มักหมายถึงอุปกรณ์ขนาดเล็ก อาจเชื่อมต่อกับ Sensor จะคอยส่งสัญญาณความต้องการสื่อสารออกไป เมื่อการสื่อสารติดตั้งเรียบร้อยแล้วก็จะทำตามที่ Master กำหนด
BLE ใช้การส่งข้อมูลออกไปเป็นระยะจาก Broadcaster หรือ Peripheral ไปยัง Observer หรือ Central ทำให้เกิดการประหยัดพลังงาน รูปแบบการสื่อสารที่กล่าวมานี้เป็นรายละเอียดที่กำหนดไว้ในชื่อ Generic Access Profile (GAP) [5]
Bluetooth Address
มีความหมายและวัตถุประสงค์เช่นเดียวกับ Address ที่ใช้ในการสื่อสารแบบ Internet แบ่งได้เป็นสองแบบคือ
- Static Address (Public Address) มีขนาด 6 bytes (48 bits) จะถูกกำหนดมาโดยผู้ผลิตอุปกรณ์ ที่อยู่นี้จะต้องไปขึ้นทะเบียนไว้กับ SIG และไม่เปลี่ยนแปลงตลอดอายุของอุปกรณ์
- Random Address เป็นที่อยู่ที่กำหนดได้ขณะใช้งานอุปกรณ์ ในทางปฏิบัติไม่ค่อยมีการใช้งาน
Data Packets
BLE มีโครงสร้างของข้อมูลแบบเดียว แต่การใช้งานแบ่งได้เป็นสองลักษณะ คือ
- Advertising packet
- Scan Response packet
ที่มา https://docs.mbed.com/docs/ble-intros/en/latest/Advanced/CustomGAP/ |
จากภาพโครงสร้าง packet ในส่วนที่เป็นสีน้ำเงินคือส่วนใช้บรรจุข้อมูลซึ่งมีความยาวได้ไม่เกิน 31 Bytes (ในรูประบุตัวเลข 39 Bytes คือ Data + Overhead แสดงให้เห็นภาพส่วนขยาย)
Advertising
คือการส่งข้อมูลออกของอุปกรณ์ (broadcasting) ที่เป็น Peripheral หรือ Broadcaster (Advertiser) โดยมีวัตถุประสงค์เพื่อให้ค้นพบอุปกรณ์ (device discovery) หรือเพื่อส่งข้อมูล (data publishing) ด้วยระยะห่างของเวลาคงที่ ซึ่งจะมีค่าระหว่าง 20 millisecond ถึง 10.24 second data packet ที่ส่งออกไปนี้เรียกว่า Advertising packet ในบางกรณีอุปกรณ์ที่เป็น Central หรือ Observer จะส่ง Scan Request ไปให้ Advertiser ซึ่งทาง Advertiser จะตอบกลับด้วย Scan Response packet ดังภาพ
ในทางปฏิบัติแล้วในข่ายงานหนึ่ง ๆ สามารถมี Advertise และ Scanner ได้มากกว่า 1 ในเวลาเดียวกัน (Multiple Advertisers / Multiple Scanners)
ในทางปฏิบัติแล้วในข่ายงานหนึ่ง ๆ สามารถมี Advertise และ Scanner ได้มากกว่า 1 ในเวลาเดียวกัน (Multiple Advertisers / Multiple Scanners)
Attribute Protocol (ATT)
พิธีการสื่อสารของ Bluetooth คือรูปแบบเดียวกับ Client/Server [6] ข้อมูลที่ใช้แลกเปลี่ยนกันจะมี Attribute เป็นโครงสร้าง (คล้ายกับโครงสร้างของต้นไม้ ที่แยกกิ่งออกจากลำต้น)Service คือกลุ่มของข้อมูลที่มีลักษณะร่วมกันบางประการ เช่น ค่าที่ได้จาก Sensor ซึ่งอาจมีมากกว่า 1 ค่า ทาง SIG ได้ทำการกำหนดลักษณะของ Service บางอย่างไว้แล้ว [7] เพื่ออำนวยความสะดวกสำหรับผู้ผลิต firmware แต่ไม่ได้หมายความว่าจะเป็นกำหนดตายตัว นักพัฒนาก็สามารถจะกำหนด Service สำหรับใช้ในงานของตนเองได้ สำหรับ Characteristic คือที่ใช้จัดเก็บข้อมูลจริงๆ เราอาจว่า Service เปรียบได้กับตู้เก็บเอกสาร Character เปรียบได้กับลิ้นชักจัดเก็บเอกสารซึ่งเป็นข้อมูลนำไปใช้งาน ในตู้เอกสารมีได้หลายลิ้นชัก แต่ละลิ้นชักจะมีเอกสารที่มีลักษณะเฉพาะแตกต่างกันไป
ยกตัวอย่าง Heart Rate Service ที่ออกแบบไว้แล้วโดย SIG [8] Service คือ Heart Rate Service ภายใน Heart Rate Service ประกอบด้วย 3 Characteristics คือ
- Heart Rate Measurement คือ ข้อมูลจำนวนครั้งการเต้นของหัวใจ เป็น Mandatory หมายถึงเป็นส่วนที่จะถูกนำไปใช้งาน
- Body Sensor Location คือ ข้อมูลระบุตำแหน่งของการวาง Sensor เช่น หน้าอก ข้อมูล หรือ ต้นคอ เป็น Option หมายถึงข้อมูลส่วนนี้อาจถูกไปใช้หรือไม่ก็ได้แล้วแต่ความต้องการ
- Heart Rate Control Point เป็น Option เช่นกัน
แต่ละ Attribute มีองค์ประกอบหลัก 3 องค์ประกอบคือ
- Universal Unique ID (UUID)
- Handle
- Value
Universal Unique ID (UUID)
เป็นข้อมูลความยาว 128 bits (16 Bytes) ใช้เพื่อแยก attribute ไม่ใช้ซ้ำซ้อนกัน SIG ได้กำหนด UUID [7] ไว้ล่วงหน้าสำหรับบาง Service โดยกำหนดความยาวไว้ 16 bit หรือ 32 bit เวลาใช้งานจะต้องนำมารวมกับ base UUID ซึ่งเป็นค่าคงที่ คือ 0000-1000-8000-00805F9B34FB โดยนำมาวางไว้ข้างหน้าของ base UUID ก็จะได้ความยาวเป็น 128 bit ตามมาตรฐาน การกำหนดไว้แบบนี้ก็เพื่ออำนวยความสะดวกแก่ผู้ผลิต Firmware ที่ไม่จำเป็นต้องใช้พื้นที่ยาวถึง 128 bit ในการเก็บข้อมูล เช่น กำหนดให้ service ที่จะใช้งานมี UUID เป็น 0xaaa1 ในอุปกรณ์ที่ใช้งานก็จัดเก็บเฉพาะค่านี้ เมื่อส่งออกไป UUID นี้จะถูกตีความเป็น 0000aaa1-0000-1000-8000-00805F9B34FB โดยผู้รับจะนำเอา base UUID มาต่อท้ายให้
Handle
เป็นข้อมูลความยาว 16 bits ใช้เป็น identifier สำหรับการอ้างอิงแต่ละ attribute ภายใน Connections Handle ที่ถูกสร้างขึ้นจะไม่มีการเปลี่ยนแปลงระหว่างการใช้งานValue
คือตัวข้อมูลจริง ไม่มีการกำหนดประเภท (none-type) แต่มีกำหนดขนาดไว้ไม่เกิน 512 bytesการทำให้ Bluetooth ที่ติดมากับ Raspberry Pi 3 Model B ทำงานเป็น BLE
Bluetooth Chip ที่ติดตั้งมากับ Raspberry Pi 3 Model B เป็นแบบ dual mode คือสามารถกำหนดให้ทำงานแบบ Classic หรือ BLE ก็ได้ [9] สำหรับขั้นตอนการทำให้ Bluetooth ทำงานเป็น BLE จะทิ้งไว้ให้ไปอ่านจาก https://learn.adafruit.com/install-bluez-on-the-raspberry-pi/overview ซึ่งก็มีเรื่องจะบอกเพิ่มเติมคือ1. ในกรณีที่ติดตั้ง Raspbian Stretch จะมี BlueZ รุ่นใหม่กว่าที่ระบุไว้ในบทความของ Adafruit ดังนั้นจึงข้ามขั้นตอนการติดตั้ง BlueZ ไปได้ ตรวจสอบได้จาก
$ bluetoothd --version
5.43
2. ทำการเปลี่ยนค่า ControllerMode ใน /etc/bluetooth/main.conf ให้มีค่าเป็น le
ControllerMode = le
ตรวจสอบสถานะ Bluetooth ของ Raspberry Pi
$ /etc/init.d/bluetooth status
หรือ
$ sudo systemctl status bluetooth
หมายเหตุ บริเวณที่ลูกศรสีแดงชี้อาจแสดงเป็น --experiment ก็ได้
สอบถาม Bluetooth Address
$ hcitool dev
Static Address ของ Bluetooth ที่ติดตั้งบน Raspberry Pi ที่กำลังใช้งานอยู่จะแสดงบนจอ
scan หาอุปกรณ์ BLE ที่เป็น Peripheral
$ sudo hcitool lescan
จะแสดงรายการ Static Address และ ชื่อ ของ BLE ที่อยู่ในระยะบนหน้าจอ
การเชื่อมต่อระหว่าง Arduino กับ HM10
ผมเลือกใช้ HM10 ของ TinySine ต่อกับ Arduino เพื่อใช้ในการทำเป็นตัวอย่าง ครับภาพจาก https://scontent.fbkk5-7.fna.fbcdn.net/v/t1.0-9/10426334_10152690776450954_5128728896273682222_n.jpg?oh=b5dad2a58c29e3c7eac5f7bd2d9fbb74&oe=5AE08274 |
การเชื่อมต่อแสดงดังภาพข้างล่างนี้
จากรูปจะเห็นว่า HM10 ใช้พิธีการสื่อสารสองแบบคือ Serial (Tx/Rx) สื่อสารกับ Arduino และ Bluetooth กับ BLE อื่น ในที่นี้คือ Raspberry Pi
หมายเหตุ เอกสารประกอบการใช้งาน HM10 http://www.jnhuamao.cn/bluetooth40_en.zip
ทดลองการสื่อสารระหว่าง Raspberry Pi BLE กับ HM10
กำหนดให้ Raspberry Pi รับหน้าที่เป็น Central / Master และ HM 10 รับหน้าที่เป็น Peripheral / Slave ดังนั้น HM 10 จะเป็นฝ่ายส่ง Advertise packet ออกไปสู่ Raspberry Pi โดยใช้รูปแบบการสื่อสาร Connections
ฝั่ง Arduino + HM10
สร้าง Sketch เพื่อทำการสื่อสารระหว่าง Arduino กับ HM10
#include <SoftwareSerial.h>
SoftwareSerial bt(10,11); // Rx,Tx
void setup() {
Serial.begin(9600);
while (!Serial) ;
bt.begin(9600);
}
void loop() {
if (bt.available())
Serial.write(bt.read());
if (Serial.available())
bt.write(Serial.read());
}
สอบถามชื่อของ HM 10
คำสั่ง : AT+NAME?
คำตอบ : OK+NAME:HMSoft
สอบถาม Address ของ HM 10
คำสั่ง : AT+ADDR?
คำตอบ : OK+ADDR:D43639D8A54D
สอบถาม Customer Service ของ HM 10
คำสั่ง : AT+UUID?
คำตอบ : OK+Get:0xFFE0
สอบถาม Customer Characteristic UUID ของ HM 10
คำสั่ง : AT+CHAR?
คำตอบ : OK+Get:0xFFE1
ได้ข้อมูลพื้นฐานพอสำหรับทดสอบแล้ว
คำสั่ง : AT+NAME?
คำตอบ : OK+NAME:HMSoft
สอบถาม Address ของ HM 10
คำสั่ง : AT+ADDR?
คำตอบ : OK+ADDR:D43639D8A54D
สอบถาม Customer Service ของ HM 10
คำสั่ง : AT+UUID?
คำตอบ : OK+Get:0xFFE0
สอบถาม Customer Characteristic UUID ของ HM 10
คำสั่ง : AT+CHAR?
คำตอบ : OK+Get:0xFFE1
ฝั่ง Raspberry Pi
BlueZ [11] คือ official Bluetooth stack ที่ใช้กันในระบบปฏิบัติ Linux ซึ่ง Raspbian เองก็ใช้ Bluez stack เช่นกัน Bluez มาพร้อมกับ utility software หลายตัวในที่นี้จะใช้เพียงสองคือ hcitool และ gatttoolScan หา HM 10
เชื่อมต่อกับ HM 10 ที่ใช้ชื่อว่า HMSoft ตามข้อมูลที่เก็บมาได้
เปิด gatttool
$ gatttool -t random -b [Hmsoft Address] -I
แล้วพิมพ์คำสั่ง connectหาค่าของ Handle ทั้งหมด
char-desc
สังเกตุกรอบสีแดงดูค่า uuid เริ่มต้นด้วย 0000ffe1 ซึ่งจะเห็นว่าตรงกับค่าที่ได้จากใช้คำสั่ง AT+CHAR? กับ HM10 บอกเราว่า handle ที่มีค่าเป็น 0x0012 คือตัวชี้ไปยัง Custom Characteristic ของ HM10 และจากเอกสารของ HM10 ทำให้ทราบว่า Characteristic นี้สามารถที่จะใช้รับส่งข้อมูลกับ HM10 ได้ ดังนั้นเราจะทำการรับ-ส่งข้อมูลระหว่าง HM10 กับ Raspberry Pi ผ่าน handle นี้ เมื่อข้อมูลจาก Raspberry Pi ไปถึง HM10 จะถูกส่งต่อไปที่ Arduino ผ่าน UART (Tx/Rx) ไปปรากฏที่หน้าจอ Serial Monitor ในทำนองเดียวกันข้อมูลที่รับจาก Serial Monitor จะถูกส่งมายัง HM10 ผ่าน UART แล้วค่อยส่งต่อไปยัง Raspberry Pi
ส่งข้อมูลจาก HM10 ไปยัง Raspberry Pi
ทดลองพิมพ์ข้อความสั้น ๆ บน Serial Monitor เช่น Hello I am HM10จากเอกสารประกอบ HM10 ทำให้เราทราบว่า Characteristic อ้างถึง UUID นี้มีคุณสมบัติ Notification, Read, Write หมายความว่าทางด้าน Central / Master สามารถจะรับรู้การเปลี่ยนแปลง (Notify) , อ่าน (Read) และ เขียน (Write) ข้อมูลบน Characteristic นี้ได้ ดังนั้นเมื่อมีการเปลี่ยนแปลงโดยการพิมพ์ข้อความใน Serial Monitor ก็จะเกิดการ Notify ค่านั้นออกไปยัง Rasbperry Pi ทันทีดังภาพ
สังเกตุว่าค่าของ handle คือ 0x0012 และ ค่า (value) ที่ปรากฏจะเป็นเลขฐาน 16 ซึ่งหากต้องการอ่านให้เข้าใจต้องทำการแปลงค่าให้เป็น String เสียก่อน
ส่งข้อมูลจาก Raspberry Pi ไป HM10
ด้วยคำสั่ง char-write-req <handle> <value> ใน gatttool จะทำให้ Raspberry Pi ส่งข้อมูลไปยัง HM10 โดยอ้างอิง handle (แทนการใช้ UUID ซึ่งยาวกว่ามาก) ค่าของข้อมูลที่พิมพ์ลงไปนั้นต้องเป็นเลขฐาน 16ข้อมูลที่ไปปรากฏบน Serial Monitor
สรุป
ได้กล่าวถึงข้อมูลบางส่วนที่พอจะทำให้เห็นภาพรวมของการสื่อสารด้วย BLE คือ มีการแบ่งอุปกรณ์ในข่ายงานออกเป็นสองประเภทคือ ผู้ให้ข้อมูล (Peripheral/Slave) และ ผู้รับข้อมูล (Central / Master) ผู้ส่งข้อมูลจะทำการส่งข้อมูลออกไปเป็นระยะ เรียกว่า Advertising ใช้โครงสร้างข้อมูลที่ซ้อนกันเป็นชั้นๆ ชั้นนอกสุดเรียกว่า Service ภายในแต่ละ Service มีส่วนที่เก็บข้อมูลเรียกว่า Characteristics (และอาจมี Descriptor ซึ่งเป็นส่วนขยายความของ Characteristic) และในตอนท้ายก็ได้ยกตัวอย่างการสื่อสารโดยใช้ Bluetooth ที่มากับ Raspberry Pi กับ HM10 ที่เชื่อมกับ Arduino โดยใช้ utility ของ BlueZ คือ hcitool และ gatttool[1] https://en.wikipedia.org/wiki/Bluetooth
[2] https://th.wikipedia.org/wiki/%E0%B8%9A%E0%B8%A5%E0%B8%B9%E0%B8%97%E0%B8%B9%E0%B8%98%E0%B8%9E%E0%B8%A5%E0%B8%B1%E0%B8%87%E0%B8%87%E0%B8%B2%E0%B8%99%E0%B8%95%E0%B9%88%E0%B8%B3
[3] http://www.telecomabc.com/w/wibree.html
[4] https://en.wikipedia.org/wiki/Bluetooth_Special_Interest_Group
[5] https://learn.adafruit.com/introduction-to-bluetooth-low-energy/gap
[6] https://en.wikipedia.org/wiki/Client%E2%80%93server_model
[7] https://www.bluetooth.com/specifications/gatt/services
[8] https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.service.heart_rate.xml
[9] https://www.raspberrypi.org/magpi/raspberry-pi-3-specs-benchmarks/
[10] https://en.wikipedia.org/wiki/Personal_area_network
[11] http://www.bluez.org/about/
Sign up here with your email
ConversionConversion EmoticonEmoticon