junkchen / BleLib

BleLib是Android低功耗蓝牙4.0及以上开发的辅助库,一行代码解决Ble初始化、扫描、连接、特性读写、设置通知等操作。
Apache License 2.0
245 stars 73 forks source link

请问如何读取和写入数据 #9

Open android1601 opened 7 years ago

android1601 commented 7 years ago

mBleService.setCharacteristicNotification();//设置通知
mBleService.readCharacteristic();//读取数据
mBleService.writeCharacteristic();//写入数据 调用以上三个方法却没有任何响应,还请指点一下,谢谢。

junkchen commented 7 years ago

读写操作成功的前提是:首先你需要连接成功,在连接成功后要发现服务,只有服务获取到之后才可以进行读写操作以及通知,否则都是不能成功的。另外在进行读写操作时不要连续请求,记得做延时,连续请求可能导致设备忙,造成你第一次的读写操作可能没有问题,但是紧接着的读写就会不成功,由于设备忙碌。希望对你有帮助,请按照这个思路检查你自己的代码逻辑。

android1601 commented 7 years ago

已经显示连接成功并发现服务,获取服务以下是我添加的代码: private void setBleServiceListener() { mBleService.setOnServicesDiscoveredListener(new BleService.OnServicesDiscoveredListener() { @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { gattServiceList = gatt.getServices(); serviceList.clear(); for (BluetoothGattService service : gattServiceList) { String serviceUuid = service.getUuid().toString(); serviceList.add(MyGattAttributes.lookup(serviceUuid, "Unknown") + "\n" + serviceUuid); Log.i(TAG, MyGattAttributes.lookup(serviceUuid, "Unknown") + "\n" + serviceUuid);

                    mCharacteristics = service.getCharacteristics();

                    String[] charArra = new String[mCharacteristics.size()];
                    for (int i = 0; i < mCharacteristics.size(); i++) {
                        String charUuid = mCharacteristics.get(i).getUuid().toString();
                        charArra[i] = MyGattAttributes.lookup(charUuid, "Unknown") + "\n" + charUuid;

                    }
                    characteristicList.add(charArra);
                }
               mBleService.setCharacteristicNotification(mCharacteristics.get(0),true);//设置通知
                mHandler.sendEmptyMessage(SERVICE_SHOW);

            }
        }
    });

    mBleService.setOnReadRemoteRssiListener(new BleService.OnReadRemoteRssiListener() {
        @Override
        public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
            Log.i(TAG, "onReadRemoteRssi: rssi = " + rssi);
        }
    });

    //此处省略了单击事件处理  
    mBleService.readCharacteristic(mCharacteristics.get(0));//读取数据

    mBleService.writeCharacteristic(mCharacteristics.get(0),"hello");//写入数据
   //Ble数据回调
    mBleService.setOnDataAvailableListener(new BleService.OnDataAvailableListener() {
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            //处理特性读取返回的数据
            Log.i("TAG","onCharacteristicRead" + characteristic.getValue().toString());
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            //处理通知返回的数据
            Log.i("TAG","onCharacteristicChanged" + characteristic.getValue().toString());
        }

        @Override
        public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            Log.i("TAG","onDescriptorRead" + descriptor.getValue().toString());
        }
    });

}

但是还是不能读写成功,还望指正,谢谢。

junkchen commented 7 years ago

读写操作之间记得做延时,如之前提示你的那样

android1601 commented 7 years ago

嗯嗯,我已经在读写操作之间,开启新的线程开启延时了,不过貌似还是没有得到响应。还请大神指点

andy82302 commented 7 years ago

你好 我是用Google sample去改 請問一下,我有設通知(notification) BLE 每50ms傳值給我 我的oncharacteristicchange就會觸發 裡面再啟動broadcastreceiver 我在broadcastreceiver裡再做write 一開始都正常的寫入 加上我有等callback好了才再執行 所以沒有衝突 但是剛開始都寫入好好的 之後可能幾分鐘之後 就不寫入了 Callback status顯示133 你有遇過這個問題嗎? 感謝

Qzhanghuangyu commented 5 years ago

我也是读取不到设备返回的数据 请问题主解决了吗