美文网首页首页投稿(暂停使用,暂停投稿)BluetoothAndroid知识
Android BLE低功耗蓝牙开发极简系列(二)之读写操作

Android BLE低功耗蓝牙开发极简系列(二)之读写操作

作者: 木子饼干 | 来源:发表于2017-09-06 09:50 被阅读0次

    这是Ble极简系列的第二篇文章,上一篇Android BLE低功耗蓝牙开发极简系列(一)之扫描与连接主要是扫描连接,这一篇主要是读写操作。

    发现服务

    在连接成功后,可以通过Gatt进行discoverServices()。

         if (newState == BluetoothProfile.STATE_CONNECTED) {//当蓝牙设备已经连接
      //获取ble设备上面的服务
              Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
                Log.i("haha", "Attempting to start service discovery:" +
                        mBluetoothGatt.discoverServices());
                Log.d("haha", "onConnectionStateChange: " + "连接成功")
            }
    

    在mGattCallback 回调添加Servicest的相关回调

      //发现服务回调。
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            Log.d("haha", "onServicesDiscovered: " + "发现服务 : " + status);
            if (status == BluetoothGatt.GATT_SUCCESS) {
                     //成功
                }
            }
    

    读写开关

    当返回的status == BluetoothGatt.GATT_SUCCESS时,进行读写以及通知相关的操作, 调用writeDescriptor(),注意设置setValue为ENABLE_INDICATION_VALUE,否则可能后续读取不到数据。

            if (status == BluetoothGatt.GATT_SUCCESS) {
                     //成功
                 isServiceConnected = true;
    
                boolean serviceFound;
                Log.d("haha", "onServicesDiscovered: " + "发现服务 : " + status)
    
                if (mBluetoothGatt != null && isServiceConnected) {
    
                    BluetoothGattService gattService = mBluetoothGatt.getService(UUID_SERVICE);
                    BluetoothGattCharacteristic characteristic = gattService.getCharacteristic(UUID_NOTIFICATION);
                    boolean b = mBluetoothGatt.setCharacteristicNotification(characteristic, true);
                    if (b) {
    
                        List<BluetoothGattDescriptor> descriptors = characteristic.getDescriptors();
                        for (BluetoothGattDescriptor descriptor : descriptors) {
    
                            boolean b1 = descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
                            if (b1) {
                                mBluetoothGatt.writeDescriptor(descriptor);
                                Log.d(TAG, "startRead: " + "监听收数据");
                            }
    
                        }
    
                    }
                }
    

    设置成功,会在onDescriptorWrite方法进行回调,注意UUID_SERVICE,UUID_NOTIFICATION特征值UUID,可以询问公司固件端的开发人员,和开发人员配合修改。

         @Override
        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            super.onDescriptorWrite(gatt, descriptor, status);
            Log.d(TAG, "onDescriptorWrite: " + "设置成功");
        }
    

    发送数据

     public void startSend(View view) {
        if (mBluetoothGatt != null && isServiceConnected) {
            BluetoothGattService gattService = mBluetoothGatt.getService(UUID_SERVICE);
            BluetoothGattCharacteristic characteristic = gattService.getCharacteristic(UUID_WRITE);
            byte[] bytes = new byte[2];
            bytes[0] = 04;
            bytes[1] = 01;
            characteristic.setValue(bytes);
            characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
            mBluetoothGatt.writeCharacteristic(characteristic);
        }
    
    }
    

    读取数据

    读取数据在onCharacteristicChanged方法中,注意进制间的转换。

        @Override
        public final void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
            byte[] value = characteristic.getValue();
            Log.d(TAG, "onCharacteristicChanged: " + value);
            String s0 = Integer.toHexString(value[0] & 0xFF);
            String s = Integer.toHexString(value[1] & 0xFF);
            Log.d(TAG, "onCharacteristicChanged: " + s0 + "、" + s);
            for (byte b : value) {
                Log.d(TAG, "onCharacteristicChanged: " + b);
            }
    
        }
    

    断开操作

      if (mBluetoothGatt != null) {
    
            mBluetoothGatt.close();
        }
    

    注意事项

    一定要进行读写开关操作,注意descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE),否则可能读取不到数据。

    Github

    喜欢可以关注博主BleDemo

    相关文章

      网友评论

        本文标题:Android BLE低功耗蓝牙开发极简系列(二)之读写操作

        本文链接:https://www.haomeiwen.com/subject/zzsmjxtx.html