PowerUSBをlibusb-1.0からいじる
はてなブログ使いにくいですね。はてダの方が書きやすいかも…
前回の記事で分かったコマンドを送るだけのプログラムを書いてみました。ソースはここ
https://github.com/nakj/powerusb
とりあえず現時点での問題点は
- rootでないと使えない
- Outlet の設定を行うインターフェースがない
- usbhidモジュールをアンロードしないと使えないけどアンロードしちゃうとキーボードやマウスが使えない
てとこですかね
PowerUSB(3)
Outlet1 をon
a1 -> 0x01
Outlet2をon
- a2 -> 0x01
Outlet3をon
- ac -> 0x01
やっぱ前回の仮説は正しかったようです。
ping については、毎秒やってるb1,b2をこの秒だけ2回やってるだけのように見えます。気にしなくていいかな
PowerUSB(2)
WindowsにつないでSnoopyProでUSBパケットをキャプチャしてみた。
昨日の解析会があったから分かったんですが、送信パケット内のDataの最初の1バイトが命令でその後、返事がくるみたい?受信パケットのDataの中で大事なのは先頭2バイトのようです。
アプリを立ち上げたらまず
- 0xaa -> 0x0101
- 0xa7 -> 0x0201
- 0xa1 -> 0x0001
- 0xa2 -> 0x0001
- 0xac -> 0x0101
というやり取りが行われ、その後0x42,0x44,0x45(B,D,E)が二回送られます。これに対するレスポンスパケットには、Dataありません。デフォルト設定かな?ここまでは初期化シーケンスだと思われます。
最初の2つのどちらかが製品バージョン(watchdog とかdigitalIO とかBasic)を返してるんじゃないかと思いますがどうでしょ?
追記
ダウンロードサイト からDeveloper Fileの方をダウンロードするとこれを制御するアプリが書ける dll が入ってるんですが、これのAPIマニュアルによれば、初期化するとmodel とファームウェアバージョンがget出来るそうです。詳しくは中身を見ていただくとしてmodel には、(1:Basic,2:digIO, 3:watchdog 4:smart)とあり、バージョンの方はメジャーバージョンとマイナーバージョンがある、とあります。
アプリの表示を確認すると、version 2.1 とあるので、0xa7 がバージョンを取り出す命令ですな。
追記ここまで
で、あとは約1秒ごとに
- b1 -> 0000
- b2 -> 0001
が繰り返されます。
b1 はたぶん電気の使用量を取り出すコマンドかな?何もつないでないので電力量は0です。
b2はなんだろう?返答から推測するに初期化シーケンスでも返事してますので0001はOKのサインじゃないかと思います。ということはping 相当なのかな?
40秒置きにpingするって設定なので本ちゃんのpingコマンドがどうなるかは何分かキャプチャし続けないと分からないですね。。。
あとはlibusb-1.0でHIDをいじるアプリを書けば使えるようになりそうだけど、切り替える毎にカキンカキンと結構な音が鳴るので自分がいないときに使うのは躊躇われます…
さらに追記
ぼけっとAPIリファレンスマニュアル眺めてると、現在の状態を取得するコマンドもあったのですが...
ReadPortPowerUSB(port1,port2,port3)
こんな感じに発行したらそれぞれのステータスが引数に入るらしい。てことは、ポート毎にコマンドを発行して、戻ってきた応答を引数に順番に入れて行くんじゃないか?
せっかく二バイト分の情報返せるのにこんな単純な実装でいいんかと思うけど、これまで見てきた部分はあんまりややこしくしてる風じゃなかったし。
0とか1しか返さないやつは先頭バイトだけが意味があるんじゃないかと推測してみる。なのできっと以下のような意味だと思う。
- 0xaa -> 0x01 (modelを聞いて、1が返る)
- 0xa7 -> 0x0201 (firmware versionを聞いて、2と1が返る。つまり2.1)
- 0xa1 -> 0x00 (port1 の状態をread -> 0 (off))
- 0xa2 -> 0x00 (port2 の状態をread -> 0 (off))
- 0xac -> 0x01 (port3 の状態をread -> 1 (on))
明日やること。アプリは終了時に設定したデフォルト状態に戻しやがるので、デフォルト状態を変更してパケットキャプチャしてみる。
powerUSB
USBで切り替え制御出来る電源タップが通販出来るらしいので買ってみました。
とりあえずLinux につないでみた。
$ dmesg |tail [483571.845426] usb 2-4.3: new full speed USB device number 59 using ohci_hcd [483571.965425] usb 2-4.3: New USB device found, idVendor=04d8, idProduct=003f [483571.965436] usb 2-4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [483571.965443] usb 2-4.3: Product: Simple HID Device Demo [483571.965448] usb 2-4.3: Manufacturer: Microchip Technology Inc. [483571.978292] generic-usb 0003:04D8:003F.0027: hiddev0,hidraw2: USB HID v1.11 Device [Microchip Technology Inc. Simple HID Device Demo] on usb-0000:00:0b.0-4.3/input0
Mar 3 09:00:34 sango kernel: [483571.845426] usb 2-4.3: new full speed USB device number 59 using ohci_hcd Mar 3 09:00:34 sango kernel: [483571.965425] usb 2-4.3: New USB device found, idVendor=04d8, idProduct=003f Mar 3 09:00:34 sango kernel: [483571.965436] usb 2-4.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 Mar 3 09:00:34 sango kernel: [483571.965443] usb 2-4.3: Product: Simple HID Device Demo Mar 3 09:00:34 sango kernel: [483571.965448] usb 2-4.3: Manufacturer: Microchip Technology Inc. Mar 3 09:00:34 sango kernel: [483571.978292] generic-usb 0003:04D8:003F.0027: hiddev0,hidraw2: USB HID v1.11 Device [Microchip Technology Inc. Simple HID Device Demo] on usb-0000:00:0b.0-4.3/input0
ホントは低レイヤーな人たち何人かで買ったわけですが、昨日はアナライザつけて色々解析したりしてたんですが。案外簡単なプロトコルみたいなんでドライバ書く遊びするのは楽しそうです。