基于Web 的应用非常普及,例如基于web 的SCADA ,物联网 Dashboard 等等,那么基于Web 的应用如何访问OPC UA 服务器呢?本博文讨论这方面的问题。
Web 的通信方式
Web 是我们通常讲的网站,它由浏览器,HTTP 服务器和网页组成的。HTTP服务器通常称为后端,HTTP 网页在浏览器中解析执行。现代HTML5技术使HTTP中已经包括 javascript 语言,能够编写功能强大的程序,因此HTTP 网页称为前端。
传统的web 前后端是通过HTTP协议通信的,现在web 前后端能够采取多种方式通信,它们包括:
- HTTP协议
- RESTful
- MQTT 发布/订阅方式
- WebSocket
OPC UA 的通信方式
OPC UA 通信方式有两种
- TCP Client/Server
- Pub/Sub 发布订阅模型
几种基于Web的OPC UA 访问方式
基于HTTP RESTful 的方式
有两种方式实现OPC UA 的RESTful访问:
第一种方式是网关方式,将RESTful 请求翻译成为OPC UA 的Client 请求,结构如下图:
另一种方法是扩展OPC UA 标准,使OPC UA 服务器实现RESTful 访问。 OPC基金会最近宣布将通过扩展OPC UA标准的RESTful接口(2023/4/17),由微软公司公司主导编制,目前还没有更多的信息。
在OPC UA 1.04 规范中,提出了SessionlessInvoke 无状态服务通信。但是仅限于有限的服务。
基于GraphQL 方式
在这里我们介绍一种使用GraphQL 查询OPCUA 服务器的方法。
GraphQL 是一种HTTP API 方式。它的查询命令类似于JSON ,但是又不完全是JSON,而返回的是JSON结构。
Facebook 的移动应用从 2012 年就开始使用 GraphQL。GraphQL 规范于 2015 年开源,现已经在多种环境下可用,并被各种体量的团队所使用。
GraphQL 通过 HTTP 提供服务
GraphQL 是一种 API 对话的规范。下面是通过HTTP 实现的一个GragphQL 查询实例:
查询
query { hero { name } droid(id: "2000") { name } }
响应
{ "data": { "hero": { "name": "R2-D2" }, "droid": { "name": "C-3PO" } } }
GraphQL的查询过程
- GraphQL 查询不完全是 JSON;它看起来类似 JSON 形状。 当发出 'POST' 请求进行 GraphQL 查询时,客户端将其作为“字符串”发送。
- 服务器获取 JSON 对象并提取查询字符串。 根据 GraphQL 语法和图表数据模型(GraphQL 模式),服务器处理 并验证 GraphQL 查询。
- 正如典型的 API 服务器,GraphQL API 服务器随之调用数据库或其他服务,以抓取客户端请求的数据。
- 服务器获取数据并以 JSON 对象的形式将其返回客户端。
GraphQL 的优点
- GraphQL 模式会在 GraphQL 应用中设置单一事实来源。它为企业提供了一种整合其整个 API 的方法。
- 一次往返通讯可以处理多个 GraphQL 调用。客户端可得到自己所请求的内容,不会超量。
- 严格定义的数据类型可减少客户端与服务器之间的通信错误。
- GraphQL 具有自检功能。客户端可以请求一个可用数据类型的列表。这非常适合文档的自动生成。
- GraphQL 允许应用 API 进行更新优化,而无需破坏现有查询。
- 许多开源 GraphQL 扩展可提供 REST API 所不具备的功能。
- GraphQL 不指定特定的应用架构,它能够以现有的 REST API 为基础,并与现有的API管理
工具配合使用。
使用GraphQL 访问OPC UA 服务器
在下列项目中,实现了OPCUA 服务器的GraphQL 封装
https://github.com/AaltoIIC/OPC-UA-GraphQL-Wrapper
这是一个基于python-opcua 库的项目
查询的例子
query { node(server: "TestServer", nodeId: "ns=2;i=1234") { name description variable { value dataType } } }
另一个是基于NodeJS 的项目
https://github.com/gilesbradshaw/uaQL
结束语
RESTful 访问OPCUA 服务器是十分有用的,例如,当你实现一个基于OPCUA 的webHMI 应用时,HMI界面访问OPCUA 的内容。
具体实现起来,想必还有许多的细节要考虑,例如数据和事件如何订阅,这要使用websocket 双向协议,或者MQTT 发布/订阅方式。