问题
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;
}
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()
回答1:
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.
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)
.
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.
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.
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.
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...
来源:https://stackoverflow.com/questions/32779643/not-receiving-data-from-ble-device