初めて投稿いたします!
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を使う事ができます。
ヘッダファイルの変更
# include ・・・
# include <curl/curl.h> // add to curl
上記の様に対象ソースに定義を追加します。
リンカの設定
VisualStudio ソリューションエクスプローラ > 対象のプロジェクトで右クリック し上記の様に「curl」の定義を追加します。
app_manifest.jsonの変更
"Capabilities": {
"AllowedConnections": [ "xxxxx.azurewebsites.net", "yyyyy.azurewebsites.net" ],
"Gpio": [],
"Uart": [],
"WifiConfig": false
}
上記のとおりAllowedConnectionsに接続したサーバのホスト名を記述します。
記述したホスト以外に接続できませんので、注意が必要です。
curlの実行
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の機能をゴリゴリ使う部分は今後別途投稿していきます。