- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在我的应用程序中使用 BLE 连接。我有一个用于蓝牙功能的类,我正在传递来自不同 fragment 类的命令以写入任何值。
因此根据场景,在 fragment 内,单击按钮将向蓝牙类发送写入命令。它第一次运行良好,我收到了回复。但是当第二次点击按钮时, onCharacteristicChanged() 被调用两次,第三次点击使其被调用三次,依此类推。我真的想不通。我将在下面发布我的代码。请看一看。如有任何疑问,请告诉我。提前致谢。
我正在 OnDescriptorWrite() 中写入数据,其中接收数据onCharacteristicChanged()。
fragment 内部:
rvw_availableList.addOnItemTouchListener((
new RecyclerItemClickListener(myContext, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position)
{
BluetoothDevice bl_device = al_deviceList.get(position);
bleUtil.writeData(bl_device,"3AxxxxxxD");
}
})
));
现在在 BleUtil 类的 writeData() 中:
public void writeData(BluetoothDevice bluetoothDevice, final String value)
{
BluetoothGattCallback gattCallback =
new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
gatt.discoverServices();
}
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, final int status) {
activity.runOnUiThread(new Runnable() {
public void run() {
// prgd_progress.HideProgressDialog();
Log.d("onServicesDiscovered", "Service uuid ");
List<BluetoothGattService> gattServices = gatt.getServices();
Log.d("onServicesDiscovered", "Services count: "+gattServices.size());
for (BluetoothGattService gattService: gattServices)
{
Log.d("aniservice",gattService.getUuid().toString());
}
if (status == BluetoothGatt.GATT_SUCCESS) {
ArrayList<String> alst_uuid = new ArrayList<String>();
BluetoothGattCharacteristic characteristic =
gatt.getService(UUID.fromString(SERVICE_ID)).getCharacteristics().get(0);
Log.d("anicheck",characteristic.getUuid().toString());
Log.d("anicheck",characteristic.getDescriptors().get(0).getUuid().toString());
// BluetoothGattCharacteristic characteristic =
// gattServices.get(0).getCharacteristics().get(0);
// Log.d("foundoutchar",gattServices.get(0).getUuid()+" "+gattServices.get(0).getCharacteristics().get(0).getUuid()+"");
gatt.setCharacteristicNotification(characteristic,true);
for (BluetoothGattDescriptor descriptor:characteristic.getDescriptors()){
Log.e("anicheck", "BluetoothGattDescriptor: "+descriptor.getUuid().toString());
}
final BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
if(descriptor!= null)
{
descriptor.setValue(
BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
else
{
Toast.makeText(activity,"nullval", Toast.LENGTH_SHORT).show();
}
// Log.d("foundoutchar", descriptor.getUuid().toString());
}
}
});
}
@Override
public void onCharacteristicWrite(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, final int status) {
super.onCharacteristicWrite(gatt, characteristic, status);
activity.runOnUiThread(new Runnable() {
public void run()
{
}
});
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status)
{
Log.d("onCharacteristicread",characteristic.getValue().toString());
Log.d("onCharacteristicread","called");
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
super.onCharacteristicChanged(gatt, characteristic);
byte[] charValue = characteristic.getValue();
final String str_result = bytesToHex(charValue);
Log.d("onCharacteristicfullres",str_result);
final Intent intent = new Intent("ble_data"); //FILTER is a string to identify this intent
intent.putExtra("val", "getdeviceinfo");
intent.putExtra("data", str_result);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
activity.runOnUiThread(new Runnable() {
public void run()
{
// byte[] charValue = characteristic.getValue();
// String str_result = bytesToHex(charValue);
// Log.d("onCharacteristicfullres",str_result);
//Toast.makeText(activity, "On char changed "+str_result, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onDescriptorWrite(final BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)
{
activity.runOnUiThread(new Runnable() {
public void run()
{
Log.d("oncharadesc","abcd");
// prgd_progress.HideProgressDialog();
BluetoothGattService service = gatt.getService(UUID.fromString(SERVICE_ID));
for (BluetoothGattCharacteristic characteristics: service.getCharacteristics())
{
Log.d("getit",characteristics.getUuid().toString());
}
final BluetoothGattCharacteristic characteristic =
gatt.getService(UUID.fromString(SERVICE_ID)).getCharacteristics().get(0);
byte[] byt_arr;
byt_arr = hexStringToByteArray(value);
characteristic.setValue(byt_arr);
gatt.writeCharacteristic(characteristic);
}
});
}
};
BluetoothGatt bluetoothGatt = bluetoothDevice.connectGatt(activity, true, gattCallback);
}
最佳答案
是因为你多次调用了connectGatt。每次调用 connectGatt 时,都会创建一个 GATT 客户端对象来监听通知。因此,按三下后,您将拥有三个 GATT 客户端,它们都处理每个通知。
您应该更改代码,以便在写入数据时使用之前创建的 GATT 客户端。
关于android - onCharacteristicChanged() 被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50228728/
我有一个问题,我不知道如何解决。 我可以成功连接到设备,注册以获取有关特性的通知,并且可以在远程设备上的值更改后成功收到通知。 我遇到的问题是,当连续通知到达时,第二个通知并不总是被服务甚至操作系统捕
我正在我的应用程序中使用 BLE 连接。我有一个用于蓝牙功能的类,我正在传递来自不同 fragment 类的命令以写入任何值。 因此根据场景,在 fragment 内,单击按钮将向蓝牙类发送写入命令。
在我的应用程序中,我使用 setCharacteristicNotification 为特征启用通知。在日志猫中,我收到通知 enable true 也在 onDescriptorWrite 回调上获
我正在尝试编写一个 Android 应用程序来模仿我编写的 iOS 应用程序中已经存在的功能。我正在连接 2 个不同的 BLE 设备: 血压袖带 体重秤 在 iOS 上,我的两台设备都运行良好并报告数
我的应用程序执行以下操作: 它使用 onDescriptorWrite 发送命令到 BT 设备。 BT 设备一收到此命令 它开始传输数据到安卓手机。 安卓的onCharacteristicChange
我有一个医疗设备(名为 SnoreCoach),我创建了一个 Android 应用程序并与该设备进行低功耗蓝牙连接。一切(连接到设备、将数据写入特征等)都工作正常,除了 OnCharacteristi
我等待 onCharacteristicChanged() 回调通过 BLE 接收数据。但是,如果 BluetoothDevice 一次发送太多 20 字节的数据包,我最多会收到 10 条通知,而不是
我需要 Ble 的一些响应数据。当我在 ble 上写东西时,我需要从 Ble 读取响应数据。我能够成功启用和禁用我的 ble 设备,但只缺少来自 ble 的响应数据。我还需要将十进制时间转换为整数十六
这是我关于 SO 的第一篇文章。 我在 android 5.0.2 上订阅 GATT 通知时遇到一些问题。 我打算做的是将带有 BLE Shield 的 Arduino 连接到我的 Android 手
我已连接血压设备并在 onServiceDicovered 中设置通知。 我为每个特性设置了通知。但是 onCharacteristicChanged 仍然没有被调用。 public final st
我正在尝试连接蓝牙 LE 温度计。连接到设备工作正常。唯一让我挂断的部分是 gattCallBack 和 onCharacteristicChanged/Read。 'setNotification'
我正试图在退出我的应用程序时断开特征通知。以下是我在 exitCleanup() 函数中的做法: if (btGatt != null && mWriteChar != null) { bool
我有一个 Android 应用程序,我从中接收 BLE 数据(通过通知每 62 毫秒)。该应用程序可以通过 BufferedWriter 将数据保存到文件中。在每个 onCharacteristicC
我是一名优秀的程序员,十分优秀!