You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Milo SDK 0.68(Kotlin)获取OPC-UA诊断信息的惯用方式咨询

Milo SDK 0.68(Kotlin)采集OPC-UA诊断信息的惯用方式

一、服务器摘要诊断的惯用写法

Milo SDK内置了对应OPC-UA标准诊断对象的类型,无需手动强转单个属性值,直接读取整个诊断对象节点更高效且符合SDK设计习惯:

// 获取服务器诊断摘要节点ID(直接使用内置标识符)
val serverDiagnosticsSummaryNode = Identifiers.Server_ServerDiagnostics_ServerDiagnosticsSummary
// 读取整个诊断对象
val summary = opcUaClient.readValue(
    0.0,
    TimestampsToReturn.Source,
    serverDiagnosticsSummaryNode
).get().value.value as ServerDiagnosticsSummaryDataType

// 直接访问摘要内的属性,无需手动类型转换
val currentSessionCount = summary.currentSessionCount
val totalSessionCount = summary.totalSessionCount

ServerDiagnosticsSummaryDataType是Milo内置的类型,完全映射OPC-UA标准的服务器诊断摘要结构,能直接获取所有诊断属性,避免单个节点读取的冗余操作。

二、会话诊断返回null的解决方法

会话诊断并非单个属性节点,而是以会话诊断数组的形式存在,之前返回null大概率是读取了错误的节点路径,正确步骤如下:

  1. 读取会话诊断数组节点,获取所有会话对应的诊断对象NodeId列表:
val sessionDiagnosticsArrayNode = Identifiers.Server_ServerDiagnostics_SessionDiagnosticsArray
// 读取数组得到所有会话诊断节点的ID集合
val sessionNodeIds = opcUaClient.readValue(
    0.0,
    TimestampsToReturn.Source,
    sessionDiagnosticsArrayNode
).get().value.value as List<NodeId>
  1. 遍历NodeId列表,逐个读取每个会话的诊断对象:
val sessionDiagnosticsList = sessionNodeIds.map { nodeId ->
    opcUaClient.readValue(
        0.0,
        TimestampsToReturn.Source,
        nodeId
    ).get().value.value as SessionDiagnosticsDataType
}

// 示例:输出第一个会话的关键诊断信息
sessionDiagnosticsList.firstOrNull()?.run {
    println("会话ID: $sessionId")
    println("客户端名称: $clientName")
    println("客户端IP: $clientAddress")
}

SessionDiagnosticsDataType是Milo内置的会话诊断类型,包含会话ID、客户端信息、会话时长等完整诊断数据,通过数组节点获取所有会话后再读取单个会话诊断,就能避免返回null的问题。

内容的提问来源于stack exchange,提问作者Vlad C.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:57:20