= Azure IoT Hub 接続サンプル = Azure IoT Hub へ接続する[https://github.com/Azure/azure-iot-sdk-c Azure IoT Hub Device C SDK]を使ったサンプルです。 ターゲットデバイスは、[http://gadget.renesas.com/ja/product/peach.html GR-PEACH]で、Ethernet上のHTTPかMQTTで通信します。 MQTTは、mbedTLS版でのみ確認できています。 [http://gadget.renesas.com/ja/product/sakura.html GR-SAKURA]でも動作確認できています。[https://dev.toppers.jp/trac_user/contrib/wiki/azure_iot_hub こちら]を参照してください。 サンプルを動作させるには、[=#following1 下記]の手順でAzure側にデバイスを追加し、そのデバイスの接続文字列を取得し、ソースコード「app_iothub_client/src/client.c」の以下の個所を書き換える必要があります。 {{{#!c static const char* connectionString = "[device connection string]"; }}} === ダウンロード === #download GR-PEACHのソースコードは[https://github.com/h7ga40/azure_iot_hub_peach Github]にあります。WolfSSLとmbedTLSを両方含んでいます。 ファイルリストの右上にある「Clone or download」の「Download ZIP」をクリックすると、zipファイルでダウンロードできます。 === 開発環境 === ビルドはGCC+Makefileで行います。arm向けGCCは[https://gcc-renesas.com/ja/rz/rz-download-toolchains/ こちら]や[https://launchpad.net/gcc-arm-embedded こちら]から入手できます。 IDEとして[https://www.renesas.com/ja-jp/products/software-tools/tools/ide/e2studio.html e² studio]V7.4.0を使用しました。 Rubyの実行環境が必要なので、​[https://www.ruby-lang.org/ja/downloads/ こちら]からダウンロードして、コマンドプロントから実行できるよう、環境変数でパスを通してください。 デバッグするには[https://github.com/gnu-mcu-eclipse/openocd/releases OpenOCD]が必要です。 インストール後「asp3_dcre\target\gr_peach_gcc\renesas_rza1h_swd.cfg」を、OpenOCDインストールフォルダの下の「scripts\target」にコピーします。 e² studio V7.4.0のプロジェクトファイルも含まれているので、展開したフォルダをワークスペースとして開き、プロジェクトのインポートをこのフォルダに対して行うことで、取り込むことができます。 === フォルダ構成 === ||||||app_iothub_client||サンプルプログラム||TOPPERS License|| ||||||asp3_dcre||RTOS [http://www.toppers.jp/asp3-kernel.html TOPPERS/ASP3]||TOPPERS License|| ||asp3_dcre||||tinet||[http://www.toppers.jp/tinet.html TINET 1.7]をRuby版CFG対応し、IGMPを追加したもの||TOPPERS License|| ||asp3_dcre||||mbed||[https://www.mbed.com/ mbed] HAL APIの利用と実装||Apache 2.0 License|| ||asp3_dcre||syssvc||tlsf||メモリアロケータ[https://github.com/mattconte/tlsf tlsf]||BSD License|| ||||||azure_iothub||[https://github.com/Azure/azure-iot-sdk-c Azure IoT Hub Device C SDK (tag 2019-04-11)]||MIT License|| ||azure_iothub||deps||parson||[https://github.com/kgabis/parson parson] jsonパーサー ||MIT License|| ||azure_iothub||c-utility||adapters||TOPPERS向けの実装を追加||TOPPERS License|| ||||||curl-7.57.0||HTTPクライアント[https://curl.haxx.se/ cURL]||Curl License|| ||||||musl-1.1.18||標準Cライブラリ[http://www.musl-libc.org/ musl]||MIT License|| ||ntshell||||fatfs||FATファイルシステム [http://elm-chan.org/fsw/ff/00index_e.html FatFs]||!FatFs License|| ||ntshell||||ntshell||仮想ターミナル[https://www.cubeatsystems.com/ntshell/ NT-Shell]||MIT License etc.|| ||ntshell||||src||Socket API、標準入出力、ファイルディスクリプタ||TOPPERS License|| ||||||wolfssl-3.15.7||SSL/TLS ライブラリ[https://www.wolfssl.com/ wolfSSL]||GPL/商用|| ||||||mbedtls-2.16.1||SSL/TLS ライブラリ[https://tls.mbed.org/ mbedTLS]||Apache 2.0 License|| ||||||zlib-1.2.11||圧縮・伸張ライブラリ[https://www.zlib.net/ zlib]||zlib License|| === 標準Cライブラリ === [[Image(composition.png, 400px, align=center)]] GCC付属の標準Cライブラリnewlibではなく、muslを使用しています。 付属のnewlibでは、dirent.hやsocket.hがないので、curlやviのコンパイルに向いていません。 Linux向けのmuslを使用することで、POSIX向けのソースコードのコンパイルが難無く行えます。 ただし、未実装のAPIがあるとリンクエラーになります。 このソフトでは、ntshell/srcにコードがありますが、サンプルを動作させる最小限の実装を行っています。 == Azure IoT Hub について == #following1 本サンプルの作成には以下のドキュメントを参考にしました。 https://github.com/ms-iotkithol-jp/IoTKitHoLV4 https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-c Azureの利用は「IoT Hub Free エディション」を使用しました。 https://azure.microsoft.com/ja-jp/pricing/details/iot-hub/ == 開発手順 == === ワークスペースの読み込み === [=#download タウンロード]したファイルを、適当なフォルダに展開します。 この説明では「E:\e2studio\azure_iot_hub_arm」に展開します。 [[Image(Folder.png, 342px, align=center)]] パス名にスペースや漢字などを含むと問題になることがあります。 英数字とアンダーバーのみのフォルダ名で構成されたパス名にします。 e2studioを起動し、ワークスペースの場所に展開したフォルダを指定します。 [[Image(SelectWorkSpace.png, 318px, align=center)]] 起動直後の「ようこそ」画面 [[Image(Welcome.png, 505px, align=center)]] 「ようこそ」ページを閉じます。 [[Image(EmptyWorkSpace.png, 505px, align=center)]] メニューから「ファイル」→「インポート」を選択します。 [[Image(SelectImport.png, 505px, align=center)]] 「一般」の中にある「既存プロジェクトをワーク・スペースへ」を選択し、「次へ」ボタンを押します。 [[Image(ImportProjectToWorkSpace.png, 255px, align=center)]] 「プロジェクトのインポート」画面が表示されます。 [[Image(ImportProject.png, 255px, align=center)]] 「ルート・ディレクトリの選択」にソースを展開したフォルダを入力します。 「参照」ボタンを押して、そのまま「OK」ボタンを押せば入力されます。 [[Image(SelectRootDirectory.png, 255px, align=center)]] インポートが成功すると下記のように、「プロジェクト・マネージャ」にプロジェクトが表示されます。 [[Image(FillProjectWorkSpace.png, 505px, align=center)]] === ビルド === メニューから「プロジェクト」→「すべてビルド」を選択すると、ビルドが開始されます。 [[Image(BuildAll.png, 505px, align=center)]] ビルドが終了すると、「プロジェクト・マネージャ」の「app_iothub_client」の下に「バイナリー」の項目が追加されます。 [[Image(BuildComplate.png, 505px, align=center)]] === 書き込み === GR-PEACHとPCをUSB接続すると、mbedストレージが表示されます。 [[Image(MbedFolder.png, 342px, align=center)]] 出力フォルダの「E:\e2studio\azure_iot_hub_arm\app_iothub_client\Debug」にある「app_iothub_client.bin」をmbedストレージにコピーします。 [[Image(OutputFolder.png, 342px, align=center)]] 時間をかけてプログラムが書き込まれます。 [[Image(CopyBinToMbedFolder.png, 225px, align=center)]] === デバッグ === GR-PEACHとPCをUSB接続し、TeraTermでmbedシリアルポートに接続します。ポーレートは「115,200bps」です。 [[Image(SerialPort.png, 191px, align=center)]] 「プロジェクト・マネージャ」の「app_iothub_client」を右クリックし、出てきたメニューから「プロパティ」を選択します。 [[Image(ProjectProperty.png, 505px, align=center)]] 「OpenOCD Path」画面の「Executable」に「openocd.exe」、「Folder」にopenocd.exeのあるフォルダのパスを入力します。 [[Image(OpenOCDPath.png, 430px, align=center)]] 「プロジェクト・マネージャ」の「app_iothub_client」の「バイナリー」の下に「app_iothub_client.elf」があるので、それを右クリックします。 出てきたメニューから「デバッグ」→「デバッグの構成」を選択します。 [[Image(DebugConfiguration.png, 505px, align=center)]] 「デバッグの構成」画面の「Renesas GDB Hardware Debugging」で右クリックし、「新規」を選択します。 [[Image(NewDebugConf.png, 383px, align=center)]] 表示された「メイン」タブの「プロジェクト」が「app_iothub_client」、「C/C++ アプリケーション」が「Debug\app_iothub_client.elf」になっていることを確認します。 [[Image(DebugConfMain.png, 430px, align=center)]] 「Debugger」タブでは、「Debug hardware」に「E1(RX)」を選択し、「Target Device」にGR-SAKURAのCPU「R5F63NB」を選択します。 [[Image(DebugConfDebugger.png, 430px, align=center)]] チェックを外す。 [#startup][[Image(DebugConfStartup.png, 430px, align=center)]] そのほかの画面には変更はありません。 [[Image(DebugConfSources.png, 430px, align=center)]] [[Image(DebugConfCommon.png, 430px, align=center)]] [[Image(DebugConfSVDPath.png, 430px, align=center)]] 下にある「デバッグ」ボタンを押すと、プログラムのロードが始まり、「パースペクティブ切り替えの確認」画面が表示されますので、「はい」を押します。 プログラムのロードが終わると「start.S」ファイルで停止しています。 [[Image(DebugPerspective.png, 259px, align=center)]] 「デバッグ構成」画面の「[=#startup Startup]」タブのスクロールして下にある「再開」チェックボックスにチェックを入れると、停止せず実行されるようになります。 === 実行 === 実行するとTeraTermの画面に以下のように表示が出ます。 [[Image(DebugStart.png, 505px, align=center)]] 「Enter」キーを入力すると、プロンプト「NTShell」が表示されます。 [[Image(TeraTermStart.png, 369px, align=center)]] 試しに「dhcpc renew」+「Enter」を入力すると、DHCPからIPアドレスの取得を開始します。 [[Image(TeraTermDhcp.png, 369px, align=center)]] DHCPサーバーからIPアドレスの取得を待ちます。 また、証明書の検証には実際の時刻が必要なので、NTPで時刻同期するまで待ちます。 「iothub」+「Enter」で、Azure IoT Hubへメッセージを5つ送信します。 [[Image(TeraTermIoTHub.png, 369px, align=center)]] 送られたメッセージを確認するには、[=#following1 上記]サイトの「[https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-c#read-the-telemetry-from-your-hub ハブから利用統計情報を読み取る]」の手順で行います。 = 謝辞 = 日本マイクロソフトの太田様には、Azure IoT Hubの操作や設定、メッセージの確認方法など、詳しく教えて頂きました。ありがとうございました。[[br]] 日本マイクロソフト株式会社[[br]] 太田 寛[[br]] [[Image("data:image/svg+xml;base64,PHN2ZyBpZD0iTG9nb19GSVhFRCIgZGF0YS1uYW1lPSJMb2dvIOKAlCBGSVhFRCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDAwIDQwMCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7fS5jbHMtMntmaWxsOiMxZGExZjI7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5Ud2l0dGVyX0xvZ29fQmx1ZTwvdGl0bGU+PHJlY3QgY2xhc3M9ImNscy0xIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTE1My42MiwzMDEuNTljOTQuMzQsMCwxNDUuOTQtNzguMTYsMTQ1Ljk0LTE0NS45NCwwLTIuMjIsMC00LjQzLS4xNS02LjYzQTEwNC4zNiwxMDQuMzYsMCwwLDAsMzI1LDEyMi40N2ExMDIuMzgsMTAyLjM4LDAsMCwxLTI5LjQ2LDguMDcsNTEuNDcsNTEuNDcsMCwwLDAsMjIuNTUtMjguMzcsMTAyLjc5LDEwMi43OSwwLDAsMS0zMi41NywxMi40NSw1MS4zNCw1MS4zNCwwLDAsMC04Ny40MSw0Ni43OEExNDUuNjIsMTQ1LjYyLDAsMCwxLDkyLjQsMTA3LjgxYTUxLjMzLDUxLjMzLDAsMCwwLDE1Ljg4LDY4LjQ3QTUwLjkxLDUwLjkxLDAsMCwxLDg1LDE2OS44NmMwLC4yMSwwLC40MywwLC42NWE1MS4zMSw1MS4zMSwwLDAsMCw0MS4xNSw1MC4yOCw1MS4yMSw1MS4yMSwwLDAsMS0yMy4xNi44OCw1MS4zNSw1MS4zNSwwLDAsMCw0Ny45MiwzNS42MiwxMDIuOTIsMTAyLjkyLDAsMCwxLTYzLjcsMjJBMTA0LjQxLDEwNC40MSwwLDAsMSw3NSwyNzguNTVhMTQ1LjIxLDE0NS4yMSwwLDAsMCw3OC42MiwyMyIvPjwvc3ZnPg==", 32px, middle, alt="Twitter", title="Twitter", link=https://twitter.com/embedded_george, target="_blank")]]@embedded_george[[br]] [[Image("data:image/svg+xml;base64,PHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgZGF0YS1wcmVmaXg9ImZhYiIgZGF0YS1pY29uPSJnaXRodWItc3F1YXJlIiByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDQ0OCA1MTIiIGNsYXNzPSJzdmctaW5saW5lLS1mYSBmYS1naXRodWItc3F1YXJlIGZhLXctMTQgZmEtMngiPjxwYXRoIGZpbGw9ImN1cnJlbnRDb2xvciIgZD0iTTQwMCAzMkg0OEMyMS41IDMyIDAgNTMuNSAwIDgwdjM1MmMwIDI2LjUgMjEuNSA0OCA0OCA0OGgzNTJjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWODBjMC0yNi41LTIxLjUtNDgtNDgtNDh6TTI3Ny4zIDQxNS43Yy04LjQgMS41LTExLjUtMy43LTExLjUtOCAwLTUuNC4yLTMzIC4yLTU1LjMgMC0xNS42LTUuMi0yNS41LTExLjMtMzAuNyAzNy00LjEgNzYtOS4yIDc2LTczLjEgMC0xOC4yLTYuNS0yNy4zLTE3LjEtMzkgMS43LTQuMyA3LjQtMjItMS43LTQ1LTEzLjktNC4zLTQ1LjcgMTcuOS00NS43IDE3LjktMTMuMi0zLjctMjcuNS01LjYtNDEuNi01LjYtMTQuMSAwLTI4LjQgMS45LTQxLjYgNS42IDAgMC0zMS44LTIyLjItNDUuNy0xNy45LTkuMSAyMi45LTMuNSA0MC42LTEuNyA0NS0xMC42IDExLjctMTUuNiAyMC44LTE1LjYgMzkgMCA2My42IDM3LjMgNjkgNzQuMyA3My4xLTQuOCA0LjMtOS4xIDExLjctMTAuNiAyMi4zLTkuNSA0LjMtMzMuOCAxMS43LTQ4LjMtMTMuOS05LjEtMTUuOC0yNS41LTE3LjEtMjUuNS0xNy4xLTE2LjItLjItMS4xIDEwLjItMS4xIDEwLjIgMTAuOCA1IDE4LjQgMjQuMiAxOC40IDI0LjIgOS43IDI5LjcgNTYuMSAxOS43IDU2LjEgMTkuNyAwIDEzLjkuMiAzNi41LjIgNDAuNiAwIDQuMy0zIDkuNS0xMS41IDgtNjYtMjIuMS0xMTIuMi04NC45LTExMi4yLTE1OC4zIDAtOTEuOCA3MC4yLTE2MS41IDE2Mi0xNjEuNVMzODggMTY1LjYgMzg4IDI1Ny40Yy4xIDczLjQtNDQuNyAxMzYuMy0xMTAuNyAxNTguM3ptLTk4LjEtNjEuMWMtMS45LjQtMy43LS40LTMuOS0xLjctLjItMS41IDEuMS0yLjggMy0zLjIgMS45LS4yIDMuNy42IDMuOSAxLjkuMyAxLjMtMSAyLjYtMyAzem0tOS41LS45YzAgMS4zLTEuNSAyLjQtMy41IDIuNC0yLjIuMi0zLjctLjktMy43LTIuNCAwLTEuMyAxLjUtMi40IDMuNS0yLjQgMS45LS4yIDMuNy45IDMuNyAyLjR6bS0xMy43LTEuMWMtLjQgMS4zLTIuNCAxLjktNC4xIDEuMy0xLjktLjQtMy4yLTEuOS0yLjgtMy4yLjQtMS4zIDIuNC0xLjkgNC4xLTEuNSAyIC42IDMuMyAyLjEgMi44IDMuNHptLTEyLjMtNS40Yy0uOSAxLjEtMi44LjktNC4zLS42LTEuNS0xLjMtMS45LTMuMi0uOS00LjEuOS0xLjEgMi44LS45IDQuMy42IDEuMyAxLjMgMS44IDMuMy45IDQuMXptLTkuMS05LjFjLS45LjYtMi42IDAtMy43LTEuNXMtMS4xLTMuMiAwLTMuOWMxLjEtLjkgMi44LS4yIDMuNyAxLjMgMS4xIDEuNSAxLjEgMy4zIDAgNC4xem0tNi41LTkuN2MtLjkuOS0yLjQuNC0zLjUtLjYtMS4xLTEuMy0xLjMtMi44LS40LTMuNS45LS45IDIuNC0uNCAzLjUuNiAxLjEgMS4zIDEuMyAyLjguNCAzLjV6bS02LjctNy40Yy0uNC45LTEuNyAxLjEtMi44LjQtMS4zLS42LTEuOS0xLjctMS41LTIuNi40LS42IDEuNS0uOSAyLjgtLjQgMS4zLjcgMS45IDEuOCAxLjUgMi42eiIgY2xhc3M9IiI+PC9wYXRoPjwvc3ZnPg==", 32px, middle, alt="GitHub", title="GitHub", link=https://github.com/ms-iotkithol-jp, target="_blank")]] ---- {{{#!div style="text-align: right" ホームネットワークWG 長島 宏明 }}}