事件
通过 device.Events() 订阅运行态事件。
自动日志
每个事件触发时都会再打 Logged(等级跟随源事件),无论是否另订了对应事件。绑 Logged 即可收到中文消息。
要收到 ConnectedChanged / StateChanged / ErrorOccurred / LinkChanged,循环里调 StatusEx()。第一次只记基线,不触发。
功能概览
| 类别 | 事件 | 说明 | 自动日志 |
|---|---|---|---|
| 连接 | device.Events().ConnectedChanged | 与 IO 控制器的周期交换通断 | ✓ |
| 运行态 | device.Events().StateChanged | 运行态变化 | ✓ |
| 运行错误 | device.Events().ErrorOccurred | 运行错误 | ✓ |
| 日志 | device.Events().Logged | 上面每条事件都会再打这条 | — |
连接
ConnectedChanged
device.Events().ConnectedChanged +=
[](bool connected, bool ever_connected, PnSEventLevel level) { };
周期数据交换通断时触发(connected == false 且 ever_connected == true = 掉线;ever_connected == false = 从未连上)。
回调参数:
connected(bool) — 当前是否在换周期数据ever_connected(bool) — 是否曾经连上过level(PnSEventLevel) — 连接 = Info;掉线 / 从未连上 = Warn
示例:
device.Events().ConnectedChanged +=
[](bool connected, bool ever_connected, PnSEventLevel level) {
(void)level;
if (!connected && ever_connected)
printf("掉线\n");
};
运行态
StateChanged
device.Events().StateChanged +=
[](PnSState old_state, PnSState new_state, PnSEventLevel level) { };
运行态变化时触发(SDK 只观测,不主动切状态)。
回调参数:
old_state(PnSState) — 变化前,见 PnSStatenew_state(PnSState) — 变化后level(PnSEventLevel) — Info
示例:
device.Events().StateChanged +=
[](PnSState old_state, PnSState new_state, PnSEventLevel level) {
(void)level;
printf("%d → %d\n",
static_cast<int>(old_state), static_cast<int>(new_state));
};
ErrorOccurred
device.Events().ErrorOccurred +=
[](PnSRuntimeErrorCode code, const char* message, PnSEventLevel level) { };
运行错误出现时触发;code 是运行错误枚举,原值请用 device.ErrorCodeRaw()。
回调参数:
code(PnSRuntimeErrorCode) — 运行错误message(const char*) — 中文消息level(PnSEventLevel) — Warn
示例:
device.Events().ErrorOccurred +=
[](PnSRuntimeErrorCode code, const char* message, PnSEventLevel level) {
(void)level;
printf("%d: %s\n", static_cast<int>(code), message);
};
链路
LinkChanged
device.Events().LinkChanged +=
[](bool link_up, PnSEventLevel level) { };
网卡链路变化时触发。循环里调 StatusEx() 且快照带链路字段才会收到。没有链路字段时不触发。不要把 Connected() 当成链路。
现在也可读 DiagSnapshot().link_up 判断链路。
回调参数:
link_up(bool) — 链路是否 Uplevel(PnSEventLevel) — Up = Info;Down = Warn
示例:
device.Events().LinkChanged +=
[](bool link_up, PnSEventLevel level) {
(void)level;
printf(link_up ? "链路 Up\n" : "链路 Down\n");
};
日志
Logged
device.Events().Logged +=
[](PnSEventLevel level, const char* message) { };
每个事件触发时都会再打这条,等级跟随源事件。
回调参数:
level(PnSEventLevel) — 日志级别message(const char*) — 日志正文
PnSEventLevel
事件日志等级。取值见 枚举参考。
示例:
device.Events().Logged +=
[](PnSEventLevel level, const char* message) {
printf("[%d] %s\n", static_cast<int>(level), message);
};
线程
事件回调在调 StatusEx() 的那条线程上同步触发。订阅者异常吞掉,不能炸 SDK。
完整示例
device.Events().ConnectedChanged +=
[](bool connected, bool ever_connected, PnSEventLevel level) {
(void)level;
if (!connected && ever_connected)
printf("掉线\n");
};
device.Events().StateChanged +=
[](PnSState old_state, PnSState new_state, PnSEventLevel level) {
(void)level;
printf("%d → %d\n",
static_cast<int>(old_state), static_cast<int>(new_state));
};
device.Events().ErrorOccurred +=
[](PnSRuntimeErrorCode code, const char* message, PnSEventLevel level) {
(void)level;
printf("%d: %s\n", static_cast<int>(code), message);
};
device.Events().Logged +=
[](PnSEventLevel level, const char* message) {
printf("[%d] %s\n", static_cast<int>(level), message);
};