如何使用flaft_blue发送大于512字节的数据



我有一个大于512字节的文件要发送到esp32。我正在发送";withoutResponse:false";,flatterblue库根据mtu大小进行拆分没有问题,但当它达到512字节时,它会返回一个错误来写入特性。为了解决这个问题,我有一个函数来分割文件并写入每个512字节。Esp32可以在不做任何事情的情况下向我发送大于512的文件。我可以在不拆分的情况下发送更大的文件吗?

实现的代码或库示例

ok,我决定切换到flatter_reactive_ble库,并开发了与此类似的代码。基本上,我将文件拆分为4096字节的较小数据包(这是在我与esp32的通信协议中定义的(,然后我调用发送的函数,它再次将文件拆分成来自标头的mtu减去19字节的数据包。在最后一个数据包I〃中;writeWithResponse";并等待响应,如果响应正常,则递增并发送下一个包,并重复处理,直到文件结束。

late StreamSubscription<List<int>>? subscribeStream;
List<int> bytesOfFile = [];
int _size = 0;
int _increment = 0;
List<int> _returnOfSubscribe = [];
int _indexOfUploadController = 0;
Future<void> subscribeCharacteristic() async {
subscribeStream = widget
.subscribeToCharacteristic(widget.rcharacteristic)
.listen((event) {
debugPrint("resposta${hexToString(event)}");
setState(() {
_returnOfSubscribe = event;
if (_returnOfSubscribe != 'code of confirm reception file') {
debugPrint('err');
} else {
_increment++;
actualize();
}
});
});
}
void actualize() async {
int splitSize = 4096;
Iterable<int> s;
int n = (bytesOfFile.length / splitSize).ceil();
//if is the last split
if (_increment >= n) {
if (_returnOfSubscribe == 'code of confirm end of file') {
debugPrint("success");
} else {
debugPrint("err");
}
return;
}
if ((_size + splitSize) < bytesOfFile.length) {
s = bytesOfFile.getRange(_size, _size + splitSize);
} else {
s = bytesOfFile.getRange(_size, bytesOfFile.length);
}
await writeLongData(s.toList());
_size += splitSize;
}
writeLongData(List<int> data) async {
int splitSize = mtuNotifier.value - 19;
Iterable<int> s;
int size = 0;
int n = (data.length / splitSize).ceil();
for (int i = 0; i < n; i++) {
if ((size + splitSize) < data.length) {
s = data.getRange(size, size + splitSize);
} else {
s = data.getRange(size, data.length);
}
try {
if ((size + splitSize) < data.length) {
await widget.writeWithoutResponse(widget.wcharacteristic, s.toList());
} else {
//if the last, write with response
await widget.writeWithResponse(widget.wcharacteristic, s.toList());
}
} catch (e) {
debugPrint('$e');
return;
}
size += splitSize;
}
}

最新更新