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

ฟร็องซัว โบฟอร์
François Beaufort

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

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

  • Pixel Buds Pro และหูฟังเอียร์บัดไร้สายอื่นๆ ใช้ RFCOMM เพื่อจัดการการตั้งค่าเสียงและการอัปเดตเฟิร์มแวร์
  • ระบบ ณ จุดขายของอุปกรณ์เคลื่อนที่ใช้ Bluetooth SPP ในการสื่อสารกับเครื่องพิมพ์ใบเสร็จ
  • เครื่องอ่านแท็ก RFID สำหรับปศุสัตว์ใช้บลูทูธ 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 แจกแจงอุปกรณ์บลูทูธที่จับคู่ซึ่งแสดงอินเทอร์เฟซแบบอนุกรมโดยใช้โปรไฟล์ Bluetooth Serial Port ที่ได้มาตรฐาน
  • ขณะนี้ Chrome สามารถสื่อสารกับอินเทอร์เฟซแบบอนุกรมได้แม้ว่าระบบปฏิบัติการจะไม่ได้สร้างโหนดของอุปกรณ์ผ่านพอร์ตอนุกรมที่จำลองขึ้นมาโดยเฉพาะก็ตาม
  • ตอนนี้ Chrome สามารถสื่อสารกับบริการที่ไม่ใช่อนุกรมที่แสดงอินเทอร์เฟซอนุกรม RFCOMM ได้แล้ว (ดูรหัสคลาสบริการที่ไม่ใช่มาตรฐาน)

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

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

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

แม้ว่าอุปกรณ์ส่วนใหญ่จะแสดงการสื่อสารแบบ SPP ผ่านโปรไฟล์ Bluetooth Classic Serial Port ที่ได้มาตรฐานเป็นมาตรฐาน แต่บางรุ่นก็ใช้บริการที่ใช้ RFCOMM ที่กำหนดเอง อุปกรณ์เหล่านี้มีรหัสคลาสบริการที่ไม่ได้อยู่ในช่วง 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 (กล่าวคือ UUID ทั้งหมดที่ลงท้ายด้วย "-0000-1000-8000-00805f9b34fb") จะถูกบล็อก ยกเว้นรหัส Serial Port Profile เนื่องจาก Chrome ไม่รองรับบริการ Bluetooth แบบคลาสสิก เช่น เสียงและวิดีโอ

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

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

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

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

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

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

แหล่งข้อมูล

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

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