Python 虚拟设备处理来自 Azure IoT 中心的更改事件
Python virtual device handle changed event from azure IoT hub
所以,我是 python 的新手,运行 遇到了一个我真的无法解决的问题。
我有一个在 python 中编程的虚拟设备,它连接到 Azure IoT 中心。正如你们中的一些人可能知道的那样,连接到 IoT 中心的设备有一个设备孪生,它定义了设备的属性。 (这是一个基本的 JSON 对象)
这样做的想法是,后端可以更改设备孪生,这在设备上可能会影响操作模式。
到目前为止,我只想实现以下,这是非常基本的:
- 我的虚拟设备侦听设备孪生更改(不锁定我的代码)
- 我在 Azure
中更改设备孪生 属性
- 事件触发并打印出新的设备孪生属性(最终,这应该调用一些其他代码,以更改操作模式)
到目前为止我有以下内容:
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
中的一些值:
计数还在继续,我们也收到了事件:
所以,我是 python 的新手,运行 遇到了一个我真的无法解决的问题。
我有一个在 python 中编程的虚拟设备,它连接到 Azure IoT 中心。正如你们中的一些人可能知道的那样,连接到 IoT 中心的设备有一个设备孪生,它定义了设备的属性。 (这是一个基本的 JSON 对象)
这样做的想法是,后端可以更改设备孪生,这在设备上可能会影响操作模式。
到目前为止,我只想实现以下,这是非常基本的:
- 我的虚拟设备侦听设备孪生更改(不锁定我的代码)
- 我在 Azure 中更改设备孪生 属性
- 事件触发并打印出新的设备孪生属性(最终,这应该调用一些其他代码,以更改操作模式)
到目前为止我有以下内容:
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
中的一些值:
计数还在继续,我们也收到了事件: