いろんな技術に触れたい

日頃色々触れた技術を自分なりにまとめておきたいと思ってます。難しいものほどブログ書く時間がかかるのが問題・・・

Raspberry Pi起動時にMACからBluetoothでシリアル接続する方法について(メモ)

Raspberry Pi起動時にMACからBluetoothでシリアル接続する方法について(メモ)

今回、Raspberry Piをセットアップから久しぶりに行いました。そこで、毎回ディスプレイを用意するのは面倒なのでもちろん遠隔からSSHのようにログインして操作したかったので、MacからBluetoothで接続したいと考え、色々調べていました。

結果的にうまくいったので、そのメモを残しておきたいと思います。

今回の検証で必要なもの・環境は以下のとおりです。

  • Raspberry Pi 3(今回はRasPi 3を利用したので、ドングルなどは必要ありませんでした)
  • microSD & OS (Raspbian, 最新版Jessie Desktop version)
  • Display & HDMI cable
  • mouse & keyboard
  • Macbook Air

こんな人向けです

WiFi環境もEthernetもないけどRasPiを起動するだけでコンソールから遠隔操作したい

そもそもなぜBluetoothで接続したいのか

理由は3つあります。

  • Raspiを自動車で利用したいので、ルータが無い = WiFi環境がない
  • MBAなのでUSBtoEtherも面倒
  • 今までできそうだけど実際にやってなかった

まだ詳細は未定ですが、自分なりに自動車の解析をしたいと考えており、Bluetooth接続が最も便利だと考えたのが最大の理由です。

いくつかの方法

まず、「RasPi MAC Bluetooth」などで検索をかけると、たくさんヒットすると思います。簡単にまとめると以下の2通りです。

  • MacとRaspiでペアリングし、Macからシリアル接続
  • インターネット共有機能(bt-pan)を使ってSSH

どっちでもいいのですが、bt-panが謎のエラーをはいていたので辞めました。

さらに、シリアル接続といっても統一された方法は見られませんでした。

Raspberry Pi起動時にMACからBluetoothでシリアル接続する方法

では実際にやっていきましょう。

私が利用したRaspbianのKernel versionは4.14です。

1. MACとRasPiをペアリングする

以下、RasPiのコンソールで行います。

$ bluetoothctl
[bluetooth]# power on
[bluetooth]# scan on
[NEW] Device xx:xx:xx:xx:xx:xx tokina の MacBook Pro
[bluetooth]# pair xx:xx:xx:xx:xx:xx
[bluetooth]# connect xx:xx:xx:xx:xx:xx

ちなみにですが、MACアドレスはタブ補完できます。

これでペアリングができたはずです。PINコードなどはうまいことやってください。

2. rfcommを割り当てる

以下の記事が非常に参考になります。一部こちらを参考にしました。

mattintosh.hatenablog.com

以下もRasPiのコンソールで行います。

$ systemctl stop bluetooth
$ bluetoothd -C &
$ hciconfig hci0 up
$ sdptool add SP
$ rfcomm watch 0 1 agetty rfcomm0 115200 linux -a pi

少し解説しますと、まずシリアル通信するために、sdptoolを使いたいのですが、そのためにはbluetoothd(デーモン)の起動時に-Cオプションが必要なのです。そのため一度stopしています。

もう一つ大事なコマンドはrfcommです。

RFCOMM ‐ 通信用語の基礎知識

Bluetoothプロトコルスタックの一つで、L2CAP上でRS-232Cシリアルポートの転送機能をエミュレーションするもの。これにより、従来の有線によるデータ転送をそのまま無線に置きかえることが可能となる。

ということです。このコマンドを実行していると、アクセスされていることを見ることができます。

3. MACからアクセスする

一応ペアリングしておきましょう。MACBluetoothRaspberry Piに接続済みになっているか確認してください。もしくは/dev/tty.raspberrypi-SerialPort(私の環境です)が見えるか確認してください。

以下、Macのコンソールで行います。

$ ls /dev/tty.raspberrypi-SerialPort
/dev/tty.raspberrypi-SerialPort
$ cu -l /dev/tty.raspberrypi-SerialPort -s 115200
Password:

Connected.

Raspbian GNU/Linux 9 raspberrypi rfcomm0
raspberrypi login: pi (automatic login)

Last login: Fri May  4 06:55:27 UTC 2018 on tty1
Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
-bash: cannot set terminal process group (2343): Inappropriate ioctl for device
-bash: no job control in this shell
pi@raspberrypi:~ $ 
pi@raspberrypi:~ $ ls
Desktop    Downloads  oldconffiles  Public        Templates
Documents  Music      Pictures      python_games  Videos

こんな感じでcuコマンドでシリアル接続っぽくBluetooth接続できました。これで非常に便利になりましたよね。もちろんscreenコマンドでも問題ありません。

4. (おまけ)起動時に自動的に接続可能状態にする

ここまで成功している上で、rc.localを編集します。

RasPiのnanoやvimで/etc/rc.localを開いて、以下のコマンドをexit 0の前に追記します。

sudo rfcomm watch 0 1 agetty rfcomm0 115200 linux -a pi

そう、さっきのRFCOMMコマンドです。RFCOMMコマンドを実行しないとシリアル通信をシミュレートできませんので。

これで再起動して、MACから

$ cu -l /dev/tty.raspberrypi-SerialPort -s 115200

ができれば成功です。ペアリングとかしなくても、このコマンドを入力すれば自動的にペアリングが確立するはずです。

最後に

Raspberry Pi 3をRSでクーポン配布していたときに購入して以来放置していたので、ようやく重い腰を上げました。bluetoothWiFiが内蔵されており、電源だけで遠隔操作できるので、めっちゃ便利になりました。

実は、PiCANボードなども合わせて購入したので、これから楽しみです。また続きを書きたいです。