如何在Flutter中实现带OOB安全的nRF Mesh连接?
Flutter中nRF Mesh带OOB连接出现“Unsupported algorithm!”错误的解决方法
我需要在Flutter中实现带有OOB安全机制的nRF Mesh连接,但操作时触发了“Unsupported algorithm!”错误,相关日志如下:
V/MeshManagerApi(17303): Provisioning pdu sent: 0x030005 V/MeshManagerApi(17303): Received provisioning message: 0x03010100020003000000080008 V/ProvisioningCapabilities(17303): Number of elements: 1 V/ProvisioningCapabilities(17303): Public key information available: false V/ProvisioningCapabilities(17303): Static OOB information available: : false V/ProvisioningCapabilities(17303): Output OOB size: 0 V/ProvisioningCapabilities(17303): Input OOB size: 8 V/InputOOBAction(17303): Input oob action type value: Input Alpha Numeric D/fr.dooz.nordic_nrf_mesh.DoozMeshProvisioningStatusCallbacks(17303): onProvisioningStateChanged 0503f008-d1d8-25c8-4a59-494f542d3235 D/fr.dooz.nordic_nrf_mesh.DoozMeshProvisioningStatusCallbacks(17303): meshNodeAlreadySaved true D/fr.dooz.nordic_nrf_mesh.DoozMeshManagerCallbacks(17303): onNetworkUpdated I/flutter (17303): [NordicNrfMesh] successfully assigned 2 to node ! E/MethodChannel#fr.dooz.nordic_nrf_mesh/mesh_manager_api/methods(17303): java.lang.IllegalArgumentException: Unsupported algorithm! E/MethodChannel#fr.dooz.nordic_nrf_mesh/mesh_manager_api/methods(17303): at no.nordicsemi.android.mesh.MeshProvisioningHandler.sendProvisioningStart(MeshProvisioningHandler.java:378) E/MethodChannel#fr.dooz.nordic_nrf_mesh/mesh_manager_api/methods(17303): at fr.dooz.nordic_nrf_mesh.DoozMeshManagerApi.onMethodCall(DoozMeshManagerApi.kt:455) E/MethodChannel#fr.dooz.nordic_nrf_mesh/mesh_manager_api/methods(17303): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267) E/MethodChannel#fr.dooz.nordic_nrf_mesh/mesh_manager_api/methods(17303): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) E/MethodChannel#fr.dooz.nordic_nrf_mesh/mesh_manager_api/methods(17303): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:322) E/flutter (17303): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(error, Unsupported algorithm!, null, java.lang.IllegalArgumentException: Unsupported algorithm! E/flutter (17303): at no.nordicsemi.android.mesh.utils.AlgorithmType.getSupportedAlgorithmValue(AlgorithmType.java:91) E/flutter (17303): at no.nordicsemi.android.mesh.provisionerstates.ProvisioningStartState.createProvisioningStartPDU(ProvisioningStartState.java:117) E/flutter (17303): at no.nordicsemi.android.mesh.provisionerstates.ProvisioningStartState.executeSend(ProvisioningStartState.java:101) E/flutter (17303): at no.nordicsemi.android.mesh.MeshProvisioningHandler.sendProvisioningStart(MeshProvisioningHandler.java:378) E/flutter (17303): at no.nordicsemi.android.mesh.MeshProvisioningHandler.startProvisioningNoOOB(MeshProvisioningHandler.java:306)
错误原因分析
- 从日志的
ProvisioningCapabilities字段可知,设备不支持公钥配网,无静态OOB,仅支持8位字母数字的输入型OOB。 - 错误栈显示代码调用了
startProvisioningNoOOB(无OOB配网方法),但设备需要OOB验证,且当前指定的配网算法不在设备支持列表中,触发算法不兼容异常。
解决方案
1. 改用输入型OOB配网流程
放弃无OOB配网方法,调用支持输入OOB的接口,传入设备要求的8位字母数字OOB数据:
// 假设已获取设备UUID和支持的算法 final oobInput = "ABC12345"; // 示例8位字母数字OOB数据 await nordicNrfMesh.startProvisioningWithInputOob( nodeUuid, selectedAlgorithm, oobInput: oobInput, );
2. 动态获取设备支持的算法
从ProvisioningCapabilities中提取设备支持的算法列表,避免硬编码不兼容的算法:
// 获取设备的配网能力信息 final provisioningCapabilities = await nordicNrfMesh.getProvisioningCapabilities(nodeUuid); final supportedAlgorithms = provisioningCapabilities.supportedAlgorithms; if (supportedAlgorithms.isNotEmpty) { final selectedAlgorithm = supportedAlgorithms.first; // 选择第一个兼容算法 // 启动输入OOB配网 await nordicNrfMesh.startProvisioningWithInputOob( nodeUuid, selectedAlgorithm, oobInput: "你的OOB数据", ); }
3. 检查自定义插件实现
如果使用的是自定义Flutter插件(fr.dooz.nordic_nrf_mesh),需确保Android端代码调用MeshProvisioningHandler时,传递的是设备支持的算法类型,而非硬编码固定值。
内容的提问来源于stack exchange,提问作者Kishan Patil
相关产品推荐
相关产品推荐

