用的是git上的蓝牙管理库,首先添加依赖:
implementation'com.clj.fastble:FastBleLib:2.3.4' //蓝牙管理库
implementation 'com.yanzhenjie:permission:2.0.3' //6.0+权限管理
一般给蓝牙发数据是嵌入式开发的哥们写好固定的某个UID,这个UID其实是一对的,
分别是uuid_service,其对应的特征值characteristic uuid
然后我们向这对UID发送数据,上代码:
private BleDevice mBleDevice;
private void startInit() {
if (BleManager.getInstance().isBlueEnable()) {
scan();
} else {
//自己处理没开启的逻辑
BleManager.getInstance().enableBluetooth();
}
}
private void scan() {
AndPermission.with(this)
.runtime()
.permission(Permission.ACCESS_FINE_LOCATION)
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
scanLast();
}
@Override
public void onCancel() {
}
});
}
})
.onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> data) {
ToastUtil.showSingleToast("无权限,请开启权限");
}
}).start();
}
private void scanLast() {
BleManager.getInstance().scan(new BleScanCallback() {
@Override
public void onScanFinished(List<BleDevice> scanResultList) {
//这里就能看到所有扫描到的设备
System.out.println("onScanFinished---:");
}
@Override
public void onScanStarted(boolean success) {
}
@Override
public void onScanning(BleDevice bleDevice) {
System.out.println("onScanning---name:" + bleDevice.getName() + "----------mac:" + bleDevice.getMac());
//这里是自己的逻辑,扫描到指定的mac,开始连接
if (bleDevice.getMac().equals("11:22:33:44:55:66")) {
mBleDevice = bleDevice;
connectBle();
}
}
});
}
private void connectBle() {
BleManager.getInstance().connect(mBleDevice, new BleGattCallback() {
@Override
public void onStartConnect() {
}
@Override
public void onConnectFail(BleDevice bleDevice, BleException exception) {
mTvState.setText("连接设备失败,请重试一次...");
}
@Override
public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
mTvState.setText("蓝牙连接成功");
//这里进行遍历,就可以看到每个UUID对的值
//BluetoothGatt gatt2 = BleManager.getInstance().getBluetoothGatt(bleDevice);
/*List<BluetoothGattService> serviceList = gatt.getServices();
for (BluetoothGattService service : serviceList) {
UUID uuid_service = service.getUuid();
System.out.println("uuid_service----:" + uuid_service.toString());
List<BluetoothGattCharacteristic> characteristicList = service.getCharacteristics();
for (BluetoothGattCharacteristic characteristic : characteristicList) {
UUID uuid_chara = characteristic.getUuid();
System.out.println("uuid_chara----:" + uuid_chara.toString());
}
}*/
}
@Override
public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
}
});
}
//然后就是向连接的设备发送数据
private void openVoice() {
//比如要向设备发送一串16进制的数据,将十六进制转换成byte数组,然后写入数据
byte[] bytes = hexToByteArray("302132323212");
BleManager.getInstance().write(mBleDevice, "0000c010-0000-1000-8000-008032345533", "00000001-0000-1000-8000-008023456789", bytes, new BleWriteCallback() {
@Override
public void onWriteSuccess(int current, int total, byte[] justWrite) {
//发送成功
}
@Override
public void onWriteFailure(BleException exception) {
//发送失败
}
}
);
}
//字符串转byte数组
public byte[] hexToByteArray(String inHex) {
int hexlen = inHex.length();
byte[] result;
if (hexlen % 2 == 1) {
//奇数
hexlen++;
result = new byte[(hexlen / 2)];
inHex = "0" + inHex;
} else {
//偶数
result = new byte[(hexlen / 2)];
}
int j = 0;
for (int i = 0; i < hexlen; i += 2) {
result[j] = hexToByte(inHex.substring(i, i + 2));
j++;
}
return result;
}
public byte hexToByte(String inHex) {
return (byte) Integer.parseInt(inHex, 16);
}
//最后断开
@Override
protected void onDestroy() {
super.onDestroy();
try {
BleManager.getInstance().disconnect(mBleDevice);
BleManager.getInstance().cancelScan();
} catch (Exception e) {
e.printStackTrace();
}
}