質問編集履歴

4 初心者アイコン

tmn

tmn score 11

2017/11/21 01:22  投稿

ボタンを押すことなくCharacteristicの値を更新・表示したい
###前提・実現したいこと
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
public class DeviceActivity extends Activity implements View.OnClickListener {
private static final String TAG = "BLEDevice";
public static final String EXTRA_BLUETOOTH_DEVICE = "BT_DEVICE";
private BluetoothAdapter mBTAdapter;
private BluetoothDevice mDevice;
private BluetoothGatt mConnGatt;
private int mStatus;
private ToggleButton mWriteGenuinoButton;
private Button mReadGenuinoButton;
private final BluetoothGattCallback mGattcallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
mStatus = newState;
mConnGatt.discoverServices();
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
mStatus = newState;
runOnUiThread(new Runnable() {
public void run() {
mWriteGenuinoButton.setEnabled(false);
mReadGenuinoButton.setEnabled(false);
};
});
}
};
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
for (BluetoothGattService service : gatt.getServices()) {
if ((service == null) || (service.getUuid() == null)) {
continue;
}
if (BleUuid.GENUINO_UUID.equalsIgnoreCase(service.getUuid().toString())){
runOnUiThread(new Runnable() {
@Override
public void run() {
mWriteGenuinoButton.setEnabled(true);
mReadGenuinoButton.setEnabled(true);
};
});
mWriteGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.WRITE_VALUE))));
mReadGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.READ_VALUE))));
}
}
runOnUiThread(new Runnable() {
public void run() {
setProgressBarIndeterminateVisibility(false);
};
});
};
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
if (BleUuid.READ_VALUE.equalsIgnoreCase(characteristic.getUuid().toString())) {
final byte[] val = characteristic.getValue();
runOnUiThread(new Runnable() {
public void run() {
mReadGenuinoButton.setText(getString(R.string.ble_read)+":"+val[0]);
setProgressBarIndeterminateVisibility(false);
};
});
}
}
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
runOnUiThread(new Runnable() {
public void run() {
setProgressBarIndeterminateVisibility(false);
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_device);
// state
mStatus = BluetoothProfile.STATE_DISCONNECTED;
mWriteGenuinoButton = (ToggleButton) findViewById(R.id.write_genuino_button);
mWriteGenuinoButton.setOnClickListener(this);
mReadGenuinoButton = (Button) findViewById(R.id.read_genuino_button);
mReadGenuinoButton.setOnClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
init();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mConnGatt != null) {
if ((mStatus != BluetoothProfile.STATE_DISCONNECTING)
&& (mStatus != BluetoothProfile.STATE_DISCONNECTED)) {
mConnGatt.disconnect();
}
mConnGatt.close();
mConnGatt = null;
}
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.write_genuino_button) {
byte[] data = (mWriteGenuinoButton.isChecked())? new byte[] { (byte) 0x00} : new byte[] {(byte) 0x01};
if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
ch.setValue(data);
if (mConnGatt.writeCharacteristic(ch)) {
setProgressBarIndeterminateVisibility(true);
}
}
} else if (v.getId() == R.id.read_genuino_button) {
if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
if (mConnGatt.readCharacteristic(ch)) {
setProgressBarIndeterminateVisibility(true);
}
}
}
}
private void init() {
// BLE check
if (!BleUtil.isBLESupported(this)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT)
.show();
finish();
return;
}
// BT check
BluetoothManager manager = BleUtil.getManager(this);
if (manager != null) {
mBTAdapter = manager.getAdapter();
}
if (mBTAdapter == null) {
Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT)
.show();
finish();
return;
}
// check BluetoothDevice
if (mDevice == null) {
mDevice = getBTDeviceExtra();
if (mDevice == null) {
finish();
return;
}
}
mWriteGenuinoButton.setEnabled(false);
mReadGenuinoButton.setEnabled(false);
// connect to Gatt
if ((mConnGatt == null)
&& (mStatus == BluetoothProfile.STATE_DISCONNECTED)) {
// try to connect
mConnGatt = mDevice.connectGatt(this, false, mGattcallback);
mStatus = BluetoothProfile.STATE_CONNECTING;
} else {
if (mConnGatt != null) {
// re-connect and re-discover Services
mConnGatt.connect();
mConnGatt.discoverServices();
} else {
Log.e(TAG, "state error");
finish();
return;
}
}
setProgressBarIndeterminateVisibility(true);
}
private BluetoothDevice getBTDeviceExtra() {
Intent intent = getIntent();
if (intent == null) {
return null;
}
Bundle extras = intent.getExtras();
if (extras == null) {
return null;
}
return extras.getParcelable(EXTRA_BLUETOOTH_DEVICE);
}
}
```
###試したこと
参考にさせていただいたサイトのプログラムのうちDviceActivityに対して変更を加えています。それ以外の部分はUUIDの設定以外は触っていません。
常に実行されているスレッドがあればそこに追加すればいいと思い、Logを出力して常に実行されている処理があるかを確認しようとしましたが、どの部分が常に実行されているか分かっていません。
Genuinoに関してはArduino IDEのスケッチ例にあるCurieBLE⇒Peripheral⇒LEDに少し変更を加えたものを利用しています。
  • Android

    8264 questions

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

  • Bluetooth

    339 questions

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

  • Arduino

    897 questions

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

3 改善

tmn

tmn score 11

2017/11/16 20:36  投稿

ボタンを押すことなくCharacteristicの値を表示したい
ボタンを押すことなくCharacteristicの値を更新・表示したい
###前提・実現したいこと
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の値を操作することなく画面上に常時表示することです。
実現したいことは、BLE接続後Genuinoから送られてきたCharacteristicの値を操作することなく画面上に常時更新・表示することです。
常時表示でなくても何秒かごとに更新される、といった動きでも構いません。
どの部分にどのような変更が必要なのかご教授願います。
###該当のソースコード
```Java
public class DeviceActivity extends Activity implements View.OnClickListener {
   private static final String TAG = "BLEDevice";
   public static final String EXTRA_BLUETOOTH_DEVICE = "BT_DEVICE";
   private BluetoothAdapter mBTAdapter;
   private BluetoothDevice mDevice;
   private BluetoothGatt mConnGatt;
   private int mStatus;
   private ToggleButton mWriteGenuinoButton;
   private Button mReadGenuinoButton;
   private final BluetoothGattCallback mGattcallback = new BluetoothGattCallback() {
       @Override
       public void onConnectionStateChange(BluetoothGatt gatt, int status,
               int newState) {
           if (newState == BluetoothProfile.STATE_CONNECTED) {
               mStatus = newState;
               mConnGatt.discoverServices();
           } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
               mStatus = newState;
               runOnUiThread(new Runnable() {
                   public void run() {
                       mWriteGenuinoButton.setEnabled(false);
                       mReadGenuinoButton.setEnabled(false);
                   };
               });
           }
       };
       @Override
       public void onServicesDiscovered(BluetoothGatt gatt, int status) {
           for (BluetoothGattService service : gatt.getServices()) {
               if ((service == null) || (service.getUuid() == null)) {
                   continue;
               }
               if (BleUuid.GENUINO_UUID.equalsIgnoreCase(service.getUuid().toString())){
                   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           mWriteGenuinoButton.setEnabled(true);
                           mReadGenuinoButton.setEnabled(true);
                       };
                   });
                   mWriteGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.WRITE_VALUE))));
                   mReadGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.READ_VALUE))));
               }
           }
           runOnUiThread(new Runnable() {
               public void run() {
                   setProgressBarIndeterminateVisibility(false);
               };
           });
       };
       @Override
       public void onCharacteristicRead(BluetoothGatt gatt,
               BluetoothGattCharacteristic characteristic, int status) {
           if (status == BluetoothGatt.GATT_SUCCESS) {
               if (BleUuid.READ_VALUE.equalsIgnoreCase(characteristic.getUuid().toString())) {
                   final byte[] val = characteristic.getValue();
                   runOnUiThread(new Runnable() {
                       public void run() {
                           mReadGenuinoButton.setText(getString(R.string.ble_read)+":"+val[0]);
                           setProgressBarIndeterminateVisibility(false);
                       };
                   });
               }
           }
       }
       @Override
       public void onCharacteristicWrite(BluetoothGatt gatt,
               BluetoothGattCharacteristic characteristic, int status) {
           runOnUiThread(new Runnable() {
               public void run() {
                   setProgressBarIndeterminateVisibility(false);
               }
           });
       }
   };
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
       setContentView(R.layout.activity_device);
       // state
       mStatus = BluetoothProfile.STATE_DISCONNECTED;
       mWriteGenuinoButton = (ToggleButton) findViewById(R.id.write_genuino_button);
       mWriteGenuinoButton.setOnClickListener(this);
       mReadGenuinoButton = (Button) findViewById(R.id.read_genuino_button);
       mReadGenuinoButton.setOnClickListener(this);
   }
   @Override
   protected void onResume() {
       super.onResume();
       init();
   }
   @Override
   protected void onDestroy() {
       super.onDestroy();
       if (mConnGatt != null) {
           if ((mStatus != BluetoothProfile.STATE_DISCONNECTING)
                   && (mStatus != BluetoothProfile.STATE_DISCONNECTED)) {
               mConnGatt.disconnect();
           }
           mConnGatt.close();
           mConnGatt = null;
       }
   }
   @Override
   public void onClick(View v) {
       if (v.getId() == R.id.write_genuino_button) {
           byte[] data = (mWriteGenuinoButton.isChecked())? new byte[] { (byte) 0x00} : new byte[] {(byte) 0x01};
           if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
               BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
               ch.setValue(data);
               if (mConnGatt.writeCharacteristic(ch)) {
                   setProgressBarIndeterminateVisibility(true);
               }
           }
       } else if (v.getId() == R.id.read_genuino_button) {
           if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
               BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
               if (mConnGatt.readCharacteristic(ch)) {
                   setProgressBarIndeterminateVisibility(true);
               }
           }
       }
   }
   private void init() {
       // BLE check
       if (!BleUtil.isBLESupported(this)) {
           Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT)
                   .show();
           finish();
           return;
       }
       // BT check
       BluetoothManager manager = BleUtil.getManager(this);
       if (manager != null) {
           mBTAdapter = manager.getAdapter();
       }
       if (mBTAdapter == null) {
           Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT)
                   .show();
           finish();
           return;
       }
       // check BluetoothDevice
       if (mDevice == null) {
           mDevice = getBTDeviceExtra();
           if (mDevice == null) {
               finish();
               return;
           }
       }
       mWriteGenuinoButton.setEnabled(false);
       mReadGenuinoButton.setEnabled(false);
       // connect to Gatt
       if ((mConnGatt == null)
               && (mStatus == BluetoothProfile.STATE_DISCONNECTED)) {
           // try to connect
           mConnGatt = mDevice.connectGatt(this, false, mGattcallback);
           mStatus = BluetoothProfile.STATE_CONNECTING;
       } else {
           if (mConnGatt != null) {
               // re-connect and re-discover Services
               mConnGatt.connect();
               mConnGatt.discoverServices();
           } else {
               Log.e(TAG, "state error");
               finish();
               return;
           }
       }
       setProgressBarIndeterminateVisibility(true);
   }
   private BluetoothDevice getBTDeviceExtra() {
       Intent intent = getIntent();
       if (intent == null) {
           return null;
       }
       Bundle extras = intent.getExtras();
       if (extras == null) {
           return null;
       }
       return extras.getParcelable(EXTRA_BLUETOOTH_DEVICE);
   }
}
```
###試したこと
参考にさせていただいたサイトのプログラムのうちDviceActivityに対して変更を加えています。それ以外の部分はUUIDの設定以外は触っていません。
常に実行されているスレッドがあればそこに追加すればいいと思い、Logを出力して常に実行されている処理があるかを確認しようとしましたが、どの部分が常に実行されているか分かっていません。  
Genuinoに関してはArduino IDEのスケッチ例にあるCurieBLE⇒Peripheral⇒LEDに少し変更を加えたものを利用しています。
  • Android

    8264 questions

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

  • Bluetooth

    339 questions

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

  • Arduino

    897 questions

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

2 コードの追加

tmn

tmn score 11

2017/11/15 23:45  投稿

Characteristicの値を常時表示したい
ボタンを押すことなくCharacteristicの値を表示したい
###前提・実現したいこと
https://qiita.com/maki02/items/27d5a6f50016097875ae
http://greety.sakura.ne.jp/redo/2013/11/androidblecharacteristicsreadwrite.html
上記のサイトを参考にし、Android端末とGenuino 101をBluetoothで接続するアプリを作成しています。
現在はアプリ上のボタンを押すことで、Characteristicの値を変更しデータの送受信を行うことができています。
Genuinoから送られてきたCharacteristicの値を、操作することなく画面上に表示したいと考えています。
上記のサイトを参考にし、Android端末とGenuino 101をBLEで接続するアプリを作成しています。
上記サイトのソースコードとの変更点は
・onServicesDiscoveredの部分をGenuinoで設定したカスタムUUIDに対応付けさせた
・CharacteristicReadの部分をCharacteristicの値を表示できるようにした
という2点になります。
これにより、アプリ上のボタンを押すことでCharacteristicの値を読み取ることができています。
実現したいことは、BLE接続後Genuinoから送られてきたCharacteristicの値を操作することなく画面上に常時表示することです。
どの部分にどのような変更が必要なのかご教授願います。
###該当のソースコード
```Java
public class DeviceActivity extends Activity implements View.OnClickListener {
   private static final String TAG = "BLEDevice";
 
   public static final String EXTRA_BLUETOOTH_DEVICE = "BT_DEVICE";
   private BluetoothAdapter mBTAdapter;
   private BluetoothDevice mDevice;
   private BluetoothGatt mConnGatt;
   private int mStatus;
   private ToggleButton mWriteGenuinoButton;
   private Button mReadGenuinoButton;
 
   private final BluetoothGattCallback mGattcallback = new BluetoothGattCallback() {
       @Override
       public void onConnectionStateChange(BluetoothGatt gatt, int status,
               int newState) {
           Log.d("callback" , "チェック");  
           if (newState == BluetoothProfile.STATE_CONNECTED) {
               mStatus = newState;
               mConnGatt.discoverServices();
           } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
               mStatus = newState;
               runOnUiThread(new Runnable() {
                   public void run() {
                       mWriteGenuinoButton.setEnabled(false);
                       mReadGenuinoButton.setEnabled(false);
                   };
               });
           }
       };
       @Override
       public void onServicesDiscovered(BluetoothGatt gatt, int status) {
           Log.d("ServicesDiscovered" , "チェック");  
           for (BluetoothGattService service : gatt.getServices()) {
               if ((service == null) || (service.getUuid() == null)) {
                   continue;
               }
               if (BleUuid.GENUINO_UUID.equalsIgnoreCase(service.getUuid().toString())){
                   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           mWriteGenuinoButton.setEnabled(true);
                           mReadGenuinoButton.setEnabled(true);
                       };
                   });
                   mWriteGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.WRITE_VALUE))));
                   mReadGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.READ_VALUE))));
               }
           }
           runOnUiThread(new Runnable() {
               public void run() {
                   setProgressBarIndeterminateVisibility(false);
               };
           });
       };
       @Override
       public void onCharacteristicRead(BluetoothGatt gatt,
               BluetoothGattCharacteristic characteristic, int status) {
           if (status == BluetoothGatt.GATT_SUCCESS) {
               if (BleUuid.READ_VALUE.equalsIgnoreCase(characteristic.getUuid().toString())) {
                   final byte[] val = characteristic.getValue();
                   runOnUiThread(new Runnable() {
                       public void run() {
                           mReadGenuinoButton.setText(getString(R.string.ble_read)+":"+val[0]);
                           setProgressBarIndeterminateVisibility(false);
                       };
                   });
               }
           }
       }
       @Override
       public void onCharacteristicWrite(BluetoothGatt gatt,
               BluetoothGattCharacteristic characteristic, int status) {
           runOnUiThread(new Runnable() {
               public void run() {
                   setProgressBarIndeterminateVisibility(false);
               }
           });
       }
   };
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
       setContentView(R.layout.activity_device);
       // state
       mStatus = BluetoothProfile.STATE_DISCONNECTED;
       mWriteGenuinoButton = (ToggleButton) findViewById(R.id.write_genuino_button);
       mWriteGenuinoButton.setOnClickListener(this);
       mReadGenuinoButton = (Button) findViewById(R.id.read_genuino_button);
       mReadGenuinoButton.setOnClickListener(this);
   }
   
   @Override
   protected void onResume() {
       super.onResume();
       init();
   }
   @Override
   protected void onDestroy() {
       super.onDestroy();
       if (mConnGatt != null) {
           if ((mStatus != BluetoothProfile.STATE_DISCONNECTING)
                   && (mStatus != BluetoothProfile.STATE_DISCONNECTED)) {
               mConnGatt.disconnect();
           }
           mConnGatt.close();
           mConnGatt = null;
       }
   }
   @Override
   public void onClick(View v) {
       if (v.getId() == R.id.write_genuino_button) {
           byte[] data = (mWriteGenuinoButton.isChecked())? new byte[] { (byte) 0x00} : new byte[] {(byte) 0x01};
           if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
               BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
               ch.setValue(data);
               if (mConnGatt.writeCharacteristic(ch)) {
                   setProgressBarIndeterminateVisibility(true);
               }
           }
       } else if (v.getId() == R.id.read_genuino_button) {
           if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
               BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
               if (mConnGatt.readCharacteristic(ch)) {
                   setProgressBarIndeterminateVisibility(true);
               }
           }
       }
   }
   private void init() {
       // BLE check
       if (!BleUtil.isBLESupported(this)) {
           Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT)
                   .show();
           finish();
           return;
       }
       // BT check
       BluetoothManager manager = BleUtil.getManager(this);
       if (manager != null) {
           mBTAdapter = manager.getAdapter();
       }
       if (mBTAdapter == null) {
           Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT)
                   .show();
           finish();
           return;
       }
       // check BluetoothDevice
       if (mDevice == null) {
           mDevice = getBTDeviceExtra();
           if (mDevice == null) {
               finish();
               return;
           }
       }
       mWriteGenuinoButton.setEnabled(false);
       mReadGenuinoButton.setEnabled(false);
       // connect to Gatt
       if ((mConnGatt == null)
               && (mStatus == BluetoothProfile.STATE_DISCONNECTED)) {
           // try to connect
           mConnGatt = mDevice.connectGatt(this, false, mGattcallback);
           mStatus = BluetoothProfile.STATE_CONNECTING;
       } else {
           if (mConnGatt != null) {
               // re-connect and re-discover Services
               mConnGatt.connect();
               mConnGatt.discoverServices();
           } else {
               Log.e(TAG, "state error");
               finish();
               return;
           }
       }
       setProgressBarIndeterminateVisibility(true);
   }
   private BluetoothDevice getBTDeviceExtra() {
       Intent intent = getIntent();
       if (intent == null) {
           return null;
       }
       Bundle extras = intent.getExtras();
       if (extras == null) {
           return null;
       }
       return extras.getParcelable(EXTRA_BLUETOOTH_DEVICE);
   }
}
```
###試したこと
参考にさせていただいたサイトのプログラムのうちDviceActivityに対して変更を加えています。
参考にさせていただいたサイトのプログラムのうちDviceActivityに対して変更を加えています。それ以外の部分はUUIDの設定以外は触っていません。
Genuinoに関してはArduino IDEのスケッチ例にあるCurieBLE⇒Peripheral⇒LEDに少し変更を加えたものを利用しています。
  • Android

    8264 questions

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

  • Bluetooth

    339 questions

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

  • Arduino

    897 questions

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

1 文法の修正

tmn

tmn score 11

2017/11/15 19:41  投稿

Characteristicの値を常時表示したい
###前提・実現したいこと
https://qiita.com/maki02/items/27d5a6f50016097875ae
http://greety.sakura.ne.jp/redo/2013/11/androidblecharacteristicsreadwrite.html
上記のサイトを参考にし、Android端末とGenuino 101をBluetoothで接続するアプリを作成しています。
現在はアプリ上のボタンを押すことで、Characteristicの値を変更しデータの送受信を行うことができています。
Genuinoから送られてきたCharacteristicの値を、操作することなく画面上に表示したいと考えています。どの部分にどのような変更が必要なのかご教授願います。
Genuinoから送られてきたCharacteristicの値を、操作することなく画面上に表示したいと考えています。
どの部分にどのような変更が必要なのかご教授願います。
###該当のソースコード
```Java
package youten.redo.ble.readwrite;  
import java.util.UUID;  
import youten.redo.ble.util.BleUtil;  
import youten.redo.ble.util.BleUuid;  
import android.app.Activity;  
import android.bluetooth.BluetoothAdapter;  
import android.bluetooth.BluetoothDevice;  
import android.bluetooth.BluetoothGatt;  
import android.bluetooth.BluetoothGattCallback;  
import android.bluetooth.BluetoothGattCharacteristic;  
import android.bluetooth.BluetoothGattService;  
import android.bluetooth.BluetoothManager;  
import android.bluetooth.BluetoothProfile;  
import android.content.Intent;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.Window;  
import android.widget.Button;  
import android.widget.TextView;  
import android.widget.Toast;  
import android.widget.ToggleButton;  
 
/**  
* BLEデバイスへのconnect・Service  
* Discoveryを実施し、Characteristicsのread/writeをハンドリングするActivity  
*/  
public class DeviceActivity extends Activity implements View.OnClickListener {
   private static final String TAG = "BLEDevice";
   public static final String EXTRA_BLUETOOTH_DEVICE = "BT_DEVICE";
   private BluetoothAdapter mBTAdapter;
   private BluetoothDevice mDevice;
   private BluetoothGatt mConnGatt;
   private int mStatus;
   private ToggleButton mWriteGenuinoButton;
   private Button mReadGenuinoButton;
   private final BluetoothGattCallback mGattcallback = new BluetoothGattCallback() {
       @Override
       public void onConnectionStateChange(BluetoothGatt gatt, int status,
               int newState) {
           Log.d("callback" , "チェック");
           if (newState == BluetoothProfile.STATE_CONNECTED) {
               mStatus = newState;
               mConnGatt.discoverServices();
           } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
               mStatus = newState;
               runOnUiThread(new Runnable() {
                   public void run() {
                       mWriteGenuinoButton.setEnabled(false);
                       mReadGenuinoButton.setEnabled(false);
                   };
               });
           }
       };
       @Override
       public void onServicesDiscovered(BluetoothGatt gatt, int status) {
           Log.d("ServicesDiscovered" , "チェック");
           for (BluetoothGattService service : gatt.getServices()) {
               if ((service == null) || (service.getUuid() == null)) {
                   continue;
               }
               if (BleUuid.GENUINO_UUID.equalsIgnoreCase(service.getUuid().toString())){
                   runOnUiThread(new Runnable() {
                       @Override
                       public void run() {
                           mWriteGenuinoButton.setEnabled(true);
                           mReadGenuinoButton.setEnabled(true);
                       };
                   });
                   mWriteGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.WRITE_VALUE))));
                   mReadGenuinoButton.setTag(service.getCharacteristic((UUID.fromString(BleUuid.READ_VALUE))));
               }
           }
           runOnUiThread(new Runnable() {
               public void run() {
                   setProgressBarIndeterminateVisibility(false);
               };
           });
       };
       @Override
       public void onCharacteristicRead(BluetoothGatt gatt,
               BluetoothGattCharacteristic characteristic, int status) {
           Log.d("CharacteristicRead" , "チェック");  
           if (status == BluetoothGatt.GATT_SUCCESS) {
               if (BleUuid.READ_VALUE.equalsIgnoreCase(characteristic.getUuid().toString())) {
                   final byte[] val = characteristic.getValue();
                   runOnUiThread(new Runnable() {
                       public void run() {
                           mReadGenuinoButton.setText(getString(R.string.ble_read)+":"+val[0]);
                           setProgressBarIndeterminateVisibility(false);
                       };
                   });
               }
           }
       }
       @Override
       public void onCharacteristicWrite(BluetoothGatt gatt,
               BluetoothGattCharacteristic characteristic, int status) {
           runOnUiThread(new Runnable() {
               public void run() {
                   setProgressBarIndeterminateVisibility(false);
               }
           });
       }
   };
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
       setContentView(R.layout.activity_device);
       // state
       mStatus = BluetoothProfile.STATE_DISCONNECTED;
       mWriteGenuinoButton = (ToggleButton) findViewById(R.id.write_genuino_button);
       mWriteGenuinoButton.setOnClickListener(this);
       mReadGenuinoButton = (Button) findViewById(R.id.read_genuino_button);
       mReadGenuinoButton.setOnClickListener(this);
   }
   @Override
   protected void onResume() {
       super.onResume();
       init();
   }
   @Override
   protected void onDestroy() {
       super.onDestroy();
       if (mConnGatt != null) {
           if ((mStatus != BluetoothProfile.STATE_DISCONNECTING)
                   && (mStatus != BluetoothProfile.STATE_DISCONNECTED)) {
               mConnGatt.disconnect();
           }
           mConnGatt.close();
           mConnGatt = null;
       }
   }
   @Override
   public void onClick(View v) {
       if (v.getId() == R.id.write_genuino_button) {
           byte[] data = (mWriteGenuinoButton.isChecked())? new byte[] { (byte) 0x00} : new byte[] {(byte) 0x01};
           if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
               BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
               ch.setValue(data);
               if (mConnGatt.writeCharacteristic(ch)) {
                   setProgressBarIndeterminateVisibility(true);
               }
           }
       } else if (v.getId() == R.id.read_genuino_button) {
           if ((v.getTag() != null) && (v.getTag() instanceof BluetoothGattCharacteristic)) {
               BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v.getTag();
               if (mConnGatt.readCharacteristic(ch)) {
                   setProgressBarIndeterminateVisibility(true);
               }
           }
       }
   }
   private void init() {
       // BLE check
       if (!BleUtil.isBLESupported(this)) {
           Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT)
                   .show();
           finish();
           return;
       }
       // BT check
       BluetoothManager manager = BleUtil.getManager(this);
       if (manager != null) {
           mBTAdapter = manager.getAdapter();
       }
       if (mBTAdapter == null) {
           Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT)
                   .show();
           finish();
           return;
       }
       // check BluetoothDevice
       if (mDevice == null) {
           mDevice = getBTDeviceExtra();
           if (mDevice == null) {
               finish();
               return;
           }
       }
       mWriteGenuinoButton.setEnabled(false);
       mReadGenuinoButton.setEnabled(false);
       // connect to Gatt
       if ((mConnGatt == null)
               && (mStatus == BluetoothProfile.STATE_DISCONNECTED)) {
           // try to connect
           mConnGatt = mDevice.connectGatt(this, false, mGattcallback);
           mStatus = BluetoothProfile.STATE_CONNECTING;
       } else {
           if (mConnGatt != null) {
               // re-connect and re-discover Services
               mConnGatt.connect();
               mConnGatt.discoverServices();
           } else {
               Log.e(TAG, "state error");
               finish();
               return;
           }
       }
       setProgressBarIndeterminateVisibility(true);
   }
   private BluetoothDevice getBTDeviceExtra() {
       Intent intent = getIntent();
       if (intent == null) {
           return null;
       }
       Bundle extras = intent.getExtras();
       if (extras == null) {
           return null;
       }
       return extras.getParcelable(EXTRA_BLUETOOTH_DEVICE);
   }
}
   
```
###試したこと
参考にさせていただいたサイトのプログラムのうちDviceActivityに対して変更を加えています。
Genuinoに関してはArduino IDEのスケッチ例にあるCurieBLE⇒Peripheral⇒LEDに少し変更を加えたものを利用しています。
  • Android

    8264 questions

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

  • Bluetooth

    339 questions

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

  • Arduino

    897 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る