我又来了。
所以,长话短说:在我的应用程序中,我试图在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;
}
答案 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视频和示例项目......