public static class BleSendPackage {
private byte[] characteristicData;
private int characteristicCursor;
private String address;
public BleSendPackage(String address,byte[] characteristicData) {
this.characteristicData = characteristicData;
this.characteristicCursor = 0;
this.address = address;
}
}
private ArrayList<BleSendPackage> bleSendPackageList = new ArrayList<>(BleSendPackage);
public void writeC5(final String address, final byte[] pktData){
BleSendPackage bleSendPackage = new BleSendPackage(address,pktData);
if( bleSendPackageList.size() == 0){//第一段数据,马上执行
synchronized( bleSendPackageList ) {
bleSendPackageList.add(bleSendPackage);
}
writeBleCharacteristicIfRemained(address);
}else{//其他数据,延时执行
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized( bleSendPackageList ) {
bleSendPackageList.add(bleSendPackage);
}
writeBleCharacteristicIfRemained(address);
}
}).start();
}
}
private void writeBleCharacteristicIfRemained(String address) {
synchronized( bleSendPackageList ) {
if(bleSendPackageList.size() != 0){
BleSendPackage bleSendPackage = bleSendPackageList.get(0);
boolean bwrite=false;
BluetoothGattCharacteristic writeCharacteristic = getBlueDtoWriteCharacteristic(address);
BluetoothGatt gatt = getBlueDtoBluetoothGatt(address);
if (writeCharacteristic == null || gatt == null){
//TODO:需要告诉调用者消息异常处理
AppLog.Loge("dcgble","write characteristic cannot find");
return ;
}
if(BlueOper.this.mtu <= 3){
BlueOper.this.mtu = BLE_MTU_DEFAULT;
}
int availableTransmitLength = BlueOper.this.mtu - 3;
int lastCursor = bleSendPackage.characteristicCursor;
int fragLength = (bleSendPackage.characteristicCursor + availableTransmitLength <= bleSendPackage.characteristicData.length)
? availableTransmitLength
: (bleSendPackage.characteristicData.length - bleSendPackage.characteristicCursor);
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(bleSendPackage.characteristicData, lastCursor, fragLength);
AppLog.Loge("dcgble_Data","lastCursor:"+lastCursor+"----fragLength:"+fragLength+"---数据length:"+bleSendPackage.characteristicData.length);
writeCharacteristic.setValue(out.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
//订阅通知
boolean notification =gatt.setCharacteristicNotification(writeCharacteristic, true);
writeCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
bwrite = gatt.writeCharacteristic(writeCharacteristic);
AppLog.Loge("dcgble_Data","指令写入结果"+bwrite);
bleSendPackage.characteristicCursor += fragLength;
if( bleSendPackage.characteristicCursor == bleSendPackage.characteristicData.length ) {
bleSendPackageList.remove(0);//执行完成,移出队列
AppLog.Loge("dcgble","指令发送结束");
}
} else {
sendCompletedEvent();
}
}
}
private void sendCompletedEvent() {
if(netstrapService!=null && netstrapService.isOtaStarted() ) {
netstrapService.addTask(new NetstrapTask(NetstrapState.OTA_SEND));
}
}
锁住数组,让队列按照顺序执行
最新推荐文章于 2022-01-03 16:27:49 发布