Skip to content

async_hub fails #1157

@LaudixGit

Description

@LaudixGit

Context

Raspberry Pi4B
Linux RPi4-Alpha 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux
iotedge 1.4.16
Python 3.9.2
pip 23.2.1 from /usr/local/lib/python3.9/dist-packages/pip (python 3.9)

Package             Version
------------------- ---------
azure-iot-device    2.12.0
certifi             2020.6.20
chardet             4.0.0
colorzero           1.1
deprecation         2.1.0
distro              1.5.0
gpiozero            1.6.2
idna                2.10
janus               1.0.0
numpy               1.19.5
packaging           23.2
paho-mqtt           1.6.1
picamera2           0.3.12
pidng               4.0.9
piexif              1.1.3
Pillow              8.1.2
pip                 23.2.1
PySocks             1.7.1
python-apt          2.2.1
python-prctl        1.7
requests            2.25.1
requests-unixsocket 0.3.0
RPi.GPIO            0.7.0
setuptools          52.0.0
simplejpeg          1.6.4
six                 1.16.0
spidev              3.5
ssh-import-id       5.10
toml                0.10.1
typing_extensions   4.8.0
urllib3             1.26.5
v4l2-python3        0.3.2
wheel               0.34.2

Description of the issue

With Edge agents halted sudo iotedge system stop this sample works launched from the command line.
Tested by this command in cloudshell: az iot hub invoke-device-method --device-id "Alpha" --hub-name "hub2" --method-name "method1"

With the Edge agent restored (either reboot or sudo iotedge config apply -c '/etc/aziot/config.toml'), similar code based on this sample never triggers the on_method_request_received call_back.

There are no errors in the logs, however the cloudshell command fails with
Error occurred in request., ReadTimeout: HTTPSConnectionPool(host='edge2.azure-devices.net', port=443): Read timed out. (read timeout=30)

There are no errors in sudo iotedge check --verbose
The container successfully writes to the logs - which correctly show in Azure Portal "Troubleshooting'.
image

Command used to create the container:
sudo docker build --rm -f "./modules/App/Dockerfile.arm64v8" -t iotedge.azurecr.io/app:2023.10.12.16.10-arm64 "./modules/App/"

Code sample exhibiting the issue

A simplification of this sample

import asyncio
import sys
import signal
import threading
from azure.iot.device.aio import IoTHubModuleClient
from datetime import datetime

# Event indicating client stop
stop_event = threading.Event()


def create_client():
    client = IoTHubModuleClient.create_from_edge_environment()

    # Define behavior for receiving methods
    async def method_handler(method_request):
        print("method request received: {}".format(method_request.name))
        method_response = MethodResponse.create_from_method_request(method_request, 400, None)
        await client.send_method_response(method_response)

    # set the received data handlers on the client
    client.on_method_request_received = method_handler

    return client


async def run_sample(client):
    await client.connect()
    while not stop_event.is_set():
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
        print(current_time, "   heartbeat")
        
        await asyncio.sleep(15)

def main():
    if not sys.version >= "3.5.3":
        raise Exception( "The sample requires python 3.5.3+. Current version of Python: %s" % sys.version )
    print ( "IoT Hub Client for Python" )

    # NOTE: Client is implicitly connected due to the handler being set on it
    client = create_client()

    # Define a handler to cleanup when module is is terminated by Edge
    def module_termination_handler(signal, frame):
        print ("IoTHubClient sample stopped by Edge")
        stop_event.set()

    # Set the Edge termination handler
    signal.signal(signal.SIGTERM, module_termination_handler)

    # Run the sample
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(run_sample(client))
    except Exception as e:
        print("Unexpected error %s " % e)
        raise
    finally:
        print("Shutting down IoT Hub Client...")
        loop.run_until_complete(client.shutdown())
        loop.close()


if __name__ == "__main__":
    main()

Console log of the issue

No error in the log

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions