Ambientでは、複数台のIoT端末がある場合、端末ごとに別のチャネルにデーターを送信することを推奨しています。Ambientにデーターを送信する時は、チャネルIDとライトキーを指定します。端末ごとに別チャネルに送信するために、個別のチャネルIDとライトキーをプログラムに記述すると、端末ごとに実行形式ファイルが異なるものになります。端末の台数が多くなると管理が煩雑です。

Ambientでは、端末ごとの固有のキー(デバイスキー)をチャネルに対応付け、端末からデバイスキーを送って、対応するチャネルIDとライトキーを取得する機能があります。デバイスキーとしては端末の通信デバイスの物理アドレス(MACアドレス)など端末ごとに固有のデーターを使います。それをプログラムで読み出すことで、複数台の端末でも同じプログラムで端末ごとに別のチャネルにデーターを送信できるようになります。

デバイスキーは通信デバイスのMACアドレスなど端末に固有のデーターで、最大20バイトの文字列です。

事前にプログラムで端末固有のデーターを取得して表示し、デバイスキーとしてAmbientに登録しますが、次のようなプログラムにすることで、センサーデーターをAmbientに送信するプログラムと共通化できます。

  1. 通信デバイスのMACアドレスなど端末に固有のデーターを取得し、表示する。
  2. 取得したデバイスキーを引数にしてgetchannel()関数を呼び、AmbientからチャネルIDとライトキーを取得する。getchannel()でチャネルIDが取得できなかったら、停止する。
  3. 取得したチャネルIDとライトキーを引数にしてbegin()関数でAmbientの初期設定をおこなう。
  4. set()関数でデーターをセットし、send()関数でデーターを送信する。

実際のプログラムは次のようになります。

setup()関数の中でesp_read_mac()関数でWi-FiのMACアドレスを取得し、デバイスキーを作ります。getchannel()関数はAmbientと通信をおこなうので、先にWiFi.begin()関数を呼んでWiFiアクセスポイントに接続します。次にgetchannel()関数を呼びますが、最初はAmbientにデバイスキーが登録されていないので、次のようにデバイスキーを表示してプログラムは停止します。

 M5StickC initializing...OK
 D8:A0:1D:67:8D:A4
 ....
 WiFi connected
 Cannot get channelId. Please set DeviceKey (D8:A0:1D:67:8D:A4) to Ambient.

Ambientのデバイスキー管理画面でこの端末からデーターを送信するチャネルIDの右側の「+」をクリックして、表示されたデバイスキーを入力し、チャネルとデバイスキーを対応付けます。

Ambientにデバイスキーを登録し、再度プログラムを実行すると、getchannel()でチャネルIDとライトキーが取得でき、Ambientの初期設定をおこない、データーが送信できるようになります。

getchannel()関数を使うことで、プログラム中にチャネルIDとライトキーを記述しなくてよくなります。複数の端末に対して、同一の実行形式ファイルで端末ごとに別のチャネルにデーター送信可能になります。