[gallery ids="2089,2090,2091,2092,2093,2094,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106" type="slideshow"]
課題
Raspberry Piなどを使って開発する際、ターミナルに接続したいことが度々あります。方法としては有線LANやWi-Fi経由でのSSH接続、HDMIポートのあるものはディスプレイ接続、他にはUSBシリアルを使った方法が一般的かと思います。しかし時々不便に感じることがあります。例えば、
- IPアドレスを探すのが大変
- ディスプレイやキーボードが場所を取ってしまう
- LANケーブルやHDMIケーブルなどが手元にない
このような場合でも、手軽にターミナルを開いて設定できたら便利です。そこでIPアドレスを探したり固定する必要がなく、且つケーブルなどを用意する手間がない方法として、Bluetooth Low Energy(以下、BLE)でのターミナル接続を思いつきました。
実装方法
実装は全てNode.jsで行いました。またBLEの通信とターミナルベースのやりとりを実現するために以下のライブラリを使用しました。
- noble … Node.jsのBLEセントラル実装です
- bleno … Node.jsのBLEペリフェラル実装です
- node-pty … forkpty(3)のNode.jsバイディングで、擬似端末への接続を実現します。
BLEではそれぞれのデバイスに役割を持たせる必要があり、今回はワークステーションをセントラル、Raspberry PiをペリフェラルとしてGATTを使ったアトリビュートプロトコルで通信させました。
擬似端末は例えばSSHなどでログインした際に接続されるターミナルです。上で紹介しているnode-ptyは
Electronベースのターミナルである
Hyperなどで使われています。
基本的な流れとして、ワークステーションから実行したいコマンドを送信しRaspberry Pi側で擬似端末に対して書き込みを行った後、結果を返します。デモはこちらです。
[wpvideo Nio55ntq]
まとめ
ひとまずBLEを使ったリモートターミナル操作が実現できましたが、まだ実用的に扱うには改善しなければならない点がたくさんあります。何より現状では誰でもコマンドを実行できてしまうため、認証やBLEのセキュリティについてもっと調査・実装する必要があります。
またBLEで送信できるサイズには制限があるため、長い出力やエディタには対応できていません。引き続きGATTで実現する場合はバッファリングが求められます。他にはシグナルのハンドリングなど…。
課題はたくさんありますが面白く、手軽なところが魅力的です。今後も実装を続け成果は公開する予定なのでまた報告できればと思います。]]>