我想将我们作为公司开发的睡眠跟踪设备中的文件转移到我们通过蓝牙使用 flutter 开发的应用程序中。文件以 .bin 格式保存到设备中。 flutter_blue_plus 包可以实现这一点吗?或者任何不同的方法?如果您有帮助,我会很高兴
是的,这是可能的,但并不简单。您必须在睡眠跟踪设备和使用 flutter 开发的应用程序上实现文件传输协议。这是因为没有默认的 BLE 文件传输协议,需要从头开始开发适合您用例的自定义协议。这并不简单,但以下是一些可以帮助您入门的提示:-
睡眠追踪设备
您需要在睡眠跟踪设备上实现一个 GATT 服务器,以公开可以读取/通知的数据。该设备需要是一个不断进行广告并愿意接受来自远程中央设备的传入连接的外围设备。
颤动应用
flutter 应用程序需要是一个 GATT 客户端设备,可以订阅(接收通知)并向睡眠跟踪设备写入数据。它还需要成为一个中心,以便它可以扫描并连接到睡眠跟踪设备。
实施
当您的设备需要从睡眠追踪设备读取数据时,首先需要使用以下扫描功能找到它:-
// Start scanning
flutterBlue.startScan(timeout: Duration(seconds: 4));
// Listen to scan results
var subscription = flutterBlue.scanResults.listen((results) {
// do something with scan results
for (ScanResult r in results) {
print('${r.device.name} found! rssi: ${r.rssi}');
}
});
// Stop scanning
flutterBlue.stopScan();
如果在扫描列表中找到睡眠跟踪设备,则 flutter 应用程序需要使用以下功能连接到它:-
// Connect to sleep tracking device
await device.connect();
然后,需要使用以下功能启用通知:-
await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
// do something with new value
});
然后,您需要写入睡眠跟踪设备上的特征,以告诉它您已准备好从其接收数据。您可以使用以下功能来完成此操作:-
// Writes to a characteristic
await c.write([0x10, 0x01])
请注意,以上只是一个示例。该特征可能会有不同的句柄,因此上面的两个值都会不同。
在睡眠跟踪设备上,一旦触发 flutter 应用程序准备好接收文件的事件,睡眠跟踪设备需要对 .bin 数据进行分块,并通过 BLE 将其作为 BLE 通知进行传输。通知的实现将取决于睡眠跟踪设备上运行的操作系统/软件,因此我不会在这里共享代码。
最后,请注意,这是通过 BLE 在两个设备之间传输文件的非常简化的实现。可以通过吞吐量优化和适当的流量控制机制来改进实现,但这超出了本问题的范围。
您可以通过以下链接找到更多信息:-
您可能只需要将它们以文件格式保存在您的接收设备上即可。
但是,如果您要发送大量数据,最好以块或字节块迭代方式发送它,然后在两端(睡眠跟踪设备和您的应用程序)使用 CRC32 等校验和来检查您是否收到了您发送的数据相同,因为可能会发生噪声干扰。
您可以通过仔细分配每次在 BLE 设备上发送的每个块的正确数据量来减少出错的可能性。我建议使用 BLE 设备最大 MTU 的一半,因为超过这似乎会影响连接的可靠性(基于 nRF52840 的经验)。
我也发布了类似的答案here。