ゲートウェイとサブデバイスのシナリオを使用してIoTデバイスをクラウドに接続

今回は、**IoT**デバイスをクラウドに接続するためのゲートウェイとサブデバイスのシナリオを見ていきます。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/taking-a-go-at-gateway-and-sub-device-development_595430)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/27490d3a-a24e-e535-02cf-196229fbad48.png)

多くのIoTシナリオでは、端末機器自体がインターネットにアクセスすることはありません。では、データをクラウドに移行するにはどうすればいいのだろうか、と疑問に思うかもしれません。

クラウドの[IoTプラットフォーム]()は、[MQTT]()と呼ばれる特殊なプロトコルを使用したデバイス上での直接接続をサポートしています。

興味深いことに、この種の接続プロトコルは、ゲートウェイのサブデバイスとして機能するようにデバイスをゲートウェイにマウントすることもサポートしており、ゲートウェイのプロキシがデバイスをIoTプラットフォームに接続することができます。その後、ゲートウェイデバイス自体がIoTゲートウェイデバイスとして機能し、IoTプラットフォームへのMQTT接続を確立してデータを送受信します。さらに、このデバイスはサブデバイスの管理も担当しています。このように、このすべては、したがって、以下の操作も含みます。

- ゲートウェイは、サブデバイスのネットワーク・トポロジ・リレーションシップを追加します。
- サブデバイスはゲートウェイのMQTT接続チャネルを再利用して接続を実装します。
- ゲートウェイはサブデバイスのデータをクラウドに報告します。
- ゲートウェイは指令を受信し、サブデバイスに転送します。
- ゲートウェイはサブデバイスの切断を報告します。
- ゲートウェイは、サブデバイスのネットワークトポロジ関係を削除します。

また、ローカルネットワークに応じて、ゲートウェイとサブデバイス間の通信プロトコルは、HTTP、MQTT、[ZigBee](https://zigbee.org/what-is-zigbee/?spm=a2c65.11461447.0.0.13e627e6SUARNc)、[Modbus](http://www.bb-elec.com/Learning-Center/All-White-Papers/Modbus/The-Answer-to-the-14-Most-Frequently-Asked-Modbus.aspx?spm=a2c65.11461447.0.0.13e627e6SUARNc)、[BLE](https://blog.beaconstac.com/2018/08/ble-made-simple-a-complete-guide-to-ble-bluetooth-beacons/?spm=a2c65.11461447.0.0.13e627e6SUARNc)、[OPC-UA](https://opcfoundation.org/about/opc-technologies/opc-ua/?spm=a2c65.11461447.0.0.13e627e6SUARNc)などがあります。このロジックは、ゲートウェイによって実装されます。しかし、これらの接続機能はIoT SDKでは提供できません。

さて、上で説明したシナリオ、具体的にはゲートウェイとサブデバイスのシナリオを設定する方法を見てみましょう。そのためには、以下の手順に従う必要があります。

#ネットワーク製品の作成
ネットワーク製品を作成するには、ノードタイプを選択する必要があります（このチュートリアルではゲートウェイとします）。ゲートウェイは、サブデバイスを管理し、サブデバイスに存在するトポロジカルな関係を維持し、これらのトポロジカルな関係をクラウドに同期させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c36fff9f-29af-3043-93a5-8296a9182e40.png)

参考までに、ゲートウェイとそのサブデバイス間に存在するトポロジカルな関係を下図に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b4b31cd9-c886-48c0-3dfb-25bf8b4374ef.png)


#ゲートウェイを接続
以下のパラメータを設定することで、ゲートウェイ装置を接続することができます。

```
LinkKitInitParams params = new LinkKitInitParams();

DeviceInfo gatewayInfo = new DeviceInfo();
gatewayInfo.productKey = gateway.productKey;
gatewayInfo.deviceName = gateway.deviceName;
gatewayInfo.deviceSecret = gateway.deviceSecret;

params.deviceInfo = gatewayInfo;
LinkKit.getInstance().init(params, ILinkKitConnectListener)
```

ゲートウェイデバイスが接続されると、コンソールに "Online "のステータスで表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6c2d875d-d4db-8c92-9191-9aea051d7cec.png)

#ネットワーク トポロジの追加
以下のパラメータを設定して、ネットワークトポロジを追加することができます。

```
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewayAddSubDevice(
    deviceInfo, // the ID of the sub-device
    SubDeviceConnectListener)
```

代わりにコンソールで行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4a2e7ff3-449f-7335-6cf2-58a2cf3604b2.png)

#サブデバイスを接続する
以下のパラメータを設定することで、サブデバイスを接続することができます。

```
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(
    deviceInfo,  // the ID of the sub-device
    ISubDeviceActionListener)
```

代わりにコンソールで行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d21bf953-0251-5df3-9139-9852d286d1bd.png)


そして、サブデバイスの接続情報をコンソール上で確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ab0f6d82-d92c-27c3-3624-e26806c79dca.png)

#サブデバイスのデータを報告する
以下のパラメータを設定することで、サブデバイスのデータをレポートすることができます。

```
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDevicePublish(
    topic, // sub-device topic
    data, // the data
    deviceInfo, // the ID of the sub-device
    ISubDeviceActionListener)
```

代わりにコンソールを使用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6262850b-f0f5-ee25-13b7-13e9e28d65c8.png)

#サブデバイスにトピックを購読させる
以下のパラメータを設定することで、サブデバイスにトピックを購読させることができます。

```
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDeviceSubscribe(
    topic, // sub-device subscription topic
    deviceInfo, // the ID of the sub-device
    ISubDeviceActionListener)
```

#サブデバイスの接続を解除する

```
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewaySubDeviceLogout(
    deviceInfo, // the ID of the sub-device
    ISubDeviceActionListener)
```

#サブデバイスのネットワークトポロジの削除

```
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey;
deviceInfo.deviceName = deviceName;
deviceInfo.deviceSecret = deviceSecret;
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(
    deviceInfo, // the ID of the sub-device
    ISubDeviceRemoveListener)
```

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*