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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions