我们有一个Android设备,可以充当蓝牙同步和蓝牙外设 . 当Android / IOS设备尝试通过BLE连接我的蓝牙外设时,有时会在Android / IOS设备上弹出蓝牙配对 .

蓝牙同步已经从系统级完成,这里是ble外设的代码 .

public final class ClusterPeripheral {
private static final String TAG = ClusterPeripheral.class.getSimpleName();

private static final UUID ClusterDevice_Service = UUID.fromString("0095aad6-8719-11e7-bb31-be2e44b06b34");

private static final UUID Cluster_PACKET_WRITE_CHARACTERSTICS = UUID.fromString("1d090324-871a-11e7-bb31-be2e44b06b34");

private static final UUID Cluster_BIKE_KEY_CHARACTERISTICS = UUID.fromString("21a25f42-a1ab-11e7-abc4-cec278b6b50a");

private static final UUID Cluster_CONNECTION_STATE_CHARACTERISTICS = UUID.fromString("4a32defa-a8b8-11e7-abc4-cec278b6b50a");

private static final UUID Cluster_NAVIGATION_STATE_CHARACTERISTICS = UUID.fromString("4a8cc23a-c13b-11e7-abc4-cec278b6b50a");

public static final UUID Cluster_BIKE_KEY_CHANGE_CHARACTERISTICS = UUID.fromString("6a32e314-a8b8-11e7-abc4-cec278b6b50a");

public static final UUID Cluster_CONNECTION_CHARACTERISTICS = UUID.fromString("d13674a6-ace2-11e7-abc4-cec278b6b50a");


public static final UUID Cluster_IOS_NOTIFICATION_CHARACTERISTICS = UUID.fromString("46e55460-cdea-11e7-abc4-cec278b6b50a");

public static final UUID CLIENT_CHARACTERISTIC_CONFIGURATION_UUID = UUID
        .fromString("00002902-0000-1000-8000-00805f9b34fb");

private static final UUID CHARACTERISTIC_USER_DESCRIPTION_UUID = UUID
        .fromString("00002901-0000-1000-8000-00805f9b34fb");
private AppPreferences appPreferences;

private BluetoothGattService Cluster_Service_Instance;
public static BluetoothGattCharacteristic Cluster_WRITE_InstanceCharacterstics;
public static BluetoothGattCharacteristic Cluster_BIKE_KEY_InstanceCharacterstics;
public static BluetoothGattCharacteristic Cluster_STATE_CONNECTED_Characterstics;
public static BluetoothGattCharacteristic Cluster_IOS_NOTIFICATION_Characterstics;

public static BluetoothGattCharacteristic Cluster_Connection_Characteristics;
public static BluetoothGattCharacteristic Cluster_NAVIGATION_STATE_Characterstics;

public static BluetoothGattCharacteristic Cluster_BIKE_KEY_CHANGE_Characterstics;
public ClusterPeripheral() {

    appPreferences = AppPreferences.getInstance(Cluster.mActivity);
    Cluster_WRITE_InstanceCharacterstics =
            new BluetoothGattCharacteristic(Cluster_PACKET_WRITE_CHARACTERSTICS,
                    BluetoothGattCharacteristic.PROPERTY_WRITE,
                    BluetoothGattCharacteristic.PERMISSION_WRITE);

    //initializing the bike key characteristic
    Cluster_BIKE_KEY_InstanceCharacterstics =
            new BluetoothGattCharacteristic(Cluster_BIKE_KEY_CHARACTERISTICS,
                    BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
                    BluetoothGattCharacteristic.PERMISSION_READ);

    //adding descriptor to the bike key characteristic
    Cluster_BIKE_KEY_InstanceCharacterstics.addDescriptor(
            getClientCharacteristicConfigurationDescriptor());

    //initializing the state connected characteristic
    Cluster_STATE_CONNECTED_Characterstics = new BluetoothGattCharacteristic(Cluster_CONNECTION_STATE_CHARACTERISTICS,
            BluetoothGattCharacteristic.PROPERTY_READ,
            BluetoothGattCharacteristic.PERMISSION_READ);

    //initializing the navigation state characteristic
    Cluster_NAVIGATION_STATE_Characterstics = new BluetoothGattCharacteristic(Cluster_NAVIGATION_STATE_CHARACTERISTICS,
            BluetoothGattCharacteristic.PROPERTY_READ,
            BluetoothGattCharacteristic.PERMISSION_READ);


    Cluster_Connection_Characteristics = new BluetoothGattCharacteristic(Cluster_CONNECTION_CHARACTERISTICS,
            BluetoothGattCharacteristic.PROPERTY_WRITE,

            BluetoothGattCharacteristic.PERMISSION_WRITE);
    //initilizing the bluetooth gatt service
    Cluster_Service_Instance = new BluetoothGattService(ClusterDevice_Service,
            BluetoothGattService.SERVICE_TYPE_PRIMARY);

    Cluster_BIKE_KEY_CHANGE_Characterstics = new BluetoothGattCharacteristic(Cluster_BIKE_KEY_CHANGE_CHARACTERISTICS,
            BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
            BluetoothGattCharacteristic.PERMISSION_WRITE | BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY);

    Cluster_BIKE_KEY_CHANGE_Characterstics.addDescriptor(
            getClientCharacteristicConfigurationDescriptor());

    Cluster_BIKE_KEY_CHANGE_Characterstics.addDescriptor(getCharacteristicUserDescriptionDescriptor("Update Vehichle Key"));

    Cluster_IOS_NOTIFICATION_Characterstics = new BluetoothGattCharacteristic(Cluster_IOS_NOTIFICATION_CHARACTERISTICS,
            BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
            BluetoothGattCharacteristic.PERMISSION_WRITE | BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY);

    Cluster_IOS_NOTIFICATION_Characterstics.addDescriptor(
            getClientCharacteristicConfigurationDescriptor());





    //adding the charateristics to the service
    Cluster_Service_Instance.addCharacteristic(Cluster_WRITE_InstanceCharacterstics);
    Cluster_Service_Instance.addCharacteristic(Cluster_BIKE_KEY_InstanceCharacterstics);
    Cluster_Service_Instance.addCharacteristic(Cluster_STATE_CONNECTED_Characterstics);
    Cluster_Service_Instance.addCharacteristic(Cluster_BIKE_KEY_CHANGE_Characterstics);
    Cluster_Service_Instance.addCharacteristic(Cluster_Connection_Characteristics);
    Cluster_Service_Instance.addCharacteristic(Cluster_NAVIGATION_STATE_Characterstics);
    Cluster_Service_Instance.addCharacteristic(Cluster_IOS_NOTIFICATION_Characterstics);


    Cluster_IOS_NOTIFICATION_Characterstics.setValue(0,BluetoothGattCharacteristic.FORMAT_UINT16, 0);

    if (appPreferences.getPassKey().length() != 0)
        Cluster_BIKE_KEY_InstanceCharacterstics.setValue(Integer.parseInt(appPreferences.getPassKey()),
                BluetoothGattCharacteristic.FORMAT_UINT16, 0);

    //setting the value of charateristic to Zero, if there is no device connected and 1, if a device is connected.
    Cluster_STATE_CONNECTED_Characterstics.setValue(0,
            BluetoothGattCharacteristic.FORMAT_UINT16, 0);

    //setting the value of charateristic to Zero, if the navigation screen is not open
    Cluster_NAVIGATION_STATE_Characterstics.setValue(0,
            BluetoothGattCharacteristic.FORMAT_UINT16, 0);

    //setting default value of bike pass key
    if (appPreferences.getPassKey().length() != 0)
        Cluster_BIKE_KEY_CHANGE_Characterstics.setValue(Integer.parseInt(appPreferences.getPassKey()),
                BluetoothGattCharacteristic.FORMAT_UINT16, 0);
}

/**
 * Return the instance of Cluster service.
 *
 * @return
 */
public BluetoothGattService getBluetoothGattService() {

    AndroidAppUtils.showLog(TAG, "*****************getBluetoothGattService called");
    return Cluster_Service_Instance;
}


/**
 * Return UUID of Cluster Service
 *
 * @return
 */
public ParcelUuid getServiceUUID() {
    AndroidAppUtils.showLog(TAG, "*****************getServiceUUID called");

    return new ParcelUuid(ClusterDevice_Service);
}


/**
 * Function to communicate to the ServiceHelper that a device wants to write to a
 * characteristic.
 * <p>
 * The ServiceHelper should check that the value being written is valid and
 * return a code appropriately. The ServiceHelper should update the UI to reflect the change.
 *
 * @param characteristic Characteristic to write to
 * @param value          Value to write to the characteristic
 * @return {@link BluetoothGatt#GATT_SUCCESS} if the read operation
 * was completed successfully. See {@link BluetoothGatt} for GATT return codes.
 */
public int writeCharacteristic(BluetoothGattCharacteristic characteristic, int offset, byte[] value, final String writtendata) {

    AndroidAppUtils.showLog(TAG, "Length of data recieved: " + value.length + writtendata);
    if (offset != 0) {
        return BluetoothGatt.GATT_INVALID_OFFSET;
    }
    // Heart Rate control point is a 8bit characteristic
    if (value.length != 1) {
        Log.d(TAG, "value.length:" + BluetoothGatt.GATT_INVALID_ATTRIBUTE_LENGTH);
        return BluetoothGatt.GATT_INVALID_ATTRIBUTE_LENGTH;
    }

    return BluetoothGatt.GATT_SUCCESS;
}


public static BluetoothGattDescriptor getClientCharacteristicConfigurationDescriptor() {
    BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor(
            CLIENT_CHARACTERISTIC_CONFIGURATION_UUID,
            (BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE));
    descriptor.setValue(new byte[]{0, 0});
    return descriptor;
}

public static BluetoothGattDescriptor getCharacteristicUserDescriptionDescriptor(String defaultValue) {
    BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor(
            CHARACTERISTIC_USER_DESCRIPTION_UUID,
            (BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE));
    try {
        descriptor.setValue(defaultValue.getBytes("UTF-8"));
    } finally {
        return descriptor;
    }
}

}