私は Android と Java を初めて使用しますが、まだあきらめたくありません。このプロジェクトでは、BLE 用の Android Studio サンプルを使用しています。 https://github.com/googlesamples/android-BluetoothLeGatt
私の目的に関連するサンプルコードやアドバイスがあれば、正しい方向に向けてください。:)
RSSI 値が特定のしきい値に達したときに、電話を鳴らしたり、振動させたり、カスタム特性に書き込んだりしたいと考えています。StopRing または StopVibrate ボタンを押さない限り、鳴り続けるはずです。別の BLE デバイスが特性を読み取り、ブザーを鳴らして応答できるように、(しきい値に違反した場合) 特性に書き込む必要があります。
1) いくつかのサンプル コードを読み、ボタンがクリックされたときに電話を鳴らし、振動させ、書き込む (または停止する) 方法を確認しました。ただし、今では RSSI 値を 10 ミリ秒ごとに読み取るのに役立つタイマーがあり、以下の updateRssi 関数呼び出しは基本的に、電話アプリに表示される RSSI 値を更新します。更新 RSSI 内 (RSSI < -threshold 条件内) にバイブレーションまたはリング関数呼び出しを追加できますが、リング/バイブレーションが鳴り、着信音/バイブレーション パターンが終了する前に停止します。
RSSI 値を GATT から取得した後、RSSI 値が条件を満たしているかどうかを確認し続け、その後、無期限に鳴って振動する別の方法に切り替えるにはどうすればよいでしょうか? if (RSSI < -threshold) 条件内でインテントを作成できますか? そして、上記のアクションを実行するはずのメソッドが意図を受け取るようにしますか? (以下は、DeviceControlActivity 内のメッセージ ハンドラーのスニペットです)
2) 以下では、Gatt サーバーから RSSI 値を取得するたびに、カスタム特性に書き込むかどうかを決定します。RSSI 値は 10 ミリ秒ごとに読み取られるため、RSSI 値がしきい値を超えている限り、writecharacteristic 関数が呼び出される可能性があります。フォーラムを検索しているときに、Android BLE スタックがあまり安定していない、特に連続した特徴的な書き込みが多いと彼らが言っているのを聞きました。私の場合は大丈夫ですか?
どうもありがとうございました!
// Service message handler
//This message handler will be called when BluetoothLeService gets results back from the Gatt server.
private Handler mMessageHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Bundle bundle;
switch (msg.what) {
case BluetoothLeService.GATT_SERVICES_DISCOVERED:
// start off the rssi reading timer
DeviceControlActivity.this.startReadRssiTimer();
break;
case BluetoothLeService.GATT_DISCONNECT:
break;
case BluetoothLeService.GATT_REMOTE_RSSI:
bundle = msg.getData();
int rssi = bundle.getInt(BluetoothLeService.PARCEL_RSSI);
DeviceControlActivity.this.updateRssi(rssi);
if (rssi < - 80){
if(mBluetoothLeService!=null){
mBluetoothLeService.writeCustomCharacteristic(0xAA);
}
}
break;
}
}
};
編集: タイマーを停止して (新しい RSSI の読み取りとハンドラーの呼び出しを停止するため)、電話を振動させて鳴らす (レイアウト上のボタンが押されるまで) だけに進むことにしました。
EDIT2:実際には、バックグラウンドで実行されるサービスが必要です...