BluetoothモジュールRN-42とiPhoneをつなぐ。~自動化への夢~

## やったこと
iOSにBluetoothキーボードのショートカットキーがあり、スクリーンショットなど色々制御できそうだと思い、
[ＲＮ－４２使用　Ｂｌｕｅｔｏｏｔｈ無線モジュール評価キット](http://akizukidenshi.com/catalog/g/gK-07378/)を使って、WindowsマシンからBluetoothでキーボード操作を自動化
<img width="300" alt="fast_typing.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180925/8870dee3-3e34-18a2-6dc4-96bdf8f64fc5.gif">


構成
Windows8 → (USB) → RN-42 → (Bluetooth) → iPhone 6s（iOS13）

## 手順
### RN-42をPCに接続する
今回、Windows8マシンがあったので、TeraTermを使ってRN-42に接続しました。
#### RN-42とターミナルソフトと接続
参考サイト：[RN-42 Bluetoothモジュールの使い方1](http://workpiles.com/2014/04/rn42-bluetooth1/)
上のサイトに詳しいことが載っていますが、

1. FTDI社のUSBデバイスドライバをインストール
2. COMポートの設定
3. TeraTermとの接続

でTeraTermと接続できます。

### RN-42の設定
参考サイト：[iPhoneとRN42でBluetooth](https://qiita.com/nabehide/items/a84f3b7d4ad4ff70008d)
ここからは上のサイトになぞり、TeraTerm上でRN-42をスレーブのHIDキーボードとして設定します。

設定が終わるとiPhoneとの接続が可能になり、TeraTerm上でキー入力を行うとiPhone側にも反映されます。
Bluetoothキーボード上では`win+H`でホームボタンを押すショートカットなのですが、Windows側のショートカットとかぶっているので、うまく動作しません。
また、今回はキー操作を自動化したいので、

* キー入力のバイナリ（HID keyboard report format）を送信して操作する
* TeraTermのマクロによる自動化

の2点を使ってアプローチします。
### キー入力のバイナリ（HID keyboard report format）を送信して操作する
Bluetoothキーボードはキー入力時に11バイトのバイナリデータを送信するプロトコルとなっています。
[Bluetooth HID Profile User Manual](https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/RN-HID-User-Guide-v1.0r.pdf)
バイナリの中身として
`| 0xfd | 0x09 | 0x01 | modifier | 0x00 | code1 | code2 | code3 | code4 | code5 | code6 |`
となっており、実際のキー入力は4バイト目のmodifierと6バイト目以降のscan codeに入ります。
ここで、modifierはCtrlやAltなどのビットごとにフラグをたてたものであり、

```
bit7 : RightGUI (Meta)
bit6 : RightAlt
bit5 : RightShift
bit4 : RightCtrl
bit3 : LeftGUI (Meta)
bit2 : LeftAlt
bit1 : LeftShift
bit0 : LeftCtrl
```

また、各codeにはその他のキーのscan codeが1つずつの6個までが入ります。
[scan codeの早見表](https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2)

具体例として`Cmd+Shift+3`（iOSのスクリーンショットのショートカットキー）は
`FD 09 01 82 00 20 00 00 00 00 00`

**なにも押してない状態**は
`FD 09 01 00 00 00 00 00 00 00 00`
となります。

### TeraTermのマクロによる自動化
キー入力のバイナリをマクロを使って自動化します。
[コントロール]→[マクロ]より`.ttl`ファイルが選択・実行ができます。

```
i = 0
while < 100
    ;スクリーンショット
    send $FD $09 $01 $82 $00 $20 $00 $00 $00 $00 $00
    ;キーを何も押してない状態に戻す
    send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

    ;5秒待機
    pause 5
    i = i + 1
loop
```
上のマクロは見ての通り、実行すると5秒おきのスクリーンショットを500回行うものです。

**注意**）
TeraTermの[設定]→[全般]→[言語(L)]は`English`にしてください。
また、[コントロール]→[マクロウィンドウの表示]は実行後に中止するときに使ってください。自動では止まりません。

### あとがき
iPhoneなどスマートフォンの自動操作は難しいものではありますが、今回のBluetoothを用いたアプローチは少し希望が見えるのではないでしょうか。
~~マクロを巨大に組まないといけないけれども。~~

### おまけ
一番上のタイピングgifのマクロ

```
;t
send $FD $09 $01 $00 $00 $17 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;y
send $FD $09 $01 $00 $00 $1C $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;o
send $FD $09 $01 $00 $00 $12 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;u
send $FD $09 $01 $00 $00 $18 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;z
send $FD $09 $01 $00 $00 $1D $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;e
send $FD $09 $01 $00 $00 $08 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;t
send $FD $09 $01 $00 $00 $17 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;u
send $FD $09 $01 $00 $00 $18 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;r
send $FD $09 $01 $00 $00 $15 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;i
send $FD $09 $01 $00 $00 $0C $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;g
send $FD $09 $01 $00 $00 $0A $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;a
send $FD $09 $01 $00 $00 $04 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;i
send $FD $09 $01 $00 $00 $0C $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;n
send $FD $09 $01 $00 $00 $11 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;o
send $FD $09 $01 $00 $00 $12 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;t
send $FD $09 $01 $00 $00 $17 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;a
send $FD $09 $01 $00 $00 $04 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;i
send $FD $09 $01 $00 $00 $0C $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;p
send $FD $09 $01 $00 $00 $13 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;i
send $FD $09 $01 $00 $00 $0C $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;n
send $FD $09 $01 $00 $00 $11 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;n
send $FD $09 $01 $00 $00 $11 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;g
send $FD $09 $01 $00 $00 $0A $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;u
send $FD $09 $01 $00 $00 $18 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00

;.
send $FD $09 $01 $00 $00 $37 $00 $00 $00 $00 $00
send $FD $09 $01 $00 $00 $00 $00 $00 $00 $00 $00
```