0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Web Serial APIを使ってブラウザ上でUSBバー/QRコードスキャナから入力

Posted at

つまるところ

  1. 先日M5Stackのハンズオンに参加したらなんかChromeで使える標準APIで「Web Serial API」っていうのがあるらしく、ブラウザだけでシリアル通信できるらしい
  2. それだよそれ!それ使ったらキーボードの入力モードやらによらなくて便利に爆速な入力ができるようになりそう!やったぜ

HIDなバーコードリーダーはツライよ

ここに文句を死ぬほど書く

  • HIDなバーコードリーダー、それはそれで便利なんだが動作が遅いし逆に入力速すぎてOSだかが取りこぼしたりもしてイマイチなところ結構ある
  • ウェブの入力フォームだと日本語入力の制御もしづらいし、日本語ON・OFFさせるのも全角で入力されても問題なくするのとかあほらしくてしょうがねえよ

今回の動作環境

仕事で何台か買ってみたが、できるやつとできないやつがあるみたい。とりあえず今回は以下の組み合わせでできた。

USB QR バーコードスキャナをシリアル通信モードにする

付属のマニュアルに「このバーコードを読むと、そのモードに切り替わるよ」というバーコード一覧が載っており、これをスキャンすると「USB-KBWモード(HIDモード)」から「USB COMモード」に切り替わるらしい。おお確かにかわっている。

before

スクリーンショット 2025-01-07 19.08.22.png

after

スクリーンショット 2025-01-07 19.07.49.png

シリアルポートを確認する

なるほど。 /dev/tty.usbmodemAPP_0000000001 がそうらしい。

# まずスキャナをUSBから抜く
[pharaohkj] $ ls -l /dev/tty* > ttylist1.txt

# そしてスキャナをUSBに挿す
[pharaohkj] $ ls -l /dev/tty* > ttylist2.txt

# diffをみる
[pharaohkj] $ diff ttylist1.txt ttylist2.txt
11a12
> crw-rw-rw-  1 root       wheel   0x9000014  1  7 18:29 /dev/tty.usbmodemAPP_0000000001
69c70
< crw--w----  1 pharaohkj  tty    0x10000008  1  7 18:28 /dev/ttys008
---
> crw--w----  1 pharaohkj  tty    0x10000008  1  7 18:29 /dev/ttys008


このシリアルポートに接続して試す

以下のコマンドで接続して、適当にバーコードを読んでみる。おおバッチリ読めてる。screenを抜けるのは Ctrl+a 後 k。

[pharaohkj] $ screen /dev/tty.usbmodemAPP_0000000001

このシリアルポートにブラウザからアクセスする

このページ にアクセスすればなんでも乗ってるしできる。その通りにやる。

と、その前に、Chromeを起動して chrome://device-log/ を開く。おお。なんか便利そう。この無骨さがいい。

さて、そしたらこの画面にて、デベロッパーツールを開き、 Console タブを選択して、jsのコンソールに入る。

ブラウザからポートの選択

で以下のコードを実行すると、なんと接続できるポート一覧がでてきて、選べばよい。すげー便利やん。これなら本番導入時も楽そう。↑で調べたデバイスを選択しておく。

const requestedPort = await navigator.serial.requestPort();

↑で↓こんなのがでる。

スクリーンショット 2025-01-07 19.17.29.png

ポートから読む

上記Googleのページに乗ってるサンプルどおりやればOK。

器機選択から続けて以下を実行すると、何事もなかったようにawaitされており、バーコードリーダーでバーコードを読めばよい。

await requestedPort.open({ baudRate: 9600 });

const textDecoder = new TextDecoderStream();
const readableStreamClosed = requestedPort.readable.pipeTo(textDecoder.writable);
const reader = textDecoder.readable.getReader();

// Listen to data coming from the serial device.
while (true) {
  const { value, done } = await reader.read();
  if (done) {
    // Allow the serial port to be closed later.
    reader.releaseLock();
    break;
  }
  // value is a string.
  console.log(value);
}

おお、読めてる読めてる。QRコードもバッチリよめる。そしてめっっっちゃはやい。エディッタを開いてHIDで入力すると、入力しそこねとかあったりするが、全然そんなのなさそう。

あとはこれを console.log(value) せずに、いい感じの入力欄に setText(value) してやればよかろう。やったぜ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?