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

シリアルデバイスとしては、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



