因此,有两种类型的端点连接到opcua模拟服务器,一种是tcp,另一种是https。
的数据
我尝试了一切我可以连接的https端点,但我没有得到运气。
这是我的Python代码:
`host, port = address.split("/")[2].split(":")
server_address = host
server_port = int(port)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
ssl_socket = ssl_context.wrap_socket(client_socket, server_hostname=server_address)
ssl_socket.connect((server_address, server_port))
node_id = "ns=3;i=1002" # Replace with your desired NodeId
message = (
b'\x03\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x11\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00' + len(node_id).to_bytes(4, byteorder='little')
+ node_id.encode()
)
content_type = b'application/octet-stream'
request = (
b"POST / HTTP/1.1\r\n"
b"Host: " + server_address.encode() + b"\r\n"
b"Content-Type: " + content_type + b"\r\n"
b"Content-Length: " + str(
len(message)).encode() + b"\r\n"
b"\r\n" + message
)
ssl_socket.send(request)
response = ssl_socket.recv(4096)
print("Response:\n", response)
ssl_socket.close()`
字符串
对于上面的代码,这是我收到的错误:
第一个月
我需要使用object id获取对象的值。协议必须是HTPPS。
2条答案
按热度按时间vtwuwzda1#
opc ua的http协议非常复杂。你必须实现很多规范,比如编码层、安全特性等等。.
我只会使用普通的opc ua tcp和asyncua。
如果你真的需要使用https,你至少可以使用asyncua二进制编码和数据类型来帮助生成正确的二进制消息。
m1m5dgzv2#
我不知道你的消息是什么,但你需要知道你的客户端需要通过HTTPS传递OPC UA二进制消息。
因此,您将无法使用简单的HTTP客户端-您将需要使用OPC UA客户端,该客户端可以使用编码为UA二进制消息的OPC UA服务调用通过HTTPS打开适当的OPC UA客户端-服务器会话。
这是令人困惑的,我们(Prosys OPC)通常不推荐UA HTTPS,除非你没有选择使用UA TCP。