发送GATT属性客户端 - >服务器

时间:2016-10-10 09:07:55

标签: android bluetooth-lowenergy gatt

我正在尝试在Tablet和我的MCU之间建立一个连接,它通过GATT连接为BLE和发送/接收特性。 MCU是GATT服务器,平板电脑是我的GATT客户端。

到目前为止工作的是什么: 两个设备都相互连接。 我可以通过我的GATT服务器发送通知,以便我的GATT客户端正在读取onCharacterChanged中的选择特征,以便进一步完成任务。

但是我在将Gatt Client的特性写入服务器时有一些奇怪的行为。我通过onClick函数触发发送过程:

buttonOne.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        byte[] testByte = new byte[1];
        testByte[0] = 3;
        characteristic.setValue(testByte);
        bluetoothGatt.writeCharacteristic(characteristic);
        }
     });

到目前为止这是有效的(我在onClick之前填充了特征对象)。 现在我有另一个onClickListener来改变特征的值并再次发送它。

buttonTwo.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    byte[] testByte = new byte[1];
    testByte[0] = 7;
    characteristic.setValue(testByte);
    bluetoothGatt.writeCharacteristic(characteristic);
    }
 });

因此,一旦我在GATT服务器上的特征应该具有值3和一次7.这只能工作一次,直到我的连接丢弃并重新打开,然后我可以重新发送该特征。 writeCharacteristic来自BluetoothGatt类,如下所示:

public boolean writeCharacteristic(BluetoothGattCharacteristic characteristic) {
    if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) == 0
        && (characteristic.getProperties() &
            BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) == 0) return false;

    if (VDBG) Log.d(TAG, "writeCharacteristic() - uuid: " + characteristic.getUuid());
    if (mService == null || mClientIf == 0 || characteristic.getValue() == null) return false;

    BluetoothGattService service = characteristic.getService();
    if (service == null) return false;

    BluetoothDevice device = service.getDevice();
    if (device == null) return false;

    synchronized(mDeviceBusy) {
        if (mDeviceBusy) return false;
        mDeviceBusy = true;
    }

    try {
        mService.writeCharacteristic(mClientIf, device.getAddress(),
            service.getType(), service.getInstanceId(),
            new ParcelUuid(service.getUuid()), characteristic.getInstanceId(),
            new ParcelUuid(characteristic.getUuid()),
            characteristic.getWriteType(), AUTHENTICATION_NONE,
            characteristic.getValue());
    } catch (RemoteException e) {
        Log.e(TAG,"",e);
        mDeviceBusy = false;
        return false;
    }

    return true;
}

我发现这个过程陷入了

synchronized(mDeviceBusy) {
    if (mDeviceBusy) return false;
    mDeviceBusy = true;
}

但我不知道为什么到目前为止。有没有我应该设置告诉我的GATT服务器我将"重写"那个特点?我是否需要使用线程或其他东西并将其置于睡眠状态?

0 个答案:

没有答案