<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
      網易首頁 > 網易號 > 正文 申請入駐

      UDS 診斷服務精講:$22 ReadDataByIdentifier、$2E WriteDataByIdentifier 與 $31 RoutineC...

      0
      分享至


      UDS 診斷服務精講: 、 2E WriteDataByIdentifier 與 $31 RoutineControl


      在基于 ISO 14229 的 UDS 診斷協議中,$22$2E$31是最常用的三個服務,分別用于讀取數據寫入數據執行例程。它們構成了診斷交互的核心:獲取車輛信息、標定配置、觸發復雜動作。本文將詳細講解這三個服務的協議格式、正負響應機制,并提供可直接運行的 C++ 模擬代碼,幫助開發者快速理解與實現。

      一、$22 ReadDataByIdentifier(按標識符讀數據) 1.1 功能說明

      $22服務允許診斷儀(Tester)讀取一個或多個數據標識符(DID,Data Identifier)對應的數據值。DID 通常為兩個字節(如0xF190表示 VIN 碼)。ECU 收到請求后,從內部存儲或實時計算中獲得數據,并以$62響應回傳。

      1.2 協議格式

      • 請求22 DID [DID2 ...]

        • 22:服務 ID

        • DID:高字節 + 低字節(例如F1 90

        • 可連續請求多個 DID(但多數實現一次只請求一個,避免長度過長)

      • 正響應62 DID dataRecord

        • 62:響應服務 ID

        • DID:回顯請求中的 DID

        • dataRecord:該 DID 對應的數據字節(長度由 DID 定義決定)

      • 負響應7F 22 NRC

        • 7F:負響應固定值

        • 22:原始請求服務 ID

        • NRC:負響應碼(見下文)

      1.3 常見負響應碼(NRC)

      NRC

      含義

      0x13

      報文長度或格式錯誤(例如 DID 數量不匹配)

      0x22

      條件不滿足(例如車輛未上 ON 檔)

      0x31

      DID 不支持或當前會話不可用

      0x33

      安全訪問未解鎖,DID 受保護


      1.4 C++ 代碼示例:模擬 ECU 處理 $22 請求

      #include  
      
      #include
      #include
      #include
      using namespace std;

      // 模擬 ECU 內部 DID 數據庫
      class EcuDataBase {
      public:
      EcuDataBase() {
      // 預定義 DID 及其數據(VIN 碼示例)
      dataStore[0xF190] = { 'L', 'F', 'V', '3', 'A', '2', '1', 'K', '8', 'M', '5', '0', '0', '0', '0', '1' };
      // 軟件版本號 DID = 0xF188
      dataStore[0xF188] = { 0x01, 0x02, 0x03 };
      }

      bool isDIDSupported(uint16_t did) const {
      return dataStore.find(did) != dataStore.end();
      }

      const vector& getData(uint16_t did) const {
      static vector empty;
      auto it = dataStore.find(did);
      if (it != dataStore.end())
      return it->second;
      return empty;
      }

      // 模擬條件檢查(如安全等級、ON檔狀態等)
      bool isReadable(uint16_t did) const {
      // 示例:0xF190 任何時候可讀;0xF188 需要解鎖
      if (did == 0xF188)
      return securityUnlocked; // 需要安全解鎖
      return true;
      }

      void setSecurityUnlocked(bool locked) { securityUnlocked = locked; }

      private:
      map> dataStore;
      bool securityUnlocked = false;
      };

      // 處理 $22 請求的函數
      // 輸入:完整請求報文(首字節為 0x22),輸出:響應報文
      vector handleReadDataByIdentifier(const vector& request, EcuDataBase& ecu) {
      const uint8_t SID = 0x22;
      const uint8_t POS_RESP_SID = 0x62;

      // 負響應輔助
      auto negResp = [&](uint8_t nrc) -> vector {
      return { 0x7F, SID, nrc };
      };

      if (request.size() < 3) // 至少 SID + DID(2字節)
      return negResp(0x13); // 格式錯誤

      // 檢查是否支持該 DID
      uint16_t did = (request[1] << 8) | request[2];
      if (!ecu.isDIDSupported(did))
      return negResp(0x31); // 不支持

      // 檢查讀取條件
      if (!ecu.isReadable(did))
      return negResp(0x33); // 安全未解鎖

      // 構造正響應
      vector response;
      response.push_back(POS_RESP_SID);
      response.push_back(request[1]); // DID 高字節
      response.push_back(request[2]); // DID 低字節
      const auto& data = ecu.getData(did);
      response.insert(response.end(), data.begin(), data.end());

      return response;
      }

      // 演示
      int main() {
      EcuDataBase ecu;
      // 請求讀取 VIN (DID=0xF190)
      vector request = { 0x22, 0xF1, 0x90 };
      vector response = handleReadDataByIdentifier(request, ecu);

      cout << "Request: ";
      for (auto b : request) printf("%02X ", b);
      cout << "\nResponse: ";
      for (auto b : response) printf("%02X ", b);
      cout << endl;

      // 請求需要解鎖的 DID (0xF188) 且未解鎖
      request = { 0x22, 0xF1, 0x88 };
      response = handleReadDataByIdentifier(request, ecu);
      cout << "\nRequest (locked): ";
      for (auto b : request) printf("%02X ", b);
      cout << "\nResponse: ";
      for (auto b : response) printf("%02X ", b);
      cout << endl;

      // 解鎖后再次請求
      ecu.setSecurityUnlocked(true);
      response = handleReadDataByIdentifier(request, ecu);
      cout << "\nRequest (unlocked): ";
      for (auto b : request) printf("%02X ", b);
      cout << "\nResponse: ";
      for (auto b : response) printf("%02X ", b);
      cout << endl;

      return 0;
      }

      輸出示例(實際運行時):

      Request: 22 F1 90 
      Response: 62 F1 90 4C 46 56 33 41 32 31 4B 38 4D 35 30 30 30 30 31

      Request (locked): 22 F1 88
      Response: 7F 22 33

      Request (unlocked): 22 F1 88
      Response: 62 F1 88 01 02 03
      二、$2E WriteDataByIdentifier(按標識符寫數據) 2.1 功能說明

      $2E服務用于診斷儀向 ECU 寫入一個 DID 對應的數據值。典型應用包括寫入 VIN 碼、配置字、車架號、標定參數等。注意:可讀 DID 未必可寫,寫操作通常受更嚴格的安全和條件約束。

      2.2 協議格式

      • 請求2E DID dataRecord

        • 2E:服務 ID

        • DID:兩字節標識符

        • dataRecord:要寫入的數據字節流(長度由 DID 定義決定)

      • 正響應6E DID(僅回顯 DID,不返回數據內容)

      • 負響應7F 2E NRC

      2.3 常見負響應碼(NRC)

      NRC

      含義

      0x13

      數據長度或格式與 DID 定義不符

      0x22

      當前條件不滿足寫入(如車速不為0)

      0x31

      DID 不支持寫入(只讀 DID)

      0x33

      需要安全訪問解鎖

      0x72

      寫入時內部錯誤(如校驗失敗、非易失存儲故障)


      重點坑:動態定義的 DID(如通過 $2C 服務動態創建)通常不能作為 $2E 的寫入目標。
      2.4 C++ 代碼示例:模擬 ECU 處理 $2E 請求

      #include  
      
      #include
      // 沿用前面的 EcuDataBase,擴展寫入支持

      class EcuDataBaseWithWrite : public EcuDataBase {
      public:
      // 檢查是否允許寫入
      bool isWriteable(uint16_t did) const {
      // 示例:0xF190 可寫但需安全解鎖;0xF188 只讀
      if (did == 0xF190) return securityUnlockedWrite;
      if (did == 0xF188) return false; // 只讀 DID
      return false; // 其它 DID 不允許寫
      }

      bool writeData(uint16_t did, const vector& data) {
      if (!isWriteable(did))
      return false;
      // 長度校驗(示例:VIN 必須為 17 字節)
      if (did == 0xF190 && data.size() != 17)
      return false;
      dataStore[did] = data; // 覆蓋寫入
      return true;
      }

      void setWriteUnlocked(bool unlocked) { securityUnlockedWrite = unlocked; }

      private:
      bool securityUnlockedWrite = false;
      };

      // 處理 $2E 請求
      vector handleWriteDataByIdentifier(const vector& request, EcuDataBaseWithWrite& ecu) {
      const uint8_t SID = 0x2E;
      const uint8_t POS_RESP_SID = 0x6E;

      auto negResp = [&](uint8_t nrc) -> vector {
      return { 0x7F, SID, nrc };
      };

      if (request.size() < 4) // SID + DID(2) + 至少1字節數據
      return negResp(0x13);

      uint16_t did = (request[1] << 8) | request[2];
      vector writeData(request.begin() + 3, request.end());

      // 檢查 DID 是否支持寫入
      if (!ecu.isWriteable(did))
      return negResp(0x31);

      // 執行寫入
      if (!ecu.writeData(did, writeData))
      return negResp(0x72); // 寫入失敗(長度或條件)

      // 正響應
      return { POS_RESP_SID, request[1], request[2] };
      }

      int main() {
      EcuDataBaseWithWrite ecu;
      // 嘗試寫入 VIN (DID=0xF190) 但未解鎖
      vector newVin = { '1','G','N','P','K','D','K','E','X','R','1','2','3','4','5','6','7' };
      vector request = { 0x2E, 0xF1, 0x90 };
      request.insert(request.end(), newVin.begin(), newVin.end());

      vector resp = handleWriteDataByIdentifier(request, ecu);
      cout << "Write without unlock: ";
      for (auto b : resp) printf("%02X ", b);
      cout << endl;

      // 解鎖并寫入
      ecu.setWriteUnlocked(true);
      resp = handleWriteDataByIdentifier(request, ecu);
      cout << "Write with unlock: ";
      for (auto b : resp) printf("%02X ", b);
      cout << endl;

      // 驗證讀取
      vector readReq = { 0x22, 0xF1, 0x90 };
      auto readResp = handleReadDataByIdentifier(readReq, ecu);
      cout << "Verify read after write: ";
      for (auto b : readResp) printf("%02X ", b);
      cout << endl;

      return 0;
      }

      輸出示例

      Write without unlock: 7F 2E 31 
      Write with unlock: 6E F1 90
      Verify read after write: 62 F1 90 31 47 4E 50 4B 44 4B 45 58 52 31 32 33 34 35 36 37
      三、$31 RoutineControl(例程控制) 3.1 功能說明

      $31服務用于觸發 ECU 內部一段預定義的例程(Routine),例如自檢、內存擦除、鑰匙學習、刷寫前檢查等。與$22/$2E操作靜態數據不同,$31執行的是動作(函數回調)。例程通過兩字節的例程標識符(RID)區分。

      3.2 控制類型(sub-function)

      含義

      0x01

      啟動例程 (Start)

      0x02

      停止例程 (Stop)

      0x03

      請求例程結果 (RequestResults)

      請求中可攜帶附加參數(例如擦除起始地址、長度),由 RID 定義決定。

      3.3 協議格式

      • 請求31 routineControlType RID [routineData...]

      • 正響應71 routineControlType RID [routineStatusData...]

        • Start:可能返回預計執行時間或狀態

        • RequestResults:返回例程執行的結果數據(如故障碼個數)

      • 負響應7F 31 NRC

      3.4 常見負響應碼(NRC)

      NRC

      含義

      0x12

      子功能(controlType)不支持

      0x13

      報文長度錯誤(缺少必需參數)

      0x22

      當前條件不滿足(如發動機運轉中不能擦除)

      0x24

      順序錯誤(例如未 Start 就 RequestResults)

      0x31

      RID 不支持或參數超出范圍

      0x33

      需要安全訪問解鎖

      0x72

      例程執行失敗(例如擦除校驗錯誤)


      3.5 C++ 代碼示例:模擬 ECU 處理例程控制

      #include  
      
      #include
      #include
      #include
      #include

      enum RoutineState { IDLE, RUNNING, FINISHED };
      class EcuRoutineController {
      public:
      EcuRoutineController() : state(IDLE), resultReady(false) {}

      // 注冊例程回調
      void registerRoutine(uint16_t rid, function&)> startFunc,
      function stopFunc,
      function()> resultFunc) {
      routines[rid] = { startFunc, stopFunc, resultFunc };
      }

      // 處理 $31 請求
      vector handleRoutineControl(const vector& request) {
      const uint8_t SID = 0x31;
      const uint8_t POS_RESP_SID = 0x71;
      auto negResp = [&](uint8_t nrc) -> vector {
      return { 0x7F, SID, nrc };
      };

      if (request.size() < 4) // SID + SubFunc + RID(2)
      return negResp(0x13);

      uint8_t ctrlType = request[1];
      uint16_t rid = (request[2] << 8) | request[3];
      vector param(request.begin() + 4, request.end());

      // 檢查子功能支持
      if (ctrlType != 0x01 && ctrlType != 0x02 && ctrlType != 0x03)
      return negResp(0x12);

      // 檢查 RID 是否存在
      auto it = routines.find(rid);
      if (it == routines.end())
      return negResp(0x31);

      auto& routine = it->second;
      bool success = false;
      vector resultData;

      switch (ctrlType) {
      case 0x01: // Start
      if (state != IDLE)
      return negResp(0x24); // 順序錯誤:已運行或未正確停止
      success = routine.startFunc(param);
      if (success) {
      state = RUNNING;
      // 模擬異步執行,這里簡單同步,實際可啟動線程
      // 為演示效果,立即標記完成(真實場景需延遲)
      state = FINISHED;
      resultReady = true;
      resultCache = routine.resultFunc(); // 預存結果
      }
      break;
      case 0x02: // Stop
      if (state != RUNNING && state != FINISHED)
      return negResp(0x24);
      success = routine.stopFunc();
      if (success) state = IDLE;
      break;
      case 0x03: // RequestResults
      if (!resultReady)
      return negResp(0x24); // 未 Start 或未完成
      resultData = routine.resultFunc();
      // 不改變狀態
      break;
      }

      if (!success)
      return negResp(0x72); // 例程執行失敗

      // 構造正響應
      vector response = { POS_RESP_SID, ctrlType, uint8_t(rid >> 8), uint8_t(rid & 0xFF) };
      response.insert(response.end(), resultData.begin(), resultData.end());
      return response;
      }

      private:
      struct Routine {
      function&)> startFunc;
      function stopFunc;
      function()> resultFunc;
      };
      map routines;
      RoutineState state;
      bool resultReady;
      vector resultCache;
      };

      // 演示:內存擦除例程 RID=0xFF01
      int main() {
      EcuRoutineController ecu;
      // 注冊擦除例程
      ecu.registerRoutine(0xFF01,
      [](const vector& params) -> bool {
      cout << "Routine Start: Erasing memory, params size=" << params.size() << endl;
      // 模擬條件檢查(例如參數必須包含有效地址)
      if (params.size() < 4) return false;
      return true;
      },
      []() -> bool {
      cout << "Routine Stop: Stop erasing" << endl;
      return true;
      },
      []() -> vector {
      cout << "Routine Result: Erase success, 0 errors" << endl;
      return { 0x00, 0x00 }; // 成功標志
      }
      );

      // 請求啟動例程,帶參數(起始地址0x0000,長度0x1000)
      vector request = { 0x31, 0x01, 0xFF, 0x01, 0x00, 0x00, 0x10, 0x00 };
      auto resp = ecu.handleRoutineControl(request);
      cout << "Start response: ";
      for (auto b : resp) printf("%02X ", b);
      cout << endl;

      // 請求結果
      request = { 0x31, 0x03, 0xFF, 0x01 };
      resp = ecu.handleRoutineControl(request);
      cout << "Result response: ";
      for (auto b : resp) printf("%02X ", b);
      cout << endl;

      // 未 Start 就請求結果(狀態機已變化,這里演示順序錯誤,需重置狀態?實際需真實模擬)
      // 為了展示 NRC 0x24,再創建一個新控制器
      EcuRoutineController ecu2;
      ecu2.registerRoutine(0xFF01, [](auto){return true;}, []{return true;}, []{return vector{};});
      request = { 0x31, 0x03, 0xFF, 0x01 };
      resp = ecu2.handleRoutineControl(request);
      cout << "Result without start: ";
      for (auto b : resp) printf("%02X ", b);
      cout << endl;

      return 0;
      }

      輸出示例

      Routine Start: Erasing memory, params size=4
      Start response: 71 01 FF 01 00 00
      Routine Result: Erase success, 0 errors
      Result response: 71 03 FF 01 00 00
      Result without start: 7F 31 24
      四、總結:NRC 排查思路

      無論遇到哪個服務的負響應,都可以按照以下金字塔順序排查:

      1. 服務/子功能支持性(0x12,0x31)
        檢查對方 ECU 是否實現了該 SID 或 RID/ DID。

      2. 安全訪問狀態(0x33)
        多數寫操作和敏感讀取需要先執行$27服務解鎖。

      3. 會話模式(0x7F常伴隨0x120x31)
        某些服務僅在擴展會話下可用。

      4. 報文長度/格式(0x13)
        核對 DID 定義的長度,是否漏傳或多傳了數據。

      5. 運行條件(0x22)
        是否需要車輛處于特定狀態(ON檔、發動機停止、車速為零)。

      6. 調用順序(0x24)
        對于$31,是否嚴格遵循 Start → (Stop) → RequestResults 的順序。

      7. 內部執行錯誤(0x72)
        例程內部邏輯失敗,如擦除校驗失敗、寫入 EEPROM 超時。

      掌握這些服務的協議與實現細節,能讓你在開發診斷工具或 ECU 固件時,快速定位問題,寫出穩定可靠的代碼。

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

      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 12:35:13
      未婚女孩隱私部位膿腫南京明基醫院要求住院手術 女孩換家三甲醫院開了4塊錢藥治好

      未婚女孩隱私部位膿腫南京明基醫院要求住院手術 女孩換家三甲醫院開了4塊錢藥治好

      墜入二次元的海洋
      2026-05-15 19:16:40
      徹底瞞不住了,何九華承認自己當爹,稱孩子已2歲,王鷗回應打臉

      徹底瞞不住了,何九華承認自己當爹,稱孩子已2歲,王鷗回應打臉

      小樾說歷史
      2026-05-14 11:42:08
      87-82險勝!京媒撕開遮羞布:張鎮麟這招“作弊碼”,打疼了誰?

      87-82險勝!京媒撕開遮羞布:張鎮麟這招“作弊碼”,打疼了誰?

      舟望停云
      2026-05-16 01:10:30
      小寶與王某雷,誰探訪花的數量更多?

      小寶與王某雷,誰探訪花的數量更多?

      挪威森林
      2026-01-31 12:15:26
      深圳一建筑工地兩名工人從6樓墜亡?當地住建確認涉事項目有安全事故發生致2人死亡,已要求項目停工整改

      深圳一建筑工地兩名工人從6樓墜亡?當地住建確認涉事項目有安全事故發生致2人死亡,已要求項目停工整改

      大風新聞
      2026-05-15 17:32:44
      恭喜!陳思誠又當爹!26歲小女友曬生日照,一臉孕相得到父母認可

      恭喜!陳思誠又當爹!26歲小女友曬生日照,一臉孕相得到父母認可

      八卦王者
      2026-05-14 11:39:43
      24桿147!斯諾克新紀錄誕生:中國7人上榜,常冰玉進賬133萬獎金

      24桿147!斯諾克新紀錄誕生:中國7人上榜,常冰玉進賬133萬獎金

      劉姚堯的文字城堡
      2026-05-15 10:01:41
      心理學有個殘忍真相:子女長大后不心疼你,從來不是他不懂感恩,也不是他薄情寡義,而是你早年這兩種“隱形傷害”,親手關閉他心疼人開關

      心理學有個殘忍真相:子女長大后不心疼你,從來不是他不懂感恩,也不是他薄情寡義,而是你早年這兩種“隱形傷害”,親手關閉他心疼人開關

      心理觀察局
      2026-05-07 10:05:05
      朱雀二號改進型成功復飛!長六甲再送18顆“千帆”衛星入軌

      朱雀二號改進型成功復飛!長六甲再送18顆“千帆”衛星入軌

      NASA愛好者
      2026-05-15 03:36:06
      被曝涉黃,觸目驚心!網友怒了: 看得脊背發涼

      被曝涉黃,觸目驚心!網友怒了: 看得脊背發涼

      每日經濟新聞
      2026-05-13 21:30:06
      26連勝+三殺北京!上海強得可怕,許利民怒砸廣告牌,李楠也無解

      26連勝+三殺北京!上海強得可怕,許利民怒砸廣告牌,李楠也無解

      萌蘭聊個球
      2026-05-15 21:47:04
      卸磨殺驢的結果!文胖:詹皇愿去別隊拿中產,也不愿降薪3000萬

      卸磨殺驢的結果!文胖:詹皇愿去別隊拿中產,也不愿降薪3000萬

      錢說體育
      2026-05-15 09:05:10
      美媒問“10年后,世人會怎么評價這次訪問”,特朗普的回答不一般

      美媒問“10年后,世人會怎么評價這次訪問”,特朗普的回答不一般

      阿龍聊軍事
      2026-05-15 14:52:46
      案件:廣東一女子與弟弟布置婚房,丈夫看到監控后,當場錘死妻子

      案件:廣東一女子與弟弟布置婚房,丈夫看到監控后,當場錘死妻子

      紅豆講堂
      2025-01-02 15:00:02
      馬斯克表示:他絕對能建造出比中國任何公共交通系統都更好的系統

      馬斯克表示:他絕對能建造出比中國任何公共交通系統都更好的系統

      華史談
      2026-04-14 13:00:13
      我跟女總裁說:你要是我媳婦我一天揍你3頓,隔天她帶5個保鏢堵我

      我跟女總裁說:你要是我媳婦我一天揍你3頓,隔天她帶5個保鏢堵我

      千秋文化
      2026-05-13 19:47:04
      東契奇3年3次季后賽傷停,帕金斯:正滑向"恩比德陷阱"

      東契奇3年3次季后賽傷停,帕金斯:正滑向"恩比德陷阱"

      溫柔且自由
      2026-05-16 02:05:22
      北京3將低迷太致命了!杰曼陳盈駿被鎖死,曾凡博帶傷攻守全迷!

      北京3將低迷太致命了!杰曼陳盈駿被鎖死,曾凡博帶傷攻守全迷!

      籃球資訊達人
      2026-05-16 01:53:46
      16對16,這場國宴誰坐了C位

      16對16,這場國宴誰坐了C位

      梳子姐
      2026-05-15 20:47:03
      2026-05-16 06:23:00
      新能源自動駕駛 incentive-icons
      新能源自動駕駛
      專注于半導體行業資訊
      977文章數 347關注度
      往期回顧 全部

      科技要聞

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

      頭條要聞

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

      頭條要聞

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

      體育要聞

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

      娛樂要聞

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

      財經要聞

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

      汽車要聞

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

      態度原創

      健康
      旅游
      教育
      時尚
      手機

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

      旅游要聞

      藏在沈陽鬧市的金色秘境!2 萬㎡油菜花全開,地鐵直達還免費

      教育要聞

      老師掌摑多名學生后續,系一名書法教師,當地公布處罰結果

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

      手機要聞

      iPhone 17系列全系跳水,最高立減2500!

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 能在线看的av网站| 99久久国内精品成人免费| 亚洲最大成人在线播放| 午夜成人激情视频| 国产对白叫床清晰在线播放| 亚洲AV永久天堂在线观看| 波多野结衣第一页| 影音先锋中文字幕无码资源站| 色色免费视频| 日本人真淫视频一区二区三区| 盐山县| 白色丝袜国产在线视频| 亚洲一区二区三区四区精品| 亚洲人成网7777777国产| 色欲色欲久久综合网| 亚洲国产精品成人综合色在| 最新的国产成人精品2020| 瑟瑟AV| 日本高清一区二区视频在线观看| 国产精品亚洲日韩AⅤ在线观看| 国产精品一卡二卡三卡| 国产精自产拍久久久久久蜜| 偷拍网日本一区二区三区| 热久久99精品这里有精品| 国产农村精品一级毛片视频| 国产成人av一区二区在线观看| 熟女在线视频| 亚洲综合色中文网| 亚洲精品国男人在线视频| 欧美制服丝袜人妻另类| 日本久久99成人网站| jizz喷水| 精品一区二区三区东京热| 在线视频一区二区观看| 国产精品午夜性视频| 韩国三级在线 中文字幕 无码| 四虎永久在线精品视频| 国产精品久久午夜夜伦鲁鲁| 国产日韩欧美精品一区二区三区| 制服jk白丝h无内视频网站| 亚洲人视频在线观看|