Azure / Azure/azure-iot-sdk-python

async_hub fails

Open
#1,157 3 comments 0 reactions 0 assignees View on GitHub
bug IoTSDK
Dominant language
Python
Stars
438
Forks
380
Avg merge
22h 17m
Merged PRs (30d)
22

Description

# 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](https://github.com/Azure/azure-iot-sdk-python/blob/main/samples/async-hub-scenarios/receive_direct_method.py) **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](https://github.com/Azure/azure-iot-sdk-python/blob/main/samples/async-edge-scenarios/receive_data.py) 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](https://github.com/Azure/azure-iot-sdk-python/assets/58885245/49342f84-408e-4852-a540-b857a8b79b11)

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](https://github.com/Azure/azure-iot-sdk-python/blob/main/samples/async-edge-scenarios/receive_data.py)

```
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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.