1. hasenagata

    Posted

    hasenagata
Changes in title
+Azure Shpere で curl を使う
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,63 @@
+ 初めて投稿いたします!
+ 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](https://docs.microsoft.com/en-us/azure-sphere/app-development/curl)
+
+ 下記の様にいくつか設定するだけでcurlを使う事ができます。
+###ヘッダファイルの変更
+```c:main.c
+#include ・・・
+#include <curl/curl.h> // add to curl
+```
+上記の様に対象ソースに定義を追加します。
+
+###リンカの設定
+![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/f5bdb781-b8ea-1a0d-395e-dc99deac0efc.png)
+
+
+VisualStudio ソリューションエクスプローラ > 対象のプロジェクトで右クリック し上記の様に「curl」の定義を追加します。
+###app_manifest.jsonの変更
+```JSON:app_manifest.json
+ "Capabilities": {
+ "AllowedConnections": [ "xxxxx.azurewebsites.net", "yyyyy.azurewebsites.net" ],
+ "Gpio": [],
+ "Uart": [],
+ "WifiConfig": false
+ }
+```
+上記のとおり**AllowedConnections**に接続したサーバのホスト名を記述します。
+記述したホスト以外に接続できませんので、注意が必要です。
+
+###curlの実行
+```c: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の機能をゴリゴリ使う部分は今後別途投稿していければと思います。
+