Python 虚拟设备处理来自 Azure IoT 中心的更改事件

Python virtual device handle changed event from azure IoT hub

所以,我是 python 的新手,运行 遇到了一个我真的无法解决的问题。

我有一个在 python 中编程的虚拟设备,它连接到 Azure IoT 中心。正如你们中的一些人可能知道的那样,连接到 IoT 中心的设备有一个设备孪生,它定义了设备的属性。 (这是一个基本的 JSON 对象)

这样做的想法是,后端可以更改设备孪生,这在设备上可能会影响操作模式。

到目前为止,我只想实现以下,这是非常基本的:

  1. 我的虚拟设备侦听设备孪生更改(不锁定我的代码)
  2. 我在 Azure
  3. 中更改设备孪生 属性
  4. 事件触发并打印出新的设备孪生属性(最终,这应该调用一些其他代码,以更改操作模式)

到目前为止我有以下内容:

async def main():
   
    async def printdesiredproperties():
        while True:
            test = await my_client.receive_twin_desired_properties_patch() #This returns a JSON dict
            print(test)
    
    task = asyncio.create_task(printdevicetwin()) #not correct way to attach event
    await task
    #Do other stuff

根据我在其他编程语言方面的经验,我们习惯于分别使用 += 和 -= 附加和分离事件处理程序。

在python中似乎有很多方法可以实现这一点,但是我真的没有成功过。

my_client.receive_twin_desired_properties_patch() 是引发事件的原因,在某种意义上,它 returns 一个 JSON 在 Azure

中进行更改时发出指令

试试下面的代码:

import time
import threading

from azure.iot.device import IoTHubDeviceClient
from azure.iot.device.iothub.sync_clients import IoTHubModuleClient

CONNECTION_STRING = "<device conn str>"

def iothub_client_init():
    
    client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
    return client

def twin_update_listener(client):
    while True:
        patch = client.receive_twin_desired_properties_patch()
        print("Twin patch received:")
        print(patch)
       

def iothub_client_init():
    client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    return client

def iothub_client_sample_run():
    try:
        client = iothub_client_init()

        twin_update_listener_thread = threading.Thread(target=twin_update_listener, args=(client,))
        twin_update_listener_thread.daemon = True
        twin_update_listener_thread.start()
        count = 0;
        while True:
            count += 1
            print ( "Sending data as reported property..." )
            reported_patch = {"ReportCount": count}
            client.patch_twin_reported_properties(reported_patch)
            print ( "Reported properties updated:" + str(count))
            time.sleep(5)
    except KeyboardInterrupt:
        print ( "IoT Hub Device Twin device sample stopped" )

if __name__ == '__main__':
    print ( "Starting the Python IoT Hub Device Twin device sample..." )
    print ( "IoTHubModuleClient waiting for commands, press Ctrl-C to exit" )

    iothub_client_sample_run()

虽然我更改了 twin 的 desired 中的一些值:

计数还在继续,我们也收到了事件: