没有从BLE设备接收数据

时间:2015-09-25 09:58:34

标签: java android bluetooth-lowenergy android-bluetooth

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

{'host1': ['Tomcat', 'MySQL'], 
 'host2' : ['Disk Space', 'Apache'],
}

这是我的logcat:

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;
}

1 个答案:

答案 0 :(得分:4)

您有一个mBluetoothLeService.readCharacteristic(btGattCharacteristic)来电但没有onCharacteristicRead(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status)来电来接收该值。它是BluetoothGattCallback的一部分。

我对这个过程的理解是,首先你可以通过BLE扫描找到BluetoothDevice这种或那种方式。你确定它,例如按名称(使用device.getName())或广告数据与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。

然后,您将使用gatt.readCharacteristic( service.getCharacteristic(CHARACTERISTIC_UUID))阅读该特征。然后,这会触发onCharacteristicRead(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status)回调。在这里,您将使用characteristic.getUuid()检查您收到的特征(因为事物是异步的),并使用characteristic.getStringValue(0)读取其String值或使用getFloatValue(0)读取Float值等,具体取决于数据类型

由于异步操作链,它可能会令人困惑。但是,here中的服务器和客户端都有很好的示例代码,更具体地说,客户端代码是in this file。它们与NewCircle的this excellent video about BLE on Android有关,它也解释了一些代码。

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