アプリと連携で有線キーボード -2-

 シリアルデバイス側はこんな感じで認識した。給電はどちらからでもよさげ。

 シリアルデバイスとしては、tty.usbserial-1140として見えている。

 % ls /dev/tty.*

 /dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial-1140

 接続してみる。

 % python -m serial.tools.miniterm /dev/tty.usbserial-1140 115200

 なんも見えないな...

 製品資料のほうに、いろいろ情報が入っている。

 キーボード/マウス エミュレータ解説書20240206.zip - Google ドライブ

https://drive.google.com/file/d/17Dn9tl1YqW_iVWj6vO8monKASKgg6fJ2/view

 サンプルコードとデータシートがあるのは助かる。

 なんか、プロトコルが独特ね... とりあえずPythonスクリプトがあるので、それで動作確認してみるか。

 サンプルコードは、接続先がCOM24にハードコードされている。うーん。

 んで、操作部分が全部コメントアウトされている。

 AIに分析させてみると、明らかに間違いもいくつか見つかる。うーん...

 とりあえず、abcだけキーインするものを書き直し。

 import time

 import serial

 class CH9329:

TBL = {
'a': [0x00, 0x04],
'b': [0x00, 0x05],
'c': [0x00, 0x06],
}

 def init(self, port="/dev/tty.usbserial-1140", baud=9600):

self.ser = serial.Serial(
port=port,
baudrate=baud,
timeout=0.1
)

 def sendpacket(self, data):

self.ser.write(bytes(data))
self.ser.flush()
time.sleep(0.02)
return self.ser.read(7)

 def push(self, modifier, key):

Key down

packet = [
0x57, 0xAB, 0x00,
0x02,       # keyboard command
0x08,       # data length
modifier,
0x00,
key,
0x00,
0x00,
0x00,
0x00,
0x00,
]
packet.append(sum(packet) & 0xFF)
self.sendpacket(packet)

Key up

packet = [
0x57, 0xAB, 0x00,
0x02,
0x08,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
]
packet.append(sum(packet) & 0xFF)
self.sendpacket(packet)

 def type_text(self, text):

 for ch in text:

 if ch in self.TBL:

 modifier, key = self.TBL[ch]

self.push(modifier, key)

 def close(self):

self.ser.close()
drv = CH9329("/dev/tty.usbserial-1140", 9600)

 try:

drv.type_text("abc")
finally:
drv.close()

 USB HUBにどちらの端も接続して実行する。想定通りの結果になった。

 % python3 ch9329_test.py

 abc%

 % abc

 動くことはわかったので、次に進む。

 とりあえず、Androidの画面からキーインして、キーボードとしてふるまうようにしてみよう。そのあとはTab5でやってみたいところ。

 なんかアプリをビルドする環境を整えるのがめんどくさいな。chromeでUSBシリアル叩くのはAndroidでもできるんだろうか? とりあえず、macOSのchromeで試す。

 HTMLを貼るとfanboxが保存エラーになるので、gistに貼っておく。

 CH9329 loopback test for chrome

https://gist.github.com/kinneko/a8d6dbeff8f03f8e22620ba50762a689

 なんか、HTMLをブラウザで直接開いてもダメらしい。Pythonで簡易サーバーを立てて、そこを呼び出す。

 想定通り、ブラウザからシリアル経由でHIDとしてキーインできるのを確認できた。

 Androidのchromeでも開いてみる。シリアル側をAndroidに接続する。

 うーん、そんな制約があるのか。めんどくさいな。

http://192.168.0.7:8000 のようなLAN内HTTPなので、window.isSecureContext == false となり、今のWeb Serial版では「接続」やA/B/C送信は動かないそうな。

 一応、接続ボタンを押してみるけど、ダメっぽい。

 しょうがないね。Termuxでローカル実行してみる。結果ダメ。

 お手軽にはできぬな...

 ケーブルかな? と思ったりしたけど、OTGケーブルで試してもダメだったわ。


オリジナル投稿:
アプリと連携で有線キーボード -2-|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/12477071