質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2769閲覧

BLEのデータ受信がうまくいかない

ZKyb

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2021/08/29 14:36

前提・実現したいこと

AndroidとBLEデバイスで通信するプログラムを作成しています。

Androidからマイコンに"a"と書き込むと、マイコンに接続されたLEDのHigh/Lowを反転するプログラムです。
マイコンはLEDをHigh/Lowした際に、Androidに"H"または"L"の値を返します。
接続は以下の通りです。

Android(Pixcel3a) ⇔ BLEモジュール(HM-19) ⇔ マイコン(PIC)

Android(Pixcel3a) ⇔ BLEモジュール(HM-19) はBLE接続。
BLEモジュール(HM-19) ⇔ マイコン(PIC)はシリアル通信です。

Androidから"a"を送信し、マイコンが受信してLEDをON/OFFするところまでは、意図したとおりに動作しました。

発生している問題・エラーメッセージ

マイコンはLEDをHigh/Lowした際に、Androidに"H"または"L"の値を返します。
この値がAndroid側でうまく受信できません。

Notifyを設定して、onCharacteristicChangedが呼び出されるところは正常に動作しているようです。
bluetoothGatt.readCharacteristic(characteristic);を実行して、onCharacteristicReadが呼び出されるところも正常に動作していそうです。

characteristic.getValue();で値をとりだして、TextViewに表示するところで問題が発生します。
マイコン側から"H"や"L"を送信した場合、Android側では以下の7byteの値が受信されます。
A4 DA 32 67 16 F6 FB
これは"H"でも"L"でも同じ値です。
また、"HH"など文字列の長さを変えても同じ値です。

BLEモジュールを製作しているDSD TECH社が配布しているアプリがあるので、そのアプリを使用して書き込み、読み込みをすると意図したとおりに動作します。
"a"を送信して、LEDを反転して、"H"や"L"を正常に受信できます。文字列を"LED_ON"や"LED_OFF"に変更しても、正常に受信できます。
そのため、マイコン側は意図したとおりに動作していると思われます。

該当のソースコード

JAVA

1 //Notify(キャラスタリスティックの変更通知)処理 2 @Override 3 public void onCharacteristicChanged( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic ) 4 { 5 //呼び出したUUID取り出す 6 String _uuidNotify; 7 _uuidNotify = characteristic.getUuid().toString(); 8 ///呼び出したUUID毎に処理を分ける 9 switch (_uuidNotify){ 10 case UUID_0: 11 Log.d("BLE", "変更通知(UUID_0)"); 12 break; 13 case UUID_1: 14 Log.d("BLE", "変更通知(UUID_1)"); 15 bluetoothGatt.readCharacteristic(characteristic); 16 break; 17 case UUID_2: 18 Log.d("BLE", "変更通知(UUID_2)"); 19 break; 20 } 21 return; 22 } 23 24 // キャラクタリスティックが読み込まれたときの処理 25 @Override 26 public void onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status ) 27 { 28 if( BluetoothGatt.GATT_SUCCESS != status ) 29 { 30 Log.d("BLE", "読み込み失敗"); 31 return; 32 }else{ 33 Log.d("BLE", String.valueOf(status)); 34 //呼び出したUUID取り出す 35 String _uuidRead; 36 _uuidRead = characteristic.getUuid().toString(); 37 ///呼び出したUUID毎に処理を分ける 38 switch (_uuidRead){ 39 case UUID_0: 40 Log.d("BLE", "読み込み(UUID_0)"); 41 break; 42 case UUID_1: 43 Log.d("BLE", "onCharacteristicRead\nstatus=" + String.valueOf(status) + "\n読み込み(UUID_1)"); 44 byte[] data = characteristic.getValue(); 45 final StringBuilder sb = new StringBuilder(); 46 for (byte _data : data) { 47 sb.append(String.format("%02X ", _data)); 48 } 49 final String result = sb.toString(); 50 tvRead.append("read:" + result + "\n"); 51 break; 52 case UUID_2: 53 Log.d("BLE", "読み込み(UUID_2)"); 54 break; 55 } 56 return; 57 } 58 59 }

試したこと

・マイコン側から送信する文字列を変えてみる。int型の値を送ってみる。
→毎回同じ値(A4 DA 32 67 16 F6 FB)を受信する。
・マイコン側から空の値("")を送信する。
→なにも受信しない。

補足情報(FW/ツールのバージョンなど)

AndroidStudio:ArcticFox|2020.3.1
Android:Pixcel3a API30
BLEモジュール:DSD TECH社 HM-19 (BLE5.0対応)
マイコン:PIC16LF1566

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/08/29 16:56

要は「PIC が何を送っても同じ値しか取れない」ということでしょうか。 UUID が間違っているということは無いでしょうか。
ZKyb

2021/08/30 12:07

アドバイスありがとうございます。 確認しましたが、UUIDは間違えていませんでした。 蛇足ですが、確認時に気になった点があったので試してみました。 使用しているBLEモジュール(BLEHM-19)には UUID①:サービス(FFE0) UUID②:キャラスタリスティック1(FFE1) UUID③:キャラスタリスティック2(FFE2) があります。 今まではキャラスタリスティック1を使用してWrite/Readをしていましたが、もしかしてReadはキャラスタリスティック2なのでは?と思いそちらを使用してみました。 結果は変わらず、同じ値を返してきました。 そもそも、キャラスタリスティック2は、工場出荷状態では使用できず、キャラスタリスティック1を使用して専用のコマンドを送信すると使えるようになるというものでした。用途は不明です。
jimbe

2021/08/30 13:20

onCharacteristicChanged メソッド内で _uuidNotify が UUID_1 の時 readCharacteristic していますが、 onCharacteristicChanged のパラメータで来る characteristic から getValue() して表示したら何が出てくるでしょうか。
jimbe

2021/08/30 14:34

>FFE2 is Char2 UUID (Could open by AT+FFE2 command) > If you use AT+CHAR command to change Char1 value, then Char2 value will be Char1 value + 1. というヤツですね。 テスト用でしょうか・・・。
jimbe

2021/08/30 14:44

なぜ characteristic.getValue(); が 7 バイトを返すのかがよく分かりません。 そもそも FFE0 は温度計測サービスで FFE1 は int8 なのが標準みたいですし。(中国企業なので標準無視も普通っぽいですが^^; ) 「DSD TECH社が配布しているアプリ」では動くということなので、同じような感じでソースが載っている [BLE通信ソフトを作る ( Android Studio 2.3.3 + RN4020 )] https://www.hiramine.com/programming/blecommunicator/index.html のアプリでどうなるか試されてみるのは如何でしょうか。
ZKyb

2021/08/30 14:51

コメントありがとうございます。 ご指摘の箇所を確認してみました。 onCharacteristicChanged のパラメータで来る characteristic から getValue() すると、 0x48と0x4cで、マイコンから送信している"H"と"L"と一致しました。 追加した記述は下記のとおりです。 書き込みを数回実行するとアプリが終了してしまうので、デバックは必要そうですが、何とかなりそうです。ちゃんと動くコードにして、解決方法に記載したいと思います。 あきらめかけていたところ、ダメもとで本サイトを使用させて頂きました。 本当に解決できて感激です!! わざわざコードまで読んでいただいてありがとうございました!! ------------------------------------------------------------------------------------- //Notify(キャラスタリスティックの変更通知)処理 @Override public void onCharacteristicChanged( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic ) { //debug byte[] char_Notify = characteristic.getValue(); final StringBuilder sb_Notify = new StringBuilder(); for (byte _char_Notify : char_Notify) { sb_Notify.append(String.format("%02X ", _char_Notify)); } final String Notify = sb_Notify.toString(); Log.d("BLE_debug", "onCharacteristicChangedでのcharacteristicの値" + Notify);
jimbe

2021/08/30 15:03 編集

実は私も今まで Bluetooth/BLE を触ったことがありませんで「ダメもと」で情報を探しまくりました^^;;; ラッキーヒットになって良かったです。
guest

回答1

0

自己解決

jimbeさんに解決して頂きました。

修正した箇所

BLEモジュール(DSD TECH社 HM-19)がキャラスタリスティックを変更した時に
誤:onCharacteristicReadメソッドで、characteristic.getValue();する
正:onCharacteristicChangedメソッドで、characteristic.getValue();する

該当のソースコード

//Notify(キャラスタリスティックの変更通知)処理 @Override public void onCharacteristicChanged( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic ) { //呼び出したUUID取り出す String _uuidNotify; _uuidNotify = characteristic.getUuid().toString(); ///呼び出したUUID毎に処理を分ける switch (_uuidNotify){ case UUID_0: Log.d("BLE", "変更通知(UUID_0)"); break; case UUID_1: Log.d("BLE", "変更通知(UUID_1)"); byte[] data = characteristic.getValue(); //ASCIIで出力 tvRead.append("read:" + henkan.byteToAscii(data) + "\n"); //16進数で出力 tvRead.append("read:" + henkan.byteToHex(data)+ "\n"); break; case UUID_2: Log.d("BLE", "変更通知(UUID_2)"); break; } return; } // キャラクタリスティックが読み込まれたときの処理 @Override public void onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status ) { if( BluetoothGatt.GATT_SUCCESS != status ) { Log.d("BLE", "読み込み失敗"); return; }else{ Log.d("BLE", String.valueOf(status)); //呼び出したUUID取り出す String _uuidRead; _uuidRead = characteristic.getUuid().toString(); ///呼び出したUUID毎に処理を分ける switch (_uuidRead){ case UUID_0: Log.d("BLE", "読み込み(UUID_0)"); break; case UUID_1: Log.d("BLE", "読み込み(UUID_1)"); break; case UUID_2: Log.d("BLE", "読み込み(UUID_2)"); break; } return; } }

投稿2021/08/31 14:35

ZKyb

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問