【问题标题】:Python virtual device handle changed event from azure IoT hubPython 虚拟设备处理来自 Azure IoT 中心的更改事件
【发布时间】:2020-12-23 12:11:11
【问题描述】:

所以,我对 python 还很陌生,遇到了一个我真的无法解决的问题。

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

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

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

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

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

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()是引发事件的原因,因为它在 Azure 中进行更改时返回 JSON 字典

【问题讨论】:

  • 怎么样?你的问题解决了吗?

标签: python azure event-handling


【解决方案1】:

试试下面的代码:

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()

虽然我在双胞胎的desired 中更改了一些值:

计数仍在继续,我们也得到了事件:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2021-01-30
    • 2018-12-25
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多