跳到主要内容

事件

通过 device.events() 订阅运行态事件。

自动日志

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

先订阅,再读运行态,才会比对变化并回调。第一次只记当前状态,不发事件。

功能概览

类别事件说明自动日志
连接device.events().addConnectedChangedListener与 IO 控制器的周期交换通断
运行态device.events().addStateChangedListener运行态变化
运行错误device.events().addErrorOccurredListener运行错误
日志device.events().addLoggedListener上面每条事件都会再打这条

连接

addConnectedChangedListener

public void addConnectedChangedListener(Consumer<ConnectedChanged> listener)

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

回调参数:

public static final class ConnectedChanged {
public boolean connected() { } // 当前是否在换周期数据
public boolean everConnected() { } // 是否曾经连上过
public PnSEventLevel level() { } // 连接 = Info;掉线 / 从未连上 = Warn
}

示例:

device.events().addConnectedChangedListener(e -> {
if (!e.connected() && e.everConnected())
System.out.println("掉线");
});

运行态

addStateChangedListener

public void addStateChangedListener(Consumer<StateChanged> listener)

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

回调参数:

public static final class StateChanged {
public PnSState oldState() { } // 变化前,见 [PnSState](./api#pnsstate)
public PnSState newState() { } // 变化后
public PnSEventLevel level() { } // Info
}

示例:

device.events().addStateChangedListener(e ->
System.out.println(e.oldState() + " → " + e.newState()));

addErrorOccurredListener

public void addErrorOccurredListener(Consumer<ErrorOccurred> listener)

运行错误出现时触发;e.errorCode() 是 int 原值,枚举形态请用 device.errorCodeEnum()

回调参数:

public static final class ErrorOccurred {
public int errorCode() { } // 运行错误原值(不是枚举)
public String message() { } // 中文消息。缺失为空串
public PnSEventLevel level() { } // Warn
}

示例:

device.events().addErrorOccurredListener(e ->
System.out.println(e.errorCode() + ": " + e.message()));

日志

addLoggedListener

public void addLoggedListener(BiConsumer<PnSEventLevel, String> listener)

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

回调参数:

  • level (PnSEventLevel) — 日志级别
  • message (String) — 日志正文
PnSEventLevel

日志级别。取值见 枚举参考

示例:

device.events().addLoggedListener((level, message) ->
System.out.println("[" + level + "] " + message));

线程安全

事件回调不在 UI 线程上触发。更新界面时需要线程同步:

// Swing
device.events().addConnectedChangedListener(e ->
SwingUtilities.invokeLater(() ->
labelStatus.setText(e.connected() ? "已连接" : "未连接")));

// JavaFX
device.events().addConnectedChangedListener(e ->
Platform.runLater(() ->
statusText.set(e.connected() ? "已连接" : "未连接")));