4. V2N通信:通过蜂窝网络上传车辆遥测数据

任务目标

在车载终端(OBU/T-Box)侧采集速度、经纬度等遥测数据,通过 4G/5G 蜂窝网络以 HTTP POST 方式上传到云端服务器;云端提供接收接口并落盘保存。本案例给出可独立运行的最小实现:一个 Python 车载上传端 + 一个 Flask 云端接收端,并说明如何验证上传成功。

环境与依赖

  • Python 3.8+
  • 上传端:requests(pip install requests)
  • 云端:flask(pip install flask)
  • 蜂窝网络:车载端需具备 4G/5G 数据链路(本机联网即可模拟)

数据流与结构

车载终端 采集速度/位置 构造 JSON 4G/5G 蜂窝网络 HTTP POST /api/telemetry 云端服务器 校验并落盘 返回 201 响应状态码 / 结果

云端接收端(server.py)

提供 POST /api/telemetry 接口,校验必填字段后追加写入 telemetry.jsonl,成功返回 201。

from flask import Flask, request, jsonify
import json, time

app = Flask(__name__)
LOG = "telemetry.jsonl"
REQUIRED = ["vehicle_id", "speed_kmh", "lat", "lon", "ts"]

@app.route("/api/telemetry", methods=["POST"])
def telemetry():
    data = request.get_json(silent=True)
    if not isinstance(data, dict):
        return jsonify({"error": "invalid json"}), 400
    missing = [k for k in REQUIRED if k not in data]
    if missing:
        return jsonify({"error": "missing", "fields": missing}), 400
    with open(LOG, "a", encoding="utf-8") as f:
        f.write(json.dumps(data, ensure_ascii=False) + "\n")
    return jsonify({"status": "ok", "received_at": time.time()}), 201

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

车载上传端(uploader.py)

采集一次遥测数据(速度、经纬度、时间戳),通过蜂窝网络 POST 到云端;带超时与重试,打印状态码与响应体。

import time, requests

SERVER = "http://127.0.0.1:8000/api/telemetry"  # 实际部署改为云端公网/内网地址
VEHICLE_ID = "VIN-0001"

def collect_telemetry():
    # 真实场景由 CAN/定位模块读取,这里给出确定性示例值
    return {
        "vehicle_id": VEHICLE_ID,
        "speed_kmh": 62.5,
        "lat": 31.2304,
        "lon": 121.4737,
        "ts": time.time(),
    }

def upload(payload, retries=3, timeout=5):
    for i in range(1, retries + 1):
        try:
            r = requests.post(SERVER, json=payload, timeout=timeout)
            print(f"[try {i}] status={r.status_code} body={r.text}")
            if r.status_code == 201:
                return True
        except requests.RequestException as e:
            print(f"[try {i}] network error: {e}")
        time.sleep(1)
    return False

if __name__ == "__main__":
    ok = upload(collect_telemetry())
    print("UPLOAD_OK" if ok else "UPLOAD_FAILED")

运行与验证

  1. 启动云端:python server.py,监听 0.0.0.0:8000。
  2. 另开终端运行上传端:python uploader.py。
  3. 观察上传端输出:出现 status=201 且末行打印 UPLOAD_OK,即判定上传成功。
  4. 在云端目录查看 telemetry.jsonl,应新增一行包含 vehicle_id/speed_kmh/lat/lon/ts 的 JSON 记录。

失败排查:若打印 network error 或 UPLOAD_FAILED,检查蜂窝链路是否连通、SERVER 地址与端口是否正确、云端是否已启动;若返回 400,检查 payload 是否缺少必填字段。