IoT Central デバイス ブリッジは、 Sigfox、 Particle Device Cloud、 Things Network などの他の IoT クラウドを IoT Central アプリケーションに接続するオープンソース ソリューションです。 デバイス ブリッジは、他の IoT クラウドに接続されているデバイスから IoT Central アプリケーションにデータを転送することによって機能します。 デバイス ブリッジはデータを IoT Central にのみ転送し、IoT Central からデバイスにコマンドやプロパティの更新を送信することはありません。
デバイス ブリッジを使用すると、IoT Central の機能を次のようなデバイスと組み合わせることができます。
- Sigfox の低電力ワイド エリア ネットワークに接続された資産追跡デバイス。
- Particle Device Cloud 上の空気品質監視デバイス。
- モノのネットワーク上の土壌水分モニタリングデバイス。
データのルールや分析などの IoT Central アプリケーション機能を使用したり、Power Automate と Azure Logic Apps でワークフローを作成したり、データをエクスポートしたりできます。
デバイス ブリッジ ソリューションは、複数の Azure リソースを Azure サブスクリプションにプロビジョニングします。Azure サブスクリプションは連携して、デバイス メッセージを変換して IoT Central に転送します。
[前提条件]
このハウツー ガイドの手順を完了するには、次のものが必要です。
有効な Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
カスタム アプリケーション テンプレートから作成された IoT Central アプリケーション 。 詳細については、「 IoT Central アプリケーションの作成 」と「アプリケーション に関する情報を取得する方法」を参照してください。
概要
IoT Central デバイス ブリッジは、GitHub のオープンソース ソリューションです。 カスタムの Azure Resource Manager テンプレートを使用して、Azure Functions の関数アプリなど、複数のリソースを Azure サブスクリプションにデプロイします。
関数アプリは、デバイス ブリッジのコア部分です。 単純な Webhook を介して、他の IoT プラットフォームから HTTP POST 要求を受信します。 Azure IoT Central Device Bridge リポジトリには、Sigfox、Particle、および Things Network クラウドを接続する方法を示す例が含まれています。 プラットフォームが関数アプリに HTTP POST 要求を送信できる場合は、このソリューションを拡張してカスタム IoT クラウドに接続できます。
関数アプリは、IoT Central で受け入れられる形式にデータを変換し、デバイス プロビジョニング サービスとデバイス クライアント API を使用して転送します。
IoT Central アプリケーションが転送されたメッセージのデバイス ID を認識すると、デバイスからのテレメトリが IoT Central に表示されます。 IoT Central アプリケーションでデバイス ID が認識されない場合、関数アプリはデバイス ID を使用して新しいデバイスの登録を試みます。 新しいデバイスは、IoT Central アプリケーションの [デバイス] ページに未割り当てデバイスとして表示されます。 [ デバイス ] ページから、新しいデバイスをデバイス テンプレートに割り当ててから、テレメトリを表示できます。
デバイス ブリッジをデプロイする
デバイス ブリッジをサブスクリプションにデプロイするには:
IoT Central アプリケーションで、[ アクセス許可 > デバイス接続グループ ] ページに移動します。
ID スコープを書き留めておきます。 この値は、デバイス ブリッジをデプロイするときに使用します。
同じページで、 SAS-IoT-Devices 登録グループを開きます。 SAS-IoT-Devices グループ ページで、主キーをコピーします。 この値は、デバイス ブリッジをデプロイするときに使用します。
次の [ Azure にデプロイ ] ボタンを使用して、関数アプリをサブスクリプションにデプロイするカスタム Resource Manager テンプレートを開きます。 前の手順の ID スコープ と 主キー を使用します。
デプロイが完了したら、関数に必要な npm パッケージをインストールする必要があります。
Azure portal で、サブスクリプションにデプロイされた関数アプリを開きます。 次に、 開発ツール>Console に移動します。 コンソールで、次のコマンドを実行してパッケージをインストールします。
cd IoTCIntegration npm installこれらのコマンドの実行には数分かかる場合があります。 警告メッセージは無視しても問題ありません。
パッケージのインストールが完了したら、関数アプリの [概要] ページで [再起動] を選択します。
これで関数を使用する準備ができました。 外部システムでは、HTTP POST 要求を使用して、デバイス ブリッジを介して IoT Central アプリケーションにデバイス データを送信できます。 関数の URL を取得するには、 Functions > IoTCIntegration > Code + Test > Get function URL に移動します。
デバイス ブリッジに送信されるメッセージ本文は、次の形式である必要があります。
"device": {
"deviceId": "my-cloud-device"
},
"measurements": {
"temp": 20.31,
"pressure": 50,
"humidity": 8.5,
"ledColor": "blue"
}
measurements オブジェクト内の各キーは、IoT Central アプリケーションのデバイス テンプレートのテレメトリの種類の名前と一致する必要があります。 このソリューションでは、メッセージ本文でのインターフェイス ID の指定はサポートされていません。 そのため、2 つの異なるインターフェイスに同じ名前のテレメトリの種類がある場合、測定は IoT Central アプリケーションの両方のテレメトリ ストリームに表示されます。
本文に timestamp フィールドを含めて、メッセージの UTC 日時を指定できます。 このフィールドは ISO 8601 形式である必要があります。 たとえば、「 2020-06-08T20:16:54.602Z 」のように入力します。 タイムスタンプを含めない場合は、現在の日付と時刻が使用されます。
本文には、 modelId フィールドを含めることができます。 プロビジョニング中にデバイス テンプレートにデバイスを割り当てるには、このフィールドを使用します。
deviceIdは英数字、小文字でなければならず、ハイフンを含めることができます。
modelId フィールドを含めない場合、または IoT Central がモデル ID を認識しない場合は、認識されないdeviceIdを含むメッセージによって、IoT Central に新しい未割り当てデバイスが作成されます。 オペレーターは、デバイスを適切なデバイス テンプレートに手動で移行できます。 詳細については、「 Azure IoT Central アプリケーションでのデバイスの管理」 > テンプレートへのデバイスの移行に関するページを参照してください。
注
デバイスがテンプレートに割り当てられるまで、関数に対するすべての HTTP 呼び出しは 403 エラー状態を返します。
Application Insights を使用して関数アプリのログ記録をオンにするには、Azure portal で関数アプリの [監視 > ログ ] に移動します。 [ Application Insights を有効にする] を選択します。
プロビジョニングされたリソース
Resource Manager テンプレートは、Azure サブスクリプションに次のリソースをプロビジョニングします。
- 関数アプリ
- App Service プラン
- ストレージ アカウント
- キーボールト (Key Vault)
キー コンテナーには、IoT Central アプリケーションの SAS グループ キーが格納されます。
関数アプリは 従量課金プランで実行されます。 このオプションでは専用のコンピューティング リソースは提供されませんが、デバイス ブリッジは 1 分あたり数百のデバイス メッセージを処理できます。これは、メッセージの送信頻度が低いデバイスまたはデバイスの数が少ない場合に適しています。 アプリケーションが多数のデバイス メッセージのストリーミングに依存している場合は、従量課金プランを専用 の App Service プランに置き換えます。 このプランには専用のコンピューティング リソースが用意されており、サーバーの応答時間が短縮されます。 標準の App Service プランでは、このリポジトリ内の Azure からの関数のパフォーマンスが最大で、1 分あたり約 1,500 のデバイス メッセージでした。 詳細については、 Azure Functions のホスティング オプションに関するページを参照してください。
従量課金プランではなく専用の App Service プランを使用するには、デプロイする前にカスタム テンプレートを編集します。 [ テンプレートの編集] を選択します。
次のセグメントを置き換えます。
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2015-04-01",
"name": "[variables('planName')]",
"location": "[resourceGroup().location]",
"properties": {
"name": "[variables('planName')]",
"computeMode": "Dynamic",
"sku": "Dynamic"
}
},
置換後のコード:
{
"type": "Microsoft.Web/serverfarms",
"sku": {
"name": "S1",
"tier": "Standard",
"size": "S1",
"family": "S",
"capacity": 1
},
"kind": "app",
"name": "[variables('planName')]",
"apiVersion": "2016-09-01",
"location": "[resourceGroup().location]",
"tags": {
"iotCentral": "device-bridge",
"iotCentralDeviceBridge": "app-service-plan"
},
"properties": {
"name": "[variables('planName')]"
}
},
次に、テンプレートを編集して、"alwaysOn": truefunctionapp 構成で関数アプリが常に実行されていることを確認する"properties": {"SiteConfig": {...}} リソースの構成にを含めます。
例示
次の例では、さまざまな IoT クラウド用にデバイス ブリッジを構成する方法について説明します。
例 1: デバイス ブリッジを介してパーティクル デバイスを接続する
デバイス ブリッジを介して Particle デバイスを IoT Central に接続するには、Particle コンソールに移動し、新しい Webhook 統合を作成します。 要求形式を JSON に設定します。 [ 詳細設定] で、次のカスタム本文形式を使用します。
{
"device": {
"deviceId": "{{{PARTICLE_DEVICE_ID}}}"
},
"measurements": {
"{{{PARTICLE_EVENT_NAME}}}": "{{{PARTICLE_EVENT_VALUE}}}"
}
}
関数アプリの 関数 URL を 貼り付けると、Particle デバイスが割り当てられていないデバイスとして IoT Central に表示されます。 詳細については、 Particle を利用したプロジェクトを Azure IoT Central と統合する方法 に関するブログ投稿を参照してください。
例 2: デバイス ブリッジを介して Sigfox デバイスを接続する
一部のプラットフォームでは、Webhook 経由で送信されるデバイス メッセージの形式を指定できない場合があります。 このようなシステムでは、デバイス ブリッジが処理する前に、メッセージ ペイロードを予期される本文形式に変換する必要があります。 この変換は、デバイス ブリッジを実行するのと同じ関数で実行できます。
このセクションでは、Sigfox webhook 統合のペイロードを、デバイス ブリッジで想定される本文形式に変換する方法を示します。 Sigfox クラウドは、デバイス データを 16 進数の文字列形式で送信します。 便宜上、デバイス ブリッジには、この形式の変換関数が含まれています。これは、Sigfox デバイス ペイロードで使用可能なフィールド型のサブセット (8、16、32、または 64 ビットの int と uint 、32 ビットまたは 64 ビットの float 、リトル エンディアンとビッグ エンディアン) を受け入れます。 Sigfox webhook 統合からのメッセージを処理するには、関数アプリの IoTCIntegration/index.js ファイルに次の変更を加えます。
メッセージ ペイロードを変換するには、21 行目の handleMessage の呼び出しの前に次のコードを追加し、 payloadDefinition を Sigfox ペイロード定義に置き換えます。
const payloadDefinition = 'gforce::uint:8 lat::uint:8 lon::uint:16'; // Replace this with your payload definition
req.body = {
device: {
deviceId: req.body.device
},
measurements: require('./converters/sigfox')(payloadDefinition, req.body.data)
};
Sigfox デバイスには、 204 応答コードが必要です。 21 行目の handleMessage の呼び出しの後に、次のコードを追加します。
context.res = {
status: 204
};
例 3: デバイス ブリッジを介して Things Network からデバイスを接続する
モノのネットワーク デバイスを IoT Central に接続するには:
- Things Network で新しい HTTP 統合をアプリケーションに追加します:アプリケーション>統合>統合を追加>HTTP 統合。
- アプリケーションに送信する前に、デバイス メッセージのペイロードを JSON に自動的に変換するデコーダー関数がアプリケーションに含まれていることを確認します。 Application > Payload Functions > デコーダー。
次の例は、バイナリ データから一般的な数値型をデコードするために使用できる JavaScript デコーダー関数を示しています。
function Decoder(bytes, port) {
function bytesToFloat(bytes, decimalPlaces) {
var bits = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
var sign = (bits >>> 31 === 0) ? 1.0 : -1.0;
var e = bits >>> 23 & 0xff;
var m = (e === 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000;
var f = Math.round((sign * m * Math.pow(2, e - 150)) * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces);
return f;
}
function bytesToInt32(bytes, signed) {
var bits = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
var sign = 1;
if (signed && bits >>> 31 === 1) {
sign = -1;
bits = bits & 0x7FFFFFFF;
}
return bits * sign;
}
function bytesToShort(bytes, signed) {
var bits = bytes[0] | (bytes[1] << 8);
var sign = 1;
if (signed && bits >>> 15 === 1) {
sign = -1;
bits = bits & 0x7FFF;
}
return bits * sign;
}
return {
temperature: bytesToFloat(bytes.slice(0, 4), 2),
presscounter: bytesToInt32(bytes.slice(4, 8), true),
blueLux: bytesToShort(bytes.slice(8, 10), false)
};
}
統合を定義した後、関数アプリの handleMessageindex.jsファイルの 21 行目でを呼び出す前に、次のコードを追加します。 このコードにより、HTTP 統合の本文が想定される形式に変換されます。
req.body = {
device: {
deviceId: req.body.end_device_ids.device_id.toLowerCase()
},
measurements: req.body.uplink_message.decoded_payload
};
注
前のスニペットでは、人間に優しいデバイス ID を使用しています。 Things Network メッセージには、 req.body.dev_eui.toLowerCase()を使用してアクセスできる技術 ID も含まれています。 詳細については、「 モノのネットワーク - データ形式」を参照してください。
制限事項
デバイス ブリッジは、メッセージを IoT Central にのみ転送し、デバイスにメッセージを送信しません。 この制限は、このデバイス ブリッジを介して IoT Central に接続するデバイスではプロパティとコマンドが機能しない理由です。 デバイス ツインの操作はサポートされていないため、デバイス ブリッジを介してデバイスのプロパティを更新することはできません。 これらの機能を使用するには、デバイスが Azure IoT デバイス SDK のいずれかを使用して IoT Central に直接接続する必要があります。