IoT Hub 是托管在云中的托管服务,充当 IoT 应用程序与其管理的设备之间双向通信的中央消息枢纽。您可以使用 Azure IoT Hub 构建与数百万 IoT 设备及云托管解决方案后端之间通信可靠且安全的 IoT 解决方案。几乎任何设备都可以连接到 IoT Hub。
IoT Hub 支持从设备到云以及从云到设备的双向通信。IoT Hub 支持多种消息传递模式,例如设备到云的遥测、设备的文件上传以及从云控制设备的请求-响应方法。IoT Hub 监控通过跟踪设备创建、设备故障和设备连接等事件来帮助维护解决方案的健康状态。
IoT Hub 的功能帮助您构建可扩展的全功能 IoT 解决方案,例如管理制造业中使用的工业设备、追踪医疗保健中的宝贵资产以及监控办公楼的使用情况。
IoT Hub 为您的设备提供安全的通信通道以发送数据。IoT Hub 和设备 SDK 支持以下用于连接设备的协议:
MQTT
MQTT over WebSockets
多种认证类型支持各种设备能力:
SAS 基于令牌的身份验证,可快速开始使用您的物联网解决方案。
单独的 X.509 证书身份验证,用于安全的、基于标准的认证。
TsgcIoTAzure_MQTT_Client 是用于连接 Azure IoT 的组件。一个客户端只能连接到一个设备。该客户端使用纯 MQTT 协议连接,并通过 SAS / X.509 客户端证书进行身份验证。
为了连接到 Azure IoT Hub,客户端需要以下属性:
Azure.IoTHub: MQTT 客户端将连接的服务器名称。
Azure.DeviceId:Azure IoT Hub 中设备的名称。
Azure 支持多种认证类型,默认使用 SAS 令牌。
SAS 认证
SAS.Enabled:若身份验证使用 SAS,请启用此选项。
SAS.SecretKey:来自您 Azure IoT 账户的 SAS 令牌。
SAS.KeyName:共享访问密钥名称。
SAS.Expiry:设置 SAS 令牌过期前的分钟数。默认值为 1440(24 小时)。
如果您有连接字符串,可以使用 ReadConnectionString 方法自动读取连接字符串的值。示例:
ReadConnectionString('HostName=yourhub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=Yj7RRPnkSDTv+UCFLgwIP/FrbDymZv4qVAIoTLHUFR8=');
X509 证书
使用 OpenSSL 作为 IOHandler
Certificate.Enabled:若身份验证使用证书,请启用此项。
Certificate.CertFile:X.509 客户端证书的路径。
Certificate.KeyFile:X.509 客户端密钥文件的路径。
Certificate.Password:如果证书设有密码,请在此填写。
Version:TLS 版本,默认使用 TLS 1.0
将 SChannel 用作 IOHandler
Certificate.Enabled:若身份验证使用证书,请启用此项。
Certificate.CertFile:PFX 证书路径(证书必须先转换为 PFX 格式)。了解更多。
Certificate.Password:如果证书设有密码,请在此填写。
Version:TLS 版本,默认使用 TLS 1.0
其他属性:
MQTTHeartBeat:若启用,尝试通过每 x 秒发送一次 ping 来保持 MQTT 连接活跃。
Interval:每次 ping 之间的秒数。
WatchDog:如果启用,当检测到意外断开连接时,将尝试自动重新连接到服务器。
Interval:两次重连尝试之间的秒数。
Attempts: 最大重连尝试次数;零表示无限制。
LogFile:若启用,将套接字消息保存到日志文件(对调试有用)。如果从多个线程访问,日志文件的访问不是线程安全的。
Enabled:如果启用,每次套接字接收和发送消息时,都会将其保存到文件中。
FileName:文件的完整路径。
Azure MQTT 实现基于 MQTT 3.1.1 版本,但与规范存在以下偏差:
IoT Hub 不支持 QoS 2 消息。如果设备应用以 QoS 2 发布消息,IoT Hub 将关闭网络连接。
IoT Hub 不持久化 Retain 消息。如果设备发送了 RETAIN 标志设置为 1 的消息,IoT Hub 会在消息中添加 x-opt-retain 应用属性并将其传递给后端应用。
IoT Hub 每台设备只支持一个活跃的 MQTT 连接。使用相同设备 ID 发起的任何新 MQTT 连接都会导致 IoT Hub 断开现有连接。
首先,您需要登录 Azure 账户、注册新设备,并为该设备创建认证方法。完成后,您可以创建一个新的 TsgcIoTAzure_MQTT_Client 并连接到 Azure IoT Hub。
例如:
oClient := TsgcIoTAzure_MQTT_Client.Create(nil);
oClient.Azure.IoTHub := 'youriothub.azure-devices.net';
oClient.Azure.DeviceId := 'YourDeviceId';
oClient.SAS.Enabled := True;
oClient.SAS.SecretKey := 'YourSecretKey';
oClient.OnMQTTConnect := OnMQTTConnectEvent;
oClient.Active := True;
procedure OnMQTTConnect(Connection: TsgcWSConnection; const Session: Boolean; const
ReturnCode: TmqttConnReturnCode);
begin
ShowMessage('Connected to Azure IoT Hub');
end;
从设备应用向解决方案后端发送信息时,IoT Hub 提供以下选项:
1. 设备到云消息,用于时序遥测和警报。
oClient.Send_DeviceToCloud('{"temp": 10}', azuIoTQoS1);
您可以使用 TStringList 发送键值属性,只需用所需的消息属性填充 TStringList 并将其作为参数传入即可。
oProperties := TStringList.Create;
Try
oProperties.AddPair('prop_name1', 'prop_value1');
oProperties.AddPair('prop_name2', 'prop_value2');
oClient.Send_DeviceToCloud('{"temp": 10}', oProperties, azuIoTQoS1);
Finally
oProperties.Free;
End;
如果需要设置消息的 ContentType 和 ContentEncoding,必须将这些值添加到属性列表中。这些属性的名称由 Azure 定义。
| Name | 值 |
| $.ct | application/json |
| $.ce | utf-8 |
oProperties := TStringList.Create;
Try
oProperties.AddPair('$.ct', 'application/json');
oProperties.AddPair('$.ce', 'utf-8');
oClient.Send_DeviceToCloud('{"temp": 10}', oProperties, azuIoTQoS1);
Finally
oProperties.Free;
End;
2. 设备孪生的报告属性,用于报告设备状态信息,例如可用功能、条件或长期运行工作流的状态。例如,配置和软件更新。
oClient.Set_DeviceTwinsProperties('1', '{"sgc":1}');
IoT Hub 为设备应用提供三种向后端应用暴露功能的选项:
1. 直接方法用于需要立即确认结果的通信。直接方法通常用于设备的交互式控制,例如打开风扇。
oClient.Subscribe_DirectMethod;
您可以使用以下方法响应公共方法。
oClient.RespondPublicMethod(RequestId, Status, 'Your Response', azuIoTQoS1);
2. Twin 的期望属性,用于旨在将设备置于某种期望状态的长时间运行命令。例如,将遥测发送间隔设置为 30 分钟。您可以使用以下方法获取属性。
oClient.Get_DeviceTwinsProperties('1');
3. 云到设备消息,用于向设备应用发送单向通知。要接收消息,您必须先订阅。
oClient.Subscribe_CloudToDevice;
消息通过 OnMQTTPublish 事件(文本载荷)或 OnMQTTPublishEx 事件(载荷为 TsgcWSMQTTPublishData,包含 Value、Bytes 和 Stream 属性)接收。
procedure TFRMSGCClientIoT.AzureIoTMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
DoLog('Received Message: ' + aTopic + ' ' + aText);
end;
IoT 中心通过提供共享访问签名(SAS)URI 或 X509 证书,帮助已连接设备上传文件。
如果您选择 SAS,必须设置以下属性:
如果您选择 X509 证书,必须设置以下属性:
使用 UploadFile 方法将文件上传到 Azure 服务器。如果 Overwrite 参数设置为 true,将替换现有文件。如果 Overwrite 参数设置为 false,则仅在文件不存在时才上传,若文件已存在则引发错误(这是默认选项)。
procedure UploadFileToAzure;
begin
oDialog := TOpenDialog.Create(nil);
Try
if oDialog.Execute then
AzureIoT.UploadFile(oDialog.FileName);
Finally
oDialog.Free;
End;
end;
Azure IoT 允许使用 DPS 从代码中注册设备。目前,该库支持通过传递 Scope Id 和 Registration Id 作为参数来注册设备。
oClient := TsgcIoTAzure_MQTT_Client.Create(nil);
Try
oClient.Certificate.CertFile := 'cert.pem';
oClient.Certificate.KeyFile := 'key.pem';
oClient.Certificate.Enabled := True;
oResponse := TsgcIoT_Azure_OperationRegistrationState.Create;
Try
if oClient.ProvisioningDeviceClient_Register('scope_id', 'registration_id', oResponse) then
ShowMessage('#Provisioning Register OK: ' + oResponse.Status)
else
ShowMessage('#Provisioning Register Error: ' + oResponse.Status);
Finally
FreeAndNil(oResponse);
End;
Finally
FreeAndNil(oClient);
End;
您可以使用 Azure IoT Explorer 应用程序与连接到您的 IoT Hub 的设备进行交互,查看收到的遥测消息、已注册的设备等信息。该应用程序免费,可从以下地址下载:
https://github.com/Azure/azure-iot-explorer/releases