4. V2N通信:通过蜂窝网络上传车辆遥测数据
任务目标
在车载终端(OBU/T-Box)侧采集速度、经纬度等遥测数据,通过 4G/5G 蜂窝网络以 HTTP POST 方式上传到云端服务器;云端提供接收接口并落盘保存。本案例给出可独立运行的最小实现:一个 Python 车载上传端 + 一个 Flask 云端接收端,并说明如何验证上传成功。
环境与依赖
- Python 3.8+
- 上传端:
requests(pip install requests) - 云端:
flask(pip install flask) - 蜂窝网络:车载端需具备 4G/5G 数据链路(本机联网即可模拟)
数据流与结构
云端接收端(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")
运行与验证
- 启动云端:
python server.py,监听0.0.0.0:8000。 - 另开终端运行上传端:
python uploader.py。 - 观察上传端输出:出现
status=201且末行打印UPLOAD_OK,即判定上传成功。 - 在云端目录查看
telemetry.jsonl,应新增一行包含vehicle_id/speed_kmh/lat/lon/ts的 JSON 记录。
失败排查:若打印 network error 或 UPLOAD_FAILED,检查蜂窝链路是否连通、SERVER 地址与端口是否正确、云端是否已启动;若返回 400,检查 payload 是否缺少必填字段。