package com.github.captain_miao.android.ble.utils;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothProfile;
import java.lang.reflect.Method;
/**
* @author YanLu
* @since 15/9/14
*/
public class BleUtils {
private final static String TAG = BleUtils.class.getName();
/**
* Clears the device cache.
*/
public static boolean refreshDeviceCache(BluetoothGatt gatt) {
/*
* There is a refresh() method in BluetoothGatt class but for now it's hidden. We will call it using reflections.
*/
try {
final Method refresh = BluetoothGatt.class.getMethod("refresh");
if (refresh != null) {
final boolean success = (Boolean) refresh.invoke(gatt);
BleLog.i(TAG, "Refreshing result: " + success);
return success;
}
} catch (Exception e) {
BleLog.e(TAG, "An exception occured while refreshing device");
}
return false;
}
//蓝牙连接状态
public static String getBleConnectStatus(int status) {
switch (status) {
case BluetoothProfile.STATE_DISCONNECTED:
return "STATE_DISCONNECTED";
case BluetoothProfile.STATE_CONNECTING:
return "STATE_CONNECTING";
case BluetoothProfile.STATE_CONNECTED:
return "STATE_CONNECTED";
case BluetoothProfile.STATE_DISCONNECTING:
return "STATE_DISCONNECTING";
default:
return "STATE_UNKNOWN: " + status;
}
}
//GATT 状态
public static String getGattStatus(int status) {
switch (status) {
case BluetoothGatt.GATT_SUCCESS:
return "GATT_SUCCESS";
case BluetoothGatt.GATT_READ_NOT_PERMITTED:
return "GATT_READ_NOT_PERMITTED";
case BluetoothGatt.GATT_WRITE_NOT_PERMITTED:
return "GATT_WRITE_NOT_PERMITTED";
case BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION:
return "GATT_INSUFFICIENT_AUTHENTICATION";
case BluetoothGatt.GATT_REQUEST_NOT_SUPPORTED:
return "GATT_REQUEST_NOT_SUPPORTED";
case BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION:
return "GATT_INSUFFICIENT_ENCRYPTION";
case BluetoothGatt.GATT_INVALID_OFFSET:
return "GATT_INVALID_OFFSET";
case BluetoothGatt.GATT_INVALID_ATTRIBUTE_LENGTH:
return "GATT_INVALID_ATTRIBUTE_LENGTH";
case BluetoothGatt.GATT_FAILURE:
return "GATT_FAILURE";
default:
return "STATE_UNKNOWN: " + status;
}
}
//BluetoothGattCharacteristic Permission
public static String getPermission(int permission) {
StringBuilder permissionStr = new StringBuilder();
String binaryString = Integer.toBinaryString(permission);
binaryString = String.format("%16s", binaryString).replace(' ', '0');
int len = binaryString.length();
//PERMISSION_READ (0x00000001)
if(binaryString.charAt(len - 1) == '1'){
permissionStr.append("READ,");
}
//PERMISSION_READ_ENCRYPTED (0x00000002)
if(binaryString.charAt(len - 2) == '1'){
permissionStr.append("READ_ENCRYPTED,");
}
//PERMISSION_READ_ENCRYPTED_MITM (0x00000004)
if(binaryString.charAt(len - 3) == '1'){
permissionStr.append("READ_ENCRYPTED_MITM,");
}
//PERMISSION_WRITE (0x00000010)
if(binaryString.charAt(len - 5) == '1'){
permissionStr.append("WRITE,");
}
//PERMISSION_WRITE_ENCRYPTED (0x00000020)
if(binaryString.charAt(len - 6) == '1'){
permissionStr.append("WRITE_ENCRYPTED,");
}
//PERMISSION_WRITE_ENCRYPTED_MITM (0x00000040)
if(binaryString.charAt(len - 7) == '1'){
permissionStr.append("WRITE_ENCRYPTED_MITM,");
}
//PERMISSION_WRITE_SIGNED (0x00000080)
if(binaryString.charAt(len - 8) == '1'){
permissionStr.append("WRITE_ENCRYPTED_MITM,");
}
//PERMISSION_WRITE_SIGNED_MITM (0x00000100)
if(binaryString.charAt(len - 9) == '1'){
permissionStr.append("WRITE_SIGNED_MITM,");
}
String perStr = permissionStr.toString();
if(perStr.endsWith(",")) {
perStr = perStr.substring(0, perStr.length() - 1);
}
return perStr;
}
//BluetoothGattCharacteristic Properties
public static String getProperties(int properties) {
StringBuilder permissionStr = new StringBuilder();
String binaryString = Integer.toBinaryString(properties);
binaryString = String.format("%16s", binaryString).replace(' ', '0');
int len = binaryString.length();
//PROPERTY_BROADCAST (0x00000001)
if(binaryString.charAt(len - 1) == '1'){
permissionStr.append("BROADCAST,");
}
//PROPERTY_READ (0x00000002)
if(binaryString.charAt(len - 2) == '1'){
permissionStr.append("READ,");
}
//PROPERTY_WRITE_NO_RESPONSE (0x00000004)
if(binaryString.charAt(len - 3) == '1'){
permissionStr.append("WRITE_NO_RESPONSE,");
}
//PROPERTY_WRITE (0x00000008)
if(binaryString.charAt(len - 4) == '1'){
permissionStr.append("READ_ENCRYPTED_MITM,");
}
//PROPERTY_NOTIFY (0x00000010)
if(binaryString.charAt(len - 5) == '1'){
permissionStr.append("NOTIFY,");
}
//PROPERTY_INDICATE (0x00000020)
if(binaryString.charAt(len - 6) == '1'){
permissionStr.append("INDICATE,");
}
//PROPERTY_SIGNED_WRITE (0x00000040)
if(binaryString.charAt(len - 7) == '1'){
permissionStr.append("SIGNED_WRITE,");
}
//PROPERTY_EXTENDED_PROPS (0x00000080)
if(binaryString.charAt(len - 8) == '1'){
permissionStr.append("EXTENDED_PROPS,");
}
String perStr = permissionStr.toString();
if(perStr.endsWith(",")) {
perStr = perStr.substring(0, perStr.length() - 1);
}
return perStr;
}
//BluetoothGattCharacteristic WriteType
public static String getWriteType(int writeType) {
StringBuilder permissionStr = new StringBuilder();
String binaryString = Integer.toBinaryString(writeType);
binaryString = String.format("%16s", binaryString).replace(' ', '0');
int len = binaryString.length();
//WRITE_TYPE_NO_RESPONSE (0x00000001)
if(binaryString.charAt(len - 1) == '1'){
permissionStr.append("NO_RESPONSE,");
}
//WRITE_TYPE_DEFAULT (0x00000002)
if(binaryString.charAt(len - 2) == '1'){
permissionStr.append("WRITE,");
}
//WRITE_TYPE_SIGNED (0x00000004)
if(binaryString.charAt(len - 3) == '1'){
permissionStr.append("SIGNED,");
}
String perStr = permissionStr.toString();
if(perStr.endsWith(",")) {
perStr = perStr.substring(0, perStr.length() - 1);
}
return perStr;
}
}