ラズパイのNode-REDでBluetooth接続のバーコードリーダーを使う

#概要
今回やりたかったことは
「ラズパイのNode-REDで、Bluetooth接続のバーコードリーダーを使う」
ということ。
その方法の備忘録です。

#背景
製造業の生産ラインで、人の稼働状況を把握する方法としてラズパイを活用する際に
これから行う品番などをバーコードリーダーでシステムに通知する方法を考えたんですが、
ラズパイの設置場所と作業者の距離が少し離れていて・・・
Bluetooth接続のバーコードリーダーを使うことになったんです。

ラズパイでバーコードリーダーを使う記事や、
カメラでQRコードを認識する記事や、
ラズパイのNode-REDで有線のバーコードリーダーを使う記事は見つかったんですが・・・。

無線（Bluetooth接続）のバーコードリーダーを使う記事が無く、
やってみると気を付けないといけないことがあったので、備忘のために記事にしてます。

#バーコードリーダー
Amazonでポチッたこちらの商品を買いました。
[https://www.amazon.co.jp/gp/product/B085DCV212](https://www.amazon.co.jp/gp/product/B085DCV212)

Bluetooth接続で、充電スタンドが付いていて、購入当時15%Offだったというだけで買いました（汗）。

![ハンディ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c84f9030-221d-e46f-3354-047eaa522180.jpeg)

#バーコードリーダーをつないでみる
このバーコードリーダーには、通信モード（？）が３つあるとのこと。
① Bluetooth HIDプロファイルで認識させる通信する
② Bluetooth SSPプロファイルで認識させて通信する
③ Bluetooth LEデバイスとして認識させて通信する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c1858119-3e4b-49e3-13a9-910be3576209.png)

まずはじめに、Windows PCとこのバーコードリーダーを①の方法で接続して動かしてみました。
OSからは、キーボードとして認識され、問題なくバーコードが読み取れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/2147f220-faaf-7e5a-6c11-2c5d41c852f0.png)

つぎにラズパイでこのバーコードリーダーを①のモードで接続して動かしてみました。
Bluetoothのアイコンをクリックして、「Add Device...」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/32fe148d-997b-a96c-0264-0b2458a961b7.png)

対象のバーコードリーダーを選んで、「Pair」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/603c8f15-9d86-8da7-40af-3ecf9253d469.png)

バーコードを読ませてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/628ecb46-7b13-7e76-4c5f-82667db59905.png)
ちゃんと読めました。

#Node-REDで確認してみる
バーコードリーダーが認識できたところで、Node-REDでバーコードリーダーがスキャンしたデータを取得してみたいと思います。
Node-REDにKeyboardからのデータを受け取るノードがあったので、それをデバッグ出力につないで動作確認してみたところ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/92adde7c-3832-35dc-eab9-551dd865cbfe.png)
データが取れない。
ちょっと調べてみると、どうやらこのノード、USB接続のキーボードのキーコードをキャプチャする機能のようですね・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c88f7675-a9ff-992c-c485-a7c0cbfd7096.png)

#Bluetooth SPPモードで試してみる
Bluetooth SPPは、シリアル通信のプロファイル。
バーコードリーダーがスキャンしたデータを（Bluetoothを介した）シリアル通信で送信してくれるはず。
ということで、まずはラズパイでBluetooth SPPを使えるようにします。

なぜかわかりませんが、ラズパイのGUIでBluetooth SPPの機器をペアリングしにいっても、うまくいきません。
ターミナルでごにょごにょする必要があります。

ターミナルを開き/etc/systemd/system/dbus-org.bluez.serviceを開きます。

```
$sudo nano /etc/systemd/system/dbus-org.bluez.service
```

「Service」項目を以下のように編集します。

```diff_api_blueprint
[Service]
Type=dbus
BusName=org.bluez
- ExecStart=/usr/lib/bluetooth/bluetoothd
+ ExecStart=/usr/lib/bluetooth/bluetoothd --compat
+ ExecStartPost=/usr/bin/sdptool add SP
・・・
```

変更後、ラズパイを再起動します。
再起動後、ターミナルで以下のコマンドを実行します。

```
$ bluetoothctl
[bluetooth]# pair (MACアドレス)
[bluetooth]# exit
```
その後、ターミナルで以下のコマンドを実行します。

```
$sudo rfcomm -r -M -L 0 bind 0 対象機器のMACアドレス
```

これでペアリングの設定は完了です。
次にNode-REDでシリアル通信データを取得してみます。
シリアル通信ノードの設定はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/b0cf320e-d5d9-956e-e465-2ee779911bff.png)

バーコードをスキャンしてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8242d68d-a9fd-d6ba-0b46-afa8c24418e9.png)
データがちゃんと取れました！




#参考にしたページ
[【ESP32】UbuntuとBluetooth ClassicでSPP通信する方法【Arduino】](https://miyutomori.com/2019/08/20/esp_arduno_ubuntu_bluetooth_connect/)