Azure 如何通过HTTP按设备从IoT Hub检索最新消息(事件)

Azure 如何通过HTTP按设备从IoT Hub检索最新消息(事件),azure,http,synchronous,azure-iot-hub,Azure,Http,Synchronous,Azure Iot Hub,我发现了许多关于如何从运行的物联网中心检索数据的示例。然而,在所有这些情况下,都需要使用某些变体 JavaScript客户机SDK,此示例位于 甚至还有一个,但它只用于管理设备和发送数据 我需要一种方法立即从物联网设备获取最新消息。 脚本 我正在使用4台设备运行一个小型气象站,这些设备将数据发送到物联网中心。作为展示,我想回收一个。它的浏览器不支持WebSocket,因此排除了所有现代方法 我将使用轮询更新这些值,最好使用简单的HTTP GET请求,每15分钟更新一次 我运行了上面提到的示

我发现了许多关于如何从运行的物联网中心检索数据的示例。然而,在所有这些情况下,都需要使用某些变体

  • JavaScript客户机SDK,此示例位于
  • 甚至还有一个,但它只用于管理设备和发送数据
我需要一种方法立即从物联网设备获取最新消息。

脚本 我正在使用4台设备运行一个小型气象站,这些设备将数据发送到物联网中心。作为展示,我想回收一个。它的浏览器不支持WebSocket,因此排除了所有现代方法

我将使用轮询更新这些值,最好使用简单的HTTP GET请求,每15分钟更新一次


我运行了上面提到的示例(qrysweathertest.azurewebsites.net),但它使用web套接字,因此无法在1stGen iPad上工作。

这在IoT Hub中是不可能的。您必须将遥测值存储到存储器(例如数据库),并构建一个小API来检索最新的值。您可以使用Azure函数存储和检索这些值,这将是启用您的场景的一种低成本方法


或者,IoT Central支持通过网络检索最新遥测值。IoT Central的仪表板功能可能会覆盖您的整个场景。

您的业余爱好项目的另一个备选方案可以考虑使用设备twin标记来存储最后的遥测数据

基本上,您可以使用EventGridTrigger订阅者以推送方式或使用拉送方式将遥测数据存储到设备twin tags属性,例如,IoHubTrigger功能作为IoHub流管道的消费者

以下代码段显示了IoTubTrigger函数的示例:

run.csx:

#r“Microsoft.Azure.EventHubs”
#r“Newtonsoft.Json”
#r.。\\bin\\Microsoft.Azure.Devices.dll
#r.。\\bin\\Microsoft.Azure.Devices.Shared.dll
使用Microsoft.Azure.Devices;
Net系统;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Extensions.Primitives;
使用Microsoft.Azure.EventHubs;
使用Newtonsoft.Json;
使用Newtonsoft.Json.Linq;
使用系统文本;
静态RegistryManager RegistryManager=RegistryManager.CreateFromConnectionString(Environment.GetEnvironmentVariable(“AzureIoTubShariedAccessPolicy”);
公共静态异步任务运行(EventData消息、ILogger日志)
{
log.LogInformation($“\nSystemProperties:\n\t{string.Join(“|”),message.SystemProperties.Select(i=>$”{i.Key}={i.Value})});
if(message.SystemProperties[“iothub消息源”]?.ToString()=“遥测”)
{    
var connectionDeviceId=message.SystemProperties[“iothub连接设备id”].ToString();
var msg=Encoding.UTF8.GetString(message.Body.Array);
log.LogInformation($“DeviceId={connectionDeviceId},Telemetry={msg}”);
var twinPatch=JsonConvert.SerializeObject(新{tags=new{telemetry=new{lastdupdated=message.SystemProperties[“iothub-enqueuedtime”],data=JObject.Parse(msg)}});
等待registryManager.ReplaceTwinAsync(connectionDeviceId,twinPatch,“*”);
}
}
function.json:

{
“绑定”:[
{
“名称”:“消息”,
“连接”:“我的IoTub”,
“eventHubName”:“我的名字”,
“consumerGroup”:“函数”,
“基数”:“一”,
“方向”:“在”,
“类型”:“eventHubTrigger”
}
]
}
一旦遥测数据存储在设备twin tags属性中,我们就可以使用所有iothub内置功能以编程方式或使用azure门户查询和检索设备twin

以下示例显示了从所有设备获取遥测数据的查询字符串:

SELECT devices.id, devices.tags.telemetry FROM devices WHERE is_defined(devices.tags.telemetry)
使用,我们可以获得查询字符串的结果,请参见以下示例:

使用,我们可以获得特定设备的设备双胞胎,请参见以下示例:

注:

  • REST请求需要sas令牌作为授权标头
  • 上述解决方案不适用于基本层物联网集线器(没有双设备)
  • 此解决方案适用于业余爱好项目(免费和S1定价层),如果有数百台设备频繁接收遥测数据,请参阅有关查询和双更新限制的文档

  • 感谢您提及物联网中心。我不知道这件事。对于我的爱好项目来说,这可能有点太复杂了,所以我将首先研究Azure功能。对于爱好项目,我通常从IoT Central开始(它在幕后利用IoT Hub),但这并不总是答案。