当前位置: 首页 > 知识库问答 >
问题:

使用可读GATT特性

商辰钊
2023-03-14

我试图从蓝牙LE设备(心率手镯)读取GATT特征值。其规格如下:

服务

特点

我还没有弄明白如何“阅读”规范并将其“翻译”成代码。

我需要在我的应用程序上显示设备检测到的心跳。如何解读关贸总协定的价值观?请提供一个代码示例:)

遵循我的实际源代码。

设置BLUETOOT连接

    private BluetoothAdapter mBluetoothAdapter;
    private BluetoothGatt mBluetoothGatt;
    private Handler mHandler;

    private static final int REQUEST_ENABLE_BT = 1;
    private static final long SCAN_PERIOD = 10000;

    // ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bluetooth);
        mHandler = new Handler();

        // BLE is supported?
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "Bluetooth Low Energy non supportato", Toast.LENGTH_SHORT).show();
            finish();
        }

        final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();

        // Bluetooth is supported?
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth non supportato", Toast.LENGTH_SHORT).show();
            finish();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        // Bluetooth is enabled?
        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }

        scanLeDevice(true);
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
            scanLeDevice(false);
        }
    }

发现BLE设备并与心率监测器连接

    // Device scan callback.
    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {
                @Override
                public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "Name: " + device.getName() + " (" + device.getAddress() + ")");
                            String deviceAddress = device.getAddress();
                            if (deviceAddress.equals("C0:19:37:54:9F:30")) {
                                connectToDevice(device);
                            }
                        }
                    });
                }
            };

    public void connectToDevice(BluetoothDevice device) {
        if (mBluetoothGatt == null) {
            Log.i(TAG, "Attempting to connect to device " + device.getName() + " (" + device.getAddress() + ")");
            mBluetoothGatt = device.connectGatt(this, true, gattCallback);
            scanLeDevice(false);// will stop after first device detection
        }
    }

    private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            Log.i(TAG, "Status: " + status);
            switch (newState) {
                case BluetoothProfile.STATE_CONNECTED:
                    Log.i(TAG, "STATE_CONNECTED");
                    //BluetoothDevice device = gatt.getDevice(); // Get device
                    gatt.discoverServices();
                    break;
                case BluetoothProfile.STATE_DISCONNECTED:
                    Log.e(TAG, "STATE_DISCONNECTED");
                    break;
                default:
                    Log.e(TAG, "STATE_OTHER");
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            List<BluetoothGattService> services = gatt.getServices();
            Log.i(TAG, "Services: " + services.toString());

            BluetoothGattCharacteristic bpm = services.get(2).getCharacteristics().get(0);
            gatt.readCharacteristic(services.get(0).getCharacteristics().get(0));
        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            // my attempt to read and print characteristics
            byte[] charValue = characteristic.getValue();
            byte flag = charValue[0];
            Log.i(TAG, "Characteristic: " + flag);
            //gatt.disconnect();
        }
    };

共有1个答案

琴镜
2023-03-14

试着在内部使用这个gattCallback

        @Override
        public synchronized void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {


            final byte[] dataInput = characteristic.getValue();

}

编辑

我想你会收到一个字节的听力数据,用这个函数得到int值:

public int unsignedByteToInt(byte b) {
    return b & 0xFF;
}

并在onCharacteristicChanged()中调用它:

final byte[] dataInput = characteristic.getValue();
int hearRate = unsignedByteToInt(dataInput);

编辑2

为心率创建通知侦听器:

public void setHeartRateNotification(boolean enable){

    String uuidHRCharacteristic = "YOUR CHARACTERISTIC";

    BluetoothGattService mBluetoothLeService = null;
    BluetoothGattCharacteristic mBluetoothGattCharacteristic = null;

    for (BluetoothGattService service : mBluetoothGatt.getServices()) {
        if ((service == null) || (service.getUuid() == null)) {

            continue;
        }
        if (uuidAccelService.equalsIgnoreCase(service.getUuid().toString())) {

            mBluetoothLeService = service;
        }
    }

    if(mBluetoothLeService!=null) {
        mBluetoothGattCharacteristic =
                mBluetoothLeService.getCharacteristic(UUID.fromString(uuidHRCharacteristic));
    }
    else{
        Log.i("Test","mBluetoothLeService is null");
    }

    if(mBluetoothGattCharacteristic!=null) {

        setCharacteristicNotification(mBluetoothGattCharacteristic, enable);

        Log.i("Test","setCharacteristicNotification:"+true);
    }
    else{
        Log.i("Test","mBluetoothGattCharacteristic is null");
    }


}

并将其设置为在服务中发现gattCallback:

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {

    Log.i("Test", "onServicesDiscovered received: " + status);

    setHeartRateNotification(true);

}
 类似资料:
  • 我试图在我的应用程序中读取一些蓝牙特性。现在我有一个问题,在我的Gatt服务器特性改变后该怎么办。起初,我试图使用一个线程来重新触发读取特性,一次又一次,就像这样: 但问题是,数据似乎在某一点上被破坏(就像我总是从我的MCU端将相同的数据写入特征)。 允许读取像这样的可读取数据吗?有没有什么建议的方法可以一直读取可读取的数据?还是在我的应用程序端更新? 如果你需要任何额外的代码,请告诉我。

  • 我试图读取一个特点后,关贸总协定连接和服务发现成功。但接收错误15(0x0f,GATT_INSUFFICIENT_ENCRYPTION),然后137(0x0089)在gatt回调。在此错误之后,gatt立即断开连接。 我的设备是三星S4,4.4.2。

  • Gatt 是一个 Go 语言包,用来构建低功耗蓝牙外设。 具有以下功能: 作为外设——可以用于创建服务,接收信息,处理请求。 作为处理中心——可以用于扫描,连接,发现服务,并作出反映。

  • 我一直在尝试通过葡萄糖服务从一个可编程设备读取葡萄糖测量记录。我能够成功地连接到设备并读取新记录,但当我请求以前记录的列表时,我会收到状态为129的回调(“GATT_INTERNAL_ERROR”)。之后不会发生其他回调,最终传输超时。 据我所知,要检索记录,我需要向记录访问控制点特性写入请求。收到请求后,设备应通过吐出请求的记录来响应。 我的请求代码如下: 其中{0x01,0x01}枚举对应于{

  • 我有一个Android应用程序,我正在开发。这是一个BTLE应用程序,我有一些BTLE标签,我需要谈谈。 我是按照书做的,发现设备,GATT连接(后续连接),写/读特性。。。它起作用了。 现在奇怪的是,如果我关闭并打开应用程序两次,它就会停止工作。 假设我已经有一个标签正确连接,粘合和正常工作。 手机重启。第一次打开应用程序- 在日志中,每次尝试都没有什么不同。我记录每个调用并打印返回状态:没有区

  • 在我的设备配置中,gatt。在xml中,我添加了一个带有自定义UUID的自定义GATT特性,并启用了读写属性。配对后使用windows Bluetooth API,当我尝试读取GATT特性时,它工作正常,但写入GATT特性不起作用。我一直被拒绝访问,只有一个例外。下面我添加了gatt样本。xml、bgs和C#代码。我使用的是Bluegiga v1。3.1_API。当前的设置可以与USB加密狗配合使