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

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

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

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Android

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

3842閲覧

ボタンを押すことなくCharacteristicの値を更新・表示したい

tmn

総合スコア13

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Android

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2017/11/15 10:34

編集2017/11/20 16:22

###前提・実現したいこと
https://qiita.com/maki02/items/27d5a6f50016097875ae
http://greety.sakura.ne.jp/redo/2013/11/androidblecharacteristicsreadwrite.html
上記のサイトを参考にし、Android端末とGenuino 101をBLEで接続するアプリを作成しています。
上記サイトのソースコードとの変更点は
・onServicesDiscoveredの部分をGenuinoで設定したカスタムUUIDに対応付けさせた
・CharacteristicReadの部分をCharacteristicの値を表示できるようにした
という2点になります。
これにより、アプリ上のボタンを押すことでCharacteristicの値を読み取ることができています。

実現したいことは、BLE接続後Genuinoから送られてきたCharacteristicの値を操作することなく画面上に常時更新・表示することです。
常時表示でなくても何秒かごとに更新される、といった動きでも構いません。
どの部分にどのような変更が必要なのかご教授願います。

###該当のソースコード

Java

1 2public class DeviceActivity extends Activity implements View.OnClickListener { 3 private static final String TAG = "BLEDevice"; 4 public static final String EXTRA_BLUETOOTH_DEVICE = "BT_DEVICE"; 5 private BluetoothAdapter mBTAdapter; 6 private BluetoothDevice mDevice; 7 private BluetoothGatt mConnGatt; 8 private int mStatus; 9 private ToggleButton mWriteGenuinoButton; 10 private Button mReadGenuinoButton; 11 private final BluetoothGattCallback mGattcallback = new BluetoothGattCallback() { 12 @Override 13 public void onConnectionStateChange(BluetoothGatt gatt, int status, 14 int newState) { 15 if (newState == BluetoothProfile.STATE_CONNECTED) { 16 mStatus = newState; 17 mConnGatt.discoverServices(); 18 } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 19 mStatus = newState; 20 runOnUiThread(new Runnable() { 21 public void run() { 22 mWriteGenuinoButton.setEnabled(false); 23 mReadGenuinoButton.setEnabled(false); 24 }; 25 }); 26 } 27 }; 28 29 @Override 30 public void onServicesDiscovered(BluetoothGatt gatt, int status) { 31 for (BluetoothGattService service : gatt.getServices()) { 32 if ((service == null) || (service.getUuid() == null)) { 33 continue; 34 } 35 if (BleUuid.GENUINO_UUID.equalsIgnoreCase(service.getUuid().toString())){ 36 runOnUiThread(new Runnable() { 37 @Override 38 public void run() { 39 mWriteGenuinoButton.setEnabled(true); 40 mReadGenuinoButton.setEnabled(true); 41 }; 42 }); 43 mWriteGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.WRITE_VALUE)))); 44 mReadGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.READ_VALUE)))); 45 } 46 } 47 runOnUiThread(new Runnable() { 48 public void run() { 49 setProgressBarIndeterminateVisibility(false); 50 }; 51 }); 52 }; 53 54 55 @Override 56 public void onCharacteristicRead(BluetoothGatt gatt, 57 BluetoothGattCharacteristic characteristic, int status) { 58 if (status == BluetoothGatt.GATT_SUCCESS) { 59 if (BleUuid.READ_VALUE.equalsIgnoreCase(characteristic.getUuid().toString())) { 60 final byte[] val = characteristic.getValue(); 61 runOnUiThread(new Runnable() { 62 public void run() { 63 mReadGenuinoButton.setText(getString(R.string.ble_read)+":"+val[0]); 64 setProgressBarIndeterminateVisibility(false); 65 }; 66 }); 67 } 68 } 69 } 70 71 @Override 72 public void onCharacteristicWrite(BluetoothGatt gatt, 73 BluetoothGattCharacteristic characteristic, int status) { 74 runOnUiThread(new Runnable() { 75 public void run() { 76 setProgressBarIndeterminateVisibility(false); 77 } 78 }); 79 } 80 }; 81 82 @Override 83 protected void onCreate(Bundle savedInstanceState) { 84 super.onCreate(savedInstanceState); 85 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 86 setContentView(R.layout.activity_device); 87 // state 88 mStatus = BluetoothProfile.STATE_DISCONNECTED; 89 mWriteGenuinoButton = (ToggleButton) findViewById(R.id.write_genuino_button); 90 mWriteGenuinoButton.setOnClickListener(this); 91 mReadGenuinoButton = (Button) findViewById(R.id.read_genuino_button); 92 mReadGenuinoButton.setOnClickListener(this); 93 } 94 95 @Override 96 protected void onResume() { 97 super.onResume(); 98 init(); 99 } 100 101 @Override 102 protected void onDestroy() { 103 super.onDestroy(); 104 if (mConnGatt != null) { 105 if ((mStatus != BluetoothProfile.STATE_DISCONNECTING) 106 && (mStatus != BluetoothProfile.STATE_DISCONNECTED)) { 107 mConnGatt.disconnect(); 108 } 109 mConnGatt.close(); 110 mConnGatt = null; 111 } 112 } 113 114 @Override 115 public void onClick(View v) { 116 if (v.getId() == R.id.write_genuino_button) { 117 byte[] data = (mWriteGenuinoButton.isChecked())? new byte[] { (byte) 0x00} : new byte[] {(byte) 0x01}; 118 if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) { 119 BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag(); 120 ch.setValue(data); 121 if (mConnGatt.writeCharacteristic(ch)) { 122 setProgressBarIndeterminateVisibility(true); 123 } 124 } 125 } else if (v.getId() == R.id.read_genuino_button) { 126 if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) { 127 BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag(); 128 if (mConnGatt.readCharacteristic(ch)) { 129 setProgressBarIndeterminateVisibility(true); 130 } 131 } 132 } 133 } 134 135 private void init() { 136 // BLE check 137 if (!BleUtil.isBLESupported(this)) { 138 Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT) 139 .show(); 140 finish(); 141 return; 142 } 143 144 // BT check 145 BluetoothManager manager = BleUtil.getManager(this); 146 if (manager != null) { 147 mBTAdapter = manager.getAdapter(); 148 } 149 if (mBTAdapter == null) { 150 Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT) 151 .show(); 152 finish(); 153 return; 154 } 155 156 // check BluetoothDevice 157 if (mDevice == null) { 158 mDevice = getBTDeviceExtra(); 159 if (mDevice == null) { 160 finish(); 161 return; 162 } 163 } 164 165 mWriteGenuinoButton.setEnabled(false); 166 mReadGenuinoButton.setEnabled(false); 167 168 // connect to Gatt 169 if ((mConnGatt == null) 170 && (mStatus == BluetoothProfile.STATE_DISCONNECTED)) { 171 // try to connect 172 mConnGatt = mDevice.connectGatt(this, false, mGattcallback); 173 mStatus = BluetoothProfile.STATE_CONNECTING; 174 } else { 175 if (mConnGatt != null) { 176 // re-connect and re-discover Services 177 mConnGatt.connect(); 178 mConnGatt.discoverServices(); 179 } else { 180 Log.e(TAG, "state error"); 181 finish(); 182 return; 183 } 184 } 185 setProgressBarIndeterminateVisibility(true); 186 } 187 188 private BluetoothDevice getBTDeviceExtra() { 189 Intent intent = getIntent(); 190 if (intent == null) { 191 return null; 192 } 193 194 Bundle extras = intent.getExtras(); 195 if (extras == null) { 196 return null; 197 } 198 199 return extras.getParcelable(EXTRA_BLUETOOTH_DEVICE); 200 } 201} 202

###試したこと
参考にさせていただいたサイトのプログラムのうちDviceActivityに対して変更を加えています。それ以外の部分はUUIDの設定以外は触っていません。
常に実行されているスレッドがあればそこに追加すればいいと思い、Logを出力して常に実行されている処理があるかを確認しようとしましたが、どの部分が常に実行されているか分かっていません。
Genuinoに関してはArduino IDEのスケッチ例にあるCurieBLE⇒Peripheral⇒LEDに少し変更を加えたものを利用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

参考資料の回答のみ致します。

一定時間置きに更新するというのが目的のようなので、タイマーを紹介しておきます。
https://techbooster.org/android/application/934/

Characteristic の Notify(CCCD Write/Characteristic の値変化通知)が有効であるならば、そのイベントが発生したときに変更するのが理想的です。
もし、Notifyが使えるのでしたら、以下を参考にして通知を有効にして、
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification
提示していただいたコードのmGattcallbackのクラス(?)にonCharacteristicChangedを定義して、characteristic == PROPERTY_NOTIFYイベントを拾って、画面更新を行うようにしたほうが良いかと存じます。

※もうご存知かとは思いますが、BLE系のデバッグを助けるnRF ConnectというAndroid アプリがあります。これを使うと、ServiceDiscoveryや対象機器のCharacteristicに対してRead・Write等が容易にできます。

投稿2017/11/21 15:45

testset

総合スコア221

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

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

tmn

2017/11/22 07:17

回答ありがとうございます。 この質問投降後Notifyというものを知り、AndroidLeGattを改造し常時表示を行おうと考え、新たに質問を投稿させていただきました。 https://teratail.com/questions/101319 そちらでも書いたのですが、使い方があっているかどうかがわかりません。 もしよろしければそちらも参照いただき、回答お願いします。 アドバイスありがとうございます。nRF Connectについてはすでに使っていますので、また確認のために使っていきますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問