跳到主要内容

事件

通过 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) — 变化前,见 PnSState
  • new_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) — 链路是否 Up
  • level (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);
};