【问题标题】:Unable to open .pem file in flutter无法在颤动中打开 .pem 文件
【发布时间】:2022-01-02 18:55:30
【问题描述】:

我是编程初学者,对于一个学校项目,我正在构建一个 android 应用程序来使用 esp 32 和 AWS IOT 打开/关闭 LED。我正在使用 mqtt_client 9.6.4,当我运行 aws_iot.dart 示例时,我能够连接到 AWS IOT 并使用相同的脚本执行操作。当我在颤振中使用相同的代码时,我在调试控制台中收到以下错误消息,E/flutter (15280): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: FileSystemException: Cannot open file, path = 'AmazonRootCA1.pem'(操作系统错误:没有这样的文件或目录,errno = 2)

如何解决?

import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/services.dart';

import 'lib/mqtt_server_client.dart';
import 'lib/mqtt_client.dart';
import 'package:pem/pem.dart';

var switch1 = 0;

Future<int> main() async {
  const url = 'xxxxxxxxxxxxxxxx.amazonaws.com';

  const port = 8883;

  const clientId = 'Flutter';

 
  final client = MqttServerClient.withPort(url, clientId, port);

 
  client.secure = true;

  client.keepAlivePeriod = 20;
  
  client.setProtocolV311();

  client.logging(on: true);

  final context = SecurityContext.defaultContext;

  context.setClientAuthorities('AmazonRootCA1.pem');

  context.useCertificateChain('certificate.pem.crt');

  context.usePrivateKey('private.pem.key');


  client.securityContext = context;

  final connMess =
      MqttConnectMessage().withClientIdentifier(clientId).startClean();
  client.connectionMessage = connMess;

  
  try {
    print('MQTT client connecting to AWS IoT....');
    await client.connect();
  } on Exception catch (e) {
    print('MQTT client exception - $e');
    client.disconnect();
  }

  if (client.connectionStatus!.state == MqttConnectionState.connected) {
    print('MQTT client connected to AWS IoT');

    
    const topic = 'esp32/relay1';
    const topic2 = 'esp32/relay2';
    final builder = MqttClientPayloadBuilder();
    builder.addString('{\"status\":\"0\"}');
    
    client.publishMessage(topic, MqttQos.atLeastOnce, builder.payload!);

    
    client.subscribe(topic2, MqttQos.atLeastOnce);
    
    client.updates!.listen((List<MqttReceivedMessage<MqttMessage>> c) {
      final recMess = c[0].payload as MqttPublishMessage;
      final pt =
          MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
      print(
          'EXAMPLE::Change notification:: topic is <${c[0].topic}>, payload is <-- $pt -->');
      print('');
    });
  } else {
    print(
        'ERROR MQTT client connection failed - disconnecting, state is ${client.connectionStatus!.state}');
    client.disconnect();
  }

  print('Sleeping....');
  await MqttUtilities.asyncSleep(60);

  print('Disconnecting');
  client.disconnect();

  return 0;
}

【问题讨论】:

    标签: flutter dart aws-iot aws-iot-core


    【解决方案1】:

    我会尝试使用 SecurityContext 方法的 Bytes 变体。

    首先,您需要确保您引用的文件在您的pubspec.yaml 文件中定义:

    flutter:
      assets:
        - assets/AmazonRootCA1.pem # assuming you placed these files in a folder called assets
        - assets/certificate.pem.crt
        - assets/private.pem.key
    

    这将确保文件与应用程序一起打包,以便您可以使用rootBundle 加载它们。

    然后在您的代码中使用rootBundle 加载文件并将数据作为字节传递给SecurityContext

      final context = SecurityContext.defaultContext;
    
      final clientAuthorities = await rootBundle.load('assets/AmazonRootCA1.pem');
      context.setClientAuthoritiesBytes(clientAuthorities.buffer.asUint8List());
    
      final certificateChain = await rootBundle.load('assets/certificate.pem.crt');
      context.useCertificateChainBytes(certificateChain.buffer.asUint8List());
    
      final privateKey = await rootBundle.load('assets/private.pem.key');
      context.usePrivateKeyBytes(privateKey.buffer.asUint8List());
    

    顺便说一句,我有点困惑为什么你在颤振项目中的主要方法不调用runApp,而是返回int。但是如果你确实在flutter应用的main方法中使用了上面的代码,你可能需要在使用rootBundle.load之前调用main中的WidgetsFlutterBinding.ensureInitialized();

    【讨论】:

    • 发布的代码是纯 Dart 测试工具(即命令行应用程序)。 (归功于在测试工具中尝试东西的海报。)这个问题并没有明确表明他们正在尝试将工作命令行代码移植到 Flutter,并且应该可能正在使用资产(正如你正确指出的那样出)。
    猜你喜欢
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多