= 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/sakura.html GR-SAKURA]で、EthernetでHTTP通信します。 MQTTも含んでいますが、現在のバージョンでは接続できていません。 [http://gadget.renesas.com/ja/product/peach.html GR-PEACH]でも動作確認できています。[=#gr_peach 下記]を参照してください。 サンプルを動作させるには、[=#following1 下記]の手順でAzure側にデバイスを追加し、そのデバイスの接続文字列を取得し、ソースコード「app_iothub_client/src/client.c」の以下の個所を書き換える必要があります。 {{{#!c static const char* connectionString = "[device connection string]"; }}} === ダウンロード === #download GR-SAKURAのソースコードは[https://dev.toppers.jp/trac_user/contrib/browser/azure_iot_hub/trunk こちら]にあります。 リストの下にある「Download in other formats:」の「Zip Archive」をクリックすると、zipファイルでダウンロードできます。 === 開発環境 === ビルドはGCC+Makefileで行います。RX向けGCCは[https://gcc-renesas.com/ja/rx-download-toolchains/ こちら]から入手できます。arm向けGCCはe2studioのインストーラで入れた「GNU Tools ARM Embedded 5.4 2016q3」を使用しました。 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/ こちら]からダウンロードして、コマンドプロントから実行できるよう、環境変数でパスを通してください。 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||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/商用|| ||||||zlib-1.2.11||圧縮・伸張ライブラリ[https://www.zlib.net/ zlib]||zlib License|| === 標準Cライブラリ === GCC付属の標準Cライブラリnewlibではなく、muslを使用しています。 付属のnewlibでは、dirent.hやsocket.hがないので、curlやwolfsslのコンパイルに向いていません。 Linux向けのmuslを使用することで、POSIX向けのソースコードのコンパイルが難無く行えます。 ただし、未実装のAPIがあってもリンクが通ってしまいます。 このソフトでは、ntshell/srcに実装がありますが、サンプルを動作させる最小限の実装を行っています。 == Azure IoT Hub について == #following1 本サンプルの作成には以下のドキュメントを参考にしました。 https://github.com/ms-iotkithol-jp/IoTKitHoLV4 [[br]] 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 タウンロード]したファイルを、適当なフォルダに展開します。[[br]] この説明では「E:\e2studio\azure_iot_hub」に展開します。[[br]] [[Image(Folder.png, 342px, align=center)]][[br]] パス名にスペースや漢字などを含むと問題になることがあります。[[br]] 英数字とアンダーバーのみのフォルダ名で構成されたパス名にします。[[br]] e2studioを起動し、ワークスペースの場所に展開したフォルダを指定します。[[br]] [[Image(SelectWorkSpace.png, 318px, align=center)]][[br]] 起動直後の「ようこそ」画面[[br]] [[Image(Welcome.png, 505px, align=center)]][[br]] 「ようこそ」ページを閉じます。[[br]] [[Image(EmptyWorkSpace.png, 505px, align=center)]][[br]] メニューから「ファイル」→「インポート」を選択します。[[br]] [[Image(SelectImport.png, 505px, align=center)]][[br]] 「一般」の中にある「既存プロジェクトをワーク・スペースへ」を選択し、「次へ」ボタンを押します。[[br]] [[Image(ImportProjectToWorkSpace.png, 255px, align=center)]][[br]] 「プロジェクトのインポート」画面が表示されます。[[br]] [[Image(ImportProject.png, 255px, align=center)]][[br]] 「ルート・ディレクトリの選択」にソースを展開したフォルダを入力します。[[br]] 「参照」ボタンを押して、そのまま「OK」ボタンを押せば入力されます。[[br]] [[Image(SelectRootDirectory.png, 255px, align=center)]][[br]] インポートが成功すると下記のように、「プロジェクト・マネージャ」にプロジェクトが表示されます。[[br]] [[Image(FillProjectWorkSpace.png, 505px, align=center)]][[br]] === ビルド === メニューから「プロジェクト」→「すべてビルド」を選択すると、ビルドが開始されます。[[br]] [[Image(BuildAll.png, 505px, align=center)]][[br]] ビルドが終了すると、「プロジェクト・マネージャ」の「app_iothub_client」の下に「バイナリー」の項目が追加されます。[[br]] [[Image(BuildComplate.png, 505px, align=center)]][[br]] === デバッグ === [https://www.renesas.com/jp/ja/products/software-tools/tools/emulator/e1.html E1エミュレータ]を使ったデバッグの説明をします。[[br]] [[Image(GR_SAKURA_AND_E1_Emulator.jpeg, 400px, align=center)]][[br]] [https://www.ftdichip.com/Products/Cables/USBTTLSerial.htm USB Serial変換ケーブル]などでGR-SAKURAと接続し、TeraTermでシリアルポートに接続します。ポーレートは「115,200bps」です。[[br]] [[Image(SerialPort.png, 191px, align=center)]][[br]] 「プロジェクト・マネージャ」の「app_iothub_client」の「バイナリー」の下に「app_iothub_client.elf」があるので、それを右クリックします。[[br]] 出てきたメニューから「デバッグ」→「デバッグの構成」を選択します。[[br]] [[Image(DebugConfiguration.png, 505px, align=center)]][[br]] 「デバッグの構成」画面の「Renesas GDB Hardware Debugging」で右クリックし、「新規」を選択します。[[br]] [[Image(NewDebugConf.png, 383px, align=center)]][[br]] 表示された「メイン」タブの「プロジェクト」が「app_iothub_client」、「C/C++ アプリケーション」が「Debug\app_iothub_client.elf」になっていることを確認します。[[br]] [[Image(DebugConfMain.png, 430px, align=center)]][[br]] 「Debugger」タブでは、「Debug hardware」に「E1(RX)」を選択し、「Target Device」にGR-SAKURAのCPU「R5F63NB」を選択します。 [[Image(DebugConfDebugerGDBSettings.png, 430px, align=center)]][[br]] 現在販売されているのはGR-SAKURA2で、CPUは「R5F563NYD」です。RAMが256KByteとGR-SAKURAの倍になっています。[[br]] 「Connection Settings」タブでは、「EXTAL周波数」を「12.0000」に、「エミュレーターから電源を供給する」と「いいえ」変更します。[[br]] [[Image(DebugConfDebugerConnectionSettings.png, 430px, align=center)]][[br]] そのほかの画面には変更はありません。[[br]] [[Image(DebugConfDebugerToolSetting.png, 430px, align=center)]][[br]] [#startup][[Image(DebugConfStartup.png, 430px, align=center)]][[br]] [[Image(DebugConfSources.png, 430px, align=center)]][[br]] [[Image(DebugConfCommon.png, 430px, align=center)]][[br]] 下にある「デバッグ」ボタンを押すと、プログラムのロードが始まり、「パースペクティブ切り替えの確認」画面が表示されますので、「はい」を押します。[[br]] プログラムのロードが終わると「start.S」ファイルで停止しています。[[br]] [[Image(DebugPerspective.png, 259px, align=center)]][[br]] 「デバッグ構成」画面の「[=#startup Startup]」タブのスクロールして下にある「再開」チェックボックスにチェックを入れると、停止せず実行されるようになります。[[br]] === 実行 === 実行するとTeraTermの画面に以下のように表示が出ます。[[br]] [[Image(DebugStart.png, 505px, align=center)]][[br]] 「Enter」キーを入力すると、プロンプト「NTShell」が表示されます。[[br]] [[Image(TeraTermStart.png, 369px, align=center)]][[br]] 試しに「Help」+「Enter」を入力すると、コマンド一覧が表示されます。[[br]] [[Image(TeraTermHelp.png, 369px, align=center)]][[br]] 「iothub」+「Enter」で、Azure IoT Hubへメッセージを5つ送信します。[[br]] [[Image(TeraTermIoTHub.png, 369px, align=center)]][[br]] 送られたメッセージを確認するには、[=#following1 上記]サイトの「[https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-send-telemetry-c#read-the-telemetry-from-your-hub ハブから利用統計情報を読み取る]」の手順で行います。 == GR-PEACH == #gr_peach ベースのソフトに[http://dev.toppers.jp/trac_user/contrib/wiki/asp3_tinet_ecnl_rx TOPPERS/ASP3版ECNL]を使用します。注意点として、「get_time」という関数が「c-utility/adapters/agenttime_mbed.c」に定義されていますが、ベースのソフトにも定義されているので、Azure IoT SDK側の「get_time」関数を「azure_get_time」などにリネームして競合を避ける必要があります。