IoT Hub는 클라우드에서 호스팅되는 관리형 서비스로, IoT 애플리케이션과 관리하는 장치 간의 양방향 통신을 위한 중앙 메시지 허브 역할을 합니다. Azure IoT Hub를 사용하여 수백만 개의 IoT 장치와 클라우드 호스팅 솔루션 백엔드 간의 신뢰할 수 있고 안전한 통신으로 IoT 솔루션을 구축할 수 있습니다. 사실상 모든 장치를 IoT Hub에 연결할 수 있습니다.
IoT Hub는 장치에서 클라우드로, 그리고 클라우드에서 장치로의 통신을 모두 지원합니다. IoT Hub는 device-to-cloud telemetry, 장치로부터의 파일 업로드, 클라우드에서 장치를 제어하기 위한 request-reply 메서드와 같은 여러 메시징 패턴을 지원합니다. IoT Hub 모니터링은 장치 생성, 장치 실패 및 장치 연결과 같은 이벤트를 추적하여 솔루션의 상태를 유지하는 데 도움이 됩니다.
IoT Hub의 기능은 제조에 사용되는 산업 장비 관리, 의료 분야의 귀중한 자산 추적, 사무실 건물 사용량 모니터링과 같은 확장 가능하고 완전한 기능을 갖춘 IoT 솔루션을 구축하는 데 도움이 됩니다.
IoT Hub은 기기가 데이터를 보낼 수 있는 보안 통신 채널을 제공합니다. IoT Hub과 기기 SDK는 기기 연결을 위해 다음 프로토콜을 지원합니다:
MQTT
MQTT over WebSockets
여러 인증 유형이 다양한 장치 기능을 지원합니다:
IoT 솔루션을 빠르게 시작하기 위한 SAS 토큰 기반 인증입니다.
안전하고 표준 기반의 인증을 위한 개별 X.509 인증서 인증입니다.
TsgcIoTAzure_MQTT_Client는 Azure IoT에 연결하는 데 사용되는 구성 요소입니다. 하나의 클라이언트는 단 하나의 장치에만 연결할 수 있습니다. 클라이언트는 일반 MQTT 프로토콜을 사용하여 연결하고 SAS / X.509 Client Certificate를 사용하여 인증합니다.
Azure IoT Hub에 연결하려면 클라이언트에 다음 속성이 필요합니다:
Azure.IoTHub: MQTT 클라이언트가 연결할 서버 이름입니다.
Azure.DeviceId: Azure IoT Hub의 장치 이름입니다.
Azure는 여러 인증 유형을 허용하며, 기본적으로 SAS 토큰을 사용합니다.
SAS 인증
SAS.Enabled: 인증이 SAS를 사용하는 경우 활성화하십시오.
SAS.SecretKey: Azure IoT 계정의 SAS Token입니다.
SAS.KeyName: Shared Access Key Name입니다.
SAS.Expiry: SAS Token이 만료되기 전 분 수를 설정합니다. 기본값은 1440(24시간)입니다.
연결 문자열이 있는 경우, ReadConnectionString 메서드를 사용하여 연결 문자열 값을 자동으로 읽을 수 있습니다. 예제:
ReadConnectionString('HostName=yourhub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=Yj7RRPnkSDTv+UCFLgwIP/FrbDymZv4qVAIoTLHUFR8=');
X509 Certificates
IOHandler로 OpenSSL 사용
Certificate.Enabled: 인증이 인증서를 사용하는 경우 활성화하십시오.
Certificate.CertFile: X.509 클라이언트 인증서 경로입니다.
Certificate.KeyFile: X.509 클라이언트 키 파일의 경로입니다.
Certificate.Password: 인증서에 비밀번호가 있는 경우 여기에 설정하십시오.
Version: TLS 버전이며, 기본적으로 TLS 1.0을 사용합니다.
IOHandler로 SChannel을 사용
Certificate.Enabled: 인증이 인증서를 사용하는 경우 활성화하십시오.
Certificate.CertFile: PFX 인증서 경로(먼저 인증서를 PFX로 변환해야 함). 자세히 보기.
Certificate.Password: 인증서에 비밀번호가 있는 경우 여기에 설정하십시오.
Version: TLS 버전이며, 기본적으로 TLS 1.0을 사용합니다.
기타 속성:
MQTTHeartBeat: 활성화하면 x초마다 ping을 보내 MQTT 연결을 유지하려고 시도합니다.
Interval: 각 ping 사이의 초 수입니다.
WatchDog: 활성화되면 예기치 않은 연결 끊김이 감지될 때 서버에 자동으로 재연결을 시도합니다.
Interval: 재연결 시도 전 초.
Attempts: 최대 재연결 시도 횟수입니다. 0은 무제한을 의미합니다.
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 애플리케이션 속성을 추가합니다. 이 경우 retain 메시지를 유지하는 대신 IoT Hub는 이를 백엔드 앱으로 전달합니다.
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. 시계열 텔레메트리 및 알림을 위한 Device-to-cloud 메시지.
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을 설정해야 하는 경우 이러한 값을 Properties List에 추가해야 합니다. 이러한 속성의 이름은 Azure에 의해 정의됩니다.
| Name | Value |
| $.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. 결과의 즉각적인 확인이 필요한 통신을 위한 Direct 메서드입니다. Direct 메서드는 종종 팬을 켜는 것과 같은 장치의 대화형 제어에 사용됩니다.
oClient.Subscribe_DirectMethod;
다음 메서드를 사용하여 public 메서드에 응답할 수 있습니다.
oClient.RespondPublicMethod(RequestId, Status, 'Your Response', azuIoTQoS1);
2. 장기 실행 명령을 위한 Twin의 desired 속성은 장치를 특정 desired 상태로 만들기 위한 것입니다. 예를 들어, 텔레메트리 전송 간격을 30분으로 설정합니다. 다음 메서드를 사용하여 속성을 가져올 수 있습니다.
oClient.Get_DeviceTwinsProperties('1');
3. 장치 앱으로의 단방향 알림을 위한 Cloud-to-device 메시지입니다. 메시지를 받으려면 먼저 구독해야 합니다.
oClient.Subscribe_CloudToDevice;
메시지는 OnMQTTPublish 이벤트(텍스트 페이로드) 또는 OnMQTTPublishEx 이벤트(Value, Bytes 및 Stream 속성을 가진 TsgcWSMQTTPublishData로서의 페이로드)에서 수신됩니다.
procedure TFRMSGCClientIoT.AzureIoTMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
DoLog('Received Message: ' + aTopic + ' ' + aText);
end;
IoT hub는 연결된 디바이스에 공유 액세스 서명(SAS) URI 또는 X509 인증서를 제공하여 디바이스로부터의 파일 업로드를 용이하게 합니다.
SAS를 선택하면 다음 속성을 설정해야 합니다:
X509 인증서를 선택하는 경우 다음 속성을 설정해야 합니다:
Azure 서버에 파일을 업로드하려면 UploadFile 메서드를 사용하십시오. 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;
IoT Hub에 연결된 디바이스와 상호 작용하려면 Azure IoT Explorer 애플리케이션을 사용할 수 있습니다. 수신된 텔레메트리 메시지, 등록된 디바이스 등을 볼 수 있습니다. 애플리케이션은 무료이며 다음에서 다운로드할 수 있습니다:
https://github.com/Azure/azure-iot-explorer/releases