いろんな技術にふれたい

いろんな技術に触れたい

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

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

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

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

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


2019/05/07追記

再度Bluetoothシリアルログインを試す際に、自分の記事を参考にしてもうまくいかなかったので一部修正しました。 これでも再現性は微妙かもしれません。また機会があればひとつずつ手順を追ってみようと思います。

具体的には、bluetoothctlコマンドの部分です。

また、最後macから接続する際に、「/dev/tty.XXXX」として見えないといけないのですが、これがmac側で見えない場合があります。

その場合、一度RaspberryPi側とmac側でデバイスを削除し、以下のコマンドを実行後、再度ペアリングを試してみてください。

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

また、以下の動画も一部参考になります。

これだとシンプルに文字列を送信するだけになるので、ここでRaspberryPiで最後にpythonプログラムを立ち上げずに、上記のrfcommを実行すれば良いです。


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

  • 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
Changing power on succeeded
[bluetooth]# pairable on
Changing pairable on succeeded
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller XX:XX:XX:XX:XX:XX Discoverable: yes
[bluetooth]# agent on
Agent registered
[bluetooth]# default-agent
Default agent request successful
[bluetooth]# scan on
Discovery started
[NEW] Device XX:XX:XX:XX:XX:XX TokinaのMacBook Pro
...
[bluetooth]# pair XX:XX:XX:XX:XX:XX
Attempting to pair with XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Request confirmation
[agent] Confirm passkey 502174 (yes/no): yes
[bluetooth]# trust XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes
Changing XX:XX:XX:XX:XX:XX trust succeeded
[bluetooth]# exit

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

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

2. rfcommを割り当てる

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

mattintosh.hatenablog.com

以下もRasPiのコンソールで行います。(root権限で)

$ 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ボードなども合わせて購入したので、これから楽しみです。また続きを書きたいです。