皆さんこんにちは。IoTソリューションアーキテクトのTakamasaです。
皆さんはもう、IoT向け格安SIMサービス1NCE(ワンス)は使われましたか?私は毎週1NCEを利用して、色々な機能で遊んでいます。
1NCEをまだ利用した事がない、1NCE SIMの入手方法がわからないという方は、どなたでも1枚からWEBで購入が可能ですので、下記リンクから、1NCE SIMを入手してみてください。
今回は1NCE OSサービスについての解説と、後半はDevice IntegratorとEnergy Saverを組み合わせて、AWSにIoTデータを送る検証環境を作ってみました。
はじめに|1NCEとは?
一番の特徴は、IoT回線でよくありがちな基本料金+従量課金ということではなく、一括で10年間前払いするという部分がとても特徴的ですね。
また今回使ってみる1NCE OSについても、2,200円(税込)の中で使用できるということなので、気軽にIoTをプロトタイピングしてみるといった使い方でもできそうです。
1NCEのSIM回線プラットフォーム自体には、REST APIや、IMEIロック、SMS送信、回線無効化、追加チャージなど、回線に関わる操作が一元的に管理できるものなっています。
1NCE OSについて
1NCE OSサービスは、1NCEサーバー上で通信手順を変換するサービスです。
具体的には、1NCEを利用する事でUDPやCoAP、LwM2Mで送信したデータをHTTPS通信やAWS IoT Core通信に変換するサービスです。
OSと名前がついているので、IoTデバイス側に使われるOperating System (OS)と勘違いする人も多いのですが、中身は1NCEプラットフォーム上に準備されるバイナリデータのままデータ通信が行えるデータ節約機能と、そのデータを格納&転送できるデータハブ機能になります。
1NCE OS自体は、2023年1月5日からグローバルで展開されたばかりのサービスになっており、開発者向けの英語版サイトしか展開されていないので、少々資料として読みづらい部分もあるので、注意してください。
1NCE OS機能は、全部で8つの機能に別れています。
- Device Authenticator:DTLSを使った証明書認証機能
- Device Integrator:UDP、CoAP, LwM2Mのデータエンドポイント機能
- LwM2M Service:OMA仕様に基づいたLwM2Mインターフェース機能(ブートストラップサーバなど)
- Cloud Integrator:Device Inspectorに送られたデータをクラウド側に転送する機能
- Device Inspector:Device Integratorに送れたデータをData Historianと呼ばれるデータハブに7日間保管する機能
- Device Locator:IoTデバイスの基地局情報から位置情報を取得して、APIとして返す機能(2023年2月時点では2Gのみのサポート)
- Energy Saver:バイナリデータとJSONテンプレートを使ってデータ整形する機能
- Admin Logs:管理者ログの保管機能
いくつかの機能に別れていますが、基本的に1NCE OSの考え方は機能パーツという感じに近く、単体で使えるものも有れば、組合わせてしないと動作しないものも様々あるのが、ちょっと使いづらい点ですね。
私なりに1NCE OSの全体像を作ってみましたので、こちらの方がまだわかりやすいのかなと思っています。
1NCE OSの全体的な仕組みとしては、バイナリデータを使ったデータ転送機能、データハブ機能、位置情報機能(2Gのみ)というところが今今の機能になると思います。
各機能についての詳細な説明はまた次回以降にしていきたいと思います。
今回の検証構成と検証背景
それでは改めて、今回の検証構成になります。
今回は、シンプルに1NCE OSってどんなことができるの?という部分を確認したかったので、ともかく一番シンプルに1NCE OSにデータを送って、クラウド側にデータ転送するところまでを実施してみました。
この構成の利点としては、主に3つあるかと思います。
- IoTデバイス側からは、バイナリデータ配列のみ送付しているので、データ送信容量の節約が見込める
- 1NCE OSからAWS IoT CoreまではHTTPSで送付されているので、実質的にUDPソケット⇒HTTPSデータ転送が実現できている
- 1NCE OSまでのデータはLTE通信で暗号化されており、AWS IoTコアまではHTTPSになっているので、エンドツーエンドでの暗号化通信が実現できている
またIoTデバイスとしては、今回は以下を使用しています。
- Raspberry Pi 3+B
- Onyx LTE USBドングル
- Grovepi+
- DHT11 (温湿度センサー)
設定手順
今回の作業の前提は以下になりますので、前提を満たしていない場合には個別に準備完了させてから、作業を進めてください。
- AWSアカウントが設定済みであること
- IoTデバイス側でRasbian(Raspbian For Robots (v9.13)インストールとGrovepi+の設定が完了していること
1NCEポータル上のDevice Integratorで対象デバイス(ICCID)を登録する
それでは早速設定を始めていきたいと思います。
それでは先ずは、1NCEポータルにログインし、1NCE OSタブ>Device Integratorまで進んでください。この画面で、”+New Integration”をクリック。
この画面では、どのプロトコルでエンドポイントを作成するかを選択します。
今回は、一番簡単に実装していくために、”UDP”を選択します。
クリックすると、直ぐにエンドポイントが有効化されますので、このままTest Integrationをクリックしてください。
Test Integrationでは、IoTデバイスからのデータが届くことを確認する作業になります。
ログインしている1NCEポータルに登録済みのICCIDを入力して、Test Integrationをクリックしましょう。
すると、以下の画面に切り替わり、UDPエンドポイントにデータが来るまで待機するようになります。
現時点ではまだデバイス側の設定が終わってないので、このまま閉じてしまってOKです。
1NCEポータル上のEnergy Saverを使ってテンプレートを登録する
次は、Energy Saverの設定を進めていきます。
同じく1NCEポータルのEnergy Saverに行き、+ New Integrationをクリックしましょう。
テンプレート名は適当な名前をつけて、今回のテンプレートを適用するプロトコルを選択します。
今回はUDPになります。
テンプレートが作成できたら、真ん中の方にある”Template”部分に行ってください。
とりあえず一旦説明の前に以下を入力してください。
{
"sense": [
{
"asset": "temperature",
"value": {
"byte": 0,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
},
{
"asset": "humidity",
"value": {
"byte": 4,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
}
]
}
この状態で、Payload (base64)部分に以下を入力してください。
AADQQQAAGEI=
この状態で、Test Templateを押してください。
上手くいっていれば、以下のような表示になるはずです。
{
"humidity": 38,
"temperature": 26
}
この処理はなにをしているかというと、Bytearrayのデータを変換するという処理を行っており、上記の例であると4byte (float) + 4byte (float)のバイナリデータを、JSON形式に変換しています。
なので、例えばデータが整数(int)形式にするのであれば、以下にすることもできます。
"bytelength": 2,
"type": "int",
またデータを追加したいのであれば、Bytearrayを繋げていけば、送信するデータを増やすことも可能です。
温度+湿度+風速の例
{
"sense": [
{
"asset": "temperature",
"value": {
"byte": 0,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
},
{
"asset": "humidity",
"value": {
"byte": 4,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
},
{
"asset": "velocity",
"value": {
"byte": 8,
"bytelength": 4,
"type": "float",
"byteorder": "little"
}
}
]
}
またEnergy Saverの注意点としては、基本的に1つのプロトコルに、1つのテンプレートしか利用することができません。
そのため、1つのアカウントで1つのプロトコルを利用して複数タイプのIoTデバイスからデータを送ろうとする場合には、テンプレートの書き方を工夫するか、もしくはアカウント自体を分けるような処理が必要になるので注意して下さい。
これでEnergy Saverの設定は完了です。
1NCEポータル上のCloud IntegratorでAWS IoT Coreと接続する
次にAWS IoT Coreのデータを転送するための処理を行います。
いつもと同じく1NCEポータルのCloud Intergratorに移動し、+ New Integrationをクリックしてください。
接続先として、AWSもしくはWebhookを選択することができますが、今回はAWSを選択します。
”Integration Name”には適当な名前を入力して、Parse JSON PayloadをEnable、送るデータはTelemetry Dataを選択して、Proceedをクリックしてください。
次の画面では、Open AWS Consoleをクリックすると、AWSコンソールが立ち上がり、Cloudformationが実行されます。
このまま画面通り進めていくと、AWS IoT Coreの設定が完了するはずです。
Cloudformation側の設定が完了すると、1NCE ポータル上でも、Rollout Doneという表示になり、その後Integration Activeの状態になれば、設定が全て完了です。
設定手順:IoTデバイス側でセンサーデータ送信する
次は、IoTデバイス側の設定になりますが、今回はIoTデバイス側の設定は主旨ではないので、細かくは今回は割愛していきます。
今回はRaspeberry Pi 3+ B(Rasbian 9.13)とセンサーにはGrovepi+ にDHT11(温湿度センサー)を取り付けています。
またUDPエンドポイントには、1NCE SIMが刺さったネットワークからしか到達できないので、検証する際には注意してください。
センサーデータを送信するためのコードは、今回は1NCE SDKを使用せずにPythonでUDPソケットを送信するように記載しています。
import time as t
import signal
import sys
import logging
from datetime import datetime
import grovepi
import traceback
import socket
import struct
ENDPOINT = "udp.os.1nce.com"
CLIENT_ID = “test-device” # 見やすくするための名前をつけている
PORT = 4445
wait_time = 600 # 10分ごとにデータを送信
device_name = CLIENT_ID
serv_address = (ENDPOINT, PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
logger = logging.getLogger()
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logging.basicConfig()
def device_main():
logger.info("Connecting to %s with client ID '%s' to UDP endpoints ...", ENDPOINT, CLIENT_ID)
while True:
temp, humi = grovepi.dht(6, 0) # 6番ピンに接続している
message = 'TEMP:' + str(temp) + ', HUMI:' + str(humi) # 何を送ったのかわかりやすくするため
now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
payload = bytearray(struct.pack('f',temp)) + bytearray(struct.pack('f',humi)) # 4 byte + 4byteのバイナリ配列を作成
logger.info(
"Sending UDP message to {}:{} with body {} at {}".format(
ENDPOINT,
PORT,
message,
now))
send_len = sock.sendto(payload, serv_address)
t.sleep(wait_time)
def exit_sample(msg_or_exception):
if isinstance(msg_or_exception, Exception):
logger.error("Exiting sample due to exception.")
traceback.print_exception(msg_or_exception.__class__, msg_or_exception, sys.exc_info()[2])
else:
logger.info("Exiting: %s", msg_or_exception)
logger.info("Disconnecting...")
sys.exit(0)
def exit_handler(_signal, frame):
exit_sample(" Key abort")
if __name__ == "__main__":
signal.signal(signal.SIGINT, exit_handler)
device_main()
コードが書き終わったら、実行権限を与えて、実行してみてください。
(ライブラリが足りない場合にはpipで適宜インストールをしてください。)
実行後、データがちゃんと送信できていれば、Device IntegratorのTest Integrationの画面で、以下のようになっているはずです。
これで、Device Integratorがちゃんと動作していることがわかりますね。
次はCloud Intergratorをチェックしてみます。またAWS IoT Coreに移動して、テストクライアントに、{iccid}/messagesのトピックをサブスクライブしてみてください。
10分ごとになっているので時間はかかるかもしれませんが、データが受信できることが確認できるかと思います。
このデータを見て、興味深いのは、IoTデバイスからはセンサー情報のバイナリデータしか送っていないのにも関わらず、AWS IoT Codeにはデバイス付加情報も入っているということです。
そのため、この機能を使うことでデータ量の節約をしつつ、クラウド側ではしっかりとデバイス毎のデータを利用することができるというわけですね。
ここまでデータが届いていることが確認できれば、あとはAWS IoT Analyticsでデータを取ってもいいですし、Lambda + DynamoDBに格納して、QuickSight可視化するなど、いくらでもやりたいことができますね。
因みに以下は、AWS IoT Analyticsのデータストアに格納してみた結果になります。
Energy Saverを使ったデータ量
因みに今回10分に1回、温湿度をアップロードするシステム構築してみましたが、実際のデータ量はどうなったかと言いますと、以下がAPIを使って得られた1日のデータ使用量になります。
10分に1回データを送っているので、1日当たり144回データ送信をしていることになりますので、1回当たりのデータ量は 1.3 KBということですね。
項目 | 項目 |
---|---|
1日のデータ量 | 約 188 KB |
1回当たりのデータ量 | 約 1.3KB |
500MBの中での想定稼働期間 | 約 7年2か月程度 |
1NCE SIMが、500MBのデータ量になるので、計算上は 約 7年2か月程度は稼働できるという計算になります。
まとめ
今回は、1NCE OSを使って、バイナリデータをUDPソケットに載せて、JSON変換した上で、AWS IoT Coreに届けるまでの一連の構成を作ってみました。
1NCE OSの全体感が分かると共に、1NCE OSを使ったIoTシステム構成についての理解ができたかと思います。そもそもEnergy Saverを使って、どれぐらいデータを削減できたのかについては、
今回の記事のポイントとしては、以下の点になります。
- 1NCE OSのDevice Integratorを使って、データハブを利用できる
- 1NCE OSのEnergy Saverを使って、バイナリの状態でデータを送信することで、通信容量の節約ができる
- 1NCE OSのCloud Integratorを使って、データ転送が実現できる
1NCE(ワンス)SIMカードでは法人ユーザーであれば、どなたでも1枚からWEBで購入が可能で、今回紹介した1NCE SIM管理プラットフォームの機能は、アカウントユーザーであればであれば誰でも無料で試すことができますので、先ずは是非触ってみてください。
この記事の詳細はクラウドテクノロジーブログにて