b1c3ec3af4
- Protocol definition with 6-byte header (chunk_idx: 2B, payload: N B, crc32: 4B) - Node.js server with chunk-based HTTP delivery - C client library with resumable download support - CRC32 implementation (IEEE 802.3) - Test suites for both server and CRC32 - 1024B default chunk size (0.59% overhead)
124 lines
3.6 KiB
Markdown
124 lines
3.6 KiB
Markdown
# OTA-Chunk-Transfer
|
||
|
||
レジューム可能な分割転送プロトコル
|
||
|
||
## プロトコル仕様
|
||
|
||
### パケット形式
|
||
```
|
||
+------------+----------------+----------+
|
||
| chunk_idx | payload (N B) | crc32 |
|
||
| 2 B | N B | 4 B |
|
||
+------------+----------------+----------+
|
||
```
|
||
|
||
- **chunk_idx**: 2 バイト(最大 65535 チャンク = 67MB まで対応、1024B/チャンク)
|
||
- **payload**: 可変長(デフォルト 1024B)
|
||
- **crc32**: 4 バイト(IEEE 802.3 ポリノミアル)
|
||
|
||
### コントロールメッセージ
|
||
|
||
#### Client → Server
|
||
```
|
||
GET /ota?file=<filename> // ファイル転送リクエスト
|
||
GET /ota/resume?file=<filename>&chunk=<index> // レジューム
|
||
```
|
||
|
||
#### Server → Client
|
||
```
|
||
200 OK + chunk data // チャンク転送
|
||
206 Partial Content // レジューム応答
|
||
404 Not Found // ファイル不存在
|
||
416 Range Not Satisfiable // 無効なレジューム位置
|
||
```
|
||
|
||
### 転送フロー
|
||
|
||
```
|
||
Client Server
|
||
| |
|
||
|-- GET /ota?file=test.bin ---->| // ファイルサイズ確認
|
||
|<-- 200 OK (Content-Length) ---| // ファイルサイズ返信
|
||
| |
|
||
|-- GET /ota?file=test.bin&chunk=0 -->| // チャンク 0 要求
|
||
|<-- 200 OK + chunk data -------| // チャンクデータ
|
||
| |
|
||
|-- GET /ota?file=test.bin&chunk=1 -->| // チャンク 1 要求
|
||
|<-- 200 OK + chunk data -------| // チャンクデータ
|
||
| |
|
||
... |
|
||
| |
|
||
// 通信断情况后
|
||
| |
|
||
|-- GET /ota/resume?file=test.bin&chunk=50 -->| // チャンク 50 から再開
|
||
|<-- 200 OK + chunk data -------| // チャンク 50 データ
|
||
| |
|
||
```
|
||
|
||
## ファイル構成
|
||
|
||
```
|
||
ota-chunk-transfer/
|
||
├── protocol/
|
||
│ ├── protocol.h // プロトコル定義
|
||
│ ├── chunk_client.c // C クライアント実装
|
||
│ ├── chunk_server.c // C サーバ実装(参照用)
|
||
│ └── crc32.c // CRC32 実装
|
||
├── server/
|
||
│ └── server.js // Node.js サーバ
|
||
├── tests/
|
||
│ ├── test_crc32.c
|
||
│ ├── test_chunk_client.c
|
||
│ └── test_server.js
|
||
├── Makefile
|
||
└── README.md
|
||
```
|
||
|
||
## 使用例
|
||
|
||
### C クライアント(ESP32)
|
||
```c
|
||
#include "protocol.h"
|
||
|
||
void chunk_received(uint16_t chunk_idx, uint8_t *data, uint16_t len, void *user_ctx);
|
||
void transfer_complete(uint32_t total_bytes, void *user_ctx);
|
||
void transfer_error(int err_code, void *user_ctx);
|
||
|
||
chunk_client_config_t config = {
|
||
.server_url = "http://192.168.1.100:8080",
|
||
.chunk_size = 1024,
|
||
.on_chunk_received = chunk_received,
|
||
.on_complete = transfer_complete,
|
||
.on_error = transfer_error,
|
||
.user_ctx = NULL
|
||
};
|
||
|
||
chunk_client_init(&config);
|
||
chunk_client_download("firmware.bin");
|
||
```
|
||
|
||
### Node.js サーバ
|
||
```javascript
|
||
const server = require('./server');
|
||
|
||
server.start(8080, '/path/to/ota/files');
|
||
```
|
||
|
||
## パフォーマンス
|
||
|
||
| チャンクサイズ | ヘッダ比率 | 64MB ファイルのチャンク数 |
|
||
|---------------|-----------|----------------------|
|
||
| 512 B | 1.17% | 131,072 |
|
||
| 1024 B | 0.59% | 65,536 |
|
||
| 2048 B | 0.30% | 32,768 |
|
||
|
||
## TODO
|
||
|
||
- [ ] プロトコル定義
|
||
- [ ] CRC32 実装
|
||
- [ ] C クライアント実装
|
||
- [ ] Node.js サーバ実装
|
||
- [ ] テストスイート
|
||
- [ ] 圧縮オプション(gzip)
|
||
- [ ] 暗号化オプション(TLS)
|