1週間位悩んだのですが、解決できなかったため質問させてください。
●きっかけ、やりたいこと
switchbotとAlexaを持っており、基本的にそれを用いてエアコンやテレビなどを操作しているが、amazonで購入したシーリングライト(*1)のリモコンが赤外線対応でなく、2.4GhzのRFリモコン対応だったためswitchbotでリモコン登録ができなかった。そのため、arduinoを用いてどうにかalexaからswitchbotに指示を出し、switchbotからarduinoに赤外線を飛ばし、それをトリガーとしてarduinoからシーリングを操作するようなシステムを構築したいと考えたのがきっかけ。
●現状
こちらのサイト(*2)を参考にAtom liteとIR Remoteを購入し、Alexa~Atom Lite間の構築はできたが、Atom Liteからシーリングに指示を飛ばす部分が実装できていない。
調べていたところ、該当のシーリングがLampSmartというアプリ(*3)で制御できることがわかり、それをスマートフォンに入れて確かめていたところ、ble を利用して通信していることが分かった。
こちらのサイト(*4)を参考にAndroidのBT通信のログを作成し、wiresharkでbtsnoop_hci.logを読み込んだが、シーリングを操作した時間のログを調べても特定のServiceやUUIDが記載されているログを見つけられず、そもそもシーリングを操作するために利用するはずのwriteコマンドもひとつもなかった。
①でRandom Numberが毎回設定される
②でBD_ADDRという項目でMACアドレスらしきものの記載があるが、①のRandom Numberのせいか、毎回アドレスが変わる。
③16-bit Service Class UUIDsという大項目がありUUID16が13行=52桁の16進数で構成されている。UUIDは32桁の16進数かと思われるのでここもいまいち理解できていない。
・LE Rand からCommand Completeまでの繰り返しで全体が構成されているが、重要な情報がどれなのか分かっていない。
nFR Connect(*5)アプリを利用してスマホ周囲の機器をスキャンしてみても該当のシーリング機器が見つけられないため、ServiceやCharacteristic、UUIDなども全く特定できていないが、シーリングを操作するボタンを押したタイミングで約900行程度ずつ新しいログが作成されているため、Bluetooth通信が使われていることは間違いないと思われる。
●教えていただきたいこと
Bluetoothの内容を解析し、シーリングを操作できるようにコーディングしたいです。
●リンク
*1: https://www.amazon.co.jp/dp/B09HX55LLG (購入したのは正確にはこの製品でないですが、同じリモコンが使われています。購入した製品のページにはリモコンが2.4Ghzであるとの記載がなかったため、こちらの製品を参考リンクとしてはります。)
*2: https://zenn.dev/toyotoyo/articles/dab070a42478a9
*3: https://play.google.com/store/apps/details?id=com.jingyuan.lamp&hl=en_US&gl=US
*4: https://luckypines.com/blog/2019-05-12_Android----------Bluetooth------------5844e20b5b98/
*5: https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=en&gl=US
●コード
コードは今の所下記のようになっています。
arduino
#include <M5Atom.h> #include <IRrecv.h> #include <IRremoteESP8266.h> #include <IRutils.h> #include <BleGamepad.h> const uint16_t kRecvPin = 32; const uint16_t kCaptureBufferSize = 1024; const uint8_t kTimeout = 50; const CRGB CRGB_BLE_CONNECTED(0x00, 0x00, 0xf0); const CRGB CRGB_BLE_DISCONNECTED(0x00, 0xf0, 0x00); IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true); decode_results results; // Somewhere to store the results BleGamepad bleGamepad; bool isBleConnected = false; void setup() { M5.begin(true, false, true); M5.dis.drawpix(0, CRGB_BLE_DISCONNECTED); irrecv.enableIRIn(); bleGamepad.begin(); } void loop() { M5.update(); // if (bleGamepad.isConnected()) { if (true) { // 赤外線信号確認だけの場合は true 固定 if (!isBleConnected) { M5.dis.drawpix(0, CRGB_BLE_CONNECTED); isBleConnected = true; Serial.println("Connected"); } // Check if the IR code has been received. if (irrecv.decode(&results)) { uint32_t value = results.value; Serial.println(value); switch(value){ case 16744575: Serial.println("ON"); // ONするためのコードを挿入 以下同様 sendButton(BUTTON_1); break; case 16711935: Serial.println("OFF"); sendButton(BUTTON_2); break; case 16724175: Serial.println("Bright"); sendButton(BUTTON_3); break; case 16748655: Serial.println("Dark"); sendButton(BUTTON_4); break; case 16754775: Serial.println("Yellow"); sendButton(BUTTON_5); break; case 16738455: Serial.println("White"); sendButton(BUTTON_6); break; case 16711111: Serial.println("Night"); sendButton(BUTTON_6); break; case 16722222: Serial.println("Max"); sendButton(BUTTON_6); break; default: Serial.println("他の値です"); } } } else { if (isBleConnected) { M5.dis.drawpix(0, CRGB_BLE_DISCONNECTED); isBleConnected = false; Serial.println("Disconnected"); } } delay(50); } void sendButton(uint8_t sendkey) { bleGamepad.press(sendkey); delay(1); bleGamepad.release(sendkey); }
ちょっとした情報でもアイデアでもアドバイスでもいただけるとありがたいです。
また、情報として不十分なところがありましたら追記して補足いたしますので
どうぞご指導おねがいいたします。
まだ回答がついていません
会員登録して回答してみよう