이 빠른 시작에서는 Azure Event Grid MQTT broker 기능을 사용하여 MQTT 프로토콜을 사용하여 메시징을 지원합니다. 디바이스와 클라우드 애플리케이션을 모두 포함하는 클라이언트는 대규모 브로드캐스트 및 명령 및 제어와 같은 시나리오에 대해 유연한 계층적 토픽을 통해 MQTT 메시지를 게시하고 구독할 수 있습니다.
이 문서에서는 Azure CLI를 사용하여 다음을 수행합니다.
- Event Grid 네임스페이스를 만들고 MQTT 브로커를 사용하도록 설정합니다.
- 클라이언트, 클라이언트 그룹 및 토픽 공간과 같은 하위 리소스를 만듭니다.
- 토픽 공간을 게시하고 구독할 수 있는 액세스 권한을 클라이언트에 부여합니다.
- MQTT 메시지를 게시하고 받습니다.
Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만드세요.
필수 조건
- Event Grid를 새로 사용하는 경우 이 자습서를 시작하기 전에 Event Grid 개요 를 참조하세요.
- Event Grid 리소스 공급자 등록하기의 단계에 따라 Event Grid 리소스 공급자를 등록합니다.
- 방화벽에서 포트 8883이 열려 있는지 확인합니다. 이 자습서에서는 포트 8883을 통해 통신하는 MQTT 프로토콜을 사용합니다. 이 포트는 일부 회사 및 교육용 네트워크 환경에서 차단될 수 있습니다.
- Bash 환경을 Azure Cloud Shell에서 사용합니다. 자세한 내용은 Azure Cloud Shell 시작을 참조하세요.
- CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치하십시오. Windows 또는 macOS에서 실행하는 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI 실행을 참조하세요.
- 로컬 설치를 사용하는 경우
az login
명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 Azure에 인증을 참조하세요. - 메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI 확장 관리를 참조하세요.
- az version을 실행하여 설치된 버전과 관련 종속 라이브러리를 확인합니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
- 이 문서에는 Azure CLI 버전 2.53.1 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.
- 지문을 생성하고 클라이언트 연결을 인증하려면 X.509 클라이언트 인증서가 필요합니다.
- Event Grid 네임스페이스의 CLI 명령을 검토합니다.
샘플 클라이언트 인증서 및 지문 생성
인증서가 아직 없는 경우 단계 CLI를 사용하여 샘플 인증서를 만들 수 있습니다. Windows용으로 수동으로 설치하는 것이 좋습니다.
CLI 단계를 사용하여 성공적으로 설치한 후 사용자 프로필 폴더(Win+R type %USERPROFILE%
)에서 명령 프롬프트 창을 엽니다.
루트 및 중간 인증서를 만들려면 다음 명령을 실행합니다. 다음 단계에서 사용해야 하는 암호를 기억하세요.
step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
클라이언트에 대한 인증서를 만들려면 생성된 CA(인증 기관) 파일을 사용합니다. 명령에서 인증서 및 비밀 파일에 대한 올바른 경로를 사용해야 합니다.
step certificate create client1-authnID client1-authnID.pem client1-authnID.key --ca .step/certs/intermediate_ca.crt --ca-key .step/secrets/intermediate_ca_key --no-password --insecure --not-after 2400h
지문을 보려면 step 명령을 실행합니다.
step certificate fingerprint client1-authnID.pem
네임스페이스 만들기
이 명령을 사용하여 네임스페이스를 만듭니다. 리소스 그룹 및 네임스페이스 이름으로 명령을 업데이트합니다.
az eventgrid namespace create --resource-group {Resource Group} --name {Namespace Name} --topic-spaces-configuration "{state:Enabled}"
이 빠른 시작을 단순하게 유지하려면 최소한의 속성으로 네임스페이스를 만듭니다. 다른 탭의 네트워크, 보안 및 설정에 대한 자세한 내용은 네임스페이스 만들기 및 관리를 참조하세요.
클라이언트 만들기
이 명령을 사용하여 클라이언트를 만듭니다. 리소스 그룹 및 네임스페이스 이름으로 명령을 업데이트합니다.
az eventgrid namespace client create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Client Name} --authentication-name client1-authnID --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[Client Thumbprint]}"
- 이 빠른 시작을 단순하게 유지하려면 인증에 지문 일치를 사용합니다. 클라이언트 인증에 X.509 CA 인증서 체인을 사용하는 방법에 대한 단계는 인증서 체인을 사용하여 클라이언트 인증을 참조하세요.
- 이 연습에서는 네임스페이스의 모든 클라이언트를 포함하는 기본
$all client
그룹을 사용합니다. 클라이언트 특성을 사용하여 사용자 지정 클라이언트 그룹을 만드는 방법에 대한 자세한 내용은 클라이언트 그룹을 참조하세요.
토픽 공간 만들기
이 명령을 사용하여 토픽 공간을 만듭니다. 리소스 그룹, 네임스페이스 이름 및 토픽 공간 이름으로 명령을 업데이트합니다.
az eventgrid namespace topic-space create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Topicspace Name} --topic-templates ['contosotopics/topic1']
권한 바인딩 만들기
명령을 az eventgrid
사용하여 게시자 권한에 대한 첫 번째 권한 바인딩을 만듭니다. 리소스 그룹, 네임스페이스 이름 및 권한 바인딩 이름으로 명령을 업데이트합니다.
az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}
이 명령을 사용하여 두 번째 권한 바인딩을 만듭니다. 리소스 그룹, 네임스페이스 이름 및 권한 바인딩 이름으로 명령을 업데이트합니다. 이 권한 바인딩은 구독자를 위한 것입니다.
az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}
MQTT 메시지 게시 및 구독
다음 샘플 코드는 네임스페이스에 연결 및 게시를 시도하고 MQTT 토픽을 구독하는 간단한 .NET 게시자입니다. 요구 사항에 맞게 코드를 수정하고 Visual Studio 또는 다른 디자인 도구에서 실행할 수 있습니다.
이 코드를 실행하려면 NuGet에서 MQTTnet 패키지(버전 4.1.4.563)를 설치해야 합니다. Visual Studio에서 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리로 이동하여 MQTTnet을 검색합니다. MQTTnet 패키지를 선택하고 설치합니다.
비고
다음 샘플 코드는 데모용으로만 사용되며 프로덕션용으로 사용되지 않습니다.
클라이언트를 연결하고, 게시하고, 토픽의 MQTT 메시지를 구독하는 샘플 C# 코드
중요합니다
클라이언트 인증서 파일의 위치에 따라 클라이언트 인증서 및 키 pem 파일 경로를 업데이트합니다. 또한 클라이언트 인증 이름 및 토픽 정보가 구성과 일치하는지 확인합니다.
using MQTTnet.Client;
using MQTTnet;
using System.Security.Cryptography.X509Certificates;
string hostname = "{Your Event Grid namespace MQTT hostname}";
string clientId = "client1-session1"; //client ID can be the session identifier. A client can have multiple sessions using username and clientId.
string x509_pem = @" client certificate cer.pem file path\client.cer.pem"; //Provide your client certificate .cer.pem file path
string x509_key = @"client certificate key.pem file path\client.key.pem"; //Provide your client certificate .key.pem file path
var certificate = new X509Certificate2(X509Certificate2.CreateFromPemFile(x509_pem, x509_key).Export(X509ContentType.Pkcs12));
var mqttClient = new MqttFactory().CreateMqttClient();
var connAck = await mqttClient!.ConnectAsync(new MqttClientOptionsBuilder()
.WithTcpServer(hostname, 8883)
.WithClientId(clientId)
.WithCredentials("client1-authnID", "") //use client authentication name in the username
.WithTls(new MqttClientOptionsBuilderTlsParameters()
{
UseTls = true,
Certificates = new X509Certificate2Collection(certificate)
})
.Build());
Console.WriteLine($"Client Connected: {mqttClient.IsConnected} with CONNACK: {connAck.ResultCode}");
mqttClient.ApplicationMessageReceivedAsync += async m => await Console.Out.WriteAsync($"Received message on topic: '{m.ApplicationMessage.Topic}' with content: '{m.ApplicationMessage.ConvertPayloadToString()}'\n\n");
var suback = await mqttClient.SubscribeAsync("contosotopics/topic1");
suback.Items.ToList().ForEach(s => Console.WriteLine($"subscribed to '{s.TopicFilter.Topic}' with '{s.ResultCode}'"));
while (true)
{
var puback = await mqttClient.PublishStringAsync("contosotopics/topic1", "hello world!");
Console.WriteLine(puback.ReasonString);
await Task.Delay(1000);
}
여러 클라이언트가 클라이언트 간에 게시 및 구독할 수 있도록 동일한 코드를 복제하고 수정할 수 있습니다.
관련 콘텐츠
- 자습서: 네임스페이스 항목을 사용하여 MQTT 메시지를 Azure Event Hubs로 라우팅
- 자습서: 사용자 지정 항목을 사용하여 MQTT 메시지를 Azure Functions로 라우팅
코드 샘플은 이 GitHub 리포지토리를 참조하세요.