Azure IoT Edge 통합 테스트 템플릿 - 2부

11033 단어

요약



이 문서는 Part.1을 따르고 azure-iot-edge-integration-test-template에서 IoT Edge 모듈에 대한 중요한 팁을 공유합니다.



  • 목차


  • Overview
  • IothubConnector
  • WeatherObserver
  • FileGenerator
  • FileUploader
  • FileUpdater
  • LocalBlobStorage

  • 개요

    This sample template has six IoT Edge modules and two integration test data flows. One is Azure Pipelines agent sending direct method Azure Blob Storage에 업로드된 일기 예보 및 일기 예보 파일을 수신합니다. 또 다른 통합 테스트 흐름은 아카이브 날씨 파일을 다운로드하도록 요청하는 직접 메서드 요청입니다.



    IoThub커넥터

  • This module depends both on IoTHubModuleClientrclypy(ROS Client Library for Python) . ROS2 environment setup 또는 iotedgehubdev 없이 이 모듈을 로컬에서 실행할 수 없습니다.
  • 응용 프로그램을 계속 실행하고 콜백을 기다리는 몇 가지 옵션이 있습니다. IothubConnectorthreadingsignal을 사용하여 에지 신호 처리기를 사용합니다. 반면 FileGeneratorrclpy.spin()를 사용합니다.

  • def module_termination_handler(signal, frame):
        print ("IoTHubClient sample stopped")
        stop_event.set()
    
    stop_event = threading.Event()
    signal.signal(signal.SIGTERM, module_termination_handler)
    try:
        stop_event.wait()
    except Exception as e:
        print("Unexpected error %s " % e)
        raise
    finally:
        print("Shutting down client")
        module_client.shutdown()
    


  • IoT Hub의 직접 메서드 콜백은 method_request_handler()로 구현됩니다. 직접 메서드 요청을 받으면 WeatherReporter ~ Azure Iot Edge route communication 으로 요청 메시지를 보냅니다.

  • async def method_request_handler(method_request):
        print('Direct Method: ', method_request.name, method_request.payload)
        if method_request.name in request_method_list:
            response_payload, response_status = await request_method_list[method_request.name](method_request.payload, module_client)
        else:
            response_payload = {"Response": "Direct method {} not defined".format(method_request.name)}
            response_status = 404
    
        method_response = MethodResponse.create_from_method_request(method_request, response_status, response_payload)
        await module_client.send_method_response(method_response)
    
    module_client.on_method_request_received = method_request_handler
    



    async def request_weather_report(payload: dict, module_client: IoTHubModuleClient):
        try:
            json_string = json.dumps(payload)
            message = Message(json_string)
            await module_client.send_message_to_output(message, 'reportRequest')
            return {"Response": "Send weather report request for {}".format(payload['city'])}, 200
        except Exception as e:
            print(e)
            return {"Response": "Invalid parameter"}, 400
    


  • Azure IoT Edge 경로 통신 콜백은 receive_message_handler()로 구현됩니다. ROS2 주제 통신을 통해 WeatherReport 모듈로부터 메시지를 수신하고 FileGenerator 모듈로 요청을 보냅니다.

  • async def receive_message_handler(message_received):
        if message_received.input_name == 'reportResponse':
            message_telemetry = Message(
                data=message_received.data.decode('utf-8'),
                content_encoding='utf-8',
                content_type='application/json',
            )
            await module_client.send_message_to_output(message_telemetry, 'telemetry')
            print("Weather report sent to IoT Hub")
    
            ros2_publisher_client.ros2_publisher(message_received.data.decode('utf-8'))
            print("ROS2 message sent to FileGenerator")
    
        elif  message_received.input_name == 'updateResponse':
            message_telemetry = Message(
                data=message_received.data.decode('utf-8'),
                content_encoding='utf-8',
                content_type='application/json',
            )
            await module_client.send_message_to_output(message_telemetry, 'telemetry')
            print("Download status sent to IoT Hub")
        else:
            print("Message received on unknown input: {}".format(message_received.input_name))
    
    module_client.on_message_received = receive_message_handler
    


    날씨관찰자

  • WeatherObserver은(는) C#의 .NET6 콘솔 앱으로 작성되었습니다. 이는 Azure IoT Edge 또는 ROS2와 간단하고 독립적이며 디버깅 목적으로 로컬에서 실행할 수 있습니다.
  • IothubConnector의 요청을 처리하는 콜백은 ioTHubModuleClient.SetInputMessageHandlerAsync()로 구현됩니다.

  • await ioTHubModuleClient.SetInputMessageHandlerAsync(routeC2W, ParseRequests, ioTHubModuleClient).ConfigureAwait(false);
    


    파일 생성기

  • FileGenerator은 Python으로 작성된 모듈로 IothubConnector의 요청을 받아 Edge 호스트 시스템에서 날씨 보고서 파일을 생성합니다.
  • 이 모듈은 rclpy.spin()를 사용하여 응용 프로그램 자체를 계속 실행하고 요청을 기다립니다.

  • rclpy.init(args=args)
    file_generator = FileGenerator()
    rclpy.spin(file_generator)
    file_generator.destroy_node()
    rclpy.shutdown()
    


  • ROS2 요청에 대한 콜백은 ROS2 주제 구독의 create_subscription()에 의해 구현됩니다.

  • def __init__(self):
        super().__init__('file_generator')
        self.subscription = self.create_subscription(
            String,
            os.getenv('ROS_TOPIC_NAME'),
            self.listener_callback,
            10)
        self.subscription
    
    def listener_callback(self, msg):
    


    파일 업로더

  • FileUploaderFileGenerator에서 생성된 파일을 추출하여 LocalBlobStorage로 보내는 .NET6 C#으로 작성된 모듈입니다.

  • FileUpdater

  • FileUpdater 모듈은 .NET6 C#으로 작성되며 Azure Blob Storage에서 보관 파일을 다운로드합니다.
  • 이 시스템은 다중 테넌트 및 다중 에지 장치 환경에서 작동할 수 있도록 모듈이 특정 디렉토리에만 액세스하도록 허용하는 SAS 토큰을 사용합니다. 이 SAS 토큰은 에 설명된 ManifestGenerator에 의해 생성됩니다.

  • LocalBlobStorage

  • This sample template uses LocalBlobStorage Microsoft에서 빌드하고 mcr.microsoft.com/azure-blob-storage:latest에서 사용합니다. 기본 제공 로컬 Blob을 사용하는 이유는 Azure IoT Edge 런타임 및 EdgeHubEdgeAgent를 포함한 기본 모듈이 파일 업로드 기능을 지원하지 않기 때문입니다.
  • 좋은 웹페이지 즐겨찾기