ซีเรียลผ่านบลูทูธบนเว็บ

François Beaufort
François Beaufort

Web Bluetooth API และ Web Serial API ช่วยให้เว็บแอปสามารถสื่อสารกับอุปกรณ์ที่ใช้บลูทูธพลังงานต่ำ (BLE) และอุปกรณ์ซีเรียลตามลำดับ แม้ว่านักพัฒนาเว็บจำนวนมากจะใช้ API เหล่านี้เพื่อให้ประสบความสำเร็จอย่างมากแล้ว แต่ก็มีความต้องการการสนับสนุนอุปกรณ์ Bluetooth แบบคลาสสิกมากขึ้นเรื่อยๆ เช่นกัน

ปัจจุบัน Web Serial API รองรับการสื่อสารกับบริการ RFCOMM ในอุปกรณ์ Bluetooth แบบคลาสสิกที่จับคู่ไว้ ซึ่งรวมถึงโปรไฟล์พอร์ตอนุกรม (SPP) ใน Chrome 117 บนเดสก์ท็อป วิธีนี้จะเปิดโอกาสใหม่ๆ สำหรับนักพัฒนาเว็บและผู้ใช้ ต่อไปนี้คืออุปกรณ์ที่มีอยู่จริงบางส่วนที่อาจได้รับประโยชน์จากการดำเนินการนี้

  • Pixel Buds Pro และหูฟังเอียร์บัดไร้สายอื่นๆ ใช้ RFCOMM เพื่อจัดการการตั้งค่าเสียงและการอัปเดตเฟิร์มแวร์
  • ระบบจุดขายของอุปกรณ์เคลื่อนที่ใช้ Bluetooth SPP เพื่อสื่อสารกับเครื่องพิมพ์ใบเสร็จ
  • เครื่องอ่านแท็ก RFID สำหรับปศุสัตว์ใช้ Bluetooth SPP เพื่อบันทึกการเคลื่อนที่ของสัตว์

โปรโตคอล RFCOMM บลูทูธ

ย้อนกลับไปในยุค 90 ของคุณ คุณแค่วาง Palm Pilot ลงในแท่นเพื่อซิงค์ปฏิทินของคุณสำหรับวันถัดไป คงจะดีไม่น้อยถ้าคุณสามารถเชื่อมต่อแบบไร้สายแทน เทคโนโลยีใหม่อย่าง "บลูทูธ" จะช่วยกำจัดสายที่ยุ่งเหยิงเหล่านั้นได้ ไร้สายคืออนาคต! มีอยู่ปัญหาเดียว ทุกอย่างที่มีอยู่นั้นออกแบบมาให้เชื่อมต่อกับสาย RS-232 นะ ดังนั้นบลูทูธจึงใช้โปรโตคอลการสื่อสารความถี่วิทยุ (RFCOMM) เพื่อมอบอินเทอร์เฟซดังกล่าวให้กับซอฟต์แวร์และฮาร์ดแวร์ที่มีอยู่ทั้งหมด

แม้ในปัจจุบัน บริการ RFCOMM ก็มีการใช้กันอย่างแพร่หลายในฮาร์ดแวร์ใหม่และฮาร์ดแวร์ที่มีอยู่ ทำให้สามารถตอบสนองความต้องการเฉพาะด้านเวลาในการตอบสนองและแบนด์วิดท์ที่บลูทูธพลังงานต่ำในปัจจุบันไม่สามารถตอบสนองได้ นั่นเป็นเหตุผลที่เราพัฒนาการผสานรวมระหว่าง Web Serial ซึ่งเป็น API สำหรับการเชื่อมต่อกับอุปกรณ์ซีเรียล และบลูทูธ เพื่อให้สามารถเข้าถึงบริการ RFCOMM แบบเดิมเหล่านี้ก่อนที่ผู้ผลิตจะย้ายข้อมูลไปยังบลูทูธพลังงานต่ำในที่สุด และนักพัฒนาซอฟต์แวร์สามารถใช้ Web Bluetooth API แทนได้

การเปลี่ยนแปลง Web Serial API

ตั้งแต่ Chrome 117 บนเดสก์ท็อปเป็นต้นไป นักพัฒนาเว็บจะสื่อสารกับอุปกรณ์บลูทูธคลาสสิกที่จับคู่ไว้ได้อย่างน่าเชื่อถือผ่านบริการ RFCOMM โดยใช้ Web Serial API เราทำเช่นนี้ได้ด้วยการอัปเดต Web Serial API ดังต่อไปนี้

  • ขณะนี้ Chrome แจกแจงอุปกรณ์บลูทูธที่จับคู่แล้วซึ่งแสดงอินเทอร์เฟซแบบอนุกรมโดยใช้โปรไฟล์พอร์ตอนุกรมบลูทูธแบบคลาสสิกที่มีแบบมาตรฐาน
  • ตอนนี้ Chrome สามารถสื่อสารกับอินเทอร์เฟซอนุกรมได้ แม้ว่าระบบปฏิบัติการจะไม่ได้สร้างโหนดอุปกรณ์ผ่านพอร์ตอนุกรมจำลองโดยเฉพาะก็ตาม
  • ตอนนี้ Chrome สามารถสื่อสารกับบริการพอร์ตที่ไม่ใช่ซีเรียลที่แสดงอินเทอร์เฟซแบบอนุกรม RFCOMM ได้แล้ว (ดูรหัสคลาสบริการที่ไม่ใช่แบบมาตรฐาน)

ดูข้อมูลเกี่ยวกับวิธีใช้ Web Serial API ได้ในบทความอ่านและเขียนไปยังพอร์ตอนุกรม บทความนี้จะถือว่าคุณมีความรู้พื้นฐานเกี่ยวกับบลูทูธและเน้นไปที่การเปลี่ยนแปลงแบบอนุกรมผ่านบลูทูธ

หากไม่มีการระบุตัวกรอง การเรียกใช้ navigator.serial.requestPort() จะช่วยให้ผู้ใช้เลือกพอร์ตอนุกรมที่ไม่ใช่บลูทูธ พอร์ตอนุกรมบลูทูธที่แมปไว้แล้ว และพอร์ตอนุกรมที่ไม่ได้จับคู่ซึ่งมาจากโปรไฟล์พอร์ตอนุกรมบลูทูธแบบคลาสสิกที่ใช้แบบมาตรฐาน

// Prompt user to select any serial port.
const port = await navigator.serial.requestPort();

แม้ว่าอุปกรณ์ส่วนใหญ่จะแสดงการสื่อสารที่ใช้ SPP ผ่านโปรไฟล์พอร์ตอนุกรมแบบบลูทูธแบบคลาสสิกที่ใช้แบบมาตรฐาน แต่บางรุ่นก็ใช้บริการแบบ RFCOMM ที่กำหนดเอง อุปกรณ์เหล่านี้มีรหัส Service Class ที่ไม่อยู่ในช่วง UUID ของบลูทูธมาตรฐาน

คุณต้องส่งรายการ allowedBluetoothServiceClassIds ไปยัง navigator.serial.requestPort() เพื่อเข้าถึงบริการที่ใช้ RFCOMM ที่กำหนดเองเหล่านี้ ดังที่แสดงในตัวอย่างด้านล่าง

const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef";

// Prompt user to select any serial port.
// Access to the custom Bluetooth RFCOMM service above will be allowed.
const port = await navigator.serial.requestPort({
  allowedBluetoothServiceClassIds: [myBluetoothServiceUuid],
});

โปรดทราบว่ารหัสคลาสบริการทั้งหมดที่ใช้ UUID ของ Bluetooth SIG Base (ซึ่งก็คือ UUID ทั้งหมดที่ลงท้ายด้วย "-0000-1000-8000-00805f9b34fb") จะถูกบล็อก ยกเว้นรหัสโปรไฟล์พอร์ตอนุกรม เนื่องจาก Chrome ไม่รองรับบริการบลูทูธแบบคลาสสิก เช่น เสียงและวิดีโอ

คุณยังใช้bluetoothServiceClassIdคีย์ตัวกรองเมื่อเรียกใช้ navigator.serial.requestPort() เพื่อแสดงข้อความแจ้งผู้ใช้ด้วยรายการพอร์ตอนุกรมบลูทูธที่กรองแล้วซึ่งรหัส Service Class ระบุไว้ โปรดดูตัวอย่างด้านล่าง

const myBluetoothServiceUuid = "01234567-89ab-cdef-0123-456789abcdef";

// Prompt the user to select Bluetooth serial ports with
// the custom Bluetooth RFCOMM service above.
const port = await navigator.serial.requestPort({
  allowedBluetoothServiceClassIds: [myBluetoothServiceUuid],
  filters: [{ bluetoothServiceClassId: myBluetoothServiceUuid }],
});

หากพอร์ตอนุกรมเป็นส่วนหนึ่งของอุปกรณ์บลูทูธ คีย์ bluetoothServiceClassId ใหม่ที่มีรหัสคลาสบริการที่เชื่อมโยงกับช่อง RFCOMM ที่พอร์ตนั้นเชื่อมต่ออยู่จะพร้อมใช้งานในข้อมูลพอร์ตอนุกรมที่ส่งกลับมาโดยโทรไปที่หมายเลข port.getInfo() หากแมปพอร์ตอนุกรมไว้ พอร์ตนี้จะแสดง "00001101-0000-1000-8000-00805f9b34fb" หรือ 0x1101 ในรูปแบบสั้น

const { bluetoothServiceClassId } = port.getInfo();

ตัวอย่างกรณีการใช้งาน: ควบคุม Pixel Buds Pro

แอป Web Companion ของ Pixel Buds Pro เป็นเว็บแอปใหม่ที่ช่วยให้ผู้ใช้ควบคุม Pixel Buds Pro ได้จากอุปกรณ์ทุกเครื่องที่มีเว็บเบราว์เซอร์ ซึ่งสร้างโดยใช้เทคโนโลยี Progressive Web App สำหรับการโหลดทันทีและเลือกติดตั้งควบคู่กับแอประบบปฏิบัติการอื่นๆ ได้

แอปใช้ Web Serial API เพื่อสื่อสารกับ Pixel Buds Pro วิธีนี้ช่วยให้ผู้ใช้ควบคุมการตั้งค่าต่างๆ ใน Pixel Buds Pro ได้ เช่น การควบคุมเสียงรบกวนแบบแอ็กทีฟ อีควอไลเซอร์ การตรวจจับการใส่หู และการอัปเดตเฟิร์มแวร์

หากต้องการลองใช้แอป Web Companion สำหรับ Pixel Buds Pro โปรดไปที่ mypixelbuds.google.com ในอุปกรณ์ ChromeOS (แพลตฟอร์มอื่นๆ จะมีให้บริการเร็วๆ นี้)

ภาพหน้าจอของแอป Pixel Buds Pro Web Companion
แอป Pixel Buds Pro Web Companion

แหล่งข้อมูล

บริการรับรองคำให้การ

ขอขอบคุณ Reilly Grant, Thomas Steiner, Ben Morss และ Vincent Scheib สำหรับรีวิวของพวกเขา รูปภาพหลักโดย Mika Baimeister ใน Unsplash