Azure Functions에서 Azure IoT Hub의 C2D 메시지 보내기

이 기사는 AI 스피커와 FlashAir로 철도 모형을 움직여 보았습니다. 참조 기사입니다.

Azure Functions란 무엇입니까?



Azure Functions에 대해서는, 이 문서 Azure 포털에서 처음 함수 만들기를 읽어 주세요.

이번에 만들고 싶은 것



이번은 Azure IoT Hub로 관리되는 디바이스에 클라우드 측에서 메시지를 보내는 것을 목적으로 하고 있습니다. Logic Apps에 Azure IoT Hub의 커넥터가 있으면 좋지만 현재 존재하지 않으므로 Azure Functions에서 Azure IoT Hub의 API를 호출하는 WebAPI를 만들려고합니다.
 여기의 문서 디바이스에 IoT Hub를 사용하여 클라우드에서 메시지 보내기(.NET) 를 참고로 합니다.

Azure Functions 함수 만들기



함수 만들기



사키의 문서에 있는 「HTTP 에 의해 트리거되는 함수의 작성」과 같이, HTTP 트리거의 함수를 작성합니다.

Azure IoT device SDK 추가



Azure IoT device SDK 을 이용하기 위해서, 우선 Azure Functions로 앞서 추가한 함수의 「파일의 표시」로부터 「project.json」이라고 하는 파일을 추가합니다.


「project.json」에는, 이하와 같이 기재합니다.

project.json
{
  "frameworks":{
    "net46":{
     "dependencies":{
      "Microsoft.Azure.Devices": "1.5.1"
    }
  }
}

함수의 본문



함수 본체는 run.csx입니다.
 사키에 추가한 Azure IoT device SDK를 사용하기 위해 「using Microsoft.Azure.Devices;」를 추가하고 있습니다. 이 때 '#r'에 의한 선언은 불필요합니다.


run.csx
using System.Net;
using System.Text;
using Microsoft.Azure.Devices;
static ServiceClient serviceClient;
static string connectionString = "ここにAzure IoT hubの接続文字列を記載する";
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");
    // Get request body
    dynamic data = await req.Content.ReadAsAsync<object>();
    string devicename = data.devicename;
    string trainSpeed = data.speed;
    string trainDirection = data.direction;

    if(trainSpeed.Length < 3){
        for(int i = 3 - trainSpeed.Length; i > 0; i--){
            trainSpeed = "0" + trainSpeed;
        }
    }
    if(trainSpeed.Length > 3){
        trainSpeed = "200";
    }

    string sendmsg = trainSpeed + trainDirection + "000000000";
    await sendMessageToDevice(devicename, sendmsg, log);
    return sendmsg == null
        ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
        : req.CreateResponse(HttpStatusCode.OK, "SendMessage[" + sendmsg + "]");
}

private async static Task sendMessageToDevice(string devname, string msg, TraceWriter log)
{
    try
    {
        serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
        SendCloudToDeviceMessageAsync(devname, msg).Wait();
    }
    catch (Exception e)
    {
        log.Info("HTTP Connect Error!![" + e.StackTrace + "]\n");
    }
    return;
}

private async static Task SendCloudToDeviceMessageAsync(string hostname, string msg)
{
     var commandMessage = new Message(Encoding.ASCII.GetBytes(msg));
     await serviceClient.SendAsync(hostname, commandMessage);
}

함수 URL 얻기



Logic Apps에서 이번에 작성한 함수를 호출하려면 함수 run.csx 편집 화면의 오른쪽 상단에 있는 "함수 URL 가져오기"를 클릭하면 다음 화면이 열리고 가져올 수 있습니다.


동작 확인



함수 작성 화면에서 모의적인 입력값(JSON 데이터)을 지정하여 동작 확인할 수 있습니다.

참고 자료


  • Azure 포털에서 처음 함수 만들기
  • 디바이스에 IoT Hub를 사용하여 클라우드에서 메시지 보내기(.NET)
  • Azure IoT device SDK
  • 좋은 웹페이지 즐겨찾기