<ruby id="9ue20"></ruby>

  1. 
    

      国产午夜福利免费入口,国产日韩综合av在线,精品久久人人妻人人做精品,蜜臀av一区二区三区精品,亚洲欧美中文日韩在线v日本,人妻av中文字幕无码专区 ,亚洲精品国产av一区二区,久久精品国产清自在天天线
      網易首頁 > 網易號 > 正文 申請入駐

      從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.

      相關推薦
      熱點推薦
      蘋果官宣降價:iPhone 17 Pro系列全線下調1000元

      蘋果官宣降價:iPhone 17 Pro系列全線下調1000元

      CNMO科技
      2026-05-15 07:28:30
      太諷刺!許家印獄中等判決,前妻卻在倫敦豪宅養31歲“小鮮肉”

      太諷刺!許家印獄中等判決,前妻卻在倫敦豪宅養31歲“小鮮肉”

      未曾青梅
      2026-05-11 22:14:44
      我國取得重大找礦突破!

      我國取得重大找礦突破!

      證券時報
      2026-05-15 21:07:11
      特朗普精力充沛,養生秘訣是吃大量阿司匹林,日常三餐吃麥當勞

      特朗普精力充沛,養生秘訣是吃大量阿司匹林,日常三餐吃麥當勞

      南權先生
      2026-04-04 05:05:03
      父親一句氣話逼走17歲兒子,8天后救援隊找到人,已無生命體征

      父親一句氣話逼走17歲兒子,8天后救援隊找到人,已無生命體征

      林大師熱點
      2026-05-14 23:20:11
      拒絕被挑撥站隊!12歲小玥兒戳破與馬筱梅真實交情,成年人別加戲

      拒絕被挑撥站隊!12歲小玥兒戳破與馬筱梅真實交情,成年人別加戲

      橙星文娛
      2026-05-15 13:59:15
      西安市人大常委會辦公廳原一級巡視員賀簡政接受審查調查

      西安市人大常委會辦公廳原一級巡視員賀簡政接受審查調查

      界面新聞
      2026-05-15 19:24:15
      千年難遇的美人,太漂亮了,沒有一點毛病,太完美了

      千年難遇的美人,太漂亮了,沒有一點毛病,太完美了

      情感大頭說說
      2026-04-24 12:46:24
      第二個李湘?董璇帶9歲小酒窩見楊麗萍惹爭議,網友:討厭此人!

      第二個李湘?董璇帶9歲小酒窩見楊麗萍惹爭議,網友:討厭此人!

      夢想的旅途照進現實
      2026-05-13 15:51:50
      玲瓏輪胎:塞爾維亞工廠目前成本偏高,主要受產能未達滿產,固定成本分攤壓力較大等多方面影響

      玲瓏輪胎:塞爾維亞工廠目前成本偏高,主要受產能未達滿產,固定成本分攤壓力較大等多方面影響

      每日經濟新聞
      2026-05-15 15:52:07
      張天愛太豐滿了!穿掛脖裙都兜不住好身材,性感又撩人!

      張天愛太豐滿了!穿掛脖裙都兜不住好身材,性感又撩人!

      小椰的奶奶
      2026-04-23 18:12:08
      M5 MacBook Pro跌破1500美元,iPhone 16e降至449美元

      M5 MacBook Pro跌破1500美元,iPhone 16e降至449美元

      薛定諤的BUG
      2026-05-16 00:36:24
      不是羅德里!老佛爺要強挖曼城王牌,皇馬要組史詩級三叉戟?

      不是羅德里!老佛爺要強挖曼城王牌,皇馬要組史詩級三叉戟?

      瀾歸序
      2026-05-15 02:21:44
      肯塔基后衛奧維在NBA選秀聯合試訓展現得分能力

      肯塔基后衛奧維在NBA選秀聯合試訓展現得分能力

      熱血體育社
      2026-05-16 00:44:02
      浙江一男子裝修時發現住了十年的房子還有一層,層高不低,有窗戶、有燈,甚至還有窗簾;網友:為時不晚

      浙江一男子裝修時發現住了十年的房子還有一層,層高不低,有窗戶、有燈,甚至還有窗簾;網友:為時不晚

      臺州交通廣播
      2026-05-15 23:44:44
      好清醒,結賬覺得貴就應該大大方方的拒絕!網友:早就不在乎面子了

      好清醒,結賬覺得貴就應該大大方方的拒絕!網友:早就不在乎面子了

      另子維愛讀史
      2026-05-15 07:20:09
      【舊事】鄧麗君真正死因:控制不了自己,到時候就會“欲罷不能”

      【舊事】鄧麗君真正死因:控制不了自己,到時候就會“欲罷不能”

      年之父
      2026-05-09 04:05:03
      奇瑞董事長尹同躍:已為智界投入200多億專項資金,智界V9累計小訂突破4萬輛

      奇瑞董事長尹同躍:已為智界投入200多億專項資金,智界V9累計小訂突破4萬輛

      新浪財經
      2026-05-15 15:21:10
      Git和GitHub到底啥區別?看完這篇終于懂了

      Git和GitHub到底啥區別?看完這篇終于懂了

      像素與芯片
      2026-05-14 12:54:33
      傅藝偉曬與母親合照!她已走出喪子悲痛,余生要托起母親晚年

      傅藝偉曬與母親合照!她已走出喪子悲痛,余生要托起母親晚年

      手工制作阿殲
      2026-05-15 01:52:54
      2026-05-16 01:12:49
      新能源自動駕駛 incentive-icons
      新能源自動駕駛
      專注于半導體行業資訊
      977文章數 347關注度
      往期回顧 全部

      汽車要聞

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

      頭條要聞

      特朗普稱中方同意購買200架波音飛機 外交部回應

      頭條要聞

      特朗普稱中方同意購買200架波音飛機 外交部回應

      體育要聞

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

      娛樂要聞

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

      財經要聞

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

      科技要聞

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

      態度原創

      健康
      時尚
      數碼
      本地
      房產

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

      頂級團隊拍出來的作品不如素人,問題出在哪兒了?

      數碼要聞

      七彩虹2026款iGame M15/M16 Origo筆記本發售,11499元起

      本地新聞

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

      房產要聞

      老黃埔熱銷之下,珠江春,為何去化僅3成?

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 青青青视频免费一区二区| 久久亚洲精品国产精品| 国产在线精品一区二区三区不卡| 亚洲老女人区一区二视频| 五十路丰满中年熟女中出| 婷婷99狠狠躁天天躁| 国产真正老熟女无套内射| 国产乱码1卡二卡3卡四卡5| 《国产成人高清精品免费5388》| 久久久久免费看少妇高潮A片| 国产热A欧美热A在线视频| 国产成人一区二区无码不卡在线| 亚洲 中文 欧美 日韩 在线| 亚洲欧美日韩成人综合一区| 欲色欲色天天天www| 99久久国产精品无码| 亚洲原创无码| 在线无码视频观看草草视频| 亚洲欧美中文v日韩v在线| 黑人猛精品一区二区三区| 探花av| 少妇被多人c夜夜爽爽av| 苍井空毛片精品久久久| 好男人在线社区WWW在线观看视频 国产免费一级精品视频 | AV在线无码| 亚洲一区二区三区十八禁| 无码国模国产在线观看免费| 亚洲最大成人在线播放| 国产亚洲成人综合| 亚洲碰碰人人AV熟女天堂| 香港特级三A毛片免费观看| 久久久综合九色合综| 麻豆一区二区三区香蕉视频| 亚洲国产中文字幕精品| 亚洲精品自拍| 亚洲欧洲AV| 无码专区久久综合久中文字幕| 国产xxxxxx| 欧美性猛交xxxx乱大交极品| 亚洲综合av男人的天堂| 欧美另类精品xxxx人妖|