跳到主要内容

事件

通过 PnSServiceOn* 注册运行态回调。​

自动日志

每个事件触发时都会再打 OnLogged(等级跟随源事件),无论是否另订了对应事件。绑 OnLogged 即可收到中文消息。

第一次快照不触发。cb 传 NULL 取消订阅。会话为空返回 PNS_ERR_INVALID_PARAM。

功能概览​

类别注册函数说明自动日志
连接PnSServiceOnConnectedChanged与 IO 控制器的周期交换通断✓
运行态PnSServiceOnStateChanged运行态变化✓
运行错误PnSServiceOnErrorOccurred运行错误✓
IO 质量PnSServiceOnIoStatusChanged非 GOOD 字节计数变化✓
链路PnSServiceOnLinkChanged网卡链路 Up / Down✓
日志PnSServiceOnLogged上面每条事件都会再打这条—

连接​

PnSServiceOnConnectedChanged​

pns_result_t PnSServiceOnConnectedChanged(
pns_service_handle_t session,
pns_connected_changed_fn cb,
void * ctx);

周期数据交换通断时触发(connected == false 且 ever_connected == true = 掉线;ever_connected == false = 从未连上)。

回调参数:

typedef void (*pns_connected_changed_fn)(
void * ctx,
bool connected, /* 当前是否在换周期数据 */
bool ever_connected, /* 是否曾经连上过 */
pns_event_level_t level); /* 连接 = Info;掉线 / 从未连上 = Warn */

示例:

static void on_connected(void * ctx, bool connected, bool ever_connected,
pns_event_level_t level)
{
(void)ctx;
(void)level;
if (!connected && ever_connected)
printf("掉线\n");
}

PnSServiceOnConnectedChanged(session, on_connected, NULL);

运行态​

PnSServiceOnStateChanged​

pns_result_t PnSServiceOnStateChanged(
pns_service_handle_t session,
pns_state_changed_fn cb,
void * ctx);

运行态变化时触发(SDK 只观测,不主动切状态)。

回调参数:

typedef void (*pns_state_changed_fn)(
void * ctx,
pns_device_state_t old_state, /* 变化前 */
pns_device_state_t new_state, /* 变化后 */
pns_event_level_t level); /* Info */

运行态取值见 pns_device_state_t。

示例:

static void on_state(void * ctx,
pns_device_state_t old_state, pns_device_state_t new_state,
pns_event_level_t level)
{
(void)ctx;
(void)level;
printf("%d → %d\n", (int)old_state, (int)new_state);
}

PnSServiceOnStateChanged(session, on_state, NULL);

PnSServiceOnErrorOccurred​

pns_result_t PnSServiceOnErrorOccurred(
pns_service_handle_t session,
pns_error_occurred_fn cb,
void * ctx);

运行错误出现时触发;error_code 是 int 原值,中文请用 PnSServiceGetErrorMessage。

回调参数:

typedef void (*pns_error_occurred_fn)(
void * ctx,
int error_code, /* 运行错误原值(不是枚举) */
const char * message, /* 中文消息 */
pns_event_level_t level); /* Warn */

示例:

static void on_error(void * ctx, int error_code, const char * message,
pns_event_level_t level)
{
(void)ctx;
(void)level;
printf("%d: %s\n", error_code, message);
}

PnSServiceOnErrorOccurred(session, on_error, NULL);

IO 质量​

PnSServiceOnIoStatusChanged​

pns_result_t PnSServiceOnIoStatusChanged(
pns_service_handle_t session,
pns_io_status_changed_fn cb,
void * ctx);

第一次读到 IOPS 只记基线,不回调。inputIopsHex 与 outputIopsHex 都缺则不虚构、不回调。非 GOOD 字节计数变化才回调。六种语言同一口径,不是每次读都回调。判据与 PnSServiceGetIoStatus 的 iops_bad_count 同源。

回调参数:

typedef void (*pns_io_status_changed_fn)(
void * ctx,
bool iops_bad, /* true = 有 IOPS 非 GOOD 的字节 */
pns_event_level_t level); /* BAD = Warn,恢复 GOOD = Info */

链路​

PnSServiceOnLinkChanged​

pns_result_t PnSServiceOnLinkChanged(
pns_service_handle_t session,
pns_link_changed_fn cb,
void * ctx);

网卡链路 Up / Down 时触发。

回调参数:

typedef void (*pns_link_changed_fn)(
void * ctx,
bool link_up, /* true = 链路 Up */
pns_event_level_t level); /* Up = Info,Down = Warn */

日志​

PnSServiceOnLogged​

pns_result_t PnSServiceOnLogged(
pns_service_handle_t session,
pns_logged_fn cb,
void * ctx);

每个事件触发时都会再打这条,等级跟随源事件。

回调参数:

pns_event_level_t​

事件日志等级。取值见 枚举参考。

示例:

static void on_log(void * ctx, pns_event_level_t level, const char * message)
{
(void)ctx;
printf("[%d] %s\n", (int)level, message);
}

PnSServiceOnLogged(session, on_log, NULL);

完整示例​

PnSServiceOnConnectedChanged(session, on_connected, NULL);
PnSServiceOnStateChanged(session, on_state, NULL);
PnSServiceOnErrorOccurred(session, on_error, NULL);
PnSServiceOnIoStatusChanged(session, on_io_status, NULL);
PnSServiceOnLinkChanged(session, on_link, NULL);
PnSServiceOnLogged(session, on_log, NULL);