<tr id="tp1vn"><td id="tp1vn"><dl id="tp1vn"></dl></td></tr>
  1. <p id="tp1vn"></p>
  2. <sub id="tp1vn"><p id="tp1vn"></p></sub>
    <u id="tp1vn"><rp id="tp1vn"></rp></u>
    <meter id="tp1vn"></meter>
      <wbr id="tp1vn"><sup id="tp1vn"></sup></wbr>
      日韩第一页浮力,欧美a在线,中文字幕无码乱码人妻系列蜜桃 ,国产成人精品三级麻豆,国产男女爽爽爽免费视频,中文字幕国产精品av,两个人日本www免费版,国产v精品成人免费视频71pao
      網易首頁 > 網易號 > 正文 申請入駐

      從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-15 10:06:13
      丟人丟到國外,千萬網紅登上戛納紅毯,被工作人員驅趕還賴著不走

      丟人丟到國外,千萬網紅登上戛納紅毯,被工作人員驅趕還賴著不走

      喵喵娛樂團
      2026-05-14 16:36:28
      3天讓一眾美國高官開了眼界,魯比奧感嘆:中國軍力不愧世界第二

      3天讓一眾美國高官開了眼界,魯比奧感嘆:中國軍力不愧世界第二

      李健政觀察
      2026-05-15 18:16:45
      退役一周后,錢天一近況,即將成211研究生,給冠軍老公下廚做飯

      退役一周后,錢天一近況,即將成211研究生,給冠軍老公下廚做飯

      秋姐居
      2026-05-14 14:29:54
      正常人可以偶爾偷吃一顆偉哥嗎?有什么副作用?本文為你講出實情

      正常人可以偶爾偷吃一顆偉哥嗎?有什么副作用?本文為你講出實情

      健康科普365
      2026-05-09 21:05:04
      2000萬汽車人的囚徒困境:國內車市大跌20.6%,賣一輛虧兩三萬

      2000萬汽車人的囚徒困境:國內車市大跌20.6%,賣一輛虧兩三萬

      DearAuto
      2026-05-15 09:34:57
      男童海底撈奔跑撞上高溫紅油鍋,全身多處燙傷!媽媽:當時夜里11點,就我們一桌,店員應提前避讓;店長:孩子猛跑過來,曾多次提醒家長

      男童海底撈奔跑撞上高溫紅油鍋,全身多處燙傷!媽媽:當時夜里11點,就我們一桌,店員應提前避讓;店長:孩子猛跑過來,曾多次提醒家長

      大風新聞
      2026-05-14 16:29:22
      今日最慘股,10個一字跌停還有430萬封單,滿倉抄底已虧110萬!

      今日最慘股,10個一字跌停還有430萬封單,滿倉抄底已虧110萬!

      八斗小先生
      2026-05-15 14:42:25
      最近熱播的國劇排名:佳偶天成第8. 低智商犯罪第3. 第一沒爭議

      最近熱播的國劇排名:佳偶天成第8. 低智商犯罪第3. 第一沒爭議

      追星頂流大姑娘
      2026-05-15 20:51:33
      騰訊掉隊,馬化騰戳破真相

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

      虎嗅APP
      2026-05-15 16:31:10
      性生活不足,原來會短壽!每周多少次比較合適?研究告訴你答案

      性生活不足,原來會短壽!每周多少次比較合適?研究告訴你答案

      醫學原創故事會
      2026-05-12 15:34:03
      上海海港2-2浙江,賽后評分:不是王鈺棟第1,上海海港2人并列第1

      上海海港2-2浙江,賽后評分:不是王鈺棟第1,上海海港2人并列第1

      側身凌空斬
      2026-05-15 21:37:50
      76人解雇莫雷尋新經理,老板道歉稱無借口

      76人解雇莫雷尋新經理,老板道歉稱無借口

      體育硬核說
      2026-05-16 01:02:59
      成人片女星許諾薩福諾夫奪歐冠將共度良宵,球員妻子爆粗回應

      成人片女星許諾薩福諾夫奪歐冠將共度良宵,球員妻子爆粗回應

      懂球帝
      2026-05-14 15:58:14
      名記:姆巴佩與阿韋洛亞之爭證實,阿隆索是被三巨頭聯手做掉的

      名記:姆巴佩與阿韋洛亞之爭證實,阿隆索是被三巨頭聯手做掉的

      星耀國際足壇
      2026-05-15 11:08:33
      中美晚宴結束,雙方達成一項共識,馬斯克出面說了一句話,不簡單

      中美晚宴結束,雙方達成一項共識,馬斯克出面說了一句話,不簡單

      激情與榮耀并存
      2026-05-15 14:05:23
      突發! 韓國股市重挫6% 觸發熔斷

      突發! 韓國股市重挫6% 觸發熔斷

      每日經濟新聞
      2026-05-15 13:55:21
      霍爾木茲海峽,傳來大消息!伊朗發聲!美股、黃金、白銀,全線重挫!

      霍爾木茲海峽,傳來大消息!伊朗發聲!美股、黃金、白銀,全線重挫!

      證券時報
      2026-05-15 22:44:09
      盧偉:很久沒打這種級別的比賽隊員們有點緊,還好最后頂住了

      盧偉:很久沒打這種級別的比賽隊員們有點緊,還好最后頂住了

      懂球帝
      2026-05-15 21:44:31
      現貨黃金跌超3% 白銀大跌9%

      現貨黃金跌超3% 白銀大跌9%

      財聯社
      2026-05-15 21:47:17
      2026-05-16 01:40:50
      新能源自動駕駛 incentive-icons
      新能源自動駕駛
      專注于半導體行業資訊
      977文章數 347關注度
      往期回顧 全部

      汽車要聞

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

      頭條要聞

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

      頭條要聞

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

      體育要聞

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

      娛樂要聞

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

      財經要聞

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

      科技要聞

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

      態度原創

      藝術
      數碼
      親子
      本地
      游戲

      藝術要聞

      1008米!沙特“世界第一高樓”項目,為何極有可能建成?

      數碼要聞

      聯想發布ThinkPad T14 Gen 7 支持LPCAMM2可更換內存

      親子要聞

      人生第一次當主刀,就是給半歲嬰兒換心!新心還沒到,她得先把舊心切了...

      本地新聞

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

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

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 日韩乱伦电影| 中文字幕亚洲一区| 欧美亚洲日本国产其他| 国产v在线最新观看视频| 国产喷水福利在线视频| 末发育娇小性色xxxxx视频| 五月婷丁香| 欧美成本人视频免费播放| 国产???做受视频| 男人的天堂午夜精品视频在线| 亚洲AV中文无码乱人伦| 毛片自拍| 国产色婷婷五月精品综合在线| 久久久久久久久久久综合日本| 国产免费制服丝袜调教视频| a级福利毛片| 中文av无码人妻一区二区三区| 日日噜噜夜夜狠狠va视频| 播放灌醉水嫩大学生国内精品| 国产精品无码AV一区二区三区| 亚洲中文av一区二区三区| 另类综合30p| 大香蕉五月丁香| 中文字幕乱码一区二区三区免费| 亚洲人av高清无码| 亚洲一区av无码专区在线观看| 国产成人精品免费午夜| 日韩有码中文字幕一区二区| 亚洲国产精品一区二区第一页| 国产午夜草莓视频在线观看| 国产精品极品在线视频| 麻豆精品网站| 亚洲欧美中文日韩在线v日本| 99久久99久久久精品齐齐综合色圆| a亚洲欧美中文日韩v日本| 乱码午夜-极品国产内射| 亚洲国产成人综合精品| 大地资源中文第三页| 亚洲欧美日韩不卡一区二区三区| 国语做受对白XXXXX在线| 久久国产女人|