# Allxon 奧創雲 OTA 與事件上傳架構

## 相關資源位置

| 資源 | 路徑 |
|------|------|
| kCurl 執行檔 | `/home/user/Documents/GOFACE/奧創雲/kCurl-1.1.1-release/` |
| kCurl ARMv7 binary | `kCurl-linux-armv7`（給 KL630 用）|
| golf.cgi (OOB Enabler CGI) | `/home/user/Documents/GOFACE/奧創雲/golf/content/golf.cgi` |
| golf.cgi 安裝 script | `golf/install.sh` → 複製到 OOB Enabler `/usr/local/sbin/www/api/` |
| Wrapper_mantratec | Vatics VML 建置系統（與 OTA 無關，是 VMF SDK 的 driver/lib 框架）|

---

## kCurl 工具說明（v1.1.1）

kCurl 是 Allxon 提供的輕量 HTTP 工具，有兩個模式：

### Client 模式（KL630 → OOB Enabler）

```sh
kCurl-linux-armv7 --data-binary @/tmp/sdcard/events/event_001.tar.gz \
    http://169.254.208.208/api/golf.cgi
```

- POST binary 檔案到 OOB Enabler 的 golf.cgi
- golf.cgi 計算 MD5 後回傳 `{"MD5": "..."}`，並將資料轉發至 Allxon Cloud
- golf.cgi 限制：只接受 192.168.*、169.254.*、10.* 的 REMOTE_ADDR

### Server 模式（OOB Enabler → KL630，用於 OTA）

```sh
kCurl-linux-armv7 -server -port 8192 -config /mnt/flash/vienna/ota_config.json &
```

- 在 KL630 上監聽 port 8192
- 收到檔案後，存到 `data-store-path`，再執行 `post-command`
- `$UPLOADED_FILE_PATH` 是自動帶入的收到檔案路徑

**`ota_config.json` 範例：**
```json
{
  "data-store-path": "/tmp/sdcard/ota",
  "post-command": "sh /mnt/flash/vienna/ota_update.sh $UPLOADED_FILE_PATH"
}
```

---

## 雙向資料流架構

```
┌─────────────────────────────────────────────────────────┐
│                     Allxon Cloud                        │
└──────────┬──────────────────────────┬───────────────────┘
           │ 接收事件上傳              │ 下發 OTA 韌體
           ▼                          ▼
┌─────────────────────────────────────────────────────────┐
│         OOB Enabler Bolt (169.254.208.208)              │
│  - 獨立 4G LTE 上網                                      │
│  - golf.cgi 安裝於 /usr/local/sbin/www/api/             │
│  - 內建 NTP（提供 KL630 對時用）                         │
└──────────┬──────────────────────────┬───────────────────┘
           │ golf.cgi (HTTP POST)      │ kCurl client POST 韌體
           │ ← KL630 上傳事件          │ → KL630:8192
           ▼                          ▼
┌─────────────────────────────────────────────────────────┐
│                KL630 (ARMv7, uClibc)                    │
│                                                         │
│  [事件上傳] kCurl client → POST tar.gz to golf.cgi       │
│  [OTA接收] kCurl server (port 8192) ← 接收韌體          │
│            └─ post-command: ota_update.sh               │
└─────────────────────────────────────────────────────────┘
```

---

## 事件上傳流程（KL630 → Cloud）

```
STDC 偵測違規
    → 抓截圖 (JPEG)
    → 打包 tar.gz（含 level1.jpg / level2.jpg / level3.jpg + event.json）
    → 存入 /tmp/sdcard/events/
    → kCurl-linux-armv7 --data-binary @event.tar.gz http://169.254.208.208/api/golf.cgi
    → OOB Enabler 轉發至 Allxon Cloud
```

---

## OTA 韌體更新流程（Cloud → KL630）

1. 在 KL630 啟動時跑 kCurl server 常駐
2. Allxon Cloud 下發 OTA 觸發 → OOB Enabler 用 kCurl client POST 韌體到 KL630:8192
3. kCurl server 收到後儲存，執行 `ota_update.sh`

**`ota_update.sh` 邏輯草稿：**
```sh
#!/bin/sh
NEW_BIN="$1"
TARGET="/mnt/flash/vienna/kp_firmware_host_stream"

# 停止現有韌體
killall kp_firmware_host_stream

# 替換 binary（flash 需 remount rw）
mount -o remount,rw /mnt/flash
cp "$NEW_BIN" "$TARGET"
chmod +x "$TARGET"
mount -o remount,ro /mnt/flash

# 重啟韌體
/mnt/flash/vienna/start_firmware.sh &
```

**待確認：**
- `/mnt/flash` 是否允許 remount rw？還是 binary 放在 SD 卡？
- Allxon Cloud 下發 OTA 的具體觸發機制（是 golf.cgi 擴充還是 OOB Enabler 的另一個 API）？
- kCurl server 在 OOB Enabler 上如何被觸發去 POST 到 KL630（需看 Allxon Platform 的 OTA flow）

---

## golf.cgi 說明

- 編譯環境：GCC 9.4.0 Buildroot allxon-bolt-standard，目標 ARMv7 uClibc
- 安裝位置（OOB Enabler 上）：`/usr/local/sbin/www/api/golf.cgi`
- 功能：接收 POST binary → 計算 MD5 → 回傳 JSON → 轉發至 Cloud
- IP 白名單：僅接受 `192.168.*`、`169.254.*`、`10.*`（本地網路保護）

---

## Wrapper_mantratec 說明（非 OTA 相關）

這是 Vatics VML（Vatics Middleware Library）Package 的建置系統框架：
- `drivers/` — Linux kernel modules（vpl_dmac_v2.0.0.3）
- `include/` — 共用 headers（dbgdefs.h, typedef.h, vivo_codec.h 等）
- `scripts/` — Makefile 建置系統

與 Allxon OTA 無關。是 VMF Vienna SDK 的 driver/library 開發框架，若未來需要自訂 KL630 上的 kernel module 或 VMF library 時才會用到。
