ESP32 MCP Server について
ESP32 MCP Server は ESP32 上で動作する MCP サーバーで、nRF52840 ではセンサー専用モードになります。WebSocket と JSON-RPC 2.0 を通じて、センサーデータとバスプロトコルの解析結果を AI アシスタントに公開します。AI エージェントから直接ハードウェアを読み取りたい組み込み、船舶、車載データの用途に向いています。
主な機能
- 01WebSocket 上の JSON-RPC 2.0 による MCP インターフェース
- 02複数ドライバーに対応する I2C センサーの自動スキャン
- 03XOR チェックサム検証付きの NMEA 0183 解析
- 04NMEA 2000 と OBD-II CAN フレームのデコード
- 05MCP から照会できるバス履歴のリングバッファ
活用シーン
- 01AI エージェントから I2C の温湿度・気圧センサーを読み取る
- 02GPS や海図プロッターが出力する NMEA 0183 データを解析する
- 03OBD-II の車両パラメーターと CAN バス履歴を照会する
MCP 対応
このプロジェクトは ESP32 上で動作する MCP サーバーであり、WebSocket 経由でリソースとセンサー・バス関連メソッドを提供します。MCP クライアントはこれらを呼び出し、購読できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ESP32 MCP サーバー
ESP32(センサー専用モードでは Nordic nRF52840 も)上で動作する Model Context Protocol(MCP)サーバーです。WebSocket / JSON-RPC 2.0 を介して、実世界のセンサーデータやバスプロトコルを AI アシスタントや自動化ツールに公開します。
AI エージェントをハードウェアに直接接続できます。I2C センサーの照会、NMEA 0183 GPS/船舶データの解析、NMEA 2000 および OBD-II CAN フレームのデコード、バス履歴の再生を、すべて標準の MCP インターフェースを通じて行えます。

機能
| 機能 | 詳細 |
|---|---|
| MCP プロトコル | WebSocket 上の JSON-RPC 2.0、リソースの検出とサブスクリプション |
| I2C センサー | 自動スキャンと、BME280、MPU6050、ADS1115、SHT31、BH1750、INA219 用ドライバー |
| NMEA 0183 | GGA、RMC、VTG、GSV、MWV、DBT、DPT、HDG、HDT、XOR チェックサム検証 |
| NMEA 2000 / CAN | 29 ビット PGN:位置、方位、速度、水深、風、姿勢、水温 |
| OBD-II / CAN | 標準 11 ビット OBD-II service 01/09 PID のデコード(60 以上の PID) |
| バス履歴 | CAN、NMEA、NMEA 2000、OBD-II 用の永続リングバッファ。MCP 経由で照会可能 |
| バスリーダー | 時間制限付きシリアルおよび CAN 読み取り、 raw または解析済みモード、JSON 出力 |
| WiFi | AP セットアップ UI と STA モード。認証情報は NVS に保存 |
| 検出 | mDNS(_mcp._tcp)と UDP 機能ブロードキャスト |
| メトリクス | ヒープ、稼働時間、RSSI、起動後も保持されるヒストグラム統計 |
| 複数ボード対応 | ESP32-S3、ESP32-C3、ESP32、Adafruit HUZZAH32、M5Stack、Nordic nRF52840-DK、Adafruit Feather nRF52840 |
| テスト | ネイティブ単体テスト(Unity)、I2C / CAN / Serial / LittleFS のモック |
対応ボード
ESP32 ボード — MCP サーバー完全対応(WiFi + WebSocket + CAN)
| ボード | PlatformIO 環境 | MCU | フラッシュ | RAM | WiFi | BLE | CAN | RGB LED |
|---|---|---|---|---|---|---|---|---|
| ESP32-S3-DevKitC-1 | esp32-s3-devkitc-1 | Xtensa LX7 × 2 @ 240 MHz | 8 MB | 512 KB + 8 MB PSRAM | ✓ | 5.0 | ✓ | GPIO48 |
| ESP32-DevKitC V4 | esp32-devkitc | Xtensa LX6 × 2 @ 240 MHz | 4 MB | 520 KB | ✓ | 4.2 | ✓ | — |
| ESP32-C3-DevKitM-1 | esp32-c3-devkitm-1 | RISC-V @ 160 MHz | 4 MB | 400 KB | ✓ | 5.0 | ✓ | GPIO8 |
| Adafruit HUZZAH32 | adafruit-huzzah32 | Xtensa LX6 × 2 @ 240 MHz | 4 MB | 520 KB | ✓ | 4.2 | ✓ | — |
| M5Stack Core ESP32 | m5stack-core | Xtensa LX6 × 2 @ 240 MHz | 16 MB | 520 KB | ✓ | 4.2 | ✗ | — |
nRF52840 ボード — センサー専用(I2C + シリアル、WiFi なし)
| ボード | PlatformIO 環境 | MCU | フラッシュ | RAM | BLE |
|---|---|---|---|---|---|
| Nordic nRF52840-DK | nrf52840-dk | Cortex-M4F @ 64 MHz | 1 MB | 256 KB | 5.0 + 802.15.4 |
| Adafruit Feather nRF52840 | nrf52840-feather | Cortex-M4F @ 64 MHz | 1 MB | 256 KB | 5.0 |
nRF52840 ターゲットは、別の
main_nrf.cppエントリーポイントを実行します。センサー + I2C + シリアル出力のみです。WiFi、MCP WebSocket、LittleFS、バス履歴には対応していません。MCP-over-WiFi のすべての機能を利用するには、UART1 に接続した ESP32-C3 を AT コマンドモードでブリッジとして使用してください。
ボード機能一覧
| 機能 | ESP32-S3 | ESP32 V4 | ESP32-C3 | HUZZAH32 | M5Stack | nRF52840-DK | nRF52840-Feather |
|---|---|---|---|---|---|---|---|
| WiFi | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| BLE | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| CAN / TWAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| I2C | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| UART(外部) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| LittleFS | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| MCP サーバー | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| バス履歴 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| mDNS / UDP 検出 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
アーキテクチャ
flowchart TD
Client[AI Agent / MCP Client] -->|WebSocket :9000 JSON-RPC 2.0| MCPServer
subgraph ESP32
MCPServer -->|resources/list| Resources
MCPServer -->|sensors/i2c/scan| SensorMgr
MCPServer -->|sensors/read| SensorMgr
MCPServer -->|buses/serial/read| BusReader
MCPServer -->|buses/can/read| BusReader
MCPServer -->|bus/history/read| BusHistory
MCPServer -->|bus/history/config/*| BusHistory
SensorMgr -->|Wire I2C| I2CSensors[BME280 · MPU6050 · ADS1115\nSHT31 · BH1750 · INA219]
BusReader -->|UART| NMEAParser[NMEA 0183 Parser]
BusReader -->|CAN TWAI| CANParser[NMEA 2000 / OBD-II Parser]
BusReader -->|feed| BusHistory[Bus History\nRing Buffers]
BusHistory --> LittleFS
NetworkMgr[Network Manager] --> WiFi
NetworkMgr --> WebSetup[Setup UI :80]
DiscoveryMgr[Discovery Manager] -->|mDNS + UDP| Network
Metrics[Metrics System] --> LittleFS
uLogger --> LittleFS
end
MCPServer --> Metrics
MCPServer --> uLogger
ハードウェア
ピン割り当て(ESP32-S3-DevKitC-1)
| GPIO | 機能 | 接続先 |
|---|---|---|
| IO8 | I2C SDA | すべての I2C センサー |
| IO9 | I2C SCL | すべての I2C センサー |
| IO16 | UART1 RX | GPS / チャートプロッター TX |
| IO17 | UART1 TX | GPS / チャートプロッター RX(任意) |
| IO4 | CAN RX | TJA1050 / SN65HVD230 CRXD |
| IO5 | CAN TX | TJA1050 / SN65HVD230 CTXD |
nRF52840-DK ピン割り当て
| ピン | 機能 |
|---|---|
| P0.26 / D6 | I2C SDA |
| P0.27 / D7 | I2C SCL |
| P0.06 / TX | UART1 TX |
| P0.08 / RX | UART1 RX |
部品表
| # | 部品 | 用途 |
|---|---|---|
| 1 | ESP32-S3-DevKitC-1 | メイン MCU |
| 1 | BME280 ブレークアウトボード | 温度 / 湿度 / 気圧 |
| 1 | MPU6050 ブレークアウトボード | 6 軸 IMU(任意) |
| 1 | TJA1050 または SN65HVD230 | CAN バス・トランシーバー(任意) |
| 1 | GPS モジュール(3.3 V UART) | NMEA 0183 の位置情報 / 時刻(任意) |
| 2 | 4.7 kΩ 抵抗 | I2C プルアップ |
| — | ブレッドボード + ジャンパー線 |
ESP32-S3-DevKitC-1 の配線
┌──────────────────────────────────────┐
│ ESP32-S3-DevKitC-1 │
│ │
3V3 ───┤ 3V3 GND ├─── GND
GND ───┤ GND IO0 ├
│ │
I2C SDA ── IO8 ───┤ IO8 ┌──────────┐ IO17 ├─── UART1 TX → GPS
I2C SCL ── IO9 ───┤ IO9 │ ESP32 │ IO16 ├─── UART1 RX ← GPS
│ IO10 │ S3 │ IO15 ├
│ IO11 └──────────┘ IO14 ├
│ IO12 IO13 ├
│ IO3 IO4 ├─── CAN RX ← TJA1050
│ IO46 IO5 ├─── CAN TX → TJA1050
│ │
│ USB (flash / serial log) │
└───────────────────────────────┘
I2C センサーの配線
すべてのセンサーは 1 つのバスを共有します。SDA と SCL から 3V3 へ 4.7 kΩ のプルアップ抵抗を追加してください。
ESP32-S3 BME280 MPU6050 ADS1115 INA219
───────── ─────── ─────── ─────── ───────
IO8 (SDA)─────SDA──────────SDA──────────SDA──────────SDA
IO9 (SCL)─────SCL──────────SCL──────────SCL──────────SCL
3V3 ──────────VCC──────────VCC──────────VCC──────────VCC
GND ──────────GND──────────GND──────────GND──────────GND
SDO→GND AD0→GND ADDR→GND
(0x76) (0x68) (0x48) (0x40)
その他の対応センサー(同じバス配線):SHT31(0x44)、BH1750(0x23)。
NMEA 0183 の配線(GPS / チャートプロッター)
GPS / chart plotter ESP32-S3
─────────────────── ────────
TX (3.3 V TTL NMEA out) ─────── IO16 (UART1 RX)
RX (optional NMEA in) ─────── IO17 (UART1 TX)
GND ─────── GND
VCC (3.3 V) ─────── 3V3
デバイスが RS-232 レベルで出力する場合は、MAX3232 レベルシフターを使用してください。RS-232 を ESP32 GPIO に直接接続しないでください。
CAN バスの配線(NMEA 2000 / OBD-II)
TJA1050 / SN65HVD230 ESP32-S3
──────────────────── ────────
CTXD ─────────── IO5 (CAN TX)
CRXD ─────────── IO4 (CAN RX)
VCC (5 V for TJA1050) ─────────── VIN / external 5 V
GND ─────────── GND
CANH ──────────────── NMEA 2000 backbone / OBD-II CANH
CANL ──────────────── NMEA 2000 backbone / OBD-II CANL
NMEA 2000 は 250 kbps で動作します。OBD-II は 500 kbps で動作します。それに応じて、
CANBusReaderの設定でボーレートを設定してください。
ソフトウェアの前提条件
- PlatformIO Core の CLI、または VS Code 用 PlatformIO IDE プラグイン
- Python 3.8+
- Git
pip install platformio
ビルドと書き込み
# 1. Clone
git clone https://github.com/navado/ESP32MCPServer.git
cd ESP32MCPServer
# 2. Install library dependencies
pio pkg install
# 3. Upload web assets to LittleFS (optional but recommended)
pio run -t uploadfs -e esp32-s3-devkitc-1
# 4. Build firmware
pio run -e esp32-s3-devkitc-1
# 5. Flash
pio run -t upload -e esp32-s3-devkitc-1
# 6. Monitor
pio device monitor --baud 115200
nRF52840
pio run -e nrf52840-dk
pio run -t upload -e nrf52840-dk
初回起動
- ボードの電源を入れます。Wi-Fi AP
ESP32_XXXXXX(MAC アドレスの末尾 6 桁の 16 進数)をブロードキャストします。 - その AP に接続し、
http://192.168.4.1を開きます。 - Wi-Fi の認証情報を入力し、「保存」をクリックします。
- ボードがネットワークに接続し、シリアルコンソールに IP アドレスを表示します。
- MCP クライアントを
ws://<IP>:9000に接続します。
Web ダッシュボード
ブラウザベースのダッシュボードは、フラッシュメモリから http://<IP>/app で配信されます。
| タブ | 機能 |
|---|---|
| センサー | I²C バスをスキャンし、検出したデバイスを表示して、値を読み取り、自動更新します |
| メトリクス | すべてのメトリクス、現在の値、スパークライン履歴グラフを表示します |
| ログ | メトリクスのログエントリーを照会して消去します |
| MCP コンソール | プリセットリクエストとリアルタイムのメッセージログを備えた、対話型 JSON-RPC コンソールです |
HTTP エンドポイント(ポート 80)
| メソッド | パス | 説明 |
|---|---|---|
| GET | / | Wi-Fi 設定ページ |
| POST | /save | Wi-Fi の認証情報を保存します(ssid、password フォームパラメーター) |
| GET | /status | ネットワークステータスの JSON |
| WS | /ws | リアルタイムのネットワークステータス WebSocket |
| GET | /app | ブラウザダッシュボード |
| GET | /bus-history | バス履歴設定 JSON を読み込みます |
| POST | /bus-history | バス履歴設定 JSON を更新します |
MCP API リファレンス(WebSocket ポート 9000)
すべてのメソッドは、WebSocket 上で JSON-RPC 2.0 を使用します。
プロトコル
| メソッド | パラメーター | 説明 |
|---|---|---|
initialize | — | サーバー情報、プロトコルバージョン、機能 |
resources/list | — | 登録済み MCP リソースを一覧表示します |
resources/read | uri | URI でリソースを読み込みます |
resources/subscribe | uri | リソースのプッシュ更新を購読します |
resources/unsubscribe | uri | 購読を解除します |
センサー
| メソッド | パラメーター | 説明 |
|---|---|---|
sensors/i2c/scan | — | I²C バスをスキャンし、ドライバーを自動検出して初期化します |
sensors/read | sensorId? | 1 つのセンサーの全チャンネルを読み取ります(すべて読み取る場合は ID を省略します) |
sensors/i2c/scan
{"jsonrpc":"2.0","method":"sensors/i2c/scan","id":1}
{
"jsonrpc":"2.0","id":1,
"result":{"devices":[
{"address":118,"name":"BME280","supported":true,"parameters":["temperature","pressure","humidity"]},
{"address":104,"name":"MPU6050","supported":true,"parameters":["accel_x","accel_y","accel_z","gyro_x","gyro_y","gyro_z","temperature"]}
]}
}
sensors/read
{"jsonrpc":"2.0","method":"sensors/read","id":2,"params":{"sensorId":"bme280_0x76"}}
{
"jsonrpc":"2.0","id":2,
"result":{"readings":[
{"sensorId":"bme280_0x76","parameter":"temperature","value":22.4,"unit":"°C","timestamp":1234567890,"valid":true},
{"sensorId":"bme280_0x76","parameter":"humidity","value":58.1,"unit":"%RH","timestamp":1234567890,"valid":true},
{"sensorId":"bme280_0x76","parameter":"pressure","value":101320.0,"unit":"Pa","timestamp":1234567890,"valid":true}
]}
}
バス履歴
バス履歴では、CAN フレーム、NMEA 行、デコード済みの NMEA 2000 メッセージ、OBD-II レコードを循環 RAM バッファに蓄積します。バッファのサイズは設定可能な RAM 予算に基づいて決まり、その設定は LittleFS に永続化されます。
| メソッド | パラメーター | 説明 |
|---|---|---|
bus/history/read | type、limit? | 履歴バッファに蓄積されたメッセージを読み取ります |
bus/history/config/get | — | 現在のバッファサイズ設定を読み取ります |
bus/history/config/set | config fields | バッファのサイズを変更し、設定を永続化します |
bus/history/read
type は can、nmea、nmea2000、obdii のいずれかである必要があります。limit のデフォルトは、保存されているすべてのエントリーです。
{"jsonrpc":"2.0","method":"bus/history/read","id":3,"params":{"type":"can","limit":10}}
{
"jsonrpc":"2.0","id":3,
"result":{
"type":"can",
"frames":["7E8#0441050300000000","7E8#04410D0000000000"],
"count":2,
"capacity":500
}
}
{"jsonrpc":"2.0","method":"bus/history/read","id":4,"params":{"type":"nmea2000"}}
{
"jsonrpc":"2.0","id":4,
"result":{
"type":"nmea2000",
"messages":[
{"pgn":129025,"priority":2,"source":0,"name":"Position Rapid Update",
"valid":true,"hasPosition":true,"latitude":47.6097,"longitude":-122.3331}
],
"count":1,"capacity":200
}
}
{"jsonrpc":"2.0","method":"bus/history/read","id":5,"params":{"type":"obdii"}}
{
"jsonrpc":"2.0","id":5,
"result":{
"type":"obdii",
"records":[
{"service":1,"pid":12,"name":"Engine RPM","value":1500,"unit":"rpm","valid":true},
{"service":1,"pid":13,"name":"Vehicle Speed","value":65,"unit":"km/h","valid":true}
],
"count":2,"capacity":300
}
}
bus/history/config/get
{"jsonrpc":"2.0","method":"bus/history/config/get","id":6}
{
"jsonrpc":"2.0","id":6,
"result":{
"canFrameCount":500,
"nmeaLineCount":1000,
"nmea2000Count":200,
"obdiiCount":300,
"ramBudgetBytes":1048576,
"safetyMarginBytes":65536,
"freeHeapBytes":2097152
}
}
bus/history/config/set
すべてのフィールドは省略可能です。省略したフィールドは現在の値が保持されます。
{
"jsonrpc":"2.0","method":"bus/history/config/set","id":7,
"params":{"canFrameCount":1000,"ramBudgetBytes":2097152}
}
{"jsonrpc":"2.0","id":7,"result":{"ok":true,"canFrameCount":1000,"nmeaLineCount":1000,"nmea2000Count":200,"obdiiCount":300,"ramBudgetBytes":2097152,"safetyMarginBytes":65536}}
canFrameCount、nmeaLineCount、nmea2000Count、obdiiCountをすべて0に設定すると、自動サイズ調整が有効になります。サーバーは各レコードタイプのサイズに基づいて、ramBudgetBytesを4種類のバッファに均等に割り当てます。
メトリクス
| メソッド | パラメーター | 説明 |
|---|---|---|
metrics/list | category? | 登録済みのすべてのメトリクス(名前、型、単位、カテゴリ)を一覧表示します |
metrics/get | name | 1つのメトリクスの現在値を取得します |
metrics/history | name、seconds? | 1つのメトリクスの過去のサンプルを取得します(デフォルト:直近300秒) |
metrics/list
{"jsonrpc":"2.0","method":"metrics/list","id":8,"params":{"category":"system"}}
{
"jsonrpc":"2.0","id":8,
"result":{"metrics":[
{"name":"system.heap.free","type":"gauge","description":"Free heap","unit":"bytes","category":"system"},
{"name":"system.uptime","type":"counter","description":"Uptime","unit":"s","category":"system"},
{"name":"system.wifi.rssi","type":"gauge","description":"WiFi signal strength","unit":"dBm","category":"system"}
]}
}
メトリクスの型:counter(累積整数)、gauge(現在値)、histogram(最小値/最大値/平均値/件数のオブジェクト)。
metrics/get
{"jsonrpc":"2.0","method":"metrics/get","id":9,"params":{"name":"system.heap.free"}}
{
"jsonrpc":"2.0","id":9,
"result":{"name":"system.heap.free","type":"gauge","value":214032,"unit":"bytes","category":"system","timestamp":1234567890}
}
ヒストグラム型メトリクスの場合、value はオブジェクトです:{"mean":…,"min":…,"max":…,"count":…}。
metrics/history
{"jsonrpc":"2.0","method":"metrics/history","id":10,"params":{"name":"system.heap.free","seconds":60}}
{
"jsonrpc":"2.0","id":10,
"result":{"name":"system.heap.free","entries":[
{"ts":1234567800,"val":214100},
{"ts":1234567830,"val":214032}
]}
}
ログ
| メソッド | パラメーター | 説明 |
|---|---|---|
logs/query | name?、seconds? | バイナリメトリクスログを照会します(デフォルト:直近3600秒) |
logs/clear | — | LittleFS からすべてのログエントリーを削除します |
{"jsonrpc":"2.0","method":"logs/query","id":11,"params":{"name":"system.heap.free","seconds":120}}
{
"jsonrpc":"2.0","id":11,
"result":{"name":"system.heap.free","count":4,"entries":[
{"ts":1234567810,"val":214100},
{"ts":1234567840,"val":214032}
]}
}
{"jsonrpc":"2.0","method":"logs/clear","id":12}
{"jsonrpc":"2.0","id":12,"result":{"ok":true}}
サブスクリプション
{"jsonrpc":"2.0","method":"resources/subscribe","id":13,"params":{"uri":"sensor://i2c/bme280_0x76"}}
サブスクライブすると、値が変わるたびにサーバーから未要求の notifications/resources/updated がプッシュされます。
{"jsonrpc":"2.0","method":"notifications/resources/updated","params":{"uri":"sensor://i2c/bme280_0x76"}}
TypeScript クライアントの例
型定義済みのクライアント全体については、examples/client/client.ts を参照してください。
I2C センサーリファレンス
| センサー | アドレス | パラメーター | 単位 |
|---|---|---|---|
| BME280 / BMP280 | 0x76, 0x77 | temperature、pressure、humidity¹ | °C、Pa、%RH |
| MPU6050 | 0x68, 0x69 | accel_x/y/z、gyro_x/y/z、temperature | g、°/s、°C |
| ADS1115 | 0x48–0x4B | ch0_V、ch1_V、ch2_V、ch3_V | V(±4.096 範囲) |
| SHT31 | 0x44, 0x45 | temperature、humidity | °C、%RH |
| BH1750 | 0x23, 0x5C | light_lux | lux |
| INA219 | 0x40–0x4F | bus_voltage_V、shunt_mV、current_mA、power_mW | V、mV、mA、mW |
¹ BMP280 では humidity を利用できません。
サポート対象の NMEA 0183 センテンス
| センテンス | 説明 | デコードされるフィールド |
|---|---|---|
| GGA | GPS 測位データ | 時刻、緯度、経度、測位品質、衛星数、HDOP、高度、ジオイド高 |
| RMC | 推奨最小航法情報 | 時刻、有効状態、緯度、経度、速度(kn および km/h)、針路、磁気偏差 |
| VTG | 対地針路/対地速度 | 針路(真方位および磁方位)、速度(kn および km/h) |
| GSV | 可視衛星 | 衛星総数、各衛星の PRN、仰角、方位角、SNR |
| MWV | 風速および風向角 | 角度、相対/真、速度、単位(K/M/N) |
| DBT | 変換器下の深度 | 深度(フィート/メートル/ファゾム) |
| DPT | 水深 | 深度(メートル) |
| HDG | 方位-偏差および磁気偏差 | 方位、偏差、磁気偏差(E/W) |
| HDT | 真方位 | 方位(真北基準) |
解析機能:XOR チェックサム検証、DDMM.MMMM → 符号付き十進度、HHMMSS.SS 時刻、トーカ ID 抽出、空フィールドの適切な処理。
サポート対象の NMEA 2000 PGN
| PGN | 名前 | 主なフィールド |
|---|---|---|
| 127250 | 船首方位 | heading、variation |
| 127257 | 姿勢 | pitch、roll、yaw |
| 128259 | 対水速度 | speedKnots |
| 128267 | 水深 | depthMetres、offset |
| 129025 | 位置の高速更新 | latitude、longitude |
| 129026 | 対地針路および対地速度 | courseOverGround、speedOverGround |
| 130306 | 風データ | speedKnots、angle、見かけ/真風フラグ |
| 130310 | 水温 | tempCelsius |
サポート対象の OBD-II PID(サービス 01)
選択した PID をデコードします。全リストは src/CANParser.cpp にあります。
| カテゴリ | PID |
|---|---|
| エンジン | RPM、負荷、冷却水温、吸気温、MAP、MAF、点火時期 |
| 燃料 | 燃圧、燃料補正(短期/長期)、レール圧、噴射時期、燃料流量 |
| 排出ガス | O2 センサー電圧、EGR、蒸発ガスシステム、DPF 圧力 |
| 走行 | 車速、スロットル位置、アクセルペダル位置 |
| 温度 | オイル温度、吸気温、EGR 温度、エンジン排気ガス温度(EGT) |
| 電気系統 | 制御モジュール電圧、バッテリー電圧 |
| ハイブリッド | ハイブリッドバッテリー残存寿命 |
| トルク | ドライバー要求トルク、実トルク、基準トルク |
| 車両情報 | VIN、キャリブレーション ID(サービス 09) |
検出
ネットワーク接続時に、サーバーは 2 つの mDNS サービスを登録し、UDP 機能ビーコンを定期的に送信します。
| 検出方法 | 詳細 |
|---|---|
| mDNS | _mcp._tcp および _http._tcp。TXT レコードにはバージョン、機能、検出されたセンサーが含まれます |
| UDP ブロードキャスト | 30 秒ごと(設定可能)に 255.255.255.255:5354 へ JSON ビーコンを送信します。センサーマニフェストが含まれます |
mDNS と UDP は、ネットワークへの参加、I2C スキャンの完了、MCP サーバーの準備完了、バス履歴設定の変更時に自動的に実行されます。
テスト
テストは Linux 上でネイティブにコンパイルして実行できます。ハードウェアは不要です。
# All tests
pio test -e native
# Specific suites
pio test -e native -f test_nmea_parser
pio test -e native -f test_can_parser
pio test -e native -f test_i2c_sensors
pio test -e native -f test_bus_reader
pio test -e native -f test_mcp_server
pio test -e native -f test_metrics_system
# With coverage (requires lcov)
pio test -e native --coverage
| スイート | テスト対象 |
|---|---|
test_nmea_parser | GGA、RMC、VTG、GSV、MWV、DBT、DPT、HDG、HDT、チェックサム検証 |
test_can_parser | OBD-II PID、NMEA 2000 PGN 127250/127257/128259/128267/129025/129026/130306/130310 |
test_i2c_sensors | モック I2C 経由の BME280、MPU6050、ADS1115、SHT31、BH1750、INA219 |
test_bus_reader | 時限読み取り、生データ/解析済みモード、タイムアウト処理 |
test_mcp_server | JSON-RPC ディスパッチ、リソース管理、メソッド登録 |
test_metrics_system | カウンター、ゲージ、ヒストグラム、LittleFS への永続化 |
カスタム MCP メソッドの拡張
実行時に JSON-RPC ハンドラーを追加登録します。
mcpServer.registerMethodHandler("myns/doSomething",
[](uint8_t clientId, uint32_t reqId, const JsonObject& params) {
StaticJsonDocument<256> doc;
doc["result"]["ok"] = true;
std::string out;
serializeJson(doc, out);
return out;
});
// Remove when no longer needed
mcpServer.unregisterMethodHandler("myns/doSomething");
貢献
- リポジトリをフォークします
- 機能ブランチを作成します:
git checkout -b feature/my-feature - 新機能のテストを追加します(
pio test -e nativeが成功する必要があります) - プルリクエストを作成します
コーディングスタイルとガイドラインについては、CONTRIBUTING.md を参照してください。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。