ว่าด้วยเรื่อง Bluetooth Low Energy ตอน 1

Bluetooth คือ มาตรฐานการสื่อสารแบบไร้สาย [1] สำหรับการรับ/ส่งข้อมูลขนาดเล็กภายในข่ายงานส่วนบุคคล (Personal Area Network, PAN) [10] เริ่มการพัฒนาโดย Ericsson ตั้งแต่ปี ค.ศ. 1994 จนมาถึงปัจจุบันเป็นรุ่นที่ 5

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 เป็นการสื่อสารแบบทางเดียว ไม่มีการเชื่อมต่อระหว่างอุปกรณ์อย่างสมบูรณ์ รูปแบบนี้แบ่งหน้าที่ของอุปกรณ์ออกเป็นสองหน้าที่คือ

  1. Broadcaster ทำหน้าที่ปล่อยข้อมูลออกมา
  2. Observer ทำหน้าที่รับฟังและเก็บข้อมูล

รูปแบบนี้เหมาะกับการสื่อสารที่มีขนาดข้อมูลเล็ก และ ความรวดเร็วในการสื่อสาร

Connections เป็นการสื่อสารแบบสองทาง มีการสร้างเส้นทางการสื่อสารระหว่างอุปกรณ์ที่ชัดเจน ใช้ส่งข้อมูลที่มีขนาดใหญ่กว่าแบบแรก แบ่งหน้าที่อุปกรณ์ออกเป็นสองหน้าที่คือ

  1. Central (Master) มักหมายถึงอุปกรณ์ที่มีความสามารถสูง เช่น โทรศัพท์เคลื่อนที่ Tablet หรือ PC จะคอยตรวจสอบสัญญาณความต้องการการสื่อสารเป็นระยะ 
  2. Peripheral (Slave) มักหมายถึงอุปกรณ์ขนาดเล็ก อาจเชื่อมต่อกับ Sensor จะคอยส่งสัญญาณความต้องการสื่อสารออกไป เมื่อการสื่อสารติดตั้งเรียบร้อยแล้วก็จะทำตามที่ Master กำหนด
 BLE ใช้การส่งข้อมูลออกไปเป็นระยะจาก Broadcaster หรือ Peripheral  ไปยัง Observer หรือ Central ทำให้เกิดการประหยัดพลังงาน รูปแบบการสื่อสารที่กล่าวมานี้เป็นรายละเอียดที่กำหนดไว้ในชื่อ Generic Access Profile (GAP) [5]

Bluetooth Address 

มีความหมายและวัตถุประสงค์เช่นเดียวกับ Address ที่ใช้ในการสื่อสารแบบ Internet แบ่งได้เป็นสองแบบคือ 
  1. Static Address (Public Address) มีขนาด 6 bytes (48 bits) จะถูกกำหนดมาโดยผู้ผลิตอุปกรณ์ ที่อยู่นี้จะต้องไปขึ้นทะเบียนไว้กับ SIG และไม่เปลี่ยนแปลงตลอดอายุของอุปกรณ์
  2. 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)





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 องค์ประกอบคือ

  1. Universal Unique ID (UUID)
  2. Handle
  3. 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());
}

เปิด Arduino IDE ทำการ compile และ upload ขึ้น Arduino แล้วเปิด Serial Monitor ขึ้นมา


สอบถามชื่อของ 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

ได้ข้อมูลพื้นฐานพอสำหรับทดสอบแล้ว

ฝั่ง Raspberry Pi

BlueZ [11]  คือ official  Bluetooth stack ที่ใช้กันในระบบปฏิบัติ Linux ซึ่ง Raspbian เองก็ใช้ Bluez stack เช่นกัน  Bluez มาพร้อมกับ utility software หลายตัวในที่นี้จะใช้เพียงสองคือ hcitool และ gatttool

Scan หา 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/



Previous
Next Post »