事件
通过 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() == false 且 everConnected() == 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() ? "已连接" : "未连接")));