使用opc-ua-sim模拟server
使用opc-ua-sim模拟server
前言
一直想找一种将模拟server放到docker容器中运行的方式,这样就不需要在每个电脑上都安装软件,仅仅只需要将镜像保存起来,使用时加载就行。于是乎就跑到了HUB里搜寻,你说巧不巧,就刚好找到了.
iotechsys
在HUB里找到这个作者(iotechsys)发布的镜像。里面有一个opc-ua-sim的镜像,这个就是我想要的。当然简单浏览了下还有很多像ua-browser、device-websocket、eb-redis等等很多的应用,这些都没有细细研究。毕竟opc-ua-sim才是今天的主要目的。
虽然有了镜像,但是作者的介绍里却是光秃秃的。我想要的食用步骤呢???在对作者的HUB端详了许久,我发现竟然有作者的官网,进去瞧瞧?
点进官网直奔support,并没有什么发现。
脑子一热直接在浏览器中搜索这个opc-ua-sim的用法,找到一个XRT User Document的网站。翻官网半天啥都找不到,最后还是直接复制关键字google出来的。真让我好找。
opc-ua-sim使用
拉取镜像
docker pull iotechsys/opc-ua-sim:1.2
在这里我看到HUB里最新tag并不是1.2,所以我选择了最新版也就是1.4的版本
运行镜像(无Lua脚本)
docker run --rm --name opc-ua-sim -p 49947:49947 iotechsys/opc-ua-sim:1.2
如果是使用windows平台下的docker desktop的话,这个地方windows的端口是49947是不能用的,需要切换到任意一个不被占用的端口,本人使用的是4840.
记得更换到你拉取的镜像版本,可以通过这个来查看镜像的运行情况,同时也能看看神秘的容器里藏着些什么东东
直到这里一切都是那么的顺利😕
运行镜像(带Lua脚本)
docker run --rm --name opc-ua-sim -p 49947:49947 iotechsys/opc-ua-sim:1.2 -l /example-scripts/simulation.lua
端口切换到4840,运行镜像中自带的测试脚本。啊啊啊,竟然报错容器停止自动销毁了。没想到官方步骤也能把我坑一手。
解决Lua Error
error running function `Update': /example-scripts/simulation.lua:lua:254: attempt to call a nil value (method 'updateValue')
很明显这个问题出现在容器内使用的脚本simulate.lua里,虽然对lua不懂,但是通过查阅貌似是因为没有updateValue这个方法导致的执行错误,并且这个方法是用来更新节点值的。通过查阅官方教程也仅仅给出了Function Update() 并没有给出使用什么方法去更新节点值。这就很头疼了。
兜兜转转,就在我想要放弃之际,我点进官方教程的Lua Scripting Examples. 啊?直接跳转到了官方的git。我好像又看到了一点希望的光透了进来。耐着性子翻阅官方的git。
通过对比我发现,v2.0-branch 和 v3.0-branch 使用的simulate.lua脚本不一样。updateValue方法被更换为了setValue。抱着试一试态度,将整个script文件夹下载到了本地通过挂载的到容器的方法运行了新的脚本
运行镜像(挂载主机Lua脚本)
docker run --rm --name opc-ua-sim -p 49947:49947 -v $(pwd)/lua-scripts/:/docker-lua-scripts/ iotechsys/opc-ua-sim:1.2 -l /docker-lua-scripts/simulate.lua
注意这里的$(pwd)方法也是一个坑,在windows的powershell下(其他平台没试,但这应该是docker的一个规定,与平台无关)这个命令docker无法识别,需要更改成${pwd},命令就能正常运行了。
验证
到这里,基本已经完成了所有的工作了,通过命令行可以查到模拟server暴露到了本机你指定的端口。并且默认情况下是允许匿名登录的。你可以使用任意的ua-client连接到这个server。并且可以查看到并监控示例object的节点值状态以及变化情况。
最后
当然这仅仅是成功运行了。server的模拟是离不开Lua脚本的,还需要进一步的熟悉熟悉Lua脚本基本用法。官方教程很多部分还没看,包括众多的Lua API。最后,iotechsys其实还有很多其他的镜像可能也需要了解一些,比如ua-browser。这些应该都是会用得上的。