こんにちは、娘が最近は色々な物を食べられるようになってきたので毎日の食卓が賑やかになってきましたが、先日焼き魚を食べてる時に「うん、この塩味がいいのよね」と言っていてどこの食通さんかと感心した木村です。
本記事はオルターブースアドベントカレンダー2022の1日目の記事です。トップバッターなので張りきっていこうと思います。
さて、今年もSORACOM + Azureネタでいくとしてどういうネタにするかな・・と2020年・2021年のアドベントカレンダーの自分の記事を見返してみたのですが、気になる記載を発見しました。
なお、SORACOM Funnelを使ってAzure EventHubsに送り込むという方法もありますが、こちらについてはまたの機会に触れられればと思います
またの機会と言っておいて2年放置していますね。これはよろしくない。
というわけで、2年越しの宿題を済ませるために今回はSORACOM Funnelを使ってAzure Event HubsにSORACOM LTE-M Buttonのデータを送信してみたいと思います。
SORACOM Funnelとは
SORACOM Funnelは「クラウドリソースアダプター」と呼ばれるサービスです。通常、IoTに限らず色々なデータをクラウドの色々なリソース(サービス)に送り込むときには、そのサービスへの接続方法に合わせて個別にプログラムを書くことが多いと思います。
SORACOM Funnelはこのつなぎ込みの部分をSORACOMが準備してくれていて、使う側は接続に必要な認証情報だけを入れたらあとはFunnelに向けてHTTP/TCP/UDPでデータを送り込めばOKというステキなサービスです。
各種サービスへの接続部分を作り込まないでよいという手軽さもありますが、それ以外にも接続情報が全てSORACOM側にあるため、デバイス側の送信先をFunnelに固定したままで接続するサービスを簡単に変えられるというメリットもあります。これによって開発中と本番稼働で接続先を切り替えることも(デバイス側の情報を書き換える手間に比べて)容易に行えます。
SORACOM Funnelには、Azure Event Hubsに接続するアダプターが準備されていますので、今回はこれを使うことにします。公式ドキュメントに従って作業していきます。
Event Hubsの準備
接続先のEvent Hubsを準備します。Event Hubsを使うときには名前空間を作り、そこに実際にデータを受け取るEvent Hubを作ります。
まずはEvent Hubs名前空間を作成します。ポータルの「リソースの作成」で「Event Hubs」で検索します。
必要事項を入力して名前空間の作成が終わったら、今度はEventHubを作ります。
Funnelから接続するURLはhttps://<Event Hubs名前空間の名前>.servicebus.windows.net/<Event Hubの名前>/messages
となりますので、Event Hubs名前空間の名前とEvent Hubの名前をメモしておきます。
それと、接続するときに使う認証情報をメモします。Event Hubs名前空間の「設定」→「共有アクセスポリシー」→「RootManageSharedAccessKey」を開き、主キーの値をメモします。Funnelからアクセスするときにはこのポリシー名(RootManageSharedAccessKey)と、主キーの値を使います。
今回は検証ですのでRootManagedSharedAccessKeyを使っていますが、本来は「送信」権限だけの専用の共有アクセスポリシーを作ってそちらを使うことをお勧めします。
Functionsの準備
公式ドキュメントではEvent Hubsのメトリックを見てメッセージが届いていることを確認するようになっていますが、せっかくなので届いたデータの内容も確認してみましょう。
接続されたデータを確認するため、データをログにダンプするだけのFunctionsを準備しておきましょう。
前回の記事と同じく、Node.jsの関数アプリを作ります。関数アプリのデプロイが完了したら、ポータルから「関数」→「追加」と進み、Event Hubトリガーの関数を作成します。
「Event Hub Connection」で「new」を押すと以下の画面が出ますが、一番上の枠はドロップダウンで先ほど作ったEvent Hubs名前空間を選択します。2つめの枠は先ほど作ったEvent Hubの名前を入力します。一番下の枠はデフォルトのままでOKです。それにしてもあっちもこっちもEvent Hub connectionで分かりに(ry
コードは以下のデフォルトのままでOKです。これで、この関数はEvent Hubから受け取ったメッセージをそのままログにダンプしてくれます。
module.exports = async function (context, eventHubMessages) { context.log(`JavaScript eventhub trigger function called for message array ${eventHubMessages}`); eventHubMessages.forEach((message, index) => { context.log(`Processed message ${message}`); }); };
SORACOM Funnelの準備
Event Hubsの準備ができたら、SORACOMコンソールからSORACOM Funnelの設定をしていきます。
メニューの「SORACOM AIR FOR セルラー」→「SIMグループ」から、LTE-M ButtonのSIMが所属しているSIMグループを開き、SORACOM Funnelの設定を開いてスライダーを「ON」にしてFunnelを使うようにします。
転送先サービスは「Microsoft Azure Event Hubs」を選択します。
転送先はhttps://<Event Hubs名前空間の名前>.servicebus.windows.net/<Event Hubの名前>/messages
を入力します。
最後に、Event Hubsに接続する認証情報を入力します。「認証情報」欄の右の「+」を押すと、以下の画面が開いて認証情報を新規に作成できます。ここで「認証情報ID」には任意の名前を入力、「種別」は「Azure認証情報」を選択、Policy nameは共有アクセスポリシー名(RootManageSharedAccessKey)を入力、「Key」は共有アクセスポリシーの主キーを入力します。
ここまでできたら全ての設定は完了です。
動かしてみる
では、実際にLTE-M Buttonを押してみましょう。作成したEvent Hubsトリガーの関数のログを確認します。
以下は整形していますが、LTE-M Buttonのデータがpayloads
に含まれていることが分かります。
{ "credentialsId": "toEventHubs", "operatorId": "OPxxxxxxxxxx", "destination": { "provider": "azure", "service": "eventhubs", "resourceUrl": "https://xxxxxxxxxxx.servicebus.windows.net/xxxxxxxxxx/messages", "payloadsOnly": false }, "sourceProtocol": "udp", "payloads": { "clickType": 1, "clickTypeName": "SINGLE", "batteryLevel": 1, "binaryParserEnabled": true }, "timestamp": xxxxxxxxxxxxxxxxxxxxx, "imsi": "xxxxxxxxxxxxx", "imei": "xxxxxxxxxxxxx", "simId": "xxxxxxxxxxxxxxxx", "locationQueryResult": "success", "location": { "lat": 33.xxxxxxxxxxxxxx, "lon": 130.xxxxxxxxxxxxxxxxx } }
まとめ
SORACOM Funnelは、SORACOMプラットフォームに届いたデータを簡単にクラウドサービスに接続できるようにするサービスです。SORACOMからデータをクラウドサービスに届けたい場合は、まずはFunnelに対応するアダプターが無いかを確認してみるといいかと思います。
IoT案件でなくても、現在はSORACOM Arcを使えばPCなどからもSORACOMプラットフォームにデータを送れますので、ちょっとしたデータのつなぎ込みなどで使うというのも面白そうです。
また、Beam/Funkと比較した場合の大きな違いとして、Funnelは非同期サービスであるというものがあります。つまり、接続したクラウドサービス側からデバイス側に戻り値を返すことができません(その代わりFunnelがバッファしてくれ、デバイス側から見るとすぐに処理が戻ってくるのでスケーラビリティに優れる)。
他にも呼び出し頻度や送信できるデータサイズ等に制限がありますので、詳しくは以下のドキュメントを参考にしてください。
皆さんのお役に立てば幸いです。