你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure 事件网格通过 HTTP 发布 MQTT 消息(预览版)

Azure 事件网格现在支持通过 HTTP 发布消息队列遥测传输 (MQTT) 消息。 事件网格使后端系统能够将消息发送到设备,而无需维护持久的 MQTT 连接。 此方法简化了偏好无状态通信的应用程序的集成。 它使用具有 Microsoft Entra ID 的安全身份验证,并向 MQTT 客户端提供可缩放的可靠传递。 本文介绍如何使用 HTTP Publish API。 你还将了解如何使用 Bruno 和 MQTTX 等常用工具获取必要的凭据并验证消息传递。

注释

此功能目前处于预览状态。

本文介绍如何通过事件网格通过 HTTP 来发布 MQTT 消息。

获取连接详细信息

  • 命名空间完全限定的域名 (FQDN):例如 contoso.westus3-1.ts.eventgrid.azure.net
  • 主题:例如 devices/CXa-23112/prompt
  • 凭据:Microsoft Entra ID 客户端凭据。

角色分配

用于发出 HTTP 发布请求的标识必须具有用于 MQTT 消息发布者访问权限的 Azure RBAC 角色 EventGrid TopicSpaces Publisher

获取持有者令牌

运行以下 Azure CLI 命令以获取持有者令牌:

az account get-access-token --resource=https://eventgrid.azure.net --query accessToken -o tsv

保存此令牌以在标头中使用 Authorization: Bearer <TOKEN>

使用 HTTP 发布消息

下面是用于模拟 HTTP Publish 的示例 curl 命令:

curl -X POST "https://contoso.westus3-1.ts.eventgrid.azure.net/mqtt/messages?topic=devices%2XXXX-0000%2Fprompt&api-version=2025-08-01-preview" \ 
  -H "Authorization: Bearer <ENTRA_TOKEN_HERE>" \ 
  -H "mqtt-qos: 1" \ 
  -H "mqtt-retain: 0" \ 
  -H "mqtt-response-topic: devices%2XXXX-00000%2Freply" \ 
  -H "mqtt-correlation-data: XXXXXXX" \ 
  -H "mqtt-user-properties: XXXXXXXXXXXX" \ 
  -H "Content-Type: text/plain;charset=UTF-8" \ 
  --data-raw "Please accept terms of licensing and agreement" 

在此示例命令中:

  • 主题经百分比编码。
  • 为服务质量 (QoS)、RETAIN 标志、响应主题和用户属性添加了可选标头。
  • 负载放在请求正文中。

在 MQTTX 中进行验证

使用 MQTTX 或任何 MQTT 库(如 paho-mqtt Python)订阅同一主题以确认传递。

  1. 在 MQTTX 中创建新的连接:

    • Host: contoso.westus3-1.ts.eventgrid.azure.net
    • Port: 8883 (TLS)
    • Client ID: same as your Entra Object ID
    • Username/Password: N/A — use certificate or token auth if configured
  2. 订阅在 HTTP POST 命令中使用的主题。

  3. 运行 HTTP Publish 并监视 MQTTX 中的消息。 系统应显示你的有效负载。

如果发布成功,则会看到:

  • HTTP 响应:“204 无内容”或“202 已接受”(具体取决于路由规则)。
  • 显示消息:MQTT 客户端立即看到该消息。

故障排除

  • 401 未授权:如果令牌丢失或已过期,你会看到“401 未授权”。此时请刷新令牌。
  • 403 禁止访问:如果主题无效或您没有权限,你会看到“403 禁止访问”。此时请检查主题或权限。
  • 500 内部服务器错误:如果路由在内部失败,请检查事件网格命名空间的指标和诊断日志。
  • 消息未显示:如果消息未显示,请确保主题在 URL 中经过百分比编码。 检查代理路由配置,并验证是否使用了相同的命名空间。