= 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のプロジェクトファイルも含まれているので、展開したフォルダをワークスペースとして開き、プロジェクトのインポートをこのフォルダに対して行うことで、取り込むことができます。[=#dev_guide こちら]を参照してください。 === フォルダ構成 === ||||||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/ == 開発手順 == #dev_guide === ワークスペースの読み込み === [=#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」タブでは、「Configu options」に「-f interface/cmsis-dap.cfg -f target/renesas_rza1h_swd.cfg」を入力します。 [[Image(DebugConfDebugger.png, 430px, align=center)]] 「Startup」タブでは、「Initial Reset」と「Load executable」のチェックを外します。 [#startup][[Image(DebugConfStartup.png, 430px, align=center)]] プログラムの書き込みは、mbedストレージへの書き込みにのみで行います。デバッガ経由ではできないようです。 「Load symbols」はソースコードデバッグするのに必要なので、チェックしておきます。 そのほかの画面には変更はありません。 [[Image(DebugConfSources.png, 430px, align=center)]] [[Image(DebugConfCommon.png, 430px, align=center)]] [[Image(DebugConfSVDPath.png, 430px, align=center)]] 下にある「デバッグ」ボタンを押すと、プログラムのロードが始まり、「パースペクティブ切り替えの確認」画面が表示されますので、「はい」を押します。 プログラムのロードが終わると「mbed_stub.c」ファイルのmain関数で停止しています。 [[Image(DebugPerspective.png, 259px, align=center)]] 「デバッグ構成」画面の「[=#startup Startup]」タブのスクロールして下にある「Set breakpoint at」チェックボックスにチェックを外すと、main関数で停止せず実行されるようになります。 === 実行 === 実行するとTeraTermの画面に以下のように表示が出ます。 [[Image(DebugStart.png, 505px, align=center)]] 「Enter」キーを入力すると、プロンプト「NTShell」が表示されます。 [[Image(TeraTermStart.png, 369px, align=center)]] 既知の問題があり、起動時のDHCPの動作が失敗してしますので「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]] 日本マイクロソフト株式会社 太田 寛 様のSNS [[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 [[Image("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGNsYXNzPSJvY3RpY29uIG9jdGljb24tbWFyay1naXRodWIiIGFyaWEtaGlkZGVuPSJ0cnVlIiB2aWV3Qm94PSIwIDAgMTYgMTYiIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2ZXJzaW9uPSIxLjEiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTSA4IDAgQyAzLjU4IDAgMCAzLjU4IDAgOCBjIDAgMy41NCAyLjI5IDYuNTMgNS40NyA3LjU5IGMgMC40IDAuMDcgMC41NSAtMC4xNyAwLjU1IC0wLjM4IGMgMCAtMC4xOSAtMC4wMSAtMC44MiAtMC4wMSAtMS40OSBjIC0yLjAxIDAuMzcgLTIuNTMgLTAuNDkgLTIuNjkgLTAuOTQgYyAtMC4wOSAtMC4yMyAtMC40OCAtMC45NCAtMC44MiAtMS4xMyBjIC0wLjI4IC0wLjE1IC0wLjY4IC0wLjUyIC0wLjAxIC0wLjUzIGMgMC42MyAtMC4wMSAxLjA4IDAuNTggMS4yMyAwLjgyIGMgMC43MiAxLjIxIDEuODcgMC44NyAyLjMzIDAuNjYgYyAwLjA3IC0wLjUyIDAuMjggLTAuODcgMC41MSAtMS4wNyBjIC0xLjc4IC0wLjIgLTMuNjQgLTAuODkgLTMuNjQgLTMuOTUgYyAwIC0wLjg3IDAuMzEgLTEuNTkgMC44MiAtMi4xNSBjIC0wLjA4IC0wLjIgLTAuMzYgLTEuMDIgMC4wOCAtMi4xMiBjIDAgMCAwLjY3IC0wLjIxIDIuMiAwLjgyIGMgMC42NCAtMC4xOCAxLjMyIC0wLjI3IDIgLTAuMjcgYyAwLjY4IDAgMS4zNiAwLjA5IDIgMC4yNyBjIDEuNTMgLTEuMDQgMi4yIC0wLjgyIDIuMiAtMC44MiBjIDAuNDQgMS4xIDAuMTYgMS45MiAwLjA4IDIuMTIgYyAwLjUxIDAuNTYgMC44MiAxLjI3IDAuODIgMi4xNSBjIDAgMy4wNyAtMS44NyAzLjc1IC0zLjY1IDMuOTUgYyAwLjI5IDAuMjUgMC41NCAwLjczIDAuNTQgMS40OCBjIDAgMS4wNyAtMC4wMSAxLjkzIC0wLjAxIDIuMiBjIDAgMC4yMSAwLjE1IDAuNDYgMC41NSAwLjM4IEEgOC4wMTMgOC4wMTMgMCAwIDAgMTYgOCBjIDAgLTQuNDIgLTMuNTggLTggLTggLTggWiIgLz48L3N2Zz4=", 24px, middle, alt="GitHub", title="GitHub", link=https://github.com/ms-iotkithol-jp, target="_blank")]] ms-iotkithol-jp ---- {{{#!div style="text-align: right" ホームネットワークWG 長島 宏明 }}}