网易首页 > 网易号 > 正文 申请入驻

UDS诊断服务详解:0x10诊断会话模式——会话等级、跳转规则与C++实现

0
分享至


一、会话模式与等级的意义 1.1 基本概念

UDS(Unified Diagnostic Services,ISO 14229)中的0x10服务用于控制ECU的诊断会话状态。诊断会话模式本质上是一种安全机制,通过划分不同权限等级,限制敏感诊断服务的访问。

1.2 三种标准会话子功能

子功能

名称

典型可用服务

0x01

Default Session(默认会话)

22读取数据、11读取DTC、14清除DTC、3E保活

0x02

Programming Session(编程会话)

34请求下载、36传输数据、37退出传输

0x03

Extended Session(扩展会话)

27安全访问、2E写入数据、31例行程序、85DTC控制


1.3 会话模式切换示意图

┌─────────────────────────────────────────────────────────┐
│ ECU上电/复位 │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ Default Session │◄──────────────────┐ │
│ │ (权限最低) │ │ │
│ └────────┬─────────┘ │ │
│ │ 10 03 │ │
│ ▼ │ 10 01
│ ┌──────────────────┐ │ │
│ │ Extended Session│ │ │
│ │ (中等级别) │ │ │
│ └────────┬─────────┘ │ │
│ │ 10 02 │ │
│ ▼ │ │
│ ┌──────────────────┐ │ │
│ │ Programming Session│──────────────────┘ │
│ │ (最高权限) │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
二、会话模式跳转规则 2.1 核心规则表

当前会话

目标会话

是否允许

Default

Default

重新初始化默认会话

Default

Extended

停止已配置的ResponseOnEvent

Default

Programming

必须经过Extended

Extended

Default

重置所有会话相关设置

Extended

Extended

安全访问需重新解锁

Extended

Programming

单向跳转

Programming

Default

重置并启用安全锁定

Programming

Extended

禁止反向跳转

Programming

Programming

重新初始化编程会话


2.2 超时机制(S3保活)

Tester                                    ECU
│ │
│──────── 10 03 (进入Extended) ─────────►│
│◄─────── 50 03 (肯定响应) ─────────────│
│ │
│ (S3_client周期内) │
│──────── 3E 00 (TesterPresent) ───────►│
│◄─────── 7E 00 (保活响应) ─────────────│
│ │
│ (超过S3_server时间无诊断请求) │
│ │──┐
│ │ │ 自动切回
│ │◄─┘ Default
三、C++代码实现 3.1 诊断会话管理器类定义

// UdsSessionManager.h
#ifndef UDS_SESSION_MANAGER_H
#define UDS_SESSION_MANAGER_H

#include
#include
#include
#include
#include

namespace Uds {

// 诊断会话类型枚举
enum class DiagnosticSession : uint8_t {
DEFAULT_SESSION = 0x01,
PROGRAMMING_SESSION = 0x02,
EXTENDED_SESSION = 0x03
};

// 服务ID枚举
enum class ServiceId : uint8_t {
DIAGNOSTIC_SESSION_CONTROL = 0x10,
ECU_RESET = 0x11,
READ_DATA_BY_ID = 0x22,
SECURITY_ACCESS = 0x27,
COMMUNICATION_CONTROL = 0x28,
READ_DTC_INFO = 0x19,
WRITE_DATA_BY_ID = 0x2E,
ROUTINE_CONTROL = 0x31,
REQUEST_DOWNLOAD = 0x34,
TRANSFER_DATA = 0x36,
REQUEST_TRANSFER_EXIT = 0x37,
TESTER_PRESENT = 0x3E
};

// 安全访问状态
enum class SecurityLevel : uint8_t {
LOCKED = 0x00,
LEVEL1_UNLOCKED = 0x01,
LEVEL2_UNLOCKED = 0x02
};

// 诊断响应结构体
struct DiagnosticResponse {
uint8_t serviceId;
std::vector data;
bool success;
std::string errorMessage;
DiagnosticResponse() : success(false) {}
};

// 会话管理器类
class UdsSessionManager {
public:
using TimerCallback = std::function;

UdsSessionManager();
~UdsSessionManager();

// 核心服务处理
DiagnosticResponse handleDiagnosticSessionControl(const std::vector& request);
DiagnosticResponse handleTesterPresent(const std::vector& request);
DiagnosticResponse handleEcuReset(const std::vector& request);
// 服务访问权限检查
bool isServiceAllowedInCurrentSession(ServiceId serviceId) const;
// 状态查询
DiagnosticSession getCurrentSession() const { return currentSession_; }
SecurityLevel getSecurityLevel() const { return securityLevel_; }
bool isSessionTimedOut() const;
// 定时器管理
void updateSessionActivity();
void setS3ServerTimeout(uint32_t milliseconds);
// 非易失性数据管理(模拟)
void setVin(const std::vector& vin);
std::vector getVin() const;

private:
// 会话状态
DiagnosticSession currentSession_;
SecurityLevel securityLevel_;
// 定时器相关
uint32_t s3ServerTimeoutMs_; // S3server超时时间(默认5000ms)
std::chrono::steady_clock::time_point lastDiagnosticActivity_;
// 持久化数据(不会因会话切换而重置)
std::vector vin_; // VIN码 (2E F1 90)
// 会话相关状态(会话切换时可能重置)
bool responseOnEventActive_; // 0x86服务激活状态
bool communicationControlActive_; // 0x28服务激活状态
bool dtcControlActive_; // 0x85服务激活状态
// 服务权限映射表
std::map std :: vector > sessionAllowedServices_;

// 跳转规则验证
bool canTransitionTo(DiagnosticSession target) const ;

// 会话初始化/重置
void initializeSession(DiagnosticSession session, bool isTransition) ;
void resetSessionRelatedStates() ;
void lockSecurity() ;

// 响应构造
DiagnosticResponse buildPositiveResponse(uint8_t serviceId,
const std::vector& data) ;
DiagnosticResponse buildNegativeResponse(uint8_t serviceId,
uint8_t negativeCode) ;

// 定时器检查线程
void startSessionTimeoutMonitor() ;
void stopSessionTimeoutMonitor() ;
void sessionTimeoutHandler() ;

std :: unique_ptr < std ::thread> timeoutMonitorThread_;
bool monitorRunning_;
};

} // namespace Uds

#endif // UDS_SESSION_MANAGER_H
3.2 诊断会话管理器实现

// UdsSessionManager.cpp
#include "UdsSessionManager.h"
#include
#include
#include
#include
#include

namespace Uds {

// NRC (Negative Response Code) 定义
namespace NRC {
constexpr uint8_t GENERAL_REJECT = 0x10;
constexpr uint8_t SERVICE_NOT_SUPPORTED = 0x11;
constexpr uint8_t SUBFUNCTION_NOT_SUPPORTED = 0x12;
constexpr uint8_t INCORRECT_MESSAGE_LENGTH = 0x13;
constexpr uint8_t CONDITIONS_NOT_CORRECT = 0x22;
constexpr uint8_t REQUEST_SEQUENCE_ERROR = 0x24;
constexpr uint8_t SECURITY_ACCESS_DENIED = 0x33;
}

UdsSessionManager::UdsSessionManager()
: currentSession_(DiagnosticSession::DEFAULT_SESSION)
, securityLevel_(SecurityLevel::LOCKED)
, s3ServerTimeoutMs_(5000) // 默认5秒
, lastDiagnosticActivity_(std::chrono::steady_clock::now())
, responseOnEventActive_(false)
, communicationControlActive_(false)
, dtcControlActive_(false)
, monitorRunning_(true)
{
// 初始化各会话允许的服务列表
// Default Session - 仅基础诊断
sessionAllowedServices_[DiagnosticSession::DEFAULT_SESSION] = {
ServiceId::DIAGNOSTIC_SESSION_CONTROL,
ServiceId::ECU_RESET,
ServiceId::READ_DATA_BY_ID,
ServiceId::READ_DTC_INFO,
ServiceId::TESTER_PRESENT
};
// Extended Session - 高级诊断服务
sessionAllowedServices_[DiagnosticSession::EXTENDED_SESSION] = {
ServiceId::DIAGNOSTIC_SESSION_CONTROL,
ServiceId::ECU_RESET,
ServiceId::READ_DATA_BY_ID,
ServiceId::SECURITY_ACCESS,
ServiceId::COMMUNICATION_CONTROL,
ServiceId::READ_DTC_INFO,
ServiceId::WRITE_DATA_BY_ID,
ServiceId::ROUTINE_CONTROL,
ServiceId::TESTER_PRESENT
};
// Programming Session - Bootloader相关服务
sessionAllowedServices_[DiagnosticSession::PROGRAMMING_SESSION] = {
ServiceId::DIAGNOSTIC_SESSION_CONTROL,
ServiceId::ECU_RESET,
ServiceId::REQUEST_DOWNLOAD,
ServiceId::TRANSFER_DATA,
ServiceId::REQUEST_TRANSFER_EXIT,
ServiceId::TESTER_PRESENT
};
// 启动超时监控线程
startSessionTimeoutMonitor();
}

UdsSessionManager::~UdsSessionManager() {
monitorRunning_ = false;
if (timeoutMonitorThread_ && timeoutMonitorThread_->joinable()) {
timeoutMonitorThread_->join();
}
}

//=============================================================================
// 核心服务: 0x10 诊断会话控制
//=============================================================================
DiagnosticResponse UdsSessionManager::handleDiagnosticSessionControl(
const std::vector& request)
{
DiagnosticResponse response;
// 1. 长度检查: 至少2字节 [SID, SubFunction]
if (request.size() < 2) {
return buildNegativeResponse(static_cast(ServiceId::DIAGNOSTIC_SESSION_CONTROL),
NRC::INCORRECT_MESSAGE_LENGTH);
}
uint8_t subFunction = request[1];
// 2. 子功能有效性检查
DiagnosticSession targetSession;
switch (subFunction) {
case 0x01: targetSession = DiagnosticSession::DEFAULT_SESSION; break;
case 0x02: targetSession = DiagnosticSession::PROGRAMMING_SESSION; break;
case 0x03: targetSession = DiagnosticSession::EXTENDED_SESSION; break;
default:
return buildNegativeResponse(static_cast(ServiceId::DIAGNOSTIC_SESSION_CONTROL),
NRC::SUBFUNCTION_NOT_SUPPORTED);
}
// 3. 跳转规则检查
if (!canTransitionTo(targetSession)) {
return buildNegativeResponse(static_cast(ServiceId::DIAGNOSTIC_SESSION_CONTROL),
NRC::CONDITIONS_NOT_CORRECT);
}
// 4. 记录旧会话用于特殊处理
DiagnosticSession oldSession = currentSession_;
// 5. 执行会话切换
initializeSession(targetSession, true); // true表示这是跳转切换
// 6. 构造肯定响应
std::vector responseData;
responseData.push_back(static_cast(targetSession));
// 可选: 添加P2/P2*定时参数(根据具体实现)
responseData.push_back(0x00); // P2 = 0ms (使用默认)
responseData.push_back(0x00); // P2* = 0ms
response = buildPositiveResponse(
static_cast(ServiceId::DIAGNOSTIC_SESSION_CONTROL),
responseData);
// 打印日志
std::cout << "[UDS] Session transition: "
<< static_cast(oldSession) << " -> "
<< static_cast(targetSession) << std::endl;
return response;
}

//=============================================================================
// 核心服务: 0x3E 保活服务
//=============================================================================
DiagnosticResponse UdsSessionManager::handleTesterPresent(
const std::vector& request)
{
DiagnosticResponse response;
// 非默认会话需要持续接收3E来维持
updateSessionActivity();
// 标准响应: 7E 00
if (request.size() >= 2 && request[1] == 0x00) {
response = buildPositiveResponse(
static_cast(ServiceId::TESTER_PRESENT),
{0x00});
} else {
response = buildPositiveResponse(
static_cast(ServiceId::TESTER_PRESENT),
{});
}
return response;
}

//=============================================================================
// 核心服务: 0x11 ECU复位
//=============================================================================
DiagnosticResponse UdsSessionManager::handleEcuReset(
const std::vector& request)
{
DiagnosticResponse response;
if (request.size() < 2) {
return buildNegativeResponse(static_cast(ServiceId::ECU_RESET),
NRC::INCORRECT_MESSAGE_LENGTH);
}
uint8_t resetType = request[1];
// 硬复位(0x01)或软复位(0x03)后回到默认会话
if (resetType == 0x01 || resetType == 0x03) {
// 重置会话状态
initializeSession(DiagnosticSession::DEFAULT_SESSION, true);
response = buildPositiveResponse(
static_cast(ServiceId::ECU_RESET),
{resetType});
std::cout << "[UDS] ECU Reset (type " << static_cast(resetType)
<< "), session reset to Default" << std::endl;
} else {
response = buildNegativeResponse(static_cast(ServiceId::ECU_RESET),
NRC::SUBFUNCTION_NOT_SUPPORTED);
}
return response;
}

//=============================================================================
// 权限检查: 当前会话是否允许指定服务
//=============================================================================
bool UdsSessionManager::isServiceAllowedInCurrentSession(ServiceId serviceId) const
{
auto it = sessionAllowedServices_.find(currentSession_);
if (it == sessionAllowedServices_.end()) {
return false;
}
const auto& allowedServices = it->second;
return std::find(allowedServices.begin(), allowedServices.end(), serviceId)
!= allowedServices.end();
}

//=============================================================================
// 会话跳转规则验证
//=============================================================================
bool UdsSessionManager::canTransitionTo(DiagnosticSession target) const
{
// 规则1: 相同会话总是允许
if (currentSession_ == target) {
return true;
}
// 规则2: 任何会话都可以回到Default
if (target == DiagnosticSession::DEFAULT_SESSION) {
return true;
}
// 规则3: Default不能直接跳转到Programming
if (currentSession_ == DiagnosticSession::DEFAULT_SESSION &&
target == DiagnosticSession::PROGRAMMING_SESSION) {
return false;
}
// 规则4: Programming不能跳转到Extended
if (currentSession_ == DiagnosticSession::PROGRAMMING_SESSION &&
target == DiagnosticSession::EXTENDED_SESSION) {
return false;
}
// 规则5: Extended可以跳转到Programming
// 规则6: Default可以跳转到Extended
return true;
}

//=============================================================================
// 会话初始化
//=============================================================================
void UdsSessionManager::initializeSession(DiagnosticSession session, bool isTransition)
{
DiagnosticSession oldSession = currentSession_;
currentSession_ = session;
// 更新活动时间戳
updateSessionActivity();
if (!isTransition) {
// 首次启动初始化
return;
}
// --- 根据ISO 14229定义的跳转规则处理 ---
// 3.1 从Default到Default: 重置所有会话相关设置
if (oldSession == DiagnosticSession::DEFAULT_SESSION &&
session == DiagnosticSession::DEFAULT_SESSION) {
resetSessionRelatedStates();
// 注意: 非易失性存储器内容(如VIN)保持不变
return;
}
// 3.2 从Default到非Default: 停止ResponseOnEvent
if (oldSession == DiagnosticSession::DEFAULT_SESSION &&
session != DiagnosticSession::DEFAULT_SESSION) {
responseOnEventActive_ = false;
// 其他状态保持
return;
}
// 3.3 从非Default到非Default: 重新锁定安全访问
if (oldSession != DiagnosticSession::DEFAULT_SESSION &&
session != DiagnosticSession::DEFAULT_SESSION) {
// 安全访问重新锁定
lockSecurity();
// 停止ResponseOnEvent
responseOnEventActive_ = false;
// CommunicationControl和ControlDTCSetting状态保持
// (communicationControlActive_, dtcControlActive_ 不重置)
return;
}
// 3.4 从非Default到Default: 重置所有会话相关设置
if (oldSession != DiagnosticSession::DEFAULT_SESSION &&
session == DiagnosticSession::DEFAULT_SESSION) {
resetSessionRelatedStates();
lockSecurity();
// 禁用所有非默认会话特有的功能
communicationControlActive_ = false;
dtcControlActive_ = false;
return;
}
}

//=============================================================================
// 重置会话相关状态(不重置非易失性数据)
//=============================================================================
void UdsSessionManager::resetSessionRelatedStates()
{
responseOnEventActive_ = false;
// 周期性调度器等被禁用
// 所有OutputControl被禁用
}

//=============================================================================
// 锁定安全访问
//=============================================================================
void UdsSessionManager::lockSecurity()
{
securityLevel_ = SecurityLevel::LOCKED;
std::cout << "[UDS] Security locked" << std::endl;
}

//=============================================================================
// 超时管理
//=============================================================================
void UdsSessionManager::updateSessionActivity()
{
lastDiagnosticActivity_ = std::chrono::steady_clock::now();
}

bool UdsSessionManager::isSessionTimedOut() const
{
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast(
now - lastDiagnosticActivity_);
return elapsed.count() > s3ServerTimeoutMs_;
}

void UdsSessionManager::setS3ServerTimeout(uint32_t milliseconds)
{
s3ServerTimeoutMs_ = milliseconds;
}

void UdsSessionManager::startSessionTimeoutMonitor()
{
timeoutMonitorThread_ = std::make_unique([this]() {
while (monitorRunning_) {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
// 仅在非默认会话时检查超时
if (currentSession_ != DiagnosticSession::DEFAULT_SESSION) {
if (isSessionTimedOut()) {
std::cout << "[UDS] Session timeout! Switching to Default" << std::endl;
initializeSession(DiagnosticSession::DEFAULT_SESSION, true);
}
}
}
});
}

//=============================================================================
// 非易失性数据管理
//=============================================================================
void UdsSessionManager::setVin(const std::vector& vin)
{
vin_ = vin;
std::cout << "[UDS] VIN written to non-volatile memory" << std::endl;
}

std::vector UdsSessionManager::getVin() const
{
return vin_;
}

//=============================================================================
// 响应构造
//=============================================================================
DiagnosticResponse UdsSessionManager::buildPositiveResponse(
uint8_t serviceId, const std::vector& data)
{
DiagnosticResponse resp;
resp.serviceId = serviceId | 0x40; // 肯定响应SID = 请求SID + 0x40
resp.data = data;
resp.success = true;
return resp;
}

DiagnosticResponse UdsSessionManager::buildNegativeResponse(
uint8_t serviceId, uint8_t negativeCode)
{
DiagnosticResponse resp;
resp.serviceId = 0x7F; // 否定响应SID
resp.data = {serviceId, negativeCode};
resp.success = false;
std::stringstream ss;
ss << "NRC: 0x" << std::hex << static_cast(negativeCode);
resp.errorMessage = ss.str();
return resp;
}

} // namespace Uds
3.3 使用示例

// main.cpp - 演示UDS 0x10服务的使用
#include "UdsSessionManager.h"
#include
#include

using namespace Uds;

void printResponse(const DiagnosticResponse& resp, const std::string& context)
{
std::cout << "\n=== " << context << " ===" << std::endl;
std::cout << "SID: 0x" << std::hex << static_cast(resp.serviceId) << std::endl;
if (!resp.data.empty()) {
std::cout << "Data: ";
for (uint8_t byte : resp.data) {
std::cout << "0x" << std::hex << std::setw(2) << std::setfill('0')
<< static_cast(byte) << " ";
}
std::cout << std::endl;
}
if (resp.success) {
std::cout << "Status: SUCCESS" << std::endl;
} else {
std::cout << "Status: FAILED - " << resp.errorMessage << std::endl;
}
}

int main()
{
UdsSessionManager ecu;
std::cout << "========== UDS 0x10 Diagnostic Session Control Demo ==========" << std::endl;
// 1. 查询初始状态
std::cout << "\n[Initial] Session: "
<< static_cast(ecu.getCurrentSession())
<< " (Default)" << std::endl;
// 2. Default -> Extended (合法)
auto resp1 = ecu.handleDiagnosticSessionControl({0x10, 0x03});
printResponse(resp1, "Default -> Extended (10 03)");
// 验证服务权限
std::cout << "2E (WriteData) allowed in Extended? "
<< ecu.isServiceAllowedInCurrentSession(ServiceId::WRITE_DATA_BY_ID)
<< std::endl;
// 3. Extended -> Programming (合法)
auto resp2 = ecu.handleDiagnosticSessionControl({0x10, 0x02});
printResponse(resp2, "Extended -> Programming (10 02)");
// 验证编程服务权限
std::cout << "34 (RequestDownload) allowed in Programming? "
<< ecu.isServiceAllowedInCurrentSession(ServiceId::REQUEST_DOWNLOAD)
<< std::endl;
std::cout << "2E (WriteData) allowed in Programming? "
<< ecu.isServiceAllowedInCurrentSession(ServiceId::WRITE_DATA_BY_ID)
<< std::endl;
// 4. Programming -> Extended (非法 - 应被拒绝)
auto resp3 = ecu.handleDiagnosticSessionControl({0x10, 0x03});
printResponse(resp3, "Programming -> Extended (10 03) [SHOULD FAIL]");
// 5. Programming -> Default (合法)
auto resp4 = ecu.handleDiagnosticSessionControl({0x10, 0x01});
printResponse(resp4, "Programming -> Default (10 01)");
// 6. Default -> Programming (非法 - 必须经过Extended)
auto resp5 = ecu.handleDiagnosticSessionControl({0x10, 0x02});
printResponse(resp5, "Default -> Programming (10 02) [SHOULD FAIL]");
// 7. 重新进入Extended,演示3E保活
ecu.handleDiagnosticSessionControl({0x10, 0x03});
std::cout << "\n[Extended Session Active] Sending TesterPresent..." << std::endl;
for (int i = 0; i < 3; i++) {
auto resp6 = ecu.handleTesterPresent({0x3E, 0x00});
std::cout << "3E #" << (i+1) << " response: 0x" << std::hex
<< static_cast(resp6.serviceId) << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
// 8. 模拟超时(设置短超时用于演示)
ecu.setS3ServerTimeout(2000); // 2秒超时
std::cout << "\n[Timeout Demo] Waiting 3 seconds without diagnostic request..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "Session after timeout: "
<< static_cast(ecu.getCurrentSession())
<< " (should be Default)" << std::endl;
// 9. 演示非易失性数据持久化
std::cout << "\n[Persistence Demo] Writing VIN to NVM..." << std::endl;
ecu.setVin({'W','V','W','Z','Z','Z','1','Z','Z','1','2','3','4','5','6','7','8'});
// 切换到不同会话再回来
ecu.handleDiagnosticSessionControl({0x10, 0x03});
ecu.handleDiagnosticSessionControl({0x10, 0x01});
auto vin = ecu.getVin();
std::cout << "VIN after session cycle: ";
for (uint8_t c : vin) std::cout << static_cast(c);
std::cout << " (preserved!)" << std::endl;
return 0;
}
3.4 编译与运行

# 编译命令
g++ -std=c++17 -pthread UdsSessionManager.cpp main.cpp -o uds_demo


# 运行
./uds_demo
四、关键要点总结

要点

安全机制

高权限服务需要先切换到对应会话并完成安全解锁

跳转路径

Default → Extended → Programming(单向)

超时保活

非默认会话需周期性发送3E,否则自动切回Default

安全锁定

会话切换时安全访问状态会被重置(除非规则明确要求保持)

状态保持

CommunicationControl和ControlDTCSetting在非默认会话间切换时保持

持久化

NVM写入的数据(如VIN)不受会话切换影响

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

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-09-28 07:16:54
普通孩子唯一能改命的机会就是:死磕三年高中,熬过去便是一生坦途;若是偷懒,往后几十年都得用来弥补这三年留下的遗憾

普通孩子唯一能改命的机会就是:死磕三年高中,熬过去便是一生坦途;若是偷懒,往后几十年都得用来弥补这三年留下的遗憾

好爸育儿
2026-09-27 08:29:37
英国政府杀人诛心!引用中方判决,拒绝乱港分子入境,蟑螂天塌了

英国政府杀人诛心!引用中方判决,拒绝乱港分子入境,蟑螂天塌了

不甜的李子
2026-09-27 21:44:04
亚运会乒乓球今天收官!9月28日赛程:国乒冲击2冠,王楚钦迎战强敌

亚运会乒乓球今天收官!9月28日赛程:国乒冲击2冠,王楚钦迎战强敌

全言作品
2026-09-28 00:25:16
伊朗总统当着美媒面诉苦:石油卖给中国,钱却卡在账户里

伊朗总统当着美媒面诉苦:石油卖给中国,钱却卡在账户里

共工之锚
2026-09-28 00:20:41
妻子曝刘欢真正死因!独女是诱因,错过5年抢救期,一度恶化致死

妻子曝刘欢真正死因!独女是诱因,错过5年抢救期,一度恶化致死

风月得自难寻
2026-09-27 18:01:52
多位文艺界人士曾提及刘欢的酒量,戴军:喝多了就会开始讲外语

多位文艺界人士曾提及刘欢的酒量,戴军:喝多了就会开始讲外语

东方不败然多多
2026-09-27 16:21:18
王曼昱4-2孙颖莎,亚运会女单大结局,不和谐一幕:加油声一边倒

王曼昱4-2孙颖莎,亚运会女单大结局,不和谐一幕:加油声一边倒

大秦壁虎白话体育
2026-09-27 20:53:13
严子怡创雨战世界历史第一好成绩,日本电视台:不知道怎么解说了

严子怡创雨战世界历史第一好成绩,日本电视台:不知道怎么解说了

杨华评论
2026-09-28 04:29:40
“民办太子爷”发型火了,宝妈还沾沾自喜,老师:遇到你儿子,同学都绕道走

“民办太子爷”发型火了,宝妈还沾沾自喜,老师:遇到你儿子,同学都绕道走

蝴蝶花雨话教育
2026-09-26 00:05:19
这跟不穿有啥区别?三角区明显,41岁女星穿透视3D打印裙惹争议

这跟不穿有啥区别?三角区明显,41岁女星穿透视3D打印裙惹争议

铁锤妹妹是只猫
2026-09-26 19:04:43
刘欢豪宅一览表:装修值千万,客厅能容百人,有私家酒吧,从不请保姆

刘欢豪宅一览表:装修值千万,客厅能容百人,有私家酒吧,从不请保姆

火鱼观点
2026-09-27 19:25:53
王曼昱回应亚运女单夺金,提及莎莎伤病!孙颖莎坦言输球原因!日本教练拍不停!亚运9月28日赛程出炉

王曼昱回应亚运女单夺金,提及莎莎伤病!孙颖莎坦言输球原因!日本教练拍不停!亚运9月28日赛程出炉

好乒乓
2026-09-27 22:32:22
塞尔维亚总统武契奇宣布辞职

塞尔维亚总统武契奇宣布辞职

澎湃新闻
2026-09-28 02:47:02
邓亚萍谈日本男单全军覆没:男团夺冠后兴奋过了头,能战胜国乒出乎他们的意料;张本智和对中国队做了充分的准备,单打他的心态不一样了

邓亚萍谈日本男单全军覆没:男团夺冠后兴奋过了头,能战胜国乒出乎他们的意料;张本智和对中国队做了充分的准备,单打他的心态不一样了

极目新闻
2026-09-27 09:04:26
王祖贤回应容貌争议,称“我已经60岁了,大家还在谈论我的容貌”

王祖贤回应容貌争议,称“我已经60岁了,大家还在谈论我的容貌”

韩小娱
2026-09-27 10:31:59
“第一次感觉离死亡这么近!”男子称喝了几口隔夜鱼汤差点窒息,孩子哭着喊“爸爸不要死”……医疗专家解析

“第一次感觉离死亡这么近!”男子称喝了几口隔夜鱼汤差点窒息,孩子哭着喊“爸爸不要死”……医疗专家解析

都市快报橙柿互动
2026-09-28 00:14:52
网友晒爱奇艺“请勿眨眼”提示,称系统无法确认眨眼时是否错过广告,将从上次眨眼位置强制重播,爱奇艺辟谣:大过节的,别恶搞造谣了

网友晒爱奇艺“请勿眨眼”提示,称系统无法确认眨眼时是否错过广告,将从上次眨眼位置强制重播,爱奇艺辟谣:大过节的,别恶搞造谣了

台州交通广播
2026-09-28 00:45:59
骗了场上21人!梅西7天连场轰任意球:1个月4神迹 只差第1名1个球

骗了场上21人!梅西7天连场轰任意球:1个月4神迹 只差第1名1个球

风过乡
2026-09-28 08:08:33
20名“双一流”大学生、研究生"翻墙"被处分 ,网传被举报:“一个姐们差一名保研,拿翻墙这事把前面所有人全举报了”

20名“双一流”大学生、研究生"翻墙"被处分 ,网传被举报:“一个姐们差一名保研,拿翻墙这事把前面所有人全举报了”

双一流高校
2026-09-28 00:09:38
2026-09-28 09:16:49
新能源自动驾驶 incentive-icons
新能源自动驾驶
专注于半导体行业资讯
1015文章数 348关注度
往期回顾 全部

科技要闻

特斯拉人形机器人被曝周产量已达数百台

头条要闻

13岁少年和老爸"手搓"涡喷发动机 建家庭实验室花20万

头条要闻

13岁少年和老爸"手搓"涡喷发动机 建家庭实验室花20万

体育要闻

114项指控成立,曼城已经完蛋了吗?

娱乐要闻

刘欢去世后谣言四起,韩磊被翻旧账

财经要闻

标价298元核桃油, 实为大豆油冒充

汽车要闻

MAZDA EZ-60激光版上市 焕新全系11.39万元起

态度原创

教育
亲子
艺术
旅游
数码

教育要闻

整体思想,一个视频学会!

亲子要闻

秋天别让孩子在外疯跑!最近大批娃病倒,家长别再傻傻犯错

艺术要闻

致敬,刘欢硬笔书法欣赏

旅游要闻

用彩色像素打开临清东宛园,快来坐高铁打卡超美国风景区

数码要闻

年轻人第一台RGB游戏电视!REDMI电视X系列RGB-Mini LED 2027竞技版上架

无障碍浏览 进入关怀版