说明:项目中需实现Android/Linux设备作为服务端,客户端为iOS或者Android设备进行Ble连接
那么Android需要代码开启Ble服务,我设计了一个switch开关,打开/关闭则对应开启/关闭Ble服务。因为我们是对特殊的设备进行特殊功能服务,所有我们决定把蓝牙的Mac地址写入到厂商数据中,并设定特定的读、写、广播特征。
部分代码如下
获取蓝牙Mac地址
/**
* 获取本机蓝牙地址 Android10不允许获取设备唯一标识Mac地址
* 这里随机生成一个并保存 直到用户卸载才会生成新的
*/
private String getBluetoothAddress() {
String macAddress = "";
macAddress = MMKV.defaultMMKV().getString("blue_mac_address","");
if (macAddress.length()>0){
return macAddress;
}else {
String randomString = "0123456789abcdef";
// String[] randomString = new String[]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 6; i++) {
int first = random.nextInt(randomString.length());
int second = random.nextInt(randomString.length());
if (i!=5)
sb.append(randomString.charAt(first)).append(randomString.charAt(second)).append(":");
else
sb.append(randomString.charAt(first)).append(randomString.charAt(second));
}
macAddress = sb.toString();
MMKV.defaultMMKV().encode("blue_mac_address", macAddress);
}
return macAddress;
//下面方式在iOS10.0以上会得到null 测试手机为HUAWEI Meta10 系统Android10.0 据说Android8.0以上就会出问题 具体我没去测试
// try {
//
// BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// Field field = bluetoothAdapter.getClass().getDeclaredField("mService");
// // 参数值为true,禁用访问控制检查
// field.