You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python定时生成测试数据发送至Azure IoT Hub及设备控制指导请求

解决方案指导

一、修改Python代码实现每6分钟定时发送测试数据

无需修改Azure IoT Python SDK本身,直接在业务代码外层添加定时逻辑即可,以下是两种实用实现方式:

方法1:用基础time模块

import time
from azure.iot.device import IoTHubDeviceClient, Message

# 替换为你的设备连接字符串
CONNECTION_STRING = "你的设备连接字符串"

def send_test_message(client):
    # 生成模拟测试数据,可按需调整字段
    test_data = {
        "temperature": 25.5 + (time.time() % 5),
        "humidity": 60.2 + (time.time() % 3),
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
    }
    message = Message(str(test_data))
    print(f"发送消息: {test_data}")
    client.send_message(message)

def main():
    client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    client.connect()
    
    try:
        while True:
            send_test_message(client)
            # 每6分钟发送一次(6*60=360秒)
            time.sleep(360)
    except KeyboardInterrupt:
        print("停止客户端...")
        client.disconnect()

if __name__ == "__main__":
    main()

方法2:用schedule库(更灵活的任务调度)

先安装依赖:pip install schedule

import schedule
import time
from azure.iot.device import IoTHubDeviceClient, Message

CONNECTION_STRING = "你的设备连接字符串"
client = None

def send_test_message():
    global client
    test_data = {
        "temperature": 25.5 + (time.time() % 5),
        "humidity": 60.2 + (time.time() % 3),
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
    }
    message = Message(str(test_data))
    print(f"发送消息: {test_data}")
    client.send_message(message)

def main():
    global client
    client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    client.connect()
    
    # 配置每6分钟执行一次发送任务
    schedule.every(6).minutes.do(send_test_message)
    
    try:
        while True:
            schedule.run_pending()
            time.sleep(1)
    except KeyboardInterrupt:
        print("停止客户端...")
        client.disconnect()

if __name__ == "__main__":
    main()

二、数据路由与分析监控

利用Azure IoT Hub内置的路由功能,可将设备数据转发至不同服务做存储或分析,同时支持实时监控:

1. 配置IoT Hub消息路由

  • 登录Azure门户,进入你的IoT Hub,左侧菜单选择消息路由
  • 点击添加,设置路由名称,数据源选择设备遥测消息
  • 选择终点类型:比如选存储容器(存储历史数据用于离线分析),或事件中心(对接实时分析工具)
  • 可选设置路由查询(如仅转发温度超过30的数据:$body.temperature > 30)
  • 保存后,设备消息会自动转发至指定终点

2. 实时监控数据

使用Azure IoT Explorer工具:

  • 连接你的IoT Hub后,选择设备,找到目标设备进入遥测页面,即可实时接收设备发送的消息
  • 也可在IoT Hub的监控菜单查看设备连接状态、消息发送统计等数据

三、用云数据控制ESP8266/Arduino设备

Azure IoT Hub支持直接方法(即时控制)和设备孪生(配置同步)两种控制方式:

1. 直接方法(即时控制示例:远程开关LED)

  • 云侧Python代码(调用设备方法):
from azure.iot.hub import IoTHubRegistryManager

# 替换为你的IoT Hub连接字符串和设备ID
IOTHUB_CONNECTION_STRING = "你的IoT Hub连接字符串"
DEVICE_ID = "你的设备ID"

def call_toggle_led():
    registry_manager = IoTHubRegistryManager(IOTHUB_CONNECTION_STRING)
    method_params = {
        "methodName": "toggleLED",
        "payload": {"state": "on"},
        "responseTimeoutInSeconds": 30,
        "connectTimeoutInSeconds": 5
    }
    response = registry_manager.invoke_device_method(DEVICE_ID, method_params)
    print(f"设备响应: {response.payload}")

if __name__ == "__main__":
    call_toggle_led()
  • 设备侧ESP8266 Arduino代码(处理方法调用):
#include <AzureIoTHub.h>
#include <AzureIoTProtocol_MQTT.h>

// 替换为你的设备连接字符串
static const char* connectionString = "你的设备连接字符串";
static IoTHubClientHandle iotHubClientHandle;

// 直接方法回调函数
int toggleLED(const char* methodName, const char* payload, size_t size, char** response, size_t* response_size) {
  String payloadStr(payload);
  if(payloadStr.indexOf("\"state\":\"on\"") != -1){
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
  // 返回成功响应
  const char* resp = "{\"result\": \"success\"}";
  *response_size = strlen(resp);
  *response = (char*)malloc(*response_size);
  strncpy(*response, resp, *response_size);
  return 200;
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, MQTT_Protocol);
  // 注册直接方法回调
  IoTHubClient_SetDeviceMethodCallback(iotHubClientHandle, toggleLED, NULL);
}

void loop() {
  IoTHubClient_DoWork(iotHubClientHandle);
  delay(100);
}

2. 设备孪生(配置同步示例:设置目标温度)

  • 云侧Python代码(更新设备孪生):
from azure.iot.hub import IoTHubRegistryManager

IOTHUB_CONNECTION_STRING = "你的IoT Hub连接字符串"
DEVICE_ID = "你的设备ID"

def update_target_temperature():
    registry_manager = IoTHubRegistryManager(IOTHUB_CONNECTION_STRING)
    twin_patch = {
        "properties": {
            "desired": {
                "targetTemperature": 28.0
            }
        }
    }
    registry_manager.update_twin(DEVICE_ID, twin_patch, "")
    print("设备孪生已更新")

if __name__ == "__main__":
    update_target_temperature()
  • 设备侧ESP8266代码(监听孪生变化):
#include <AzureIoTHub.h>
#include <AzureIoTProtocol_MQTT.h>

static const char* connectionString = "你的设备连接字符串";
static IoTHubClientHandle iotHubClientHandle;

// 设备孪生回调函数
void onTwinReceived(DEVICE_TWIN_UPDATE_STATE updateState, const unsigned char* payLoad, size_t size) {
  String payloadStr((const char*)payLoad);
  int tempPos = payloadStr.indexOf("targetTemperature");
  if(tempPos != -1){
    float targetTemp = payloadStr.substring(tempPos + 20).toFloat();
    Serial.print("目标温度已设置为: ");
    Serial.println(targetTemp);
    // 此处添加根据目标温度执行的控制逻辑
  }
}

void setup() {
  Serial.begin(115200);
  iotHubClientHandle = IoTHubClient_CreateFromConnectionString(connectionString, MQTT_Protocol);
  // 注册孪生回调
  IoTHubClient_SetDeviceTwinCallback(iotHubClientHandle, onTwinReceived, NULL);
}

void loop() {
  IoTHubClient_DoWork(iotHubClientHandle);
  delay(100);
}

内容的提问来源于stack exchange,提问作者Prathamesh Parit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:22:51