没有从BLE设备接收数据 [英] Not receiving data from BLE device

查看:244
本文介绍了没有从BLE设备接收数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我又来了。

所以,长话短说:在我的应用程序中,我正试图从我的BLE设备接收数据(tickr心率监测器:那个)借助Android示例()。
但是......我没有从我的设备接收数据!我能够获得特征和描述符,但......仅此而已。我只是.. 错过了点
这是我的代码:

I'm here again.
So, long story short: in my app I'm trying to receive datas from my BLE device (tickr heart rate monitor: that) with the help of Android Samples (that).
But... I'm not receiving datas from my device! I'm able to get the Characteristics and the Descriptor, but... nothing more. I simply.. miss the point. Here's my code:

private BluetoothLeService mBluetoothLeService;
private ArrayList<BluetoothGattCharacteristic> mGattCharacteristics =
        new ArrayList<BluetoothGattCharacteristic>();
private BluetoothGattCharacteristic mNotifyCharacteristic;
public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";
private static final int CONNECTED_ID = 1;
private String mDeviceName;
private String mDeviceAddress;
private boolean mConnected = false;
BluetoothGatt btGatt;
BluetoothGattCharacteristic btGattCharacteristic;
 private List<BluetoothGattCharacteristic> gattCharacteristics = new ArrayList<BluetoothGattCharacteristic>();
    @InjectView(R.id.hrate) public TextView hRate;
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
            Log.i(TAG, "gatt connected");
            mConnected = true;
        } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
            mConnected = false;
            Log.i(TAG, "gatt disconnected");
            hRate.setText("0");
        } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            Log.i(TAG, "service discovered");
            returnServices(mBluetoothLeService.getSupportedGattServices());
        } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
            Log.i(TAG, "data available");
            displayHR(intent.getExtras().getString(BluetoothLeService.EXTRA_DATA));
        }
    }
};

private final ServiceConnection mServiceConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName componentName, IBinder service) {
        mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
        if (!mBluetoothLeService.initialize()) {
            Log.e(TAG, "Unable to initialize Bluetooth");
            onDestroy();
        }
        // Automatically connects to the device upon successful start-up initialization.
        mBluetoothLeService.connect(mDeviceAddress);
        Log.i("", "i'm connected");
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        mBluetoothLeService = null;
    }
};

@OnClick({R.id.button_start, R.id.button_pause, R.id.button_stop})
public void OnSession(View view) {

    switch (view.getId()) {

        case R.id.button_start:
            if(first) {
                first=false;
                onBLE();
            }
            else {
                startRun();
                if (mBluetoothLeService != null) {
                    getActivity().registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
                    final boolean result = mBluetoothLeService.connect(mDeviceAddress);
                    Log.d(TAG, "Connect request result=" + result);
                }
            }
            break;
}
public Dialog onBLE(){
    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(getActivity());
    builder.setMessage("Vuoi utilizzare un device?")
            .setCancelable(false)
            .setPositiveButton("Sì", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    Intent intent = new Intent(getActivity(), BluetoothActivity.class);
                    startActivityForResult(new Intent(intent), CONNECTED_ID);
                    dialog.cancel();
                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    hRate.setText("N.D.");
                    startRun();
                    dialog.cancel();
                }
            });
    android.app.AlertDialog ble = builder.create();
    ble.show();
    return null;
}

public void startRun(){
    timeAtStart = SystemClock.uptimeMillis();
    customHandler.postDelayed(updated, 0);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CONNECTED_ID){
        if (resultCode == Activity.RESULT_OK) {
            mDeviceName = data.getExtras().getString(EXTRAS_DEVICE_NAME);
            mDeviceAddress = data.getExtras().getString(EXTRAS_DEVICE_ADDRESS);
            Log.i("", mDeviceAddress+" "+mDeviceName);
            connect();
            startRun();
        }

    }
}
public void connect(){
    Intent gattServiceIntent = new Intent(getActivity(), BluetoothLeService.class);
    getActivity().bindService(gattServiceIntent, mServiceConnection, getActivity().BIND_AUTO_CREATE);
}
public void displayHR(String arg){
    if(arg != null){
        hRate.setText(arg);
    }
}
private void returnServices(List<BluetoothGattService> gattServices) {
    if (gattServices == null) return;

    for (BluetoothGattService service : gattServices) {
        gattCharacteristics=service.getCharacteristics();
        for (BluetoothGattCharacteristic characteristic : service.getCharacteristics()) {
            if (characteristic.getUuid().toString().compareTo(SampleGattAttributes.HEART_RATE_MEASUREMENT) == 0)
                btGattCharacteristic = characteristic;

        }
    }
    if ((btGattCharacteristic.getProperties() | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
        if (mNotifyCharacteristic != null) {
            mBluetoothLeService.setCharacteristicNotification(mNotifyCharacteristic, false);
            mNotifyCharacteristic = null;
        }
        mBluetoothLeService.readCharacteristic(btGattCharacteristic);
    }

    if ((btGattCharacteristic.getProperties() | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
        mNotifyCharacteristic = btGattCharacteristic;
        mBluetoothLeService.setCharacteristicNotification(btGattCharacteristic, true);

    }
}

private static IntentFilter makeGattUpdateIntentFilter() {
    final IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
    intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
    intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
    intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
    return intentFilter;
}

这是我的logcat:

here's my logcat:

09-25 11:38:05.975  25709-25709/apheniti.prova D/BluetoothAdapter﹕ startLeScan(): null
09-25 11:38:06.092  25709-25709/apheniti.prova D/dalvikvm﹕ GC_FOR_ALLOC freed 235K, 3% free 9444K/9716K, paused 18ms, total 18ms
09-25 11:38:06.147  25709-25722/apheniti.prova D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=4
09-25 11:38:07.194  25709-25722/apheniti.prova D/BluetoothAdapter﹕ onScanResult() - Device=DA:E1:DD:95:BB:D4 RSSI=-61
09-25 11:38:07.842  25709-25709/apheniti.prova D/BluetoothAdapter﹕ stopLeScan()
09-25 11:38:07.921  25709-25709/apheniti.prova I/﹕ DA:E1:DD:95:BB:D4 TICKR
09-25 11:38:08.006  25709-25709/apheniti.prova D/BluetoothGatt﹕ connect() - device: DA:E1:DD:95:BB:D4, auto: false
09-25 11:38:08.006  25709-25709/apheniti.prova D/BluetoothGatt﹕ registerApp()
09-25 11:38:08.006  25709-25709/apheniti.prova D/BluetoothGatt﹕ registerApp() - UUID=e8dfe101-58d1-4c04-bc3b-f1983e19b468
09-25 11:38:08.014  25709-25723/apheniti.prova D/BluetoothGatt﹕ onClientRegistered() - status=0 clientIf=4
09-25 11:38:08.014  25709-25709/apheniti.prova D/BluetoothLeService﹕ Trying to create a new connection.
09-25 11:38:08.014  25709-25709/apheniti.prova I/﹕ i'm connected
09-25 11:38:08.483  25709-25723/apheniti.prova D/BluetoothGatt﹕ onClientConnectionState() - status=0 clientIf=4 device=DA:E1:DD:95:BB:D4
09-25 11:38:08.491  25709-25723/apheniti.prova I/BluetoothLeService﹕ Connected to GATT server.
09-25 11:38:08.491  25709-25723/apheniti.prova D/BluetoothGatt﹕ discoverServices() - device: DA:E1:DD:95:BB:D4
09-25 11:38:08.491  25709-25723/apheniti.prova I/BluetoothLeService﹕ Attempting to start service discovery:true
09-25 11:38:08.491  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=00001800-0000-1000-8000-00805f9b34fb
09-25 11:38:08.499  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=00001801-0000-1000-8000-00805f9b34fb
09-25 11:38:08.499  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=0000180d-0000-1000-8000-00805f9b34fb
09-25 11:38:08.499  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=0000180f-0000-1000-8000-00805f9b34fb
09-25 11:38:08.506  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=0000180a-0000-1000-8000-00805f9b34fb
09-25 11:38:08.506  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=a026ee01-0a7d-4ab3-97fa-f1500f9feb8b
09-25 11:38:08.506  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetService() - Device=DA:E1:DD:95:BB:D4 UUID=a026ee03-0a7d-4ab3-97fa-f1500f9feb8b
09-25 11:38:08.506  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a00-0000-1000-8000-00805f9b34fb
09-25 11:38:08.514  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a01-0000-1000-8000-00805f9b34fb
09-25 11:38:08.514  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a04-0000-1000-8000-00805f9b34fb
09-25 11:38:08.530  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a05-0000-1000-8000-00805f9b34fb
09-25 11:38:08.530  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a37-0000-1000-8000-00805f9b34fb
09-25 11:38:08.538  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a38-0000-1000-8000-00805f9b34fb
09-25 11:38:08.546  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a19-0000-1000-8000-00805f9b34fb
09-25 11:38:08.546  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a29-0000-1000-8000-00805f9b34fb
09-25 11:38:08.546  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a27-0000-1000-8000-00805f9b34fb
09-25 11:38:08.553  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=00002a26-0000-1000-8000-00805f9b34fb
09-25 11:38:08.561  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=a026e002-0a7d-4ab3-97fa-f1500f9feb8b
09-25 11:38:08.561  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=a026e004-0a7d-4ab3-97fa-f1500f9feb8b
09-25 11:38:08.561  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetCharacteristic() - Device=DA:E1:DD:95:BB:D4 UUID=a026e00a-0a7d-4ab3-97fa-f1500f9feb8b
09-25 11:38:08.569  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetDescriptor() - Device=DA:E1:DD:95:BB:D4 UUID=00002902-0000-1000-8000-00805f9b34fb
09-25 11:38:08.569  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetDescriptor() - Device=DA:E1:DD:95:BB:D4 UUID=00002902-0000-1000-8000-00805f9b34fb
09-25 11:38:08.577  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetDescriptor() - Device=DA:E1:DD:95:BB:D4 UUID=00002902-0000-1000-8000-00805f9b34fb
09-25 11:38:08.585  25709-25722/apheniti.prova D/BluetoothGatt﹕ onGetDescriptor() - Device=DA:E1:DD:95:BB:D4 UUID=00002902-0000-1000-8000-00805f9b34fb
09-25 11:38:08.585  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetDescriptor() - Device=DA:E1:DD:95:BB:D4 UUID=00002902-0000-1000-8000-00805f9b34fb
09-25 11:38:08.600  25709-25723/apheniti.prova D/BluetoothGatt﹕ onGetDescriptor() - Device=DA:E1:DD:95:BB:D4 UUID=00002902-0000-1000-8000-00805f9b34fb
09-25 11:38:08.600  25709-25722/apheniti.prova D/BluetoothGatt﹕ onSearchComplete() = Device=DA:E1:DD:95:BB:D4 Status=0
09-25 11:38:09.624  25709-25709/apheniti.prova D/dalvikvm﹕ GC_FOR_ALLOC freed 441K, 5% free 9514K/9992K, paused 26ms, total 27ms
09-25 11:38:11.944  25709-25709/apheniti.prova D/dalvikvm﹕ GC_FOR_ALLOC freed 485K, 6% free 9542K/10064K, paused 18ms, total 18ms
09-25 11:38:14.772  25709-25709/apheniti.prova D/dalvikvm﹕ GC_FOR_ALLOC freed 490K, 6% free 9566K/10092K, paused 18ms, total 19ms
09-25 11:38:15.991  25709-25709/apheniti.prova D/BluetoothAdapter﹕ stopLeScan()


推荐答案

你有一个 mBluetoothLeService.readCharacteristic (btGattCharacteristic)调用但没有 onCharacteristicRead(BluetoothGatt gatt,最终BluetoothGattCharacteristic特性,int状态)回调以接收该值。它是 BluetoothGattCallback 的一部分。

You have a mBluetoothLeService.readCharacteristic(btGattCharacteristic) call but no onCharacteristicRead(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status) callback to receive the value. It's part of a BluetoothGattCallback.

我对这个过程的理解是,首先你会发现 BluetoothDevice 这种或那种 - 可能是通过BLE扫描。你确定它,例如按名称(使用 device.getName())或广告数据连接到 device.connectGatt(context,false / true, gattCallback)

My understanding of the process is that first you find a BluetoothDevice one way or another -- probably by a BLE scan. You identify it e.g. by its name (with device.getName()) or by the advertising data and connect to it with device.connectGatt(context, false/true, gattCallback).

然后在您的回调中,您将在 onConnectionStateChange(BluetoothGatt gatt,int status,int newState)中收到连接状态。如果状态是 BluetoothProfile.STATE_CONNECTED ,您可以使用 gatt.discoverServices()发现服务。这将触发 onServicesDiscovered(BluetoothGatt gatt,int status),您将通过获取可用服务gatt.getServices()并通过其UUID识别正确的服务,并通过 service.getCharacteristics()获取其特征,并再次通过其UUID识别正确的特征。

Then in your callback you receive the connection status in onConnectionStateChange(BluetoothGatt gatt, int status, int newState). If the state is BluetoothProfile.STATE_CONNECTED you can discover the services with gatt.discoverServices(). This will trigger onServicesDiscovered(BluetoothGatt gatt, int status) where you'll get the available services by gatt.getServices() and identify the correct service by its UUID and get its characteristics by service.getCharacteristics() and again identify the correct characteristic by its UUID.

然后,您将使用 gatt.readCharacteristic(service.getCharacteristic(CHARACTERISTIC_UUID))读取特征。然后,这会触发 onCharacteristicRead(BluetoothGatt gatt,最终的BluetoothGattCharacteristic特性,int状态)回调。在这里,您将使用 characteristic.getUuid()检查您收到的特征(因为它是异步的),并使用 characteristic.getStringValue读取其String值( 0)或浮点值与 getFloatValue(0)等,具体取决于数据类型。

You will then read the characteristic with gatt.readCharacteristic( service.getCharacteristic(CHARACTERISTIC_UUID)). This then triggers the onCharacteristicRead(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status) callback. Here you'll check which characteristic you received (as things are asynchonous) with characteristic.getUuid() and read its String value with characteristic.getStringValue(0) or Float value with getFloatValue(0) etc. depending on the data type.

由于异步操作链,它可能会令人困惑。但是,此处中的服务器和客户端都有很好的示例代码,更具体地说是客户端代码是在此文件中。它们与NewCircle的关于Android上BLE的优秀视频有关,该视频也解释了代码一点点。

It can be confusing because of the chain of asynchronous operations. However there's nice sample code for both the server and the client in here and more specifically the client code is in this file. They are related to this excellent video about BLE on Android by NewCircle which also explains the code a little bit.

您所指的Android示例可能有点令人困惑,因为它还涉及活动/服务交互,而不仅仅是蓝牙LE。最好还是看看NewCircle视频和示例项目......

The Android sample you are referring to might be a bit confusing as it also involves Activity/Service interaction and isn't purely about Bluetooth LE. Better to have a look the NewCircle video and sample project perhaps...

这篇关于没有从BLE设备接收数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆