1. はじめに
「センサーで計測したデータをクラウドに送りたい」——IoT入門でまず直面する課題です。
本記事では、CO2センサー(SCD40)を搭載した M5Stack Core2 を使い、計測した CO2濃度・温度・湿度を SORACOM Inventory 経由でクラウドに送信するプロジェクトを作ってみました。サンプルコードとして公開します。ご使用は自己責任にてお願いします。
ポイントは Wi-Fi のみで動作すること。SORACOM SIM は不要です。また、通信には TLS 証明書検証を組み込み、セキュリティにも配慮した実装にしています。
作るもの
[M5Stack Core2 + SCD40]
|
| Wi-Fi(家庭/オフィスのルーター経由)
|
[SORACOM Inventory Publish API]
|
[SORACOM Harvest Data](データ蓄積・可視化)
使用するハードウェア
| 部品 | 備考 |
|---|---|
| M5Stack Core2 | ESP32 搭載のオールインワンモジュール |
| Sensirion SCD40 | CO2・温度・湿度センサー(GROVE Port A で接続) |
なお、今回はVisual Studio Code+Platform IOを開発環境として使用しました。
コード等はこちら。
https://github.com/publicev4828/2026-06-18
2. SIMなしでIoTを行うには何が必要か?
SORACOM=SIMが必要、というわかではない。
SORACOM はもともと MVNO(仮想移動体通信事業者)として SIM ベースの IoT 通信を提供しています。しかし SORACOM Inventory の Publish API は、インターネットに繋がっていれば SIM がなくても使えます。
認証の仕組み
SIM の代わりに使うのが デバイス資格情報 です。
| 項目 | 内容 |
|---|---|
| デバイス ID |
d-xxxxxxxxxxxxxxxxx 形式の固定 ID |
| シークレットキー | コンソールで発行されるキー |
この2つを HTTP ヘッダーに付けて HTTPS でリクエストを送るだけで、デバイスを認証してデータを送信できます。
POST https://api.soracom.io/v1/devices/{デバイスID}/publish
Content-Type: application/json
x-device-secret: {シークレットキー}
{"co2": 850, "temperature": 24.5, "humidity": 55.0}
SIM のように物理的なチップが不要なので、Wi-Fi が使える環境であればすぐに始められます。
SIM との使い分け
| 方式 | 向いているケース |
|---|---|
| Wi-Fi + Inventory | 屋内・固定設置・試作・評価 |
| SORACOM SIM | 屋外・移動体・Wi-Fi が届かない場所 |
本記事のプロジェクトは「まず動かして試してみたい」段階に最適です。
3. SORACOM Inventory の仕組み
そもそも SORACOM Inventory とは?
SORACOM Inventory は、IoT デバイスの遠隔管理を目的として設計されたサービスです。OMA が標準化した LwM2M(Lightweight M2M) プロトコルをベースにしており、デバイスの管理・監視・操作といった機能を提供しています。
詳細は公式ページをご参照ください。
→ https://soracom.jp/services/inventory/
本記事で使う機能は「Publish API」
その SORACOM Inventory が持つ Publish API を使います。デバイス側からデータを能動的に送信する REST API で、SIM がなくても デバイス ID + シークレットキーで認証して HTTPS POST を送るだけでデータを届けられます。
SORACOM Inventory
└─ Publish API ← 本記事で使う部分
デバイス → クラウドへのデータ送信
「まずデータを送ることから始めたい」という段階に最適で、将来的にデバイス管理が必要になったとき、そのまま拡張できます。
全体像
デバイス登録(コンソール)
↓
デバイス ID + シークレットキーを取得
↓
デバイスから Publish API に POST
↓
SORACOM Harvest Data に蓄積
↓
コンソールのグラフで可視化
↑今回のゴールです。
SORACOM コンソールでの準備
下記のリンクに、手順が掲載されています。
https://users.soracom.io/ja-jp/docs/inventory/register-with-key/
- Inventory → デバイス → デバイスを登録 でデバイスを作成
- デバイス詳細画面でデバイス ID とシークレットキーをコピー
- 対象グループの SORACOM Harvest Data を ON にする
シークレットキーはコンソールに `0000,*************************"、カンマより後ろの部分だけを使います。
API の仕様(要点)
| 項目 | 内容 |
|---|---|
| エンドポイント | https://api.soracom.io/v1/devices/{deviceId}/publish |
| メソッド | POST |
| 認証ヘッダー | x-device-secret: {シークレットキー} |
| ボディ | 任意の JSON(数値・文字列・真偽値) |
| 成功レスポンス | HTTP 200 または 204 |
なお、コードの大部分はM5StackCORE2の描画・計測・そのほかの設定に使用され、上記の通信関係のハンドリングはコード全体の20%程度です。
4. TLS 証明書について
なぜ証明書検証が必要か
HTTPS(TLS)通信には「接続先が本物かどうか確認する」機能があります。この確認を省略する(setInsecure())と、偽のサーバーに接続させられる 中間者攻撃(MITM) のリスクがあります。
[デバイス] ──×── [攻撃者のサーバー] ──× SORACOM(本物)
↑ データが盗まれる
証明書検証を有効にすることで、接続先が確かに api.soracom.io であることを確認できます。
ESP32 での証明書検証
PC やスマートフォンはOSが信頼する CA 証明書を大量に保持しています。しかし ESP32 にはそのような仕組みはなく、使用する CA 証明書をコード内に埋め込む必要があります。
SORACOM API に使う CA 証明書
api.soracom.io は AWS 上でホストされているため、Amazon Root CA 1 を使って検証できます。
static const char* CA_CERT = R"(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
... (省略) ...
-----END CERTIFICATE-----
)";
この証明書は Amazon Trust Services が公開しているものです(有効期限:2038年1月17日)。
setInsecure() との比較
| 方式 | セキュリティ | 手間 |
|---|---|---|
setInsecure() |
低(MITM のリスクあり) | 少ない |
| CA 証明書埋め込み | 高 | PEM をコードに貼り付けるだけ |
試作段階では setInsecure() で動かし、本番に向けて証明書検証に切り替えるのがよい順序です。
5. コードの構成
ライブラリ構成
外部ライブラリは PlatformIO の標準ライブラリのみを使用しています。
lib_deps =
m5stack/M5Unified@^0.1.16
sensirion/Sensirion I2C SCD4x
SORACOM への送信は Arduino ESP32 コアに含まれる WiFiClientSecure と HTTPClient を直接使用しています。
認証情報の管理(secrets.h)
認証情報は src/secrets.h に分離し、.gitignore で Git 管理対象外にします。
// src/secrets.h(Git に含まない)
#define WIFI_SSID "your_ssid"
#define WIFI_PASSWORD "your_password"
#define SORACOM_DEVICE_ID "d-xxxxxxxxxxxxxxxxx"
#define SORACOM_SECRET_KEY "your_secret_key"
リポジトリには secrets.h.template(プレースホルダー版)だけをコミットし、使う人が自分でコピーして書き換える運用にします(ご自身の責任でお願いします)。
main.cpp の要点
初期化(setup())
// SCD40 を I2C で初期化(GROVE Port A: SDA=32, SCL=33)
Wire.begin(32, 33);
mySensor.begin(Wire, SCD41_I2C_ADDR_62);
mySensor.startPeriodicMeasurement();
データ送信(sendToSoracom())
bool sendToSoracom() {
char url[128];
snprintf(url, sizeof(url), SORACOM_URL_TMPL, SORACOM_DEVICE_ID);
char body[128];
snprintf(body, sizeof(body),
"{\"co2\":%d,\"temperature\":%.1f,\"humidity\":%.1f}",
co2, temp, humid);
WiFiClientSecure client;
client.setCACert(CA_CERT); // Amazon Root CA 1 で TLS 証明書を検証
HTTPClient http;
http.begin(client, url);
http.addHeader("Content-Type", "application/json");
http.addHeader("x-device-secret", SORACOM_SECRET_KEY);
int code = http.POST(body);
http.end();
return (code == 200 || code == 204);
}
client.setCACert(CA_CERT) の1行を追加するだけで、setInsecure() から TLS 証明書検証に切り替えられます。
センサー読み取り(30秒ごと)
int16_t err = mySensor.readMeasurement(co2, temp, humid);
if (err != NO_ERROR || co2 == 0) {
co2 = 0; temp = 0.0f; humid = 0.0f;
}
SCD40 は起動直後に安定したデータが出ないため、setup() 内で最大50秒(5秒×10回)ウォームアップしています。
ディスプレイ表示
┌──────────────────────────────────┐
│ CO2 850 ppm │
│ Temperature 24.5 °C │
│ Humidity 55.0 % │
│ │
│ Next send in 287s WiFi │
└──────────────────────────────────┘
1秒ごとにカウントダウンと WiFi 状態を更新します。
6. まとめ
| ポイント | 内容 |
|---|---|
| SIM不要 | Wi-Fi + デバイス資格情報で SORACOM Inventory を使える |
| 送信形式 | 任意の JSON を HTTPS POST するだけ |
| セキュリティ | Amazon Root CA 1 を埋め込んで TLS 証明書を検証 |
| 認証情報管理 |
secrets.h を .gitignore で除外し Git に含めない |
SORACOM Inventory は「とりあえずクラウドにデータを送りたい」という段階から、SIM を使った屋外設置まで段階的に移行できる仕組みです。まずは Wi-Fi 環境で試してみてください。
注意事項
サンプルコードに関して
本稿で紹介したサンプルコードを使用する際には、関連法規および下記の注意事項を守り、自己責任にてご使用ください。
認証情報の取り扱い
-
WIFI_PASSWORDやSORACOM_SECRET_KEYは絶対に Git にコミットしないでください -
.gitignoreにsrc/secrets.hを追加し、テンプレートファイル(secrets.h.template)だけをリポジトリに含める運用を推奨します - GitHub に誤ってプッシュした場合、git の履歴からも削除が必要です(
git filter-branchまたはgit filter-repo) - シークレットキーが漏洩した場合は SORACOM コンソールから即座に再発行してください
Wi-Fi 接続について
本プロジェクトはデバイスを Wi-Fi に接続して使用します。設置場所のネットワーク利用ルールや管理者の許可を確認したうえで、安全に運用してください。
- 職場・学校・公共施設など管理されたネットワークに接続する場合は、事前にネットワーク管理者の許可を得てください
- 接続先の Wi-Fi パスワードは
secrets.hに記載しますが、デバイスの紛失・盗難時に情報が漏洩しないよう、保管場所や廃棄時の取り扱いにも注意してください - 不特定多数が利用するフリー Wi-Fi への接続は避けることを推奨します
CA 証明書の有効期限
コードに埋め込んでいる Amazon Root CA 1 の有効期限は 2038年1月17日 です。長期運用する場合は定期的に確認してください。最新の証明書は Amazon Trust Services リポジトリ で公開されています。
SCD40 のウォームアップ
SCD40 は起動直後の数十秒間、安定した値が出ません。本コードでは起動時に最大50秒のウォームアップを行っていますが、設置直後のデータは参考値として扱うことを推奨します。
知的財産関連について
Amazon Root CA 1 について
本記事のコードに含まれる CA_CERT の PEM データは、Amazon Trust Services LLC が公開している Amazon Root CA 1 証明書です。
- 著作権者: Amazon Trust Services LLC
- 取得元: https://www.amazontrust.com/repository/
-
用途:
api.soracom.io(AWS 上でホスト)の TLS 接続検証のみに使用 - ライセンス: 公開証明書として配布されており、TLS 認証目的での使用が一般に認められています
SORACOM について
SORACOM は株式会社ソラコムの登録商標です。本記事は株式会社ソラコムとは無関係の個人による情報共有であり、公式情報は SORACOM 公式ドキュメント を参照してください。
使用ライブラリ
| ライブラリ | ライセンス |
|---|---|
| M5Unified | MIT |
| Sensirion I2C SCD4x | BSD 3-Clause |
| Arduino / ESP32 コア | LGPL 2.1 |
