java - 未找到自定义 BLE 服务,mBluetoothGatt.getService(uuid) 返回 null

标签 java android bluetooth-lowenergy

我正在尝试从/向 BLE 模块读写 (HF-BL100-CU)使用 this guide但是当我尝试获取服务时它返回 NULL:

这里:

 BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("00002b11-0000-1000-8000-00805f9b34fb"));
        if(mCustomService == null){
            Log.w(TAG, "Custom BLE Service not found on write");
            return;
        }

这里:

 BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("00002b10-0000-1000-8000-00805f9b34fb"));
        if(mCustomService == null){
            Log.w(TAG, "Custom BLE Service not found on read");
            return;
        }

有人建议here之前应该有一个完整的服务发现,但我很确定我已经这样做了,我可能是错的,因为我是 BLE 的新手并且仍在尝试掌握其协议(protocol)(已发现服务的输出日志添加在结束)。

从数据表和 BLE 应用程序中,用于读/写的 UUID 是 - 读:2B10,写:2B11

任何帮助将不胜感激。

蓝牙服务.java:

package com.example.android.bluetoothlegatt;

import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattDescriptor;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import java.util.List;
import java.util.UUID;

/**
 * Service for managing connection and data communication with a GATT server hosted on a
 * given Bluetooth LE device.
 */
public class BluetoothLeService extends Service {
    private final static String TAG = BluetoothLeService.class.getSimpleName();

    private BluetoothManager mBluetoothManager;
    private BluetoothAdapter mBluetoothAdapter;
    private String mBluetoothDeviceAddress;
    private BluetoothGatt mBluetoothGatt;
    private int mConnectionState = STATE_DISCONNECTED;

    private static final int STATE_DISCONNECTED = 0;
    private static final int STATE_CONNECTING = 1;
    private static final int STATE_CONNECTED = 2;

    public final static String ACTION_GATT_CONNECTED =
            "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
    public final static String ACTION_GATT_DISCONNECTED =
            "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
    public final static String ACTION_GATT_SERVICES_DISCOVERED =
            "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
    public final static String ACTION_DATA_AVAILABLE =
            "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
    public final static String EXTRA_DATA =
            "com.example.bluetooth.le.EXTRA_DATA";

    public final static UUID UUID_HEART_RATE_MEASUREMENT =
            UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);

    // Implements callback methods for GATT events that the app cares about.  For example,
    // connection change and services discovered.
    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                intentAction = ACTION_GATT_CONNECTED;
                mConnectionState = STATE_CONNECTED;
                broadcastUpdate(intentAction);
                Log.i(TAG, "Connected to GATT server.");
                // Attempts to discover services after successful connection.
                Log.i(TAG, "Attempting to start service discovery:" +
                        mBluetoothGatt.discoverServices());

            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                intentAction = ACTION_GATT_DISCONNECTED;
                mConnectionState = STATE_DISCONNECTED;
                Log.i(TAG, "Disconnected from GATT server.");
                broadcastUpdate(intentAction);
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            } else {
                Log.w(TAG, "onServicesDiscovered received: " + status);
            }
        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic characteristic,
                                         int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
            }
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }
    };

    private void broadcastUpdate(final String action) {
        final Intent intent = new Intent(action);
        sendBroadcast(intent);
    }

    private void broadcastUpdate(final String action,
                                 final BluetoothGattCharacteristic characteristic) {
        final Intent intent = new Intent(action);

        // This is special handling for the Heart Rate Measurement profile.  Data parsing is
        // carried out as per profile specifications:
        // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
        if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
            int flag = characteristic.getProperties();
            int format = -1;
            if ((flag & 0x01) != 0) {
                format = BluetoothGattCharacteristic.FORMAT_UINT16;
                Log.d(TAG, "Heart rate format UINT16.");
            } else {
                format = BluetoothGattCharacteristic.FORMAT_UINT8;
                Log.d(TAG, "Heart rate format UINT8.");
            }
            final int heartRate = characteristic.getIntValue(format, 1);
            Log.d(TAG, String.format("Received heart rate: %d", heartRate));
            intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));
        } else {
            // For all other profiles, writes the data formatted in HEX.
            final byte[] data = characteristic.getValue();
            if (data != null && data.length > 0) {
                final StringBuilder stringBuilder = new StringBuilder(data.length);
                for(byte byteChar : data)
                    stringBuilder.append(String.format("%02X ", byteChar));
                intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
            }
        }
        sendBroadcast(intent);
    }

    public class LocalBinder extends Binder {
        BluetoothLeService getService() {
            return BluetoothLeService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // After using a given device, you should make sure that BluetoothGatt.close() is called
        // such that resources are cleaned up properly.  In this particular example, close() is
        // invoked when the UI is disconnected from the Service.
        close();
        return super.onUnbind(intent);
    }

    private final IBinder mBinder = new LocalBinder();

    /**
     * Initializes a reference to the local Bluetooth adapter.
     *
     * @return Return true if the initialization is successful.
     */
    public boolean initialize() {
        // For API level 18 and above, get a reference to BluetoothAdapter through
        // BluetoothManager.
        if (mBluetoothManager == null) {
            mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
            if (mBluetoothManager == null) {
                Log.e(TAG, "Unable to initialize BluetoothManager.");
                return false;
            }
        }

        mBluetoothAdapter = mBluetoothManager.getAdapter();
        if (mBluetoothAdapter == null) {
            Log.e(TAG, "Unable to obtain a BluetoothAdapter.");
            return false;
        }

        return true;
    }

    /**
     * Connects to the GATT server hosted on the Bluetooth LE device.
     *
     * @param address The device address of the destination device.
     *
     * @return Return true if the connection is initiated successfully. The connection result
     *         is reported asynchronously through the
     *         {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
     *         callback.
     */
    public boolean connect(final String address) {
        if (mBluetoothAdapter == null || address == null) {
            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
            return false;
        }

        // Previously connected device.  Try to reconnect.
        if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
                && mBluetoothGatt != null) {
            Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
            if (mBluetoothGatt.connect()) {
                mConnectionState = STATE_CONNECTING;
                return true;
            } else {
                return false;
            }
        }

        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        if (device == null) {
            Log.w(TAG, "Device not found.  Unable to connect.");
            return false;
        }
        // We want to directly connect to the device, so we are setting the autoConnect
        // parameter to false.
        mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
        Log.d(TAG, "Trying to create a new connection.");
        mBluetoothDeviceAddress = address;
        mConnectionState = STATE_CONNECTING;
        return true;
    }

    /**
     * Disconnects an existing connection or cancel a pending connection. The disconnection result
     * is reported asynchronously through the
     * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
     * callback.
     */
    public void disconnect() {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }
        mBluetoothGatt.disconnect();
    }

    /**
     * After using a given BLE device, the app must call this method to ensure resources are
     * released properly.
     */
    public void close() {
        if (mBluetoothGatt == null) {
            return;
        }
        mBluetoothGatt.close();
        mBluetoothGatt = null;
    }

    /**
     * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported
     * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}
     * callback.
     *
     * @param characteristic The characteristic to read from.
     */
    public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }
        mBluetoothGatt.readCharacteristic(characteristic);
    }

    /**
     * Enables or disables notification on a give characteristic.
     *
     * @param characteristic Characteristic to act on.
     * @param enabled If true, enable notification.  False otherwise.
     */
    public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
                                              boolean enabled) {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }
        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

        // This is specific to Heart Rate Measurement.
        if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
            BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                    UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mBluetoothGatt.writeDescriptor(descriptor);
        }
    }

    /**
     * Retrieves a list of supported GATT services on the connected device. This should be
     * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.
     *
     * @return A {@code List} of supported services.
     */
    public List<BluetoothGattService> getSupportedGattServices() {
        if (mBluetoothGatt == null) return null;

        return mBluetoothGatt.getServices();
    }

    public void readCustomCharacteristic() {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }



        /*check if the service is available on the device*/
        BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("00002b10-0000-1000-8000-00805f9b34fb"));
        if(mCustomService == null){
            Log.w(TAG, "Custom BLE Service not found on read");
            return;
        }
        /*get the read characteristic from the service*/
        BluetoothGattCharacteristic mReadCharacteristic = mCustomService.getCharacteristic(UUID.fromString("00002b10-0000-1000-8000-00805f9b34fb"));
        if(mBluetoothGatt.readCharacteristic(mReadCharacteristic) == false){
            Log.w(TAG, "Failed to read characteristic");
        }
    }

    public void writeCustomCharacteristic(int value) {
        if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized");
            return;
        }
        /*check if the service is available on the device*/
        BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("00002b11-0000-1000-8000-00805f9b34fb"));
        if(mCustomService == null){
            Log.w(TAG, "Custom BLE Service not found on write");
            return;
        }
        /*get the read characteristic from the service*/
        BluetoothGattCharacteristic mWriteCharacteristic = mCustomService.getCharacteristic(UUID.fromString("00002b11-0000-1000-8000-00805f9b34fb"));

        mWriteCharacteristic.setValue(value,android.bluetooth.BluetoothGattCharacteristic.FORMAT_UINT8,0);
        if(mBluetoothGatt.writeCharacteristic(mWriteCharacteristic) == false){
            Log.w(TAG, "Failed to write characteristic");
        }
    }


}

日志:

12-26 17:40:46.394 6751-6869/com.example.android.bluetoothlegatt D/Surface: Surface::setBuffersDimensions(this=0x7f75a0d400,w=720,h=1280)
12-26 17:40:46.400 6751-6869/com.example.android.bluetoothlegatt W/MALI: glDrawArrays:714: [MALI] glDrawArrays takes more than 5ms here. Total elapse time(us): 5591
12-26 17:40:51.840 6751-6751/com.example.android.bluetoothlegatt D/BluetoothLeService: Trying to use an existing mBluetoothGatt for connection.
12-26 17:40:51.840 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.844 6751-6751/com.example.android.bluetoothlegatt D/ActivityThread: ACT-AM_ON_RESUME_CALLED ActivityRecord{38f72c65 token=android.os.BinderProxy@be2dd3a {com.example.android.bluetoothlegatt/com.example.android.bluetoothlegatt.DeviceControlActivity}}
12-26 17:40:51.844 6751-6751/com.example.android.bluetoothlegatt D/DeviceControlActivity: Connect request result=true
12-26 17:40:51.845 6751-6751/com.example.android.bluetoothlegatt D/FeatureProxyBase: FeatureProxyBase class constructor
12-26 17:40:51.845 6751-6751/com.example.android.bluetoothlegatt D/FeatureProxyBase: getService(), serviceName = multiwindow_service_v1
12-26 17:40:51.845 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=1 device=BB:A0:50:00:00:10
12-26 17:40:51.845 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.858 6751-6751/com.example.android.bluetoothlegatt D/ActivityThread: ACT-RESUME_ACTIVITY handled : 1 / android.os.BinderProxy@be2dd3a
12-26 17:40:51.860 6751-6826/com.example.android.bluetoothlegatt I/BluetoothLeService: Connected to GATT server.
12-26 17:40:51.860 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.860 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: discoverServices() - device: BB:A0:50:00:00:10
12-26 17:40:51.860 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.862 6751-6826/com.example.android.bluetoothlegatt I/BluetoothLeService: Attempting to start service discovery:true
12-26 17:40:51.864 6751-6769/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetService() - Device=BB:A0:50:00:00:10 UUID=00001800-0000-1000-8000-00805f9b34fb
12-26 17:40:51.864 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.873 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetService() - Device=BB:A0:50:00:00:10 UUID=00001801-0000-1000-8000-00805f9b34fb
12-26 17:40:51.873 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.873 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetService() - Device=BB:A0:50:00:00:10 UUID=00002b00-0000-1000-8000-00805f9b34fb
12-26 17:40:51.873 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.889 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002a00-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=2
12-26 17:40:51.889 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.889 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.904 6751-6769/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002a01-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=2
12-26 17:40:51.904 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.904 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.912 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002a04-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=2
12-26 17:40:51.912 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.912 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.952 6751-6771/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002a05-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=34
12-26 17:40:51.952 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.952 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.952 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.969 6751-6769/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002b10-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=20
12-26 17:40:51.969 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.969 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.969 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.969 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.978 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002b11-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=6
12-26 17:40:51.978 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.978 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.978 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.978 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.980 6751-6771/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002b12-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=4
12-26 17:40:51.980 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.980 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.980 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.980 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.985 6751-6769/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetCharacteristic() - Device=BB:A0:50:00:00:10 UUID=00002b13-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0 charProps=24
12-26 17:40:51.985 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.985 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.985 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:51.985 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.042 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetDescriptor() - Device=BB:A0:50:00:00:10 UUID=00002902-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0descrInstId=0
12-26 17:40:52.042 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.042 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.042 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.054 6751-6771/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetDescriptor() - Device=BB:A0:50:00:00:10 UUID=00002902-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0descrInstId=0
12-26 17:40:52.054 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.054 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.054 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.054 6751-6771/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.088 6751-6769/com.example.android.bluetoothlegatt D/BluetoothGatt: onGetDescriptor() - Device=BB:A0:50:00:00:10 UUID=00002902-0000-1000-8000-00805f9b34fb srvcType=0 srvcInstId=0 charInstId=0descrInstId=0
12-26 17:40:52.088 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.088 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.088 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.088 6751-6769/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.100 6751-6826/com.example.android.bluetoothlegatt D/BluetoothGatt: onSearchComplete() = Device=BB:A0:50:00:00:10 Status=0
12-26 17:40:52.100 6751-6826/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:40:52.807 6751-6869/com.example.android.bluetoothlegatt D/Surface: Surface::setBuffersDimensions(this=0x7f75a0d400,w=720,h=1280)
12-26 17:41:00.457 6751-6751/com.example.android.bluetoothlegatt D/FeatureProxyBase: FeatureProxyBase class constructor
12-26 17:41:00.458 6751-6751/com.example.android.bluetoothlegatt D/FeatureProxyBase: getService(), serviceName = multiwindow_service_v1
12-26 17:41:00.472 6751-6869/com.example.android.bluetoothlegatt D/Surface: Surface::setBuffersDimensions(this=0x7f75a0d400,w=720,h=1280)
12-26 17:41:00.548 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:41:00.548 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:41:00.548 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:41:00.548 6751-6751/com.example.android.bluetoothlegatt W/BluetoothLeService: Custom BLE Service not found on write
12-26 17:41:00.554 6751-6869/com.example.android.bluetoothlegatt D/Surface: Surface::setBuffersDimensions(this=0x7f75a0d400,w=720,h=1280)
12-26 17:41:01.385 6751-6751/com.example.android.bluetoothlegatt D/FeatureProxyBase: FeatureProxyBase class constructor
12-26 17:41:01.385 6751-6751/com.example.android.bluetoothlegatt D/FeatureProxyBase: getService(), serviceName = multiwindow_service_v1
12-26 17:41:01.405 6751-6869/com.example.android.bluetoothlegatt D/Surface: Surface::setBuffersDimensions(this=0x7f75a0d400,w=720,h=1280)
12-26 17:41:01.511 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:41:01.511 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:41:01.511 6751-6751/com.example.android.bluetoothlegatt D/BluetoothDevice: mAddress: BB:A0:50:00:00:10
12-26 17:41:01.512 6751-6751/com.example.android.bluetoothlegatt W/BluetoothLeService: Custom BLE Service not found on read
12-26 17:41:01.528 6751-6869/com.example.android.bluetoothlegatt D/Surface: Surface::setBuffersDimensions(this=0x7f75a0d400,w=720,h=1280)

最佳答案

我没有意识到服务和特征有不同的 UUID,仔细查看后我发现我只使用了特征(读和写)的 UUID。 将服务的 UUID 从 2b10/2b11 更改为 2b00 解决了这个问题。

关于java - 未找到自定义 BLE 服务,mBluetoothGatt.getService(uuid) 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41333425/

相关文章:

java - 如何将Repository自动生成的ID返回到MainActivity?

android - 使用 Realm 获取致命信号 11 (SIGSEGV),代码 1

iOS 7.1.2 : what did really change for iBeacon?

ios - BLE外设不做广告

java - 在面向对象编程中创建 Action

java - 无法编译程序

java - 错误: local variable imagesLabel is accessed from within inner class; needs to be declared final (Java)

java - 根据单击的按钮将变量保存在 SharedPreferences 中

android - 安全网络传输的最佳实践

android - 应用程序关闭时蓝牙设备会断开连接