如何使用 FIWARE OPC UA AGENT

如何解决如何使用 FIWARE OPC UA AGENT

目标

使用 Fiware OPC UA 代理更改 OPC UA 服务器上的可写值。

我的测试实现

  1. 将 NodeId“7:PLC1_7:G_Communication_7:fi_heartbeat_i”添加到 config.json 文件中的“command”和“contextSubscription”部分。 NodeId的值数据类型是Int16,但是因为这个值是要写的,所以我假设必须使用“command”作为类型。遗憾的是,手册 fiware opcua agent 中找不到更详细的信息。
  2. 使用 OpcUa 代理、Orion 上下文代理和 mongodb 启动新的测试环境。

预期行为

当请求发送到上下文代理时,服务器上的值会更新。

当前行为

  • 参数值被正确读取,但数据类型不正确(字符串而不是整数)。
  • 将请求发送到 Orion 上下文代理时,不会更新参数值。

其他信息

  1. config.json
     {
      "logLevel" : "DEBUG","contextBroker" : {
        "host" : "orion","port" : 1026
      },"server" : {
        "port" : 4001,"baseRoot" : "/"
      },"deviceRegistry" : {
        "type" : "memory"
      },"mongodb" : {
        "host" : "iotmongo","port" : "27017","db" : "iotagent","retries" : 5,"retryTime" : 5
      },"providerUrl" : "http://iotopcua:4001","pollingExpiration" : "200000","pollingDaemonFrequency" : "20000","deviceRegistrationDuration" : "P1M","defaultType" : null,"browseServerOptions" : null,"service" : "test","subservice" : "/test","types" : {
        "g_communication" : {
          "service" : "test","active" : [{
            "name" : "7:PLC1_7:G_Communication_7:fo_smartControllerActive_b","type" : "Boolean"
          } ],"lazy" : [ ],"commands" : [{
            "name" : "7:PLC1_7:G_Communication_7:fi_heartbeat_i","type" : "Command"  
            }]
        }
      },"contexts" : [ {
            "id" : "plant","type" : "g_communication","polling" : null,"mappings" : [{
              "ocb_id" : "7:PLC1_7:G_Communication_7:fo_smartControllerActive_b","opcua_id" : "ns=7;s=G_Communication.fo_smartControllerActive_b","object_id" : null,"inputArguments" : []
            } ]
      }],"contextSubscriptions" : [{ 
            "id" : "plant","mappings" : [{
              "ocb_id" : "7:PLC1_7:G_Communication_7:fi_heartbeat_i","opcua_id" : "ns=7;s=G_Communication.fi_heartbeat_i","object_id" : "ns=7;s=G_Communication","inputArguments" : [{
                 "type": "Number"
              }]
            }]
        }]
    }
  1. 列出实体
curl 'http://localhost:1026/v2/entities/plant/' -H 'fiware-service: test' -H 'fiwate-servicepath: /test' | python -m json.tool
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100   684  100   684    0     0  13751      0 --:--:-- --:--:-- --:--:-- 13959
{
   "7:PLC1_7:G_Communication_7:fi_heartbeat_i": {
       "metadata": {
           "ServerTimestamp": {
               "type": "ISO8601","value": "null"
           },"SourceTimestamp": {
               "type": "ISO8601","value": "null"
           }
       },"type": "string","value": "4"
   },"7:PLC1_7:G_Communication_7:fi_heartbeat_i_info": {
       "metadata": {},"type": "commandResult","value": " "
   },"7:PLC1_7:G_Communication_7:fi_heartbeat_i_status": {
       "metadata": {},"type": "commandStatus","value": "UNKNOWN"
   },"7:PLC1_7:G_Communication_7:fo_smartControllerActive_b": {
       "metadata": {
           "ServerTimestamp": {
               "type": "ISO8601","value": "2021-05-04T07:38:01.150Z"
           },"value": "2021-05-04T07:37:59.934Z"
           }
       },"type": "Boolean","value": false
   },"id": "plant","type": "g_communication"
}
  1. 注册
curl 'http://localhost:1026/v2/registrations'  -H 'fiware-service: test' -H 'fiwate-servicepath: /test' | python -m json.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   320  100   320    0     0  46049      0 --:--:-- --:--:-- --:--:-- 53333
[
    {
        "dataProvided": {
            "attrs": [
                "7:PLC1_7:G_Communication_7:fi_heartbeat_i"
            ],"entities": [
                {
                    "id": "plant","type": "g_communication"
                }
            ]
        },"expires": "2021-06-03T07:37:38.00Z","id": "6090f9c254b918756abf1a7d","provider": {
            "http": {
                "url": "http://iotopcua:4001"
            },"legacyForwarding": true,"supportedForwardingMode": "all"
        },"status": "active"
    }
]
  1. 测试与 iotopcua 的通信
 curl "http://iotopcua:4001/version"
{"libVersion":"2.12.0-next","port":4001,"baseRoot":"/"}
  1. 请求更新
curl -X PUT \
  'http://localhost:1026/v2/entities/plant/attrs/7:PLC1_7:G_Communication_7:fi_heartbeat_i?type=g_communication' \
  -H 'content-type: application/json' \
  -H 'fiware-service: test' \
  -H 'fiware-servicepath: /test' \
  -d '{
  "value": 2
  }'
  1. 记录 OCB
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=logMsg.h[1844]:lmTransactionStart | msg=Starting transaction from 0.0.0.0:54232/v2/entities/plant/attrs/7:PLC1_7:G_Communication_7:fi_heartbeat_i
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=rest.cpp[874]:servicePathSplit | msg=Service Path 0: '/test'
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=connectionOperations.cpp[244]:collectionCount | msg=Database Operation Successful (count: { _id.id: "plant",_id.type: "g_communication",_id.servicePath: "/test" })
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=connectionOperations.cpp[94]:collectionQuery | msg=Database Operation Successful (query: { _id.id: "plant",_id.servicePath: "/test" })
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=connectionOperations.cpp[182]:collectionRangedQuery | msg=Database Operation Successful (query: { query: { $or: [ { contextRegistration.entities.id: "plant",contextRegistration.entities.type: "g_communication" },{ contextRegistration.entities.id: ".*",contextRegistration.entities.isPattern: "true",contextRegistration.entities.type: { $in: [ "g_communication" ] } },contextRegistration.entities.type: { $exists: false } } ],expiration: { $gt: 1620114947 },contextRegistration.attrs.name: { $in: [ "7:PLC1_7:G_Communication_7:fi_heartbeat_i" ] },servicePath: "/test" },orderby: { _id: 1 } })
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=logMsg.h[1844]:lmTransactionStart | msg=Starting transaction to http://iotopcua:4001//updateContext
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=httpRequestSend.cpp[550]:httpRequestSendWithCurl | msg=Sending message 4 to HTTP server: sending message of 458 bytes to HTTP server
from=10.1.17.1 | srv=test | subsrv=/test | comp=Orion | op=logMsg.h[1844]:lmTransactionStart | msg=Starting transaction from 10.1.17.1:58162/v1/updateContext
from=10.1.17.1 | srv=test | subsrv=/test | comp=Orion | op=rest.cpp[874]:servicePathSplit | msg=Service Path 0: '/test'
from=10.1.17.1 | srv=test | subsrv=/test | comp=Orion | op=connectionOperations.cpp[94]:collectionQuery | msg=Database Operation Successful (query: { _id.id: "plant",_id.servicePath: "/test" })
from=10.1.17.1 | srv=test | subsrv=/test | comp=Orion | op=connectionOperations.cpp[454]:collectionUpdate | msg=Database Operation Successful (update: <{ _id.id: "plant",_id.servicePath: "/test" },{ $set: { attrs.7:PLC1_7:G_Communication_7:fi_heartbeat_i_status: { value: "PENDING",type: "commandStatus",mdNames: [],creDate: 1620113858,modDate: 1620114947 },modDate: 1620114947,lastCorrelator: "2324ca1e-acae-11eb-a4f7-226cad26e2cc" },$unset: { location: 1,expDate: 1 } }>)
from=10.1.17.1 | srv=test | subsrv=/test | comp=Orion | op=logMsg.h[1874]:lmTransactionEnd | msg=Transaction ended
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=httpRequestSend.cpp[570]:httpRequestSendWithCurl | msg=Notification Successfully Sent to http://iotopcua:4001//updateContext
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=httpRequestSend.cpp[579]:httpRequestSendWithCurl | msg=Notification response OK,http code: 200
from=0.0.0.0 | srv=test | subsrv=/test | comp=Orion | op=logMsg.h[1874]:lmTransactionEnd | msg=Transaction ended
  1. 登录 OPCUA 客户端
time=2021-05-04T07:55:47.191Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.GenericMiddlewares | msg=Request for path [//updateContext] from [iotopcua:4001]
time=2021-05-04T07:55:47.191Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.GenericMiddlewares | msg=Body:

{
    "contextElements": [
        {
            "type": "g_communication","isPattern": "false","attributes": [
                {
                    "name": "7:PLC1_7:G_Communication_7:fi_heartbeat_i","type": "Number","value": 2
                }
            ]
        }
    ],"updateAction": "UPDATE"
}


time=2021-05-04T07:55:47.193Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.ContextServer | msg=Handling update from [iotopcua:4001]
time=2021-05-04T07:55:47.193Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.ContextServer | msg=[object Object]
time=2021-05-04T07:55:47.194Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.InMemoryGroupRegister | msg=Looking for device params ["service","subservice","type"]
time=2021-05-04T07:55:47.194Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.DeviceService | msg=deviceData after merge with conf: {"id":"plant","name":"plant","type":"g_communication","active":[{"name":"7:PLC1_7:G_Communication_7:fo_smartControllerActive_b","type":"Boolean","object_id":"7:PLC1_7:G_Communication_7:fo_smartControllerActive_b"}],"service":"test","subservice":"/test","polling":null,"endpoint":"opc.tcp://109.68.106.155:48050","registrationId":"6090f9c254b918756abf1a7d","creationDate":1620113858802}
time=2021-05-04T07:55:47.194Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.DeviceService | msg=deviceData before merge with conf: {"id":"plant","lazy":[],"commands":[{"name":"7:PLC1_7:G_Communication_7:fi_heartbeat_i","type":"Command","object_id":"7:PLC1_7:G_Communication_7:fi_heartbeat_i"}],"creationDate":1620113858802,"internalAttributes":null,"staticAttributes":[],"subscriptions":[]}
time=2021-05-04T07:55:47.195Z | lvl=INFO | corr=n/a | trans=n/a | op=Index.CommandContextHandler | comp=iotAgent-OPCUA | srv=test | subsrv=/test | msg=method to call =[{"objectId":"ns=7;s=G_Communication","methodId":"ns=7;s=G_Communication.fi_heartbeat_i","inputArguments":[{"type":"Number"}]}]
time=2021-05-04T07:55:47.879Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=executeWithDeviceInfo entityName plant type undefined apikey undefined attributes [{"name":"7:PLC1_7:G_Communication_7:fi_heartbeat_i_status","type":"commandStatus","value":"PENDING"}] deviceInformation {"id":"plant","subscriptions":[]}
time=2021-05-04T07:55:47.879Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=error {"name":"DEVICE_GROUP_NOT_FOUND","message":"Couldn\t find device group","code":404} in get group device
time=2021-05-04T07:55:47.880Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=typeInformation {"id":"plant","subscriptions":[]}
time=2021-05-04T07:55:47.880Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=Updating device value in the Context Broker at [http://orion:1026/v1/updateContext]
time=2021-05-04T07:55:47.880Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=Using the following request:

{
    "url": "http://orion:1026/v1/updateContext","method": "POST","headers": {
        "fiware-service": "test","fiware-servicepath": "/test"
    },"json": {
        "contextElements": [
            {
                "type": "g_communication","attributes": [
                    {
                        "name": "7:PLC1_7:G_Communication_7:fi_heartbeat_i_status","value": "PENDING"
                    }
                ]
            }
        ],"updateAction": "UPDATE"
    }
}


time=2021-05-04T07:55:47.886Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=Received the following request from the CB:

{
    "contextResponses": [
        {
            "contextElement": {
                "type": "g_communication","value": ""
                    }
                ]
            },"statusCode": {
                "code": "200","reasonPhrase": "OK"
            }
        }
    ]
}


time=2021-05-04T07:55:47.886Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.NGSIService | msg=Value updated successfully
time=2021-05-04T07:55:47.886Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.ContextServer | msg=Update action from [iotopcua:4001] handled successfully.
time=2021-05-04T07:55:47.886Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.ContextServer | msg=Generated update response: {"contextResponses":[{"contextElement":{"attributes":[{"name":"7:PLC1_7:G_Communication_7:fi_heartbeat_i","type":"Number","value":""}],"id":"plant","isPattern":false,"type":"g_communication"},"statusCode":{"code":200,"reasonPhrase":"OK"}}]}
time=2021-05-04T07:55:47.887Z | lvl=DEBUG | corr=n/a | trans=n/a | op=IoTAgentNGSI.DomainControl | msg=response-time: 697

解决方法

据我所知,我认为错误存在于 config.json 中的 contextSubscription 片段中,它应该如下所示:

"contextSubscriptions": [{
  "id": "plant","type": "g_communication","service": "test","subservice": "/test","mappings": [{
    "ocb_id": "7:PLC1_7:G_Communication_7:fi_heartbeat_i","opcua_id": "ns=7;s=G_Communication.fi_heartbeat_i","object_id": "ns=7;s=G_Communication","inputArguments": [{
      "dataType": 4,"type": "Intensity"
    }]
  }]
}]

可以试试吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res