无主之地2配置高吗|看真人裸体BBBBB|秋草莓丝瓜黄瓜榴莲色多多|真人強奷112分钟|精品一卡2卡3卡四卡新区|日本成人深夜苍井空|八十年代动画片

網易首頁 > 網易號 > 正文 申請入駐

從30分鐘到30秒:DoIP并行刷寫如何“暴力破解”車載ECU海量數據升級困局

0
分享至


一、引言:數據量飆升背景下的刷寫困境

隨著“軟件定義汽車”時代的全面到來,現代智能汽車的車載軟件規模正經歷爆炸式增長。一輛2025年款的智能電動汽車通常搭載超過30個電子控制單元,代碼總量動輒數千萬行,ADAS系統固件單個體積往往超過1GB。自動駕駛領域的多傳感器融合方案進一步推高了數據量——智能駕駛車輛每天可產生40~80TB的原始數據,其中相當一部分需要在生產線端或售后場景中以固件更新的形式刷入目標EEA系統。與此同時,OTA市場規模以21.5%的年復合增長率快速擴張,車載軟件的更新頻率和單次升級包體積都在持續上升。

在這種背景下,“刷寫速度過快,但生產線節拍更緊”的矛盾愈發尖銳——尤其在工廠EOL環節,整車下線檢測和程序初始化必須在固定節拍內完成,任何一個ECU刷寫超時都可能拖累整條產線。面對這一困局,傳統的CAN/CAN FD刷寫方式顯然已力不從心。這就是本文所要探討的核心問題:以ISO 13400(DoIP協議)為基石,通過并行刷寫策略徹底打破串行刷寫的性能天花板,大幅壓縮整車級刷寫時長。

二、DoIP協議:高速刷寫的基石 2.1 何為DoIP?

DoIP全稱Diagnostic Communication over Internet Protocol,由ISO 13400標準系列定義。它本質上是一種傳輸協議,負責將符合統一診斷服務(UDS,ISO 14229)的診斷報文封裝在IP網絡中進行傳輸。與傳統的DoCAN(基于CAN總線)不同,DoIP充分利?了車載以太網的高帶寬優勢。

DoIP的定位非常清晰:它在應用層仍保持UDS的診斷語義不變,但在傳輸層與物理層用TCP/IP+以太網替代了傳統的CAN/ISO 15765協議棧。這意味著ODX數據庫和診斷邏輯可以最大程度復用,開發工程師無需重寫整套UDS服務邏輯,僅需補充DoIP協議通信參數即可完成從CAN到DoIP的平滑遷移。

2.2 帶寬數量級:從KB/s到MB/s的跨越

在CAN通信中,一條診斷報文的最大有效數據載荷僅為約4KB(255字節×16幀),且受限于總線仲裁機制,實際有效傳輸速率往往被限制在幾百Kbps以下。反觀DoIP,在ISO13400-2標準中,一條診斷報文的長度上限高達4GB。這意味著理論上一次$36服務(數據傳輸服務)可支持的發送數據量,CAN是4KB量級,DoIP則是GB級別。

在實際測試中,這一帶寬鴻溝帶來了刷寫時間的天壤之別:同文件大小下,DoIP刷寫耗時僅需4秒的場景,DoCAN卻需要3分18秒;而在更大文件的遠距離無線刷寫實踐中,采用DoIP的1.5GB文件升級時間約為20分鐘,而HS CAN刷寫同文件則需要約4小時。

這種數量級的提升,為并行刷寫提供了最為關鍵的底層基礎設施——在多ECU并行更新時,只有基于DoIP的高帶寬以太網架構,才能避免多路刷寫并發后數據流互相堵塞的網絡瓶頸。

2.3 DoIP通信五步標準流程

基于DoIP實現任意ECU刷寫,需要依次完成以下五個標準階段:

  1. 以太網激活 :診斷儀通過激活線(硬線)向DoIP邊緣節點發送激活信號(5V及以上電壓、持續200ms以上),喚醒ECU的以太網診斷功能。

  2. 車輛發現 :DHCP完成IP地址分配,邊緣節點廣播發送三次車輛聲明報文,使診斷儀獲取目標ECU的基本信息(VIN、邏輯地址、DoIP版本)。

  3. TCP連接建立 :診斷儀創建第一條TCP Socket,目標端口固定為13400(ISO 13400規定的DoIP報文監聽端口),與DoIP節點完成三次握手。

  4. 路由激活 :診斷儀發送Routing Activation Request(含自身邏輯地址、激活類型),DoIP節點根據配置校驗合法性,返回Routing Activation Response。

  5. 診斷信息交互 :路由激活成功后,TCP_DATA Socket即可傳輸UDS診斷報文( 預 編 程 、 36/37數據傳輸服務、$31例程服務等),完成預編程-編程-后編程三個刷寫階段。診斷流程結束后,檢測激活線/會話超時后關閉TCP連接。

值得注意的是,每個滿足DoIP規范的ECU必須支持n+1個并發TCP Socket連接,這一特性為多ECU并行刷寫提供了必要的前提條件。

三、從串行到并行:刷寫架構的范式變革 3.1 傳統串行刷寫的效率瓶頸

傳統的刷寫方式本質上是串行逐一更新:診斷儀依次與每一個需要更新的ECU建立連接、傳輸數據、等待響應,完成一個后再轉向下一個。

這種方式的低效性在有限條件下可通過更快的傳輸介質進行一定程度的改善與優化,但當ECU總數超過數個、每個ECU的刷寫數據量在數百MB級別時,即使單個ECU刷寫耗時被DoIP壓縮到秒級,所有ECU累加起來的刷寫總時長仍然會迅速突破生產節拍的容忍上限。由于現代整車所搭載的ECU數量是兩位數級別,串行刷寫的累加效應決定了它無法從根本上解決數據量飆升下的時間瓶頸。

※單ECU刷寫耗時: DoIP 平均30秒, DoCAN 平均3分鐘※
┌─────────────────────────────────────────────────────────┐
│ 傳統串行刷寫 (5個ECU) │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ECU_A│→│ECU_B│→│ECU_C│→│ECU_D│→│ECU_E│ │
│ └─────┘ └─────┘ └─────┘ └─────┘ └─────┘ │
│ ←──────────── DoIP 2.5分鐘 ────────────→ │
│ ←────────── DoCAN 15分鐘 ──────────→ │
│ │
│ 并行刷寫 (5個ECU) 多線程并行執行 │
│ ┌─────┐ │
│ ┌───┤ECU_A├─────────────────────────────────┐ │
│ │ └─────┘ │ │
│ │ ┌─────┐ │ │
│ ├───┤ECU_B├─────────────────────────────────┤ │
│ │ └─────┘ │ │
│ │ ┌─────┐ │ │
│ ├───┤ECU_C├─────────────────────────────────┤ │
│ │ └─────┘ │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ └───┤ECU_D├───┤ECU_E├───────────────────────┘ │
│ └─────┘ └─────┘ │
│ ←──── 耗時約30~90秒 ────→ (取5個ECU中最長的刷寫時長) │
└─────────────────────────────────────────────────────────┘
3.2 并行刷寫的核心策略和物理實現約束

并行刷寫的核心策略并不復雜,一句話即可概括:在以太網鏈路和所有DoIP節點滿足TCP并發約束的前提下,由上位機建立多個同時活躍的TCP連接,每個連接服務于一個目標ECU,診斷報文并發下發,各ECU獨立響應、獨立完成刷寫任務。

在多路并發中,約束條件來自兩方面:首先,每個DoIP節點必須支持至少n+1個并發TCP連接,這是ISO13400規范中的強制性要求。其次,上位機(診斷儀)需要具備足夠的處理能力來管理多個并行刷寫線程——每個線程不僅要維持一個獨立的TCP Socket連接,還要各自獨立完成UDS會話生命周期管理(診斷會話切換→安全訪問解鎖→驅動下載→數據下載→數據校驗→退出),并處理可能出現的流控、否定響應和傳輸層超時重傳。

在實際落地中,并行刷寫的可實現性與網關的拓撲結構密切相關:若多個目標ECU掛載在同一個子網關下,則上下行流量全部匯入該子網關,單網關的路由轉發能力將成為新的瓶頸。如掛載在中央網關下、且中央網關與各子網關之間的連接具備足夠的QoS發送緩沖,并行刷寫的效率幾乎可以實現線性擴展。

3.3 并行刷寫 vs. 隊列刷寫

需要與并行刷寫區分的是隊列刷寫技術。并行刷寫針對的是多ECU,目標是利用多條獨立通信鏈路在時間維度上充分并發;而隊列刷寫針對的是單個ECU內部的優化——對于單個ECU而言,上位機可以同時發送多個UDS請求而不必等待前一個請求的響應完成,目標ECU的Bootloader將這些請求緩存隊列中后逐條順序處理。

兩種優化策略可以組合疊加:在并行刷寫框架下,每個ECU線程內部再實現隊列刷寫機制,可以達到單位時間內向單個ECU注入診斷請求的最高速率,將帶寬利用率推至物理極限。業界已有基于DoIP協議的多線程ECU刷寫方法的實際落地案例,實驗結果顯示系統整體刷寫周期被壓縮了48.8%,故障自愈率顯著提高。

四、基于ISO13400的并行刷寫C++代碼示例 4.1 整體架構設計

并行刷寫上位機的核心組件包括:

  • ECU連接池 :管理到多個ECU的DoIP TCP連接(每個ECU一個Socket,目標端口13400,分配的源端口由系統隨機生成但不重疊)。

  • UDS會話管理器 :封裝 診 斷 會 話 控 制 、 27安全訪問、 例 程 服 務 、 34/36/37刷寫數據傳輸等UDS核心服務。

  • 線程池調度器 :并行執行多個ECU的刷寫任務,每個任務獨立運行完整的刷寫狀態機,支持任務完成/失敗/超時/重試處理。

  • 文件數據分片器 :將大文件固件數據切分成適合UDS傳輸的小塊(每塊約1KB~4KB),供各線程獨立讀取和發送。

4.2 核心代碼實現 4.2.1 DoIP底層通信封裝

首先封裝DoIP報文頭結構和基本的TCP Socket通信類:

// DoIP報文頭結構 (ISO 13400-2定義)
#pragma pack(push, 1)
struct DoIPHeader {
uint8_t protocolVersion; // 協議版本號,0x03 (ISO 13400-2:2019)
uint8_t inverseVersion; // 協議版本號取反,0xFC
uint16_t payloadType; // 負載類型
uint32_t payloadLength; // 負載長度(網絡字節序)
};
#pragma pack(pop)


// DoIP通信客戶端
class DoIPClient {
private:
int m_socket;
struct sockaddr_in m_addr;
bool m_connected;
public:
DoIPClient() : m_socket(-1), m_connected(false) {}
// 連接到ECU: 目標IP + 端口13400
bool connect(const std::string& ip, uint16_t port = 13400) {
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if (m_socket < 0) return false;
memset(&m_addr, 0, sizeof(m_addr));
m_addr.sin_family = AF_INET;
m_addr.sin_port = htons(port);
inet_pton(AF_INET, ip.c_str(), &m_addr.sin_addr);
if (::connect(m_socket, (struct sockaddr*)&m_addr, sizeof(m_addr)) < 0) {
close(m_socket);
return false;
}
m_connected = true;
return true;
}
// 發送UDS診斷請求(封裝在DoIP中)
bool sendUDSRequest(const std::vector& udsData, uint16_t srcAddr, uint16_t targetAddr) {
if (!m_connected) return false;
// 構造DoIP診斷報文(Payload Type = 0x8001)
DoIPHeader header;
header.protocolVersion = 0x03;
header.inverseVersion = 0xFC;
header.payloadType = htons(0x8001);
header.payloadLength = htonl(udsData.size() + 4); // 外加4字節邏輯地址
std::vector txData;
txData.insert(txData.end(), (uint8_t*)&header, (uint8_t*)&header + sizeof(header));
// 添加邏輯地址字段(2字節源地址 + 2字節目標地址)
uint16_t srcAddrNet = htons(srcAddr);
uint16_t targetAddrNet = htons(targetAddr);
txData.insert(txData.end(), (uint8_t*)&srcAddrNet, (uint8_t*)&srcAddrNet + 2);
txData.insert(txData.end(), (uint8_t*)&targetAddrNet, (uint8_t*)&targetAddrNet + 2);
// 添加UDS負載
txData.insert(txData.end(), udsData.begin(), udsData.end());
return send(txData);
}
// 接收ECU響應
std::vector recvResponse(int timeoutMs = 5000) {
// 實現接收和解析DoIP響應報文...
// (此處省略具體實現細節)
}
void disconnect() {
if (m_socket >= 0) close(m_socket);
m_connected = false;
}
};
4.2.2 UDS刷寫會話包裝類

class UDSFlasher {
private:
DoIPClient m_client;
std::string m_ecuIp;
uint16_t m_srcAddr; // 診斷儀邏輯地址
uint16_t m_targetAddr; // 目標ECU邏輯地址
std::vector m_seedKey; // 安全訪問種子/密鑰
// 發送UDS命令并等待響應
std::vector sendUDSCommand(uint8_t serviceId, const std::vector& data) {
std::vector request;
request.push_back(serviceId);
request.insert(request.end(), data.begin(), data.end());
if (!m_client.sendUDSRequest(request, m_srcAddr, m_targetAddr)) {
return {};
}
return m_client.recvResponse(5000);
}
public:
UDSFlasher(const std::string& ip, uint16_t src, uint16_t target)
: m_ecuIp(ip), m_srcAddr(src), m_targetAddr(target) {}
bool initConnection() {
return m_client.connect(m_ecuIp);
}
// Step 1: 進入擴展診斷會話
bool enterExtendSession() {
auto response = sendUDSCommand(0x10, {0x03}); // 0x10 03: 擴展診斷會話
return (response.size() >= 2 && response[0] == 0x50 && response[1] == 0x03);
}
// Step 2: 安全訪問種子獲取與密鑰驗證
bool securityAccess() {
// 請求種子
auto response = sendUDSCommand(0x27, {0x01}); // 0x27 01: 請求種子
if (response.size() < 3 || response[0] != 0x67 || response[1] != 0x01) {
return false;
}
// 提取種子(4字節)
std::vector seed(response.begin() + 2, response.begin() + 6);
// 計算密鑰(使用OEM特定算法)
std::vector key = computeSeedKey(seed);
// 發送密鑰
std::vector keyData = {0x02}; // 0x27 02: 發送密鑰
keyData.insert(keyData.end(), key.begin(), key.end());
response = sendUDSCommand(0x27, keyData);
return (response.size() >= 2 && response[0] == 0x67 && response[1] == 0x02);
}
// Step 3: 請求下載($34服務)
bool requestDownload(uint32_t dataSize, uint32_t address) {
std::vector req;
req.push_back(0x44); // 數據格式(主機廠自定義)
req.push_back(0x00); // 地址長度: 4字節
req.push_back(0x00); // 數據長度: 4字節
// 寫入起始地址(4字節)
for (int i = 3; i >= 0; i--)
req.push_back((address >> (i * 8)) & 0xFF);
// 寫入數據總長度(4字節)
for (int i = 3; i >= 0; i--)
req.push_back((dataSize >> (i * 8)) & 0xFF);
auto response = sendUDSCommand(0x34, req);
// 從響應中提取最大塊長度...
return (response.size() >= 2 && response[0] == 0x74);
}
// Step 4: 傳輸數據($36服務)
bool transferData(uint8_t blockSeq, const std::vector& data) {
std::vector req;
req.push_back(blockSeq);
req.insert(req.end(), data.begin(), data.end());
auto response = sendUDSCommand(0x36, req);
return (response.size() >= 2 && response[0] == 0x76);
}
// Step 5: 請求退出傳輸($37服務)
bool requestExitTransfer() {
auto response = sendUDSCommand(0x37, {});
return (response.size() >= 2 && response[0] == 0x77);
}
// Step 6: 執行刷寫完整性校驗($31例程服務)
bool checkIntegrity(uint16_t routineId) {
std::vector req;
req.push_back(0x01); // 啟動例程
req.push_back((routineId >> 8) & 0xFF);
req.push_back(routineId & 0xFF);
auto response = sendUDSCommand(0x31, req);
return (response.size() >= 2 && response[0] == 0x71);
}
// 執行ECU復位并關閉連接
bool ecuReset() {
auto response = sendUDSCommand(0x11, {0x01}); // 0x01: 硬復位
m_client.disconnect();
return (response.size() >= 2 && response[0] == 0x51);
}
};
4.2.3 并行刷寫調度器核心邏輯

class ParallelFlasher {
private:
std::vector m_tasks; // 每個ECU的刷寫任務
size_t m_concurrent; // 最大并發數
// 單個ECU刷寫工作函數
bool flashSingleECU(const ECUTask& task, size_t threadId) {
UDSFlasher flasher(task.ip, task.srcAddr, task.targetAddr);
std::cout << "[Thread " << threadId << "] Starting flash for ECU "
<< task.ecuName << std::endl;
if (!flasher.initConnection()) {
std::cerr << "[Thread " << threadId << "] Connection failed" << std::endl;
return false;
}
// 完整的刷寫流程(參考UDS規范標準刷寫序列)
if (!flasher.enterExtendSession()) return false;
if (!flasher.securityAccess()) return false;
// 準備固件數據
std::vector firmware = loadFirmware(task.firmwarePath);
// 請求下載
if (!flasher.requestDownload(firmware.size(), task.startAddress))
return false;
// 分塊傳輸數據
const size_t BLOCK_SIZE = 4096;
uint8_t blockSeq = 1;
for (size_t offset = 0; offset < firmware.size(); offset += BLOCK_SIZE) {
size_t chunkSize = std::min(BLOCK_SIZE, firmware.size() - offset);
std::vector chunk(firmware.begin() + offset,
firmware.begin() + offset + chunkSize);
if (!flasher.transferData(blockSeq++, chunk)) {
std::cerr << "[Thread " << threadId << "] Transfer failed at offset "
<< offset << std::endl;
return false;
}
// 可選: 打印進度
if (offset % (BLOCK_SIZE * 10) == 0) {
std::cout << "[Thread " << threadId << "] Progress: "
<< (offset * 100 / firmware.size()) << "%" << std::endl;
}
}
// 完成刷寫并校驗
if (!flasher.requestExitTransfer()) return false;
if (!flasher.checkIntegrity(0xF100)) return false;
if (!flasher.ecuReset()) return false;
std::cout << "[Thread " << threadId << "] ? ECU " << task.ecuName
<< " flashed successfully in "
<< std::chrono::duration_cast(
std::chrono::steady_clock::now().time_since_epoch()).count()
<< "s" << std::endl;
return true;
}
public:
ParallelFlasher(const std::vector & tasks, size_t concurrent = 4)
: m_tasks(tasks), m_concurrent(concurrent) {}
// 核心并行調度入口
bool flashAll() {
std::vector> futures;
std::atomic successCount{0};
auto startTime = std::chrono::steady_clock::now();
// 使用線程池并發執行所有ECU刷寫任務
std::mutex taskMutex;
size_t taskIdx = 0;
std::vector workers;
for (size_t i = 0; i < m_concurrent; ++i) {
workers.emplace_back([this, &taskIdx, &taskMutex, &successCount, i]() {
while (true) {
ECUTask task;
{
std::lock_guard lock(taskMutex);
if (taskIdx >= m_tasks.size()) break;
task = m_tasks[taskIdx++];
}
if (flashSingleECU(task, i)) {
successCount++;
}
}
});
}
for (auto& t : workers) t.join();
auto elapsed = std::chrono::duration_cast(
std::chrono::steady_clock::now() - startTime);
std::cout << "========================================" << std::endl;
std::cout << "Parallel flashing completed. Time: " << elapsed.count()
<< " seconds" << std::endl;
std::cout << "Success: " << successCount << "/" << m_tasks.size()
<< std::endl;
std::cout << "========================================" << std::endl;
return successCount == m_tasks.size();
}
};
4.3 使用示例

int main() {
// 定義需要刷寫的ECU列表: (名稱, IP地址, 邏輯地址, 固件路徑, 起始地址)
std::vector tasks = {
{"ADAS_Controller", "192.168.1.101", 0x1000, 0x1200,
"firmware/adas.bin", 0x8000000},
{"Infotainment_GW", "192.168.1.102", 0x1001, 0x1201,
"firmware/infotainment.bin", 0x8000000},
{"BCM_Unit", "192.168.1.103", 0x1002, 0x1202,
"firmware/bcm.bin", 0x8000000},
{"Battery_Mgmt", "192.168.1.104", 0x1003, 0x1203,
"firmware/bms.bin", 0x8000000}
};
// 創建并行刷寫調度器,最大并發數4
ParallelFlasher flasher(tasks, 4);
// 執行并行刷寫
if (flasher.flashAll()) {
std::cout << "All ECUs flashed successfully!" << std::endl;
} else {
std::cerr << "Some ECUs failed to flash!" << std::endl;
}
return 0;
}
五、工程實踐中的關鍵考量 5.1 網絡擁塞與流量整形

并行刷寫時,多路數據流同時以太網傳輸可能引發擁塞,導致丟包和重傳累積。實踐中推薦在上位機側實施流量整形:

  • 為每個ECU刷寫任務的發送速率設置合理上限

  • 在網關處設置緩沖區水位預警,基于QoS隊列為各ECU分配差異化帶寬

  • 對CAN FD/子網側ECU,在DoIP網關處做速率適配,避免以太網端高速輸出壓垮CAN低速側

5.2 異常處理與狀態回滾

并行刷寫環境下,單個ECU失敗不應影響其他ECU的正常刷寫——關鍵要保證任務間的隔離性。需要設計合理回滾機制:

  • 設置每個ECU刷寫的獨立超時門檻(根據文件大小和網絡質量動態調整)

  • 建立事務狀態表,記錄每個ECU當前所處的刷寫階段

  • 啟用斷點續傳機制,失敗后從中斷點重傳而非從頭開始

  • 對異常情況進行分類處理,區分可恢復錯誤與不可恢復錯誤

5.3 實時監控與可視化

并行刷寫過程中,工程師需要了解每個ECU的實時進展。可選方案是引入輕量級監控儀表板,實時展示各ECU連接狀態,以顯式進度取代黑盒等待。

六、總結與展望

智能汽車的數據量仍在加速攀升,傳統CAN診斷徹底被取代只是時間問題。DoIP協議為車載診斷提供了高速可靠的傳輸基礎設施,而并行刷寫策略則是將這一基礎設施的潛能徹底釋放的關鍵手段。當多路TCP Socket與線程池調度器在百兆甚至千兆車載以太網上同時運轉,十幾分鐘的刷寫時間可以被壓縮到幾十秒之內,不僅大幅提高了工廠EOL環節的生產效率,也為日后更高頻的整車OTA升級鋪平了道路。C++結合原始Socket的典型實現,簡潔而直接地詮釋了并行刷寫的核心工程思想,以此為起點,工程師們可以通過集成更完善的狀態機、更智能的流控策略和更強大的斷點續傳能力,將并行刷寫方案推向產品級穩定與成熟。

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
啥都和愛國扯到一起,就是一種病

啥都和愛國扯到一起,就是一種病

老唐有話說
2026-05-14 16:18:17
A股:剛剛,國務院國資委發布,不出意外的話,下周將迎來新變化

A股:剛剛,國務院國資委發布,不出意外的話,下周將迎來新變化

云鵬敘事
2026-05-16 00:00:09
國家發改委主任鄭柵潔會見波音公司總裁奧特伯格

國家發改委主任鄭柵潔會見波音公司總裁奧特伯格

新京報
2026-05-15 20:29:22
上海87-82戰勝北京!賽后數據一清二楚,不是王哲林 最大功臣是他

上海87-82戰勝北京!賽后數據一清二楚,不是王哲林 最大功臣是他

小火箭愛體育
2026-05-15 21:32:09
難怪黃仁勛那么積極跟著特朗普訪華,一到北京就拿下了大額訂單。

難怪黃仁勛那么積極跟著特朗普訪華,一到北京就拿下了大額訂單。

魔都姐姐雜談
2026-05-14 22:09:10
人活多久,看喝酒就知道?壽命短的人,喝酒一般有這6個特征

人活多久,看喝酒就知道?壽命短的人,喝酒一般有這6個特征

芹姐說生活
2026-05-14 23:38:55
上海奪G1但3人需總結!盧偉應變差點,白邊優勢被打沒,弗格太鐵

上海奪G1但3人需總結!盧偉應變差點,白邊優勢被打沒,弗格太鐵

籃球資訊達人
2026-05-16 01:09:21
38.98萬,夸張啊...

38.98萬,夸張啊...

放毒
2026-05-15 19:14:23
中紀委再次重拳出擊!這4個領域將被嚴查,這4種行為將被嚴肅處理

中紀委再次重拳出擊!這4個領域將被嚴查,這4種行為將被嚴肅處理

細說職場
2026-05-15 14:01:05
鄺兆鐳U17亞洲杯首秀!送助攻后或舊傷復發,只踢半場仍獲贊

鄺兆鐳U17亞洲杯首秀!送助攻后或舊傷復發,只踢半場仍獲贊

奧拜爾
2026-05-16 02:13:48
悲催!上海一母親將700萬遺產給兒子,6年后才發現被女兒徹底拉黑

悲催!上海一母親將700萬遺產給兒子,6年后才發現被女兒徹底拉黑

火山詩話
2026-05-15 06:49:15
特朗普還沒回國,就開始放狠話了

特朗普還沒回國,就開始放狠話了

利刃號
2026-05-15 17:16:39
第一次感受到“荔枝核的威力”,泡水里20天,長成“粉盆栽”

第一次感受到“荔枝核的威力”,泡水里20天,長成“粉盆栽”

美家指南
2026-05-15 15:27:43
國宴名場面刷屏:穿紅衣的服務員火了,這才是大國該有的體面

國宴名場面刷屏:穿紅衣的服務員火了,這才是大國該有的體面

娛樂洞察點點
2026-05-15 12:40:18
“錢車兩空”!男子以租代購跑網約車,三年還清13.5萬,過戶前一夜車被拖走

“錢車兩空”!男子以租代購跑網約車,三年還清13.5萬,過戶前一夜車被拖走

網約車觀察室
2026-05-14 10:00:49
張雪宣布停產!博主:雷軍出問題你建議退款 自己出問題只補償

張雪宣布停產!博主:雷軍出問題你建議退款 自己出問題只補償

念洲
2026-05-14 14:29:33
不是洛夫頓!不是古德溫!許利民贊上海隊1人,威廉姆斯傷情出爐

不是洛夫頓!不是古德溫!許利民贊上海隊1人,威廉姆斯傷情出爐

老吳說體育
2026-05-15 23:31:25
這跟不穿有啥區別?趙露思演唱會內衣外穿:被眾嘲一套比一套辣眼

這跟不穿有啥區別?趙露思演唱會內衣外穿:被眾嘲一套比一套辣眼

胡一舸南游y
2026-05-13 15:23:56
看好誰當選臺北市長?1.4萬人網絡投票結果一面倒

看好誰當選臺北市長?1.4萬人網絡投票結果一面倒

新時光點滴
2026-05-16 00:10:48
沙拉維深情告別羅馬:我即將離開,但我的一部分靈魂將永駐于此

沙拉維深情告別羅馬:我即將離開,但我的一部分靈魂將永駐于此

懂球帝
2026-05-16 02:43:35
2026-05-16 02:59:00
新能源自動駕駛 incentive-icons
新能源自動駕駛
專注于半導體行業資訊
977文章數 347關注度
往期回顧 全部

汽車要聞

高爾夫GTI刷新紐北紀錄 ID. Polo GTI迎全球首秀

頭條要聞

黃仁勛在北京喝豆汁痛苦皺眉 問“這是什么東西”

頭條要聞

黃仁勛在北京喝豆汁痛苦皺眉 問“這是什么東西”

體育要聞

德約科維奇買的球隊,從第6級聯賽升入法甲

娛樂要聞

方媛為何要來《桃花塢6》沒苦硬吃?

財經要聞

騰訊掉隊,馬化騰戳破真相

科技要聞

直降千元起步!蘋果華為率先開啟618讓利

態度原創

健康
游戲
本地
公開課
軍事航空

專家揭秘干細胞回輸的安全風險

《街霸6》春麗新品來了!招牌肉腿完美還原

本地新聞

用蘇繡的方式,打開江西婺源

公開課

李玫瑾:為什么性格比能力更重要?

軍事要聞

烏克蘭首都基輔遭空襲 死亡人數增至12人

無障礙瀏覽 進入關懷版