OPC UA协议报文,基础介绍+Hello报文解析

消息主要分为:消息头和附加字段

通讯过程

协议标准第一部分进行总体介绍;协议标准第四部分有详细介绍通讯过程

流程介绍

整体流程

连接套接字》Hello》打开安全信道》创建会话》关闭安全信道》关闭套接字

订阅等事件

服务器审核行为

聚合的服务器审核行为

HELLO报文如下

不能正常连接的报文

客户端发起连接

48 45 4C 46 55 00 00 00 00 00 00 00 FF FF 00 00 FF FF 00 00 C0 FF 3F 00 00 02 00 00 35 00 00 00 6F 70 63 2E 74 63 70 3A 2F 2F 6C 6F 63 61 6C 68 6F 73 74 3A 36 32 35 34 31 2F 51 75 69 63 6B 73 74 61 72 74 73 2F 52 65 66 65 72 65 6E 63 65 53 65 72 76 65 72

HELFU   ?? 5 opc.tcp://localhost:62541/Quickstarts/ReferenceServer

对应协议文档分析,前三个字节48 45 4C对应ascll中hel代表hello,F忽略,55000000为消息长度十进制85

对应TCP协议版本0,可以接收的最大消息65535,发送者最大消息65535,响应最大值3fffc0,响应最大块数512,客户端要连接的端口URL(这里没表述长度,但是前四个字节为消息长度,后面才是消息内容)

服务端返回错误码

45 52 52 46 38 00 00 00 00 00 7E 80 28 00 00 00 43 6C 69 65 6E 74 20 73 65 6E 74 20 61 6E 20 75 6E 65 78 70 65 63 74 65 64 20 48 65 6C 6C 6F 20 6D 65 73 73 61 67 65 2E

ERRF8 ~€( Client sent an unexpected Hello message.

可以正常连接的报文

48 45 4C 46 55 00 00 00 00 00 00 00 FF FF 00 00 FF FF 00 00 C0 FF 3F 00 00 02 00 00 35 00 00 00 6F 70 63 2E 74 63 70 3A 2F 2F 6C 6F 63 61 6C 68 6F 73 74 3A 36 32 35 34 31 2F 51 75 69 63 6B 73 74 61 72 74 73 2F 52 65 66 65 72 65 6E 63 65 53 65 72 76 65 72

HELFU   ?? 5 opc.tcp://localhost:62541/Quickstarts/ReferenceServer

收到的

41 43 4B 46 1C 00 00 00 00 00 00 00 FF FF 00 00 FF FF 00 00 00 00 40 00 41 00 00 00

ACKF..................@.A...

响应头同上发送的

其余应答信息如下:版本号和上面一致,发送者最大长度、接受者最大长度都是65535,请求消息最大值,最多块数

### 如何解析 OPC UA 报文 OPC UA 是一种用于工业自动化的通信协议,其报文结构复杂且具有高度灵活性。为了有效解析 OPC UA 报文,通常需要了解底层的数据编码方式以及使用合适的工具或库。 #### 数据编码方式 OPC UA 使用两种主要的编码方式:**Binary 编码**和 **XML 编码**。大多数情况下,Binary 编码因其高效性和紧凑性被广泛采用。以下是 Binary 编码的主要特点: - 它是一种二进制格式,适合高性能应用。 - 需要按照 OPC UA 的规范定义逐步解码数据流[^1]。 #### 工具与库的选择 对于开发者来说,可以选择现成的开源库来简化解析过程。常用的库包括: - **open62541**: 这是一个用 C 实现的轻量级 OPC UA 库,提供了丰富的 API 来操作 OPC UA 报文。 - **UA-.NETStandard SDK**: 提供了 .NET 平台上的 OPC UA 支持,适用于 Windows 和 Linux 环境下的开发工作。 下面展示一段基于 open62541 的示例代码,演示如何解析 OPC UA 响应消息: ```c #include "ua_client.h" #include "ua_types.h" void parse_opc_ua_message(UA_Client *client, const UA_NodeId *nodeId) { // 创建 Variant 变量存储读取的结果 UA_Variant value; UA_Variant_init(&value); // 从服务器读取节点属性值 UA_StatusCode statusCode = UA_Client_readValueAttribute(client, *nodeId, &value); if (statusCode != UA_STATUSCODE_GOOD) { printf("Failed to read node with status code %i\n", statusCode); return; } // 判断 Variant 类型并打印内容 if (value.type == &UA_TYPES[UA_TYPES_INT32]) { int32_t intValue = *(int32_t *)value.data; printf("Node Value: %d\n", intValue); } else if (value.type == &UA_TYPES[UA_TYPES_DOUBLE]) { double doubleValue = *(double *)value.data; printf("Node Value: %f\n", doubleValue); } else { printf("Unsupported data type.\n"); } } ``` 此代码片段展示了如何通过 `UA_Client` 对象读取指定节点的值,并根据返回的 `Variant` 类型执行相应的处理逻辑[^1]。 #### 手动解析流程 如果无法依赖第三方库,则需手动遵循 OPC UA 协议标准完成解析。基本步骤如下: 1. 获取完整的 TCP 数据包; 2. 按照 OPC UA Binary Encoding 规范拆分头部信息(如 SessionAuthenticationToken、RequestHeader 等); 3. 处理具体的服务请求体和服务响应体; 4. 将最终的有效载荷转化为可理解的形式。 需要注意的是,在实际项目中推荐优先选用成熟的解决方案而非自行实现整个解析机制,因为后者可能涉及大量细节问题难以完全覆盖[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值