Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@hasenagata

Azure Sphere で curl を使う

 初めて投稿いたします!
 WEB~組み込みまで、ソフト系いろいろやっているエンジニア hasenagataです。

背景

 最近、業務やその他お試し/実験含めて Azure (特にIoT周り) を触る機会が多くなってきています。
 その流れで AzureSphere MT3620 Development Kit を使って色々開発しているのですが、下記の様な疑問を感じました。
 
   AzureSphere で既存サービスにデータ送るときはどうしたらいいの??

 AzureSphereからのデータ送信について、Azure IoTHub や IoTCentral等のPaasとの連携はサンプルも多いです。しかし、既存サービスに存在するAPI経由でデータを送る方法がいまいちわからずにいました。ただ、色々調べていくとAzureSphereでもcurlを使う事でHTTP/HTTPS経由でデータを送信できることがわかりました。今回はその内容を自分の備忘録も兼ねて記載します。

AzureSphere で curl を使う

 基本的には次のドキュメントを参考にしています。
 ・Connect to web services - AzureSphere

 下記の様にいくつか設定するだけでcurlを使う事ができます。

ヘッダファイルの変更

main.c
#include ・・・
#include <curl/curl.h>  // add to curl

上記の様に対象ソースに定義を追加します。

リンカの設定

tempsnip.png

VisualStudio ソリューションエクスプローラ > 対象のプロジェクトで右クリック し上記の様に「curl」の定義を追加します。

app_manifest.jsonの変更

app_manifest.json
  "Capabilities": {
    "AllowedConnections": [ "xxxxx.azurewebsites.net", "yyyyy.azurewebsites.net" ],
    "Gpio": [],
    "Uart": [],
    "WifiConfig": false
  }

上記のとおりAllowedConnectionsに接続したサーバのホスト名を記述します。
記述したホスト以外に接続できませんので、注意が必要です。

curlの実行

main.c
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_URL, "http://xxxxx.azurewebsites.net/data/");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sendJson);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buf);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ApibufferWriter);
rt = curl_easy_perform(curl);
curl_easy_cleanup(curl);

 あとはcurlを実行すればOKです。
 上記は sendJson に格納したJSON形式のデータをhttp://xxxxx.azurewebsites.net/data/にPOSTする際の例です。

まとめ

 上記の様にする事で既存のAPIに則ってHTTP/HTTPSでデータを送信することができました。私の場合は他の処理や割り込みを考慮して通信部処理にキューを使ったりもしていました。
 ただ、上記のやり方はAzureSphereの強力なセキュリティ機能や認証機能を使わずにデータを送信しています。ですので、基本的にはIoTHub等のAzure のPaaSと組み合わせて使うべきなんだろうなと個人的には思います。
 本来のAzureの機能をゴリゴリ使う部分は今後別途投稿していきます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?