2020年4月3日金曜日

Bluetooth問題をなんとかする

おかげさまでご好評いただいております棚卸パッケージですが、面倒な問題を抱えております。ハンディリーダとPCの接続方法なんですが、現状はBluetoothかWifiを選択できるようになっています。このBluetoothが結構相性問題があって組み合わせによって接続できなかったり不安点だったりしていました。

昔はBluetoothスタックとして東芝スタックがほとんどの状況で、東芝スタックは安定していたのであまり問題にならなかったんですが東芝スタックを使っているBluetoothドングルというのが少なくなってしまい、他のスタックだと接続できない問題が明らかになってきて何とか東芝スタックのドングルを確保するのに奔走していました。

が、最後の東芝スタック対応ドングルのBT-Micro4-Hが在庫限りとなってしまっておりどうしたもんかなこれ、という状況でした。

この状況を打開するため、目を付けたのがコレ


じゃーん。ESP32ちゃんです。

ESP32のBluetoothは他の案件でも使用していますが結構安定して使えています。ということで通信系はESP32ちゃんに任せてしまって、COMとのブリッジをすることでPCからは単純にCOMポートとしてだけ見える状況にしてしまおうという計画です。

PCからは単にCOMポートにしか見えませんから、Bluetoothスタックがどうのこうのという話はなくなります。Bluetoothが付いていようがいまいが、どんなスタックが入っていようが入っていまいが、とにかくWindowsPCであれば動作するようになります。

というわけでやってみました。
ESP32のプログラムはBluetoothでハンディに接続し、あとはシリアルとBluetoothの通信をブリッジするだけなので簡単です。

#include "BluetoothSerial.h"

static BluetoothSerial SerialBT;
static uint8_t address[6]  = {0xD4, 0xC9, 0x4B, 0x80, 0x3B, 0x89};

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32", true);
}

void loop() {
  if (!SerialBT.hasClient()) {
    if (!SerialBT.connect(address)) {
      while(!SerialBT.connected(10000)) {
      }
    }
  } else {
    while (SerialBT.available() > 0)
      Serial.write(SerialBT.read());
    while (Serial.available() > 0)
      SerialBT.write(Serial.read());
  }
}

従来だと、

ハンディ(とかAndroid)とPCをペアリング → 設定されたCOMポートをエクセルツールに設定

という流れでしたが、

ESP32をPCに接続 → 設定されたCOMポートをエクセルツールに設定

という流れになります。
エクセルツール側はCOMポートとのやりとりということに違いはありませんのでほぼそのままで動きます。
今回Android版で試しましたが、Android側はPCから接続されるかESP32から接続されるかの違いなのでこちらもほぼそのままで動きます。


じゃーん、ちゃんと動きました。

PC <- COM -> ESP32 <- Bluetooth -> Android(SPP)

という組み合わせで動かしてますが、ESP32はWifiも動くので

PC <- COM -> ESP32(Wifi AP) <- Wifi -> Android(Wifi)

という組み合わせも可能ですね(試してないけど)。Wifi版は既設のWifi環境に接続するかモバイルルータなどを使う必要がありましたがこの組み合わせにすると既設のWifiもモバイルルータも必要なし!スバラシイ

そんなわけでこれはちょっと急ぎで進めたいと思います。




0 件のコメント:

コメントを投稿