跳到主要内容

事件

通过 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 == falseever_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);
};