java - 如何在单击按钮时将数据写入特征?

标签 java android bluetooth bluetooth-lowenergy

我正在制作一个使用 BLE 的安卓应用。我正在尝试在单击按钮时将数据写入特征,但无法做到这一点。

我有一项服务具有两个特征,在这两个特征中,我在点击按钮时写入数据。

我在其中定义了 writeDatatoCharacteristic 的 Ble 类

/* set new value for particular characteristic */
public void writeDataToCharacteristic(final BluetoothGattCharacteristic ch, final byte[] value) {

    if (mBluetoothAdapter == null || mBluetoothGatt == null || ch == null) {
        return;
    }

    // first set it locally....
    ch.setValue(value);


    // ... and then "commit" changes to the peripheral
    mBluetoothGatt.writeCharacteristic(ch);
}

按钮的 xml 文件

 <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageButtonPlay"
        android:src="@drawable/play"
        android:background="@android:color/transparent"
        android:layout_alignTop="@+id/ivRestart"
        android:layout_centerHorizontal="true"
        android:onClick="onClickWrite"/>

我调用写入数据到特征函数的主 Activity

public class Tens_modes extends AppCompatActivity {

private final String LOGTAG = "BLETEST";
private final String TARGET = "CC2650 SensorTag";
private BleWrapper mBleWrapper = null;
private mSensorState mState;
private String gattList = "";
private TextView mTv;

private enum mSensorState {IDLE, ACC_ENABLE, ACC_READ};

public final static UUID
        UUID_ACC_SERV = fromString("FFE0"),
        UUID_ACC_DATA = fromString("f000aa11-0451-4000-b000-000000000000"),
        UUID_ACC_CONF = fromString("FFE9"), // 0: disable, 1: enable
        UUID_ACC_PERI = fromString("f000aa13-0451-4000-b000-000000000000"); // Period in tens of milliseconds




private ImageButton play;
private ImageButton pause;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tens_modes);

    play = (ImageButton)findViewById(R.id.imageButtonPlay);
    pause = (ImageButton)findViewById(R.id.imageButtonPause);


    play.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            play.setVisibility(View.INVISIBLE);
            pause.setVisibility(View.VISIBLE);

    pause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pause.setVisibility(View.INVISIBLE);
            play.setVisibility(View.VISIBLE);


    //Ble stuff

    mBleWrapper = new BleWrapper(this, new BleWrapperUiCallbacks.Null()
    {

        @Override
        public void uiDeviceFound(final BluetoothDevice device, final int rssi, final byte[] record)
        {

            Log.d(LOGTAG, "uiDeviceFound: " + device.getName() + ", " + rssi + ", " + record.toString());
            if (device.getName().equals(TARGET))
            {
                if (!mBleWrapper.connect(device.getAddress()))
                {
                    Log.d(LOGTAG, "uiDeviceFound: Problem connecting to remote device.");
                }
            }
            //stopScan();
        }
        @Override
        public void uiDeviceConnected(BluetoothGatt gatt, BluetoothDevice device)
        {
            Log.d(LOGTAG, "uiDeviceConnected: State = " + mBleWrapper.getAdapter().getState());

        }

        @Override
        public void uiDeviceDisconnected(BluetoothGatt gatt, BluetoothDevice device) {
            Log.d(LOGTAG, "uiDeviceDisconnected: State = " + mBleWrapper.getAdapter().getState());
        }

        @Override
        public void uiAvailableServices(BluetoothGatt gatt, BluetoothDevice device, List<BluetoothGattService> services)
        {
            BluetoothGattCharacteristic c;
            BluetoothGattDescriptor d;

            for (BluetoothGattService service : services)
            {
                String serviceName = BleNamesResolver.resolveUuid(service.getUuid().toString());
                Log.e(LOGTAG, serviceName);
                gattList += serviceName + "\n";

                mBleWrapper.getCharacteristicsForService(service);
            }

            // enable services
            Log.e(LOGTAG, "uiAvailableServices: Enabling services");
            c = gatt.getService(UUID_ACC_SERV).getCharacteristic(UUID_ACC_CONF);

            mBleWrapper.writeDataToCharacteristic(c, new byte[] {0300000000AA});

            //mState = mSensorState.ACC_ENABLE;



            // set notification on characteristic
            //Log.d(LOGTAG, "uiAvailableServices: Setting notification");
            //c = gatt.getService(UUID_IRT_SERV).getCharacteristic(UUID_IRT_DATA);
            //mBleWrapper.setNotificationForCharacteristic(c, true);

            // enable notification on descriptor
            //d = c.getDescriptor(UUID_CCC_DESC);
            //d.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            //gatt.writeDescriptor(d);
        }

        @Override
        public void uiCharacteristicForService( BluetoothGatt gatt,
                                                   BluetoothDevice device,
                                                   BluetoothGattService service,
                                                   List<BluetoothGattCharacteristic> chars)
        {
            super.uiCharacteristicForService(gatt, device, service, chars);
            for (BluetoothGattCharacteristic c : chars)
            {
                String charName = BleNamesResolver.resolveCharacteristicName(c.getUuid().toString());
                Log.d(LOGTAG, charName);
                gattList += "Characteristic: " + charName + "\n";
            }
        }


        @Override
        public void uiSuccessfulWrite(  BluetoothGatt gatt,
                                          BluetoothDevice device,
                                          BluetoothGattService service,
                                          BluetoothGattCharacteristic ch,
                                          String description)
        {
            BluetoothGattCharacteristic c;

            super.uiSuccessfulWrite(gatt, device, service, ch, description);
            Log.d(LOGTAG, "uiSuccessfulWrite");

            switch (mState)
            {
                case ACC_ENABLE:
                    Log.d(LOGTAG, "uiSuccessfulWrite: Reading acc");
                    c = gatt.getService(UUID_ACC_SERV).getCharacteristic(UUID_ACC_DATA);
                    mBleWrapper.requestCharacteristicValue(c);
                    mState = mSensorState.ACC_READ;
                    break;

                case ACC_READ:
                    Log.d(LOGTAG, "uiSuccessfulWrite: state = ACC_READ");
                    break;

                default:
                    break;
            }
        }

        @Override
        public void uiFailedWrite(  BluetoothGatt gatt,
                                      BluetoothDevice device,
                                      BluetoothGattService service,
                                      BluetoothGattCharacteristic ch,
                                      String description)
        {
            super.uiFailedWrite(gatt, device, service, ch, description);
            Log.d(LOGTAG, "uiFailedWrite");
        }

        @Override
        public void uiNewValueForCharacteristic(BluetoothGatt gatt,
                                                BluetoothDevice device,
                                                BluetoothGattService service,
                                                BluetoothGattCharacteristic ch,
                                                String strValue,
                                                int intValue,
                                                byte[] rawValue,
                                                String timestamp)
        {
            super.uiNewValueForCharacteristic(gatt, device, service, ch, strValue, intValue, rawValue, timestamp);
            Log.d(LOGTAG, "uiNewValueForCharacteristic");
            for (byte b:rawValue)
            {
                Log.d(LOGTAG, "Val: " + b);
            }
        }

        @Override
        public void uiGotNotification(  BluetoothGatt gatt,
                                          BluetoothDevice device,
                                          BluetoothGattService service,
                                          BluetoothGattCharacteristic characteristic)
        {
            super.uiGotNotification(gatt, device, service, characteristic);
            String ch = BleNamesResolver.resolveCharacteristicName(characteristic.getUuid().toString());

            Log.d(LOGTAG,  "uiGotNotification: " + ch);
        }
    });

}

public void onClickWrite(View v){
    if(mBleWrapper != null) {
        // enable services
            Log.e(LOGTAG, "uiAvailableServices: Enabling services");
            byte[] value = new byte[1];
            value[0] = (byte)21;
            mBleWrapper.writeDataToCharacteristic(UUID_ACC_CONF, new byte[] {0300000000AA});

    }
}

我想将 0300000000AA 写为特征值,但不知道该怎么做。从过去 4.5 小时开始搜索它,但没有得到任何有用的信息

如果有人可以帮助我,请告诉我我做错了什么 谢谢

最佳答案

这应该可以为您完成。 (开始吧,我不确定编码)

byte[] temp;
//This will at least compile, however I don't know if that is what you want, strings in java are unicode, not ascii. you might have to convert to your desired encoding
temp = "0300000000AA".getBytes();
mBleWrapper.writeDataToCharacteristic(UUID_ACC_CONF, temp );

关于java - 如何在单击按钮时将数据写入特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34564516/

相关文章:

java - 如何高效地为 MT20x 消息制作 Wrapper

java - JTree 影响 JLabel

android - 如何使用 ActionBar Sherlock 设置选项卡样式

java - 所有安卓设备都有文件夹 "sdcard"吗?

android - 写java代码时的SIGSEGV

algorithm - 返回输入范围固定值的函数/算法

java - 如何更改 hpi :run 的端口号

java - 批量更新 Oracle 中的表

android - 改造解析 JSON 动态键

安卓蓝牙文件发送