├── .dockerignore ├── .gitattributes ├── .gitignore ├── Dockerfile ├── Jenkinsfile ├── NOTICE ├── README.rst ├── build.bat ├── build.sh ├── doc └── doxygen │ ├── .gitignore │ ├── Doxyfile │ └── doxygen.sh ├── docker-compose.yml ├── docs ├── Makefile ├── make.bat └── source │ ├── 1_getting_started │ ├── _index.rst │ ├── hello_world.rst │ ├── installation.rst │ ├── opc_ua_web_server.png │ └── overview.rst │ ├── 2_configuration │ ├── _index.rst │ ├── http_server.rst │ ├── websocket_gateway.rst │ └── websocket_server.rst │ ├── 3_websocket_server │ ├── _index.rst │ ├── historical_read.rst │ ├── message_format.rst │ ├── monitor.rst │ ├── notation.rst │ ├── read.rst │ ├── value_info.rst │ ├── value_list.rst │ └── write.rst │ ├── 4_websocket_gateway │ └── _index.rst │ ├── 5_certificates │ ├── _index.rst │ ├── create_certificate.rst │ └── use_ssl_connection.rst │ ├── _templates │ └── layout.html │ ├── conf.py │ ├── glossary.rst │ ├── index.rst │ └── resources │ └── opc_ua_web_server.odp ├── ftest ├── .gitignore ├── README ├── WebGateway │ ├── .gitignore │ ├── AttributeService │ │ ├── __init__.py │ │ ├── test_history_read_attribute.py │ │ ├── test_history_read_event.py │ │ ├── test_read_attribute.py │ │ └── test_write_attribute.py │ ├── Connection │ │ ├── __init__.py │ │ ├── test_max_connections.py │ │ ├── test_mulitple_opcua_connections.py │ │ ├── test_mulitple_websocket_connections.py │ │ └── test_ping.py │ ├── MethodService │ │ ├── __init__.py │ │ └── test_call.py │ ├── MonitoredItemService │ │ ├── __init__.py │ │ ├── test_data_change.py │ │ ├── test_event_notify.py │ │ └── test_monitored_item.py │ ├── Python │ │ ├── Check.py │ │ └── Sync.py │ ├── SessionService │ │ ├── __init__.py │ │ ├── test_open_session_adn_close_channel.py │ │ └── test_session.py │ ├── SubscriptionService │ │ ├── __init__.py │ │ └── test_create_delete_subscription.py │ ├── ViewService │ │ ├── __init__.py │ │ ├── test_browse.py │ │ └── test_translate_browse_paths_to_nodeids.py │ ├── __init__.py │ ├── test.sh │ └── web_gateway_testcase.py ├── WebServer │ ├── Common │ │ ├── __init__.py │ │ └── test_header.py │ ├── Functions │ │ ├── __init__.py │ │ ├── test_history_read.py │ │ ├── test_monitor.py │ │ ├── test_read.py │ │ ├── test_value_info.py │ │ ├── test_value_list.py │ │ └── test_write.py │ ├── __init__.py │ ├── test.sh │ └── web_server_testcase.py ├── environment.sh ├── requirements.txt └── test.sh ├── src ├── CMakeLists.txt ├── Copyright.txt ├── OpcUaWebServer │ ├── Build │ │ └── BuildConfig.h.in │ ├── CMakeLists.txt │ ├── Config │ │ ├── Opc.Ua.NodeSet.ASNeGServer.xml │ │ ├── Opc.Ua.NodeSet2.xml │ │ ├── OpcUaClient0.xml │ │ ├── OpcUaClient1.xml │ │ ├── OpcUaClientTest.xml │ │ ├── OpcUaServer.xml │ │ └── OpcUaWebServerModel.xml │ ├── Library │ │ ├── Library.cpp │ │ └── Library.h │ ├── MessageServer │ │ ├── MessageServer.cpp │ │ ├── MessageServer.h │ │ └── MessageServerIf.h │ ├── Messages │ │ ├── Message.cpp │ │ └── Message.h │ ├── OpcUaClient │ │ ├── HistoricalReadRequestData.cpp │ │ ├── HistoricalReadRequestData.h │ │ ├── HistoricalReadResponseData.cpp │ │ ├── HistoricalReadResponseData.h │ │ ├── MonitorManager.cpp │ │ ├── MonitorManager.h │ │ ├── MonitorStartRequestData.cpp │ │ ├── MonitorStartRequestData.h │ │ ├── MonitorStartResponseData.cpp │ │ ├── MonitorStartResponseData.h │ │ ├── MonitorStopRequestData.cpp │ │ ├── MonitorStopRequestData.h │ │ ├── MonitorStopResponseData.cpp │ │ ├── MonitorStopResponseData.h │ │ ├── MonitorUpdateData.cpp │ │ ├── MonitorUpdateData.h │ │ ├── OpcUaClient.cpp │ │ ├── OpcUaClient.h │ │ ├── OpcUaClientConfig.cpp │ │ ├── OpcUaClientConfig.h │ │ ├── OpcUaClientIf.h │ │ ├── OpcUaClientManager.cpp │ │ ├── OpcUaClientManager.h │ │ ├── OpcUaClientManagerIf.h │ │ ├── PtreeConverter.cpp │ │ ├── PtreeConverter.h │ │ ├── ReadRequestData.cpp │ │ ├── ReadRequestData.h │ │ ├── ReadResponseData.cpp │ │ ├── ReadResponseData.h │ │ ├── RequestInfo.cpp │ │ ├── RequestInfo.h │ │ ├── ServiceTransactionClient.cpp │ │ ├── ServiceTransactionClient.h │ │ ├── ValueInfo.cpp │ │ ├── ValueInfo.h │ │ ├── ValueInfoRequestData.cpp │ │ ├── ValueInfoRequestData.h │ │ ├── ValueInfoResponseData.cpp │ │ ├── ValueInfoResponseData.h │ │ ├── ValueListResponseData.cpp │ │ ├── ValueListResponseData.h │ │ ├── WriteRequestData.cpp │ │ ├── WriteRequestData.h │ │ ├── WriteResponseData.cpp │ │ └── WriteResponseData.h │ ├── Socket │ │ ├── SocketIf.h │ │ ├── SocketRaw.cpp │ │ ├── SocketRaw.h │ │ ├── SocketSSL.cpp │ │ └── SocketSSL.h │ ├── Web │ │ ├── index.html │ │ ├── pics │ │ │ └── asneg_logo.png │ │ └── projects │ │ │ ├── demo_controlpanel │ │ │ ├── controlpanel.html │ │ │ ├── css │ │ │ │ ├── panel.css │ │ │ │ └── w3.css │ │ │ ├── impressum.html │ │ │ ├── js │ │ │ │ ├── client │ │ │ │ │ └── asneg-ws-client.js │ │ │ │ ├── external │ │ │ │ │ ├── Chart.min.js │ │ │ │ │ ├── steelseries-min.js │ │ │ │ │ └── tween-min.js │ │ │ │ ├── panel │ │ │ │ │ ├── chart.js │ │ │ │ │ ├── config.js │ │ │ │ │ ├── facade.js │ │ │ │ │ ├── gauge.js │ │ │ │ │ ├── panel.js │ │ │ │ │ ├── parser.js │ │ │ │ │ ├── toolfactory.js │ │ │ │ │ └── view.js │ │ │ │ └── utility │ │ │ │ │ ├── json.js │ │ │ │ │ ├── logger.js │ │ │ │ │ └── model.js │ │ │ ├── json │ │ │ │ ├── design.json │ │ │ │ ├── settings.json │ │ │ │ ├── tools.json │ │ │ │ └── variables.json │ │ │ └── pics │ │ │ │ ├── altimeter.jpg │ │ │ │ ├── asneg_logo.png │ │ │ │ ├── asneg_web.png │ │ │ │ ├── battery.jpg │ │ │ │ ├── compass.jpg │ │ │ │ ├── display_multi.jpg │ │ │ │ ├── display_single.jpg │ │ │ │ ├── horizon.jpg │ │ │ │ ├── icon_offline.png │ │ │ │ ├── icon_online.png │ │ │ │ ├── led.jpg │ │ │ │ ├── level.jpg │ │ │ │ ├── lightblub.jpg │ │ │ │ ├── line.jpg │ │ │ │ ├── linear1.jpg │ │ │ │ ├── linear2.jpg │ │ │ │ ├── linear3.jpg │ │ │ │ ├── odometer.jpg │ │ │ │ ├── radial1.jpg │ │ │ │ ├── radial2.jpg │ │ │ │ ├── radial3.jpg │ │ │ │ ├── radial_vertical.jpg │ │ │ │ ├── table.jpg │ │ │ │ └── winddirection.jpg │ │ │ └── demo_simple │ │ │ └── simpledemo.html │ ├── WebGateway │ │ ├── Client.cpp │ │ ├── Client.h │ │ ├── ClientManager.cpp │ │ ├── ClientManager.h │ │ ├── DataChangeNotify.cpp │ │ ├── DataChangeNotify.h │ │ ├── EventNotify.cpp │ │ ├── EventNotify.h │ │ ├── LoginRequest.cpp │ │ ├── LoginRequest.h │ │ ├── LoginResponse.cpp │ │ ├── LoginResponse.h │ │ ├── LogoutRequest.cpp │ │ ├── LogoutRequest.h │ │ ├── LogoutResponse.cpp │ │ ├── LogoutResponse.h │ │ ├── NotifyHeader.cpp │ │ ├── NotifyHeader.h │ │ ├── RequestHeader.cpp │ │ ├── RequestHeader.h │ │ ├── ResponseHeader.cpp │ │ ├── ResponseHeader.h │ │ ├── SessionStatusNotify.cpp │ │ ├── SessionStatusNotify.h │ │ ├── SubscriptionStatusNotify.cpp │ │ ├── SubscriptionStatusNotify.h │ │ ├── WebGateway.cpp │ │ ├── WebGateway.h │ │ ├── WebGatewayConfig.cpp │ │ └── WebGatewayConfig.h │ ├── WebServer │ │ ├── HttpChannel.cpp │ │ ├── HttpChannel.h │ │ ├── HttpConfig.cpp │ │ ├── HttpConfig.h │ │ ├── HttpContent.cpp │ │ ├── HttpContent.h │ │ ├── HttpRequest.cpp │ │ ├── HttpRequest.h │ │ ├── HttpResponse.cpp │ │ ├── HttpResponse.h │ │ ├── HttpServer.cpp │ │ ├── HttpServer.h │ │ ├── HttpServerBase.cpp │ │ ├── HttpServerBase.h │ │ ├── HttpServerIf.h │ │ ├── IPLogger.cpp │ │ ├── IPLogger.h │ │ ├── WebServer.cpp │ │ ├── WebServer.h │ │ └── https_examples.cpp │ ├── WebSocket │ │ ├── SendQueue.cpp │ │ ├── SendQueue.h │ │ ├── WebSocket.cpp │ │ ├── WebSocket.h │ │ ├── WebSocketChannel.cpp │ │ ├── WebSocketChannel.h │ │ ├── WebSocketConfig.cpp │ │ ├── WebSocketConfig.h │ │ ├── WebSocketMessage.cpp │ │ ├── WebSocketMessage.h │ │ ├── WebSocketRequest.cpp │ │ ├── WebSocketRequest.h │ │ ├── WebSocketResponse.cpp │ │ ├── WebSocketResponse.h │ │ ├── WebSocketServer.cpp │ │ ├── WebSocketServer.h │ │ ├── WebSocketServerBase.cpp │ │ └── WebSocketServerBase.h │ ├── certificate │ │ ├── createCertificate.sh │ │ ├── csr.pem │ │ ├── websocket.crt │ │ └── websocket.pem │ └── linux │ │ ├── etc │ │ ├── init.d │ │ │ └── OpcUaWebServer.in │ │ └── init │ │ │ └── OpcUaWebServer.conf.in │ │ ├── log │ │ └── README │ │ ├── script │ │ ├── postinst │ │ ├── postrm │ │ ├── preinst │ │ └── prerm │ │ └── usr │ │ └── lib │ │ └── systemd │ │ └── system │ │ └── OpcUaWebServer.service.in └── icon │ ├── asneg.ico │ ├── asneg_install.ico │ └── asneg_uninstall.ico └── start.bat /.dockerignore: -------------------------------------------------------------------------------- 1 | build_* 2 | .git 3 | 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * linguist-language=C++ 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Debug 2 | Release 3 | ipch 4 | *.sdf 5 | *.suo 6 | *.opensdf 7 | *.swp 8 | *.pcap 9 | *.swn 10 | *.swo 11 | core 12 | *.log 13 | build 14 | build_package 15 | build_* 16 | 17 | .idea 18 | cmake-build-* 19 | __pycache__ 20 | nosetests.xml 21 | venv 22 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM asneg/opcuastack:release-4 2 | 3 | # Add source files to docker container 4 | ADD / /OpcUaWebServer 5 | 6 | # Prepare Python dependencies for tests 7 | RUN apt-get update && apt-get install -y python3-pip 8 | RUN pip3 install -r /OpcUaWebServer/ftest/requirements.txt 9 | 10 | # Prepare workdir 11 | WORKDIR /OpcUaWebServer 12 | 13 | # Build 14 | RUN sh build.sh -t local -i / -j 2 -B Release 15 | 16 | # Clean build files 17 | RUN sh build.sh -t clean 18 | 19 | # Start OpcUaWebServer 20 | EXPOSE 8890 4840 8080 8081 8082 22 21 | CMD ["OpcUaServer4", "/etc/OpcUaStack/OpcUaWebServer/OpcUaServer.xml"] 22 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | pipeline { 2 | agent any 3 | triggers { 4 | pollSCM('* * * * *') 5 | cron('30 23 * * *') 6 | } 7 | stages { 8 | stage('cppcheck') { 9 | steps { 10 | sh 'cppcheck --xml --xml-version=2 ./src 2> cppcheck.xml' 11 | } 12 | } 13 | stage('build') { 14 | parallel { 15 | stage('build_linux') { 16 | steps { 17 | sh 'docker-compose build --pull' 18 | } 19 | } 20 | 21 | stage('build_windows') { 22 | when { 23 | branch 'masterx' 24 | } 25 | steps { 26 | script { 27 | sh('basename $PWD > DIRNAME.txt') 28 | env.BUILDDIRNAME = 'C:\\build\\' + readFile('DIRNAME.txt').trim() 29 | } 30 | 31 | sh 'ssh 127.0.0.1 -l vagrant -p 2222 "cd $BUILDDIRNAME && C:\\build_vs.bat -t local -B Release -s C:\\ASNeG -i $BUILDDIRNAME\\ASNeG -vs \\"Visual Studio 15 2017 Win64\\" -j 2"' 32 | } 33 | } 34 | } 35 | } 36 | 37 | stage('test_linux') { 38 | steps { 39 | timeout(time: 5, unit: "MINUTES") { 40 | sh 'docker-compose run test_client bash -c "cd /code/ftest/ && sh environment.sh && nosetests -s -v --with-xunit"' 41 | } 42 | 43 | junit(testResults: 'ftest/nosetests.xml') 44 | } 45 | 46 | post { 47 | always { 48 | sh 'docker-compose run test_client bash -c "find /code/ | grep __pycache__ | xargs rm -rf"' 49 | } 50 | } 51 | 52 | } 53 | } 54 | 55 | post { 56 | fixed { 57 | slackSend(color:'#BDFFC3', message:"Build Fixed - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)") 58 | } 59 | 60 | failure { 61 | slackSend(color:'#FF9FA1', message:"Build Failed - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)") 62 | } 63 | 64 | always { 65 | sh 'docker ps -a' 66 | 67 | sh 'docker cp $(docker ps -a -q -f "name=asneg-demo${BUILD_TAG}"):/var/log/OpcUaStack/ASNeG-Demo/OpcUaServer.log ASNeG-Demo.log || true' 68 | archiveArtifacts artifacts: 'ASNeG-Demo.log', fingerprint: true 69 | 70 | sh 'docker cp $(docker ps -a -q -f "name=webserver${BUILD_TAG}"):/var/log/OpcUaStack/OpcUaWebServer/OpcUaServer.log webserver.log || true' 71 | archiveArtifacts artifacts: 'webserver.log', fingerprint: true 72 | } 73 | 74 | cleanup { 75 | sh 'docker-compose down --volumes --rmi local --remove-orphans' 76 | deleteDir() 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | OpcUaStack 2 | Copyright 2015 Kai Huebl 3 | 4 | This product includes software developed by 5 | Kai Huebl (http://www.asneg.de/). 6 | -------------------------------------------------------------------------------- /doc/doxygen/.gitignore: -------------------------------------------------------------------------------- 1 | html 2 | -------------------------------------------------------------------------------- /doc/doxygen/doxygen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | doxygen Doxyfile 4 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | asneg-demo: 4 | container_name: asneg-demo${BUILD_TAG} 5 | hostname: asneg-demo 6 | image: asneg/asneg-demo:release-4 7 | expose: 8 | - "8889" 9 | volumes: 10 | - demo_server_pki:/etc/OpcUaStack/ASNeG-Demo/pki 11 | 12 | webserver: 13 | container_name: webserver${BUILD_TAG} 14 | hostname: webserver 15 | depends_on: 16 | - asneg-demo 17 | environment: 18 | - SERVER_PKI_ROOT_DIR=/tmp/ 19 | - SSH_AUTH_SOCK=/ssh-agent 20 | build: . 21 | volumes: 22 | - web_server_pki:/etc/OpcUaStack/OpcUaWebServer/pki 23 | - .:/code 24 | command: >- 25 | bash -c "sed -i 's/127.0.0.1:8889/asneg-demo:8889/' /etc/OpcUaStack/OpcUaWebServer/OpcUaClient0.xml 26 | && sed -i 's/127.0.0.1:8889/asneg-demo:8889/' /etc/OpcUaStack/OpcUaWebServer/OpcUaClient1.xml 27 | && sed -i 's/127.0.0.1:8889/asneg-demo:8889/' /etc/OpcUaStack/OpcUaWebServer/OpcUaClientTest.xml 28 | && OpcUaServer4 /etc/OpcUaStack/OpcUaWebServer/OpcUaServer.xml" 29 | 30 | test_client: 31 | container_name: test_client${BUILD_TAG} 32 | build: . 33 | depends_on: 34 | - asneg-demo 35 | - webserver 36 | environment: 37 | - SERVER_PKI_ROOT_DIR=/tmp/ 38 | - WSS_GATEWAY_URL=wss://webserver:8082 39 | - WS_GATEWAY_URL=ws://webserver:8082 40 | - WSS_SERVER_URL=wss://webserver:8081 41 | - WS_SERVER_URL=ws://webserver:8081 42 | - OPC_SERVER_URL=opc.tcp://asneg-demo:8889 43 | - DOCKER_ENABLE=YES 44 | command: echo "Test client is ready" 45 | volumes: 46 | - web_server_pki:/tmp/etc/OpcUaStack/OpcUaWebServer/pki 47 | - demo_server_pki:/tmp/etc/OpcUaStack/ASNeG-Demo/pki 48 | - .:/code 49 | 50 | volumes: 51 | demo_server_pki: 52 | web_server_pki: 53 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = source 8 | BUILDDIR = build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 20 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/source/1_getting_started/_index.rst: -------------------------------------------------------------------------------- 1 | Getting Started 2 | ==================== 3 | 4 | .. toctree:: 5 | 6 | overview 7 | installation 8 | hello_world 9 | -------------------------------------------------------------------------------- /docs/source/1_getting_started/hello_world.rst: -------------------------------------------------------------------------------- 1 | Hello World 2 | ==================== 3 | 4 | -------------------------------------------------------------------------------- /docs/source/1_getting_started/opc_ua_web_server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/docs/source/1_getting_started/opc_ua_web_server.png -------------------------------------------------------------------------------- /docs/source/2_configuration/_index.rst: -------------------------------------------------------------------------------- 1 | Configuration 2 | ============= 3 | 4 | ASNeG OPC UA Web Server has a flexible configuration in XML format. In this document, you'll 5 | learn how to configure HTTP and WebSocket servers and describe data sources. 6 | 7 | The main configuration file is **OpcUaWebServerModel.xml**. You can find it in the sources: 8 | 9 | :: 10 | 11 | src/OpcUaWebServer/Config/OpcUaWebServerModel.xml 12 | 13 | or in the directory where the server was installed (**@CONF_DIR**) 14 | 15 | :: 16 | 17 | path/to/directory/etc/OpcUaStack/OpcUaWebServer/OpcUaWebServerModel.xml 18 | 19 | 20 | You can change the configuration in the sources if you want to distribute OpcUaWebServer with your configuration. 21 | 22 | 23 | .. toctree:: 24 | :maxdepth: 1 25 | 26 | http_server 27 | websocket_server 28 | websocket_gateway 29 | 30 | -------------------------------------------------------------------------------- /docs/source/3_websocket_server/_index.rst: -------------------------------------------------------------------------------- 1 | .. _websocket_server: 2 | 3 | WebSocket Server JSON API 4 | ========================= 5 | 6 | With **OpcUaWebServer** you can use a simple JSON API to access to OPC UA data via 7 | Internet. 8 | 9 | .. toctree:: 10 | 11 | message_format.rst 12 | value_list.rst 13 | value_info.rst 14 | read.rst 15 | historical_read.rst 16 | write.rst 17 | monitor.rst 18 | notation.rst 19 | -------------------------------------------------------------------------------- /docs/source/3_websocket_server/notation.rst: -------------------------------------------------------------------------------- 1 | .. _notation: 2 | 3 | Notation 4 | ======== 5 | 6 | In this documentation we use the following notation to describe the JSON data: 7 | 8 | +------------------------------+----------------------------------------------------+ 9 | | Notation | Description | 10 | +==============================+====================================================+ 11 | | FieldName | The required scalar field in JSON | 12 | | | with name *FieldName* | 13 | +------------------------------+----------------------------------------------------+ 14 | | [OptionalFieldName] | The optional scalar field in JSON | 15 | | | with name *OptionalFieldName* | 16 | +------------------------------+----------------------------------------------------+ 17 | | @ArrayField | The array in JSON | 18 | | | with name *ArrayField* | 19 | +------------------------------+----------------------------------------------------+ 20 | 21 | -------------------------------------------------------------------------------- /docs/source/4_websocket_gateway/_index.rst: -------------------------------------------------------------------------------- 1 | .. _websocket_gateway: 2 | 3 | WebSocket Gateway 4 | ==================== 5 | 6 | .. toctree:: 7 | 8 | overview 9 | -------------------------------------------------------------------------------- /docs/source/5_certificates/_index.rst: -------------------------------------------------------------------------------- 1 | Certificates 2 | ==================== 3 | 4 | .. toctree:: 5 | 6 | use_ssl_connection 7 | create_certificate 8 | -------------------------------------------------------------------------------- /docs/source/5_certificates/create_certificate.rst: -------------------------------------------------------------------------------- 1 | Create Certificate 2 | ==================== 3 | 4 | The tool openssl can be used to generate a valid certificate. The following section shows 5 | an example of how a certificate can be created on Ubuntu. 6 | 7 | The first step is to create a new private key/pair. The following command line is used for 8 | this. 9 | 10 | :: 11 | 12 | $ openssl genrsa 2048 > privatekey.pem 13 | 14 | The generated key is now in the filei privatkey.pem. 15 | 16 | The next step is to create a csr file. A CSR file is a file that you can send to a certificate 17 | authority to receive a digital server certificate. 18 | 19 | :: 20 | 21 | $ openssl req -new -key privatekey.pem -out csr.pem \ 22 | -subj /C=DE/ST=Hessen/L=Neukirchen/O=ASNeG/OU=OPC\ UA\ Service\ Department/CN=ASNeG.de 23 | 24 | You can pass the signing request on to a third party for signing or sign it yourself for 25 | development and testing. 26 | 27 | We are now signing the certificate ourselves. 28 | 29 | :: 30 | 31 | $ openssl x509 -req -days 365 -in csr.pem -signkey privatekey.pem -out public.crt 32 | 33 | The certificates created must still be entered in the configuration file. 34 | -------------------------------------------------------------------------------- /docs/source/5_certificates/use_ssl_connection.rst: -------------------------------------------------------------------------------- 1 | Use SSL connection 2 | =================== 3 | 4 | In addition to the OPC UA protocol, the OpcUaWebServer uses the http protocol and the ws 5 | protocol for communication. The https protocol and the wss protocol can also be used for 6 | secure communication. In this case, the user must provide a private key and a certificate 7 | for the OpcUaWebServer. 8 | 9 | The certificate can be signed by yourself or authorized by a CA (Certificate Authority). 10 | If a selg-signed certificate is used, a exeption must be created by the user for the 11 | browser when it is accessed. 12 | 13 | To do this, type the following into the browser and create an exception. 14 | 15 | :: 16 | 17 | https://:8080 18 | 19 | :: 20 | 21 | https://:8081 22 | 23 | :: 24 | 25 | https://:8082 26 | -------------------------------------------------------------------------------- /docs/source/_templates/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "!layout.html" %} 2 | 3 | {%- block extrahead %} 4 | 5 | 6 | {% endblock %} 7 | 8 | {% block rootrellink %} 9 |
  • Project Homepage »
  • 10 | {{ super() }} 11 | {% endblock %} 12 | 13 | {% block footer %} 14 |
    15 | 18 | {{ super() }} 19 | {% endblock footer %} 20 | -------------------------------------------------------------------------------- /docs/source/glossary.rst: -------------------------------------------------------------------------------- 1 | .. _glossary: 2 | 3 | Glossary 4 | =============== 5 | 6 | .. glossary:: 7 | Address Space 8 | collection of information that an OPC UA Server makes visible to its Clients 9 | 10 | Endpoint 11 | physical address available on a network that allows Clients to access one 12 | or more :term:`Service`\ s provided by a Server 13 | 14 | JSON 15 | JavaScript Object Notationan is open-standard file format that uses human-readable text to 16 | transmit data objects consisting of attribute–value pairs and array data types 17 | 18 | JSON API 19 | Application Programming Interface, which uses :term:`JSON` as a data format vie HTTP, 20 | WebSocket and other transport protocols 21 | 22 | Node 23 | fundamental component of an :term:`Address Space` 24 | 25 | OPC UA 26 | machine to machine communication protocol for industrial automation developed by 27 | the OPC Foundation 28 | 29 | Service 30 | client-callable operation in an OPC UA Server 31 | 32 | Variable 33 | :term:`Node` that contains a value 34 | 35 | WebSocket 36 | computer communications protocol, providing full-duplex communication channels 37 | over a single TCP connection. 38 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | .. _contents: 2 | 3 | ASNeG OPC UA Web Server Documentation 4 | ============================================ 5 | 6 | ASNeG OPC UA Web Server is an open source OPC UA web server. It provides a simple way 7 | to connect modern Web applications with the OPC UA technology. Any process data can be 8 | displayed in realtime in Web applications using the ASNeG OPC UA Web Server. 9 | 10 | Contents 11 | -------- 12 | 13 | .. toctree:: 14 | :maxdepth: 2 15 | 16 | 1_getting_started/_index 17 | 2_configuration/_index 18 | 3_websocket_server/_index 19 | 4_websocket_gateway/_index 20 | 5_certificates/_index 21 | 22 | Development Status 23 | ---------------------------------------------- 24 | 25 | ASNeG OPC UA Web Server is in the development stage. Moreover it dependents on OpcUaStack 4, which 26 | is also being developed and not released. 27 | 28 | 29 | Contribution 30 | ------------ 31 | 32 | Our goal is to let people use OPC UA technology easily and for free. As an open source project 33 | we can't reach the goal without a strong community. So we will appreciate any help 34 | to the project. 35 | 36 | If you feel eager to help the project, take a look at `Contributing to ASNeG `_ 37 | and join us `on Slack `_ 38 | 39 | 40 | Indices and tables 41 | ------------------- 42 | 43 | .. only:: builder_html 44 | 45 | * :ref:`search` 46 | * :ref:`glossary` 47 | 48 | .. only:: not builder_html 49 | 50 | * :ref:`glossary` 51 | -------------------------------------------------------------------------------- /docs/source/resources/opc_ua_web_server.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/docs/source/resources/opc_ua_web_server.odp -------------------------------------------------------------------------------- /ftest/.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.der 3 | *.pem 4 | -------------------------------------------------------------------------------- /ftest/README: -------------------------------------------------------------------------------- 1 | 2 | The nosetests tool is required to run the test scripts. The document provides 3 | an overview of the installation of nosetests. 4 | 5 | (Install all: pip install -r ./requirements.txt) 6 | 7 | 8 | 1. Install Python 3 9 | =================== 10 | 11 | $ sudo apt install python3-pip 12 | $ sudo apt install python-pip 13 | 14 | 15 | 2. Install websockets and opcua 16 | =============================== 17 | 18 | $ sudo pip install websocket 19 | $ sudo pip install websocket-client 20 | $ sudo pip install opcua 21 | 22 | 23 | 3. Install nosetests 24 | ==================== 25 | 26 | $ sudo pip install distribute 27 | $ sudo pip install nose 28 | $ sudo pip install virtualenv 29 | 30 | 31 | 4. Execute tests 32 | ================ 33 | 34 | Change to directory /ftest an run test script 35 | 36 | $ sh test.sh 37 | 38 | -------------------------------------------------------------------------------- /ftest/WebGateway/.gitignore: -------------------------------------------------------------------------------- 1 | Python/__pycache__ 2 | *.der 3 | *.pem 4 | -------------------------------------------------------------------------------- /ftest/WebGateway/AttributeService/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | -------------------------------------------------------------------------------- /ftest/WebGateway/AttributeService/test_history_read_attribute.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..web_gateway_testcase import WebGatewayTestCase 4 | 5 | 6 | class TestHistoryReadAttribute(WebGatewayTestCase): 7 | 8 | def setUp(self): 9 | WebGatewayTestCase.setUp(self) 10 | 11 | def tearDown(self): 12 | WebGatewayTestCase.tearDown(self) 13 | 14 | def test_history_read(self): 15 | # 16 | # send history read request to the opc ua server 17 | # 18 | req = { 19 | "Header": { 20 | "MessageType": "GW_HistoryReadRequest", 21 | "ClientHandle": "client-handle", 22 | "SessionId": self.sessionId 23 | }, 24 | 25 | "Body": { 26 | "HistoryReadDetails": { 27 | "TypeId": {"Id": "15263"}, 28 | "Body": { 29 | "IsReadModified": "False", 30 | "StartTime": "2019-05-04T14:33:04Z", 31 | "EndTime": "2050-05-04T14:33:04Z", 32 | "NumValuesPerNode": "0", 33 | "ReturnBounds": "True" 34 | } 35 | }, 36 | "NodesToRead": [ 37 | { 38 | "NodeId": { 39 | "Namespace": "12", 40 | "IdType": "1", 41 | "Id": "DoubleValue" 42 | } 43 | 44 | } 45 | ] 46 | } 47 | 48 | } 49 | print("SEND: ", json.dumps(req, indent=4)) 50 | self.ws.send(json.dumps(req)) 51 | 52 | # 53 | # receive history read attribute response from the opc ua server 54 | # 55 | str = self.ws.recv() 56 | print("RECV: ", str) 57 | res = json.loads(str) 58 | self.assertEqual(res['Header']['MessageType'], "GW_HistoryReadResponse") 59 | self.assertEqual(res['Header']['ClientHandle'], "client-handle") 60 | self.assertEqual(res['Header']['SessionId'], self.sessionId) 61 | self.assertEqual(res['Header']['StatusCode'], "0") 62 | self.assertEqual(len(res['Body']['Results']), 1) 63 | self.assertEqual(len(res['Body']['Results'][0]['HistoryData']['Body']['DataValues']), 10) 64 | self.assertEqual(res['Body']['Results'][0]['StatusCode'], "0") 65 | -------------------------------------------------------------------------------- /ftest/WebGateway/AttributeService/test_write_attribute.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..web_gateway_testcase import WebGatewayTestCase 4 | 5 | 6 | class TestWrite(WebGatewayTestCase): 7 | 8 | def setUp(self): 9 | WebGatewayTestCase.setUp(self) 10 | 11 | def tearDown(self): 12 | WebGatewayTestCase.tearDown(self) 13 | 14 | def test_write(self): 15 | # 16 | # send write request to the opc ua server 17 | # 18 | req = { 19 | "Header": { 20 | "MessageType": "GW_WriteRequest", 21 | "ClientHandle": "client-handle", 22 | "SessionId": self.sessionId 23 | }, 24 | "Body": { 25 | "NodesToWrite": [ 26 | { 27 | "NodeId": { 28 | "Namespace": "3", 29 | "Id": "218" 30 | }, 31 | "Value": { 32 | "Value": { 33 | "Type": "11", 34 | "Body": "80" 35 | } 36 | } 37 | }, 38 | { 39 | "NodeId": { 40 | "Namespace": "3", 41 | "Id": "219" 42 | }, 43 | "Value": { 44 | "Value": { 45 | "Type": "11", 46 | "Body": [ 47 | "2.10921e+06", 48 | "2.10921e+06", 49 | "2.10922e+06" 50 | ] 51 | } 52 | } 53 | } 54 | ] 55 | } 56 | 57 | } 58 | 59 | print("SEND: ", json.dumps(req, indent = 4)) 60 | self.ws.send(json.dumps(req)) 61 | 62 | 63 | # 64 | # receive write response from the opc ua server 65 | # 66 | str = self.ws. recv() 67 | print("RECV: ", str) 68 | res = json.loads(str) 69 | self.assertEqual(res['Header']['MessageType'], "GW_WriteResponse") 70 | self.assertEqual(res['Header']['ClientHandle'], "client-handle") 71 | self.assertEqual(res['Header']['SessionId'], self.sessionId) 72 | self.assertEqual(res['Header']['StatusCode'], "0") 73 | self.assertEqual(len(res['Body']['Results']), 2) 74 | self.assertEqual(res['Body']['Results'][0], "0") 75 | self.assertEqual(res['Body']['Results'][1], "0") 76 | -------------------------------------------------------------------------------- /ftest/WebGateway/Connection/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebGateway/Connection/__init__.py -------------------------------------------------------------------------------- /ftest/WebGateway/Connection/test_ping.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..web_gateway_testcase import WebGatewayTestCase 4 | 5 | 6 | class TestPing(WebGatewayTestCase): 7 | 8 | def setUp(self): 9 | WebGatewayTestCase.setUp(self) 10 | 11 | def tearDown(self): 12 | WebGatewayTestCase.tearDown(self) 13 | 14 | def test_ping(self): 15 | self.ws.ping("xx") 16 | 17 | [opcode, str] = self.ws.recv_data(True) 18 | print("RECV: ", opcode, " ", str) 19 | self.assertEqual(opcode, 10) 20 | 21 | 22 | -------------------------------------------------------------------------------- /ftest/WebGateway/MethodService/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebGateway/MethodService/__init__.py -------------------------------------------------------------------------------- /ftest/WebGateway/MonitoredItemService/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebGateway/MonitoredItemService/__init__.py -------------------------------------------------------------------------------- /ftest/WebGateway/Python/Sync.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bion/python 2 | import sys, time 3 | import threading 4 | 5 | import OpcUaClient as UAC 6 | 7 | class SyncCall: 8 | 9 | 10 | def __init__(self, client): 11 | self.client = client 12 | self.res = [False] 13 | 14 | def call(self, objectNodeId, funcNodeId, *args): 15 | newArgs = [objectNodeId, funcNodeId] 16 | newArgs.extend(args) 17 | self.thread = threading.Thread(target=self.runCall, args=(newArgs)) 18 | self.thread.start() 19 | 20 | def runCall(self, objectNodeId, funcNodeId, *args): 21 | self.res = self.client.callSync(objectNodeId, funcNodeId, *args) 22 | 23 | def wait(self, timeout=None): 24 | self.thread.join(timeout) 25 | -------------------------------------------------------------------------------- /ftest/WebGateway/SessionService/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebGateway/SessionService/__init__.py -------------------------------------------------------------------------------- /ftest/WebGateway/SessionService/test_open_session_adn_close_channel.py: -------------------------------------------------------------------------------- 1 | from ..web_gateway_testcase import WebGatewayTestCase 2 | 3 | 4 | class TestSessionCloseChannel(WebGatewayTestCase): 5 | 6 | def setUp(self): 7 | WebGatewayTestCase.setUp(self) 8 | 9 | def tearDown(self): 10 | pass 11 | 12 | def test_broken_channel(self): 13 | self.ws.close() -------------------------------------------------------------------------------- /ftest/WebGateway/SubscriptionService/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebGateway/SubscriptionService/__init__.py -------------------------------------------------------------------------------- /ftest/WebGateway/ViewService/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | -------------------------------------------------------------------------------- /ftest/WebGateway/ViewService/test_browse.py: -------------------------------------------------------------------------------- 1 | import json 2 | from opcua import Client 3 | from opcua import ua 4 | 5 | from ..web_gateway_testcase import WebGatewayTestCase 6 | 7 | 8 | class TestBrowse(WebGatewayTestCase): 9 | 10 | def setUp(self): 11 | WebGatewayTestCase.setUp(self) 12 | 13 | self.opcua_client = Client(self.OPC_SERVER_URL) 14 | self.opcua_client.connect() 15 | 16 | def tearDown(self): 17 | 18 | self.opcua_client.disconnect() 19 | 20 | WebGatewayTestCase.tearDown(self) 21 | 22 | def test_browse_request(self): 23 | # 24 | # send browse request to the opc ua server 25 | # 26 | req = { 27 | "Header": { 28 | "MessageType": "GW_BrowseRequest", 29 | "ClientHandle": "client-handle", 30 | "SessionId": self.sessionId 31 | }, 32 | "Body": { 33 | "RequestedMaxReferencesPerNode" : "100", 34 | "NodesToBrowse": [ 35 | { 36 | "NodeId": { 37 | "Namespace" : "0", 38 | "Id": "85" 39 | }, 40 | "ReferenceTypeId" : { 41 | "Namespace" : "0", 42 | "Id" : "33" 43 | }, 44 | "BrowseDirection" : "0", 45 | "IncludeSubtypes" : "TRUE", 46 | "NodeClassMask" : "16", 47 | "ResultMask" : "63" 48 | } 49 | ] 50 | } 51 | 52 | } 53 | 54 | print("SEND: ", json.dumps(req, indent = 4)) 55 | self.ws.send(json.dumps(req)) 56 | 57 | 58 | # 59 | # receive browse response from the opc ua server 60 | # 61 | str = self.ws.recv() 62 | print("RECV: ", str) 63 | res = json.loads(str) 64 | self.assertEqual(res['Header']['MessageType'], "GW_BrowseResponse") 65 | self.assertEqual(res['Header']['ClientHandle'], "client-handle") 66 | self.assertEqual(res['Header']['SessionId'], self.sessionId) 67 | self.assertEqual(res['Header']['StatusCode'], "0") 68 | #self.assertEqual(len(res['Body']['Results']), 2) 69 | #self.assertIsNotNone(res['Body']['Results'][0]['Value']) 70 | #self.assertIsNotNone(res['Body']['Results'][1]['Value']) 71 | #self.assertEqual('555', res['Body']['Results'][0]['Value']['Body']) 72 | #self.assertEqual('true', res['Body']['Results'][1]['Value']['Body']) 73 | -------------------------------------------------------------------------------- /ftest/WebGateway/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebGateway/__init__.py -------------------------------------------------------------------------------- /ftest/WebGateway/test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin 2 | 3 | nosetests -s -v 4 | -------------------------------------------------------------------------------- /ftest/WebServer/Common/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebServer/Common/__init__.py -------------------------------------------------------------------------------- /ftest/WebServer/Common/test_header.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..web_server_testcase import WebServerTestCase 4 | 5 | 6 | class TestCommonCommunication(WebServerTestCase): 7 | 8 | def setUp(self): 9 | WebServerTestCase.setUp(self) 10 | 11 | def tearDown(self): 12 | WebServerTestCase.tearDown(self) 13 | 14 | def test_client_handle(self): 15 | req = { 16 | 'Header': { 17 | 'MessageType': 'VALUELIST_REQUEST', 18 | 'ClientHandle': 'yyyxxxqqq' 19 | }, 20 | 'Body': {} 21 | } 22 | 23 | print("SEND: ", json.dumps(req, indent = 4)) 24 | self.ws.send(json.dumps(req)) 25 | 26 | str = self.ws. recv() 27 | print("RECV: ", str) 28 | res = json.loads(str) 29 | self.assertEqual(req['Header']['ClientHandle'], res['Header']['ClientHandle']) 30 | 31 | def test_wrong_message_type(self): 32 | req = { 33 | 'Header': { 34 | 'MessageType': 'WRONG_REQUEST', 35 | 'ClientHandle': '1' 36 | }, 37 | 'Body': {} 38 | } 39 | 40 | print("SEND: ", json.dumps(req, indent = 4)) 41 | self.ws.send(json.dumps(req)) 42 | 43 | str = self.ws. recv() 44 | print("RECV: ", str) 45 | res = json.loads(str) 46 | 47 | self.assertEqual('ERROR', res['Header']['MessageType']) 48 | self.assertEqual('BadRequestHeaderInvalid', res['Header']['StatusCode']) 49 | -------------------------------------------------------------------------------- /ftest/WebServer/Functions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebServer/Functions/__init__.py -------------------------------------------------------------------------------- /ftest/WebServer/Functions/test_history_read.py: -------------------------------------------------------------------------------- 1 | import json 2 | from opcua import Client 3 | from opcua import ua 4 | 5 | from ..web_server_testcase import WebServerTestCase 6 | 7 | 8 | class TestHistoricalRead(WebServerTestCase): 9 | 10 | def setUp(self): 11 | WebServerTestCase.setUp(self) 12 | 13 | def tearDown(self): 14 | WebServerTestCase.tearDown(self) 15 | 16 | def test_wrong_format(self): 17 | msg = { 18 | 'Header': { 19 | 'MessageType': 'HISTORICALREAD_REQUEST', 20 | 'ClientHandle': '1' 21 | }, 22 | 'Body': { 23 | 'WRONG_FIELD': 'WRONG_VALUE' 24 | } 25 | } 26 | 27 | self.ws.send(json.dumps(msg)) 28 | resp = json.loads(self.ws.recv()) 29 | 30 | self.assertEqual('HISTORICALREAD_RESPONSE', resp['Header']['MessageType']) 31 | self.assertEqual('BadAttributeIdInvalid', resp['Header']['StatusCode']) 32 | 33 | def test_variable_not_found(self): 34 | msg = { 35 | 'Header': { 36 | 'MessageType': 'HISTORICALREAD_REQUEST', 37 | 'ClientHandle': '1' 38 | }, 39 | 'Body': { 40 | 'Variable': 'NOT_EXIST', 41 | 'StartTime': '20020131T225959', 42 | 'EndTime': '20020131T235959' 43 | } 44 | } 45 | 46 | self.ws.send(json.dumps(msg)) 47 | resp = json.loads(self.ws.recv()) 48 | 49 | print(resp) 50 | self.assertEqual('HISTORICALREAD_RESPONSE', resp['Header']['MessageType']) 51 | self.assertEqual('BadNodeIdUnknown', resp['Body']['StatusCode']) 52 | 53 | def test_read_variable_wo_history(self): 54 | """TODO: Not implemented yet""" 55 | 56 | def test_read(self): 57 | """TODO: Not implemented yet""" 58 | 59 | def read_(self, variable): 60 | msg = { 61 | 'Header': { 62 | 'MessageType': 'HISTORICALREAD_REQUEST', 63 | 'ClientHandle': '1' 64 | }, 65 | 'Body': { 66 | 'Variable': variable, 67 | 'StartTime': '20020131T225959', 68 | 'EndTime': '20020131T235959' 69 | } 70 | } 71 | 72 | print(msg) 73 | 74 | self.ws.send(json.dumps(msg)) 75 | return json.loads(self.ws.recv()) 76 | -------------------------------------------------------------------------------- /ftest/WebServer/Functions/test_value_list.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from ..web_server_testcase import WebServerTestCase 4 | 5 | 6 | class TestValueList(WebServerTestCase): 7 | 8 | def setUp(self): 9 | WebServerTestCase.setUp(self) 10 | 11 | def tearDown(self): 12 | WebServerTestCase.tearDown(self) 13 | 14 | def test_value_list(self): 15 | msg = { 16 | 'Header': { 17 | 'MessageType': 'VALUELIST_REQUEST', 18 | 'ClientHandle': '1' 19 | }, 20 | 'Body': {} 21 | } 22 | 23 | self.ws.send(json.dumps(msg)) 24 | resp = json.loads(self.ws.recv()) 25 | 26 | self.assertEqual('VALUELIST_RESPONSE', resp['Header']['MessageType']) 27 | self.assertEqual(112, len(resp['Body']['Variables'])) 28 | self.assertIn('Boolean', resp['Body']['Variables']) 29 | self.assertIn('Int64', resp['Body']['Variables']) 30 | self.assertIn('LocalizedText', resp['Body']['Variables']) 31 | -------------------------------------------------------------------------------- /ftest/WebServer/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/ftest/WebServer/__init__.py -------------------------------------------------------------------------------- /ftest/WebServer/test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin 2 | 3 | nosetests -s -v $@ 4 | -------------------------------------------------------------------------------- /ftest/WebServer/web_server_testcase.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | import json 4 | import time 5 | import ssl 6 | from websocket import create_connection 7 | 8 | 9 | class WebServerTestCase(unittest.TestCase): 10 | 11 | def setUp(self): 12 | self.WSS_SERVER_URL = os.getenv('WSS_SERVER_URL', "wss://127.0.0.1:8081") 13 | self.WS_SERVER_URL = os.getenv('WS_SERVER_URL', "ws://127.0.0.1:8081") 14 | self.OPC_SERVER_URL = os.getenv('OPC_SERVER_URL', "opc.tcp://127.0.0.1:8889") 15 | self.SERVER_PKI_ROOT_DIR = os.path.join(os.getenv('SERVER_PKI_ROOT_DIR', '/tmp/'), 16 | 'etc/OpcUaStack/ASNeG-Demo/pki') 17 | 18 | # TODO: Here the certs of client and server should be exchanged 19 | 20 | # 21 | # open web socket connection 22 | # 23 | if self.WSS_SERVER_URL: 24 | self.ws = create_connection( 25 | self.WSS_SERVER_URL, 26 | sslopt={ 27 | "cert_reqs" : ssl.CERT_NONE, 28 | "check_hostname" : False, 29 | "ssl_version" : ssl.PROTOCOL_TLSv1 30 | } 31 | ) 32 | else: 33 | self.ws = create_connection(self.WS_SERVER_URL) 34 | 35 | 36 | def tearDown(self): 37 | # 38 | # close web socket connection 39 | # 40 | self.ws.close() 41 | -------------------------------------------------------------------------------- /ftest/environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DOCKER_ENABLE="${DOCKER_ENABLE:=NO}" 4 | if [ "${DOCKER_ENABLE}" = "YES" ] 5 | then 6 | # 7 | # We are running in a docker container 8 | # 9 | echo "DOCKER ENABLE" 10 | echo "=============" 11 | export OPC_UA_PKI_DIR=ASNeG-Demo:/tmp/etc/OpcUaStack/ASNeG-Demo/pki:OpcUaWebServer:/tmp/etc/OpcUaStack/OpcUaWebServer/pki 12 | else 13 | # 14 | # We are running on a local system 15 | # 16 | echo "DOCKER DISABLE" 17 | echo "==============" 18 | fi 19 | 20 | # 21 | # trust ASNeG-Demo certificate 22 | # 23 | echo "" 24 | echo "OpcUaWebServer: trust ASNeG-Demo certificate" 25 | echo "============================================" 26 | echo "OpcUaCtrl4 appl_cert get ASNeG-Demo demo_server_cert.der demo_server_key.pem" 27 | OpcUaCtrl4 appl_cert get ASNeG-Demo demo_server_cert.der demo_server_key.pem 28 | echo "OpcUaCtrl4 cert del OpcUaWebServer all" 29 | OpcUaCtrl4 cert del OpcUaWebServer all 30 | echo "OpcUaCtrl4 cert add OpcUaWebServer demo_server_cert.der" 31 | OpcUaCtrl4 cert add OpcUaWebServer demo_server_cert.der 32 | 33 | # 34 | # trust OpcUaWebServer certificate 35 | # 36 | echo "" 37 | echo "ASNeG-Demo: trust OpcUaWebServer certificate" 38 | echo "============================================" 39 | echo "OpcUaCtrl4 appl_cert get OpcUaWebServer web_server_cert.der web_server_key.pem" 40 | OpcUaCtrl4 appl_cert get OpcUaWebServer web_server_cert.der web_server_key.pem 41 | echo "OpcUaCtrl4 cert del ASNeG-Demo all" 42 | OpcUaCtrl4 cert del ASNeG-Demo all 43 | echo "OpcUaCtrl4 cert add ASNeG-Demo web_server_cert.der" 44 | OpcUaCtrl4 cert add ASNeG-Demo web_server_cert.der 45 | 46 | # 47 | # show application info 48 | # 49 | echo "" 50 | echo "show application info" 51 | echo "=====================" 52 | 53 | echo "OpcUaCtrl4 appl show" 54 | OpcUaCtrl4 appl show 55 | 56 | echo "OpcUaCtrl4 appl_cert show ASNeG-Demo" 57 | OpcUaCtrl4 appl_cert show ASNeG-Demo 58 | echo "OpcUaCtrl4 cert show ASNeG-Demo" 59 | OpcUaCtrl4 cert show ASNeG-Demo 60 | echo "OpcUaCtrl4 appl_cert show OpcUaWebServer" 61 | OpcUaCtrl4 appl_cert show OpcUaWebServer 62 | echo "OpcUaCtrl4 cert show OpcUaWebServer" 63 | OpcUaCtrl4 cert show OpcUaWebServer 64 | 65 | if [ "${DOCKER_ENABLE}" = "YES" ] 66 | then 67 | find /tmp -name \* 68 | fi 69 | -------------------------------------------------------------------------------- /ftest/requirements.txt: -------------------------------------------------------------------------------- 1 | websocket 2 | websocket-client 3 | nose 4 | opcua 5 | -------------------------------------------------------------------------------- /ftest/test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin 2 | 3 | SCRIPT_PATH=$1 4 | 5 | sh environment.sh 6 | 7 | if [ -z "${SCRIPT_PATH}" ] 8 | then 9 | nosetests -s -v $@ 10 | else 11 | nosetests -s -v ${SCRIPT_PATH} 12 | fi 13 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/Build/BuildConfig.h.in: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2017 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaHistory_BuildConfig__ 19 | #define __OpcUaHistory_BuildConfig__ 20 | 21 | // 22 | // version of Library 23 | // 24 | #define LIBRARY_VERSION_MAJOR "@VERSION_MAJOR@" 25 | #define LIBRARY_VERSION_MINOR "@VERSION_MINOR@" 26 | #define LIBRARY_VERSION_PATCH "@VERSION_PATCH@" 27 | 28 | #define LIBRARY_GIT_COMMIT "@GIT_COMMIT@" 29 | #define LIBRARY_GIT_BRANCH "@GIT_BRANCH@" 30 | 31 | #endif -------------------------------------------------------------------------------- /src/OpcUaWebServer/Config/OpcUaWebServerModel.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 |
    0.0.0.0
    22 | 8080 23 | @CONF_DIR@/../../../var/www/OpcUaWebServer 24 | 100 25 | 5000 26 | 27 | 28 | @CONF_DIR@/../../../var/log/OpcUaStack/OpcUaWebServer/access.log 29 | 5 30 | 100000 31 | 3600000 32 | 33 | 34 | on 35 | @CONF_DIR@/ssl/crt/websocket.crt 36 | @CONF_DIR@/ssl/key/websocket.pem 37 | 38 |
    39 | 40 | 41 |
    0.0.0.0
    42 | 8081 43 | 100 44 | 5000 45 | 3600000 46 | 47 | on 48 | @CONF_DIR@/ssl/crt/websocket.crt 49 | @CONF_DIR@/ssl/key/websocket.pem 50 |
    51 | 52 | 53 | @CONF_DIR@/OpcUaClient0.xml 54 | @CONF_DIR@/OpcUaClient1.xml 55 | @CONF_DIR@/OpcUaClientTest.xml 56 | 57 | 58 | 59 |
    0.0.0.0
    60 | 8082 61 | 100 62 | 0 63 | 64 | on 65 | @CONF_DIR@/ssl/crt/websocket.crt 66 | @CONF_DIR@/ssl/key/websocket.pem 67 | 68 |
    69 | 70 |
    71 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/MessageServer/MessageServer.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MessageManager_h__ 20 | #define __OpcUaWebServer_MessageManager_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/Base/Config.h" 25 | #include "OpcUaWebServer/Messages/Message.h" 26 | #include "OpcUaWebServer/MessageServer/MessageServerIf.h" 27 | 28 | namespace OpcUaWebServer 29 | { 30 | 31 | class MessageServer 32 | { 33 | public: 34 | MessageServer(void); 35 | ~MessageServer(void); 36 | 37 | bool startup(OpcUaStackCore::Config* config, MessageServerIf* messageServerIf); 38 | bool shutdown(void); 39 | void receiveMessage(uint32_t channelId, const std::string& message); 40 | void receiveMessage(Message::SPtr& message); 41 | 42 | private: 43 | bool shutdown_ = false; 44 | OpcUaStackCore::Config* config_; 45 | MessageServerIf* messageServerIf_; 46 | }; 47 | 48 | } 49 | 50 | #endif 51 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/MessageServer/MessageServerIf.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MessageServerIf_h__ 20 | #define __OpcUaWebServer_MessageServerIf_h__ 21 | 22 | #include "OpcUaWebServer/Messages/Message.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class MessageServerIf 28 | { 29 | public: 30 | virtual ~MessageServerIf(void) {} 31 | 32 | virtual void messageServerMessage(Message::SPtr & message) = 0; 33 | virtual void messageServerMessage(uint32_t channelId, const std::string& message) = 0; 34 | }; 35 | 36 | } 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/Messages/Message.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_Message_h__ 20 | #define __OpcUaWebServer_Message_h__ 21 | 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include "OpcUaStackCore/Base/Object.h" 27 | 28 | namespace OpcUaWebServer 29 | { 30 | 31 | class Message 32 | : public OpcUaStackCore::Object 33 | { 34 | public: 35 | typedef boost::shared_ptr SPtr; 36 | 37 | typedef enum 38 | { 39 | MT_Unknown, 40 | MT_Error, 41 | MT_ReadRequest, 42 | MT_ReadResponse, 43 | MT_WriteRequest, 44 | MT_WriteResponse, 45 | MT_ValueListRequest, 46 | MT_ValueListResponse, 47 | MT_ValueInfoRequest, 48 | MT_ValueInfoResponse, 49 | MT_MonitorStartRequest, 50 | MT_MonitorStartResponse, 51 | MT_MonitorStopRequest, 52 | MT_MonitorStopResponse, 53 | MT_MonitorUpdateMessage, 54 | MT_HistorcialReadRequest, 55 | MT_HistoricalReadResponse, 56 | MT_ChannelCloseMessage 57 | 58 | } MessageType; 59 | 60 | static MessageType string2MessageType(const std::string& messageType); 61 | 62 | Message(MessageType messageType); 63 | virtual ~Message(void); 64 | 65 | std::string messageTypeString(void); 66 | MessageType messageType(void); 67 | void channelId(uint32_t channelId); 68 | uint32_t channelId(void); 69 | void clientHandle(const std::string& clientHandle); 70 | std::string& clientHandle(void); 71 | void statusCode(const std::string& statusCode); 72 | std::string& statusCode(void); 73 | void body(boost::property_tree::ptree& body); 74 | boost::property_tree::ptree& body(void); 75 | 76 | 77 | protected: 78 | MessageType messageType_; 79 | uint32_t channelId_; 80 | std::string clientHandle_; 81 | std::string statusCode_; 82 | 83 | boost::property_tree::ptree body_; 84 | }; 85 | 86 | } 87 | 88 | #endif 89 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/HistoricalReadRequestData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HistoricalReadRequestData_h__ 20 | #define __OpcUaWebServer_HistoricalReadRequestData_h__ 21 | 22 | #include 23 | #include "boost/date_time/posix_time/posix_time.hpp" 24 | #include 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class HistoricalReadRequestData 30 | { 31 | public: 32 | HistoricalReadRequestData(void); 33 | ~HistoricalReadRequestData(void); 34 | 35 | void variable(const std::string& variable); 36 | std::string& variable(void); 37 | void startTime(boost::posix_time::ptime startTime); 38 | boost::posix_time::ptime startTime(void); 39 | void endTime(boost::posix_time::ptime endTime); 40 | boost::posix_time::ptime endTime(void); 41 | 42 | bool decode(boost::property_tree::ptree& pt); 43 | bool encode(boost::property_tree::ptree& pt); 44 | 45 | private: 46 | std::string variable_; 47 | boost::posix_time::ptime startTime_; 48 | boost::posix_time::ptime endTime_; 49 | }; 50 | 51 | } 52 | 53 | #endif 54 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/HistoricalReadResponseData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include 20 | #include "OpcUaStackCore/Base/Log.h" 21 | #include "OpcUaWebServer/OpcUaClient/HistoricalReadResponseData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | HistoricalReadResponseData::HistoricalReadResponseData(void) 29 | : dataValueArray_(boost::make_shared()) 30 | , valueInfoEntry_() 31 | , statusCode_("") 32 | { 33 | } 34 | 35 | void 36 | HistoricalReadResponseData::statusCode(const std::string& statusCode) 37 | { 38 | statusCode_ = statusCode; 39 | } 40 | 41 | std::string& 42 | HistoricalReadResponseData::statusCode(void) 43 | { 44 | return statusCode_; 45 | } 46 | 47 | HistoricalReadResponseData::~HistoricalReadResponseData(void) 48 | { 49 | } 50 | 51 | OpcUaDataValueArray::SPtr& 52 | HistoricalReadResponseData::dataValueArray(void) 53 | { 54 | return dataValueArray_; 55 | } 56 | 57 | void 58 | HistoricalReadResponseData::valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry) 59 | { 60 | valueInfoEntry_ = valueInfoEntry; 61 | } 62 | 63 | ValueInfoEntry::SPtr& 64 | HistoricalReadResponseData::valueInfoEntry(void) 65 | { 66 | return valueInfoEntry_; 67 | } 68 | 69 | bool 70 | HistoricalReadResponseData::jsonEncode(boost::property_tree::ptree& pt) 71 | { 72 | if (statusCode_.length() != 0) { 73 | pt.put("StatusCode", statusCode_); 74 | } 75 | else { 76 | boost::property_tree::ptree array; 77 | if (!dataValueArray_->jsonEncode(array, "")) return false; 78 | pt.add_child("DataValues", array); 79 | } 80 | return true; 81 | } 82 | 83 | bool 84 | HistoricalReadResponseData::jsonDecode(boost::property_tree::ptree& pt) 85 | { 86 | return false; 87 | } 88 | 89 | 90 | } 91 | 92 | 93 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/HistoricalReadResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HistoricalReadResponseData_h__ 20 | #define __OpcUaWebServer_HistoricalReadResponseData_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 25 | #include "OpcUaWebServer/OpcUaClient/ValueInfo.h" 26 | 27 | namespace OpcUaWebServer 28 | { 29 | 30 | class HistoricalReadResponseData 31 | { 32 | public: 33 | HistoricalReadResponseData(void); 34 | ~HistoricalReadResponseData(void); 35 | 36 | void statusCode(const std::string& statusCode); 37 | std::string& statusCode(void); 38 | OpcUaStackCore::OpcUaDataValueArray::SPtr& dataValueArray(void); 39 | void valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry); 40 | ValueInfoEntry::SPtr& valueInfoEntry(void); 41 | 42 | bool jsonEncode(boost::property_tree::ptree& pt); 43 | bool jsonDecode(boost::property_tree::ptree& pt); 44 | 45 | private: 46 | std::string statusCode_; 47 | OpcUaStackCore::OpcUaDataValueArray::SPtr dataValueArray_; 48 | ValueInfoEntry::SPtr valueInfoEntry_; 49 | }; 50 | 51 | } 52 | 53 | #endif 54 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStartRequestData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaWebServer/OpcUaClient/MonitorStartRequestData.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | MonitorStartRequestData::MonitorStartRequestData(void) 28 | : variable_("") 29 | { 30 | } 31 | 32 | MonitorStartRequestData::~MonitorStartRequestData(void) 33 | { 34 | } 35 | 36 | void 37 | MonitorStartRequestData::variable(const std::string& variable) 38 | { 39 | variable_ = variable; 40 | } 41 | 42 | std::string& 43 | MonitorStartRequestData::variable(void) 44 | { 45 | return variable_; 46 | } 47 | 48 | bool 49 | MonitorStartRequestData::decode(boost::property_tree::ptree& pt) 50 | { 51 | boost::optional variable = pt.get_optional("Variable"); 52 | if (!variable) { 53 | Log(Error, "Variable do not exist in monitor start request"); 54 | return false; 55 | } 56 | variable_ = *variable; 57 | return true; 58 | } 59 | 60 | bool 61 | MonitorStartRequestData::encode(boost::property_tree::ptree& pt) 62 | { 63 | return false; 64 | } 65 | 66 | } 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStartRequestData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MonitorStartRequestData_h__ 20 | #define __OpcUaWebServer_MonitorStartRequestData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class MonitorStartRequestData 29 | { 30 | public: 31 | MonitorStartRequestData(void); 32 | ~MonitorStartRequestData(void); 33 | 34 | void variable(const std::string& variable); 35 | std::string& variable(void); 36 | 37 | bool decode(boost::property_tree::ptree& pt); 38 | bool encode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::string variable_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStartResponseData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 21 | #include "OpcUaWebServer/OpcUaClient/MonitorStartResponseData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | MonitorStartResponseData::MonitorStartResponseData(void) 29 | : statusCode_("") 30 | { 31 | } 32 | 33 | MonitorStartResponseData::~MonitorStartResponseData(void) 34 | { 35 | } 36 | 37 | void 38 | MonitorStartResponseData::statusCode(const std::string& statusCode) 39 | { 40 | statusCode_ = statusCode; 41 | } 42 | 43 | std::string& 44 | MonitorStartResponseData::statusCode(void) 45 | { 46 | return statusCode_; 47 | } 48 | 49 | bool 50 | MonitorStartResponseData::jsonEncode(boost::property_tree::ptree& pt) 51 | { 52 | if (statusCode_.length() == 0) return true; 53 | 54 | boost::property_tree::ptree statusCode; 55 | OpcUaString statusCodeString = statusCode_; 56 | if (!statusCodeString.jsonEncode(statusCode)) return false; 57 | pt.add_child("StatusCode", statusCode); 58 | return true; 59 | } 60 | 61 | bool 62 | MonitorStartResponseData::jsonDecode(boost::property_tree::ptree& pt) 63 | { 64 | return false; 65 | } 66 | 67 | } 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStartResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MonitorStartResponseData_h__ 20 | #define __OpcUaWebServer_MonitorStartResponseData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class MonitorStartResponseData 29 | { 30 | public: 31 | MonitorStartResponseData(void); 32 | ~MonitorStartResponseData(void); 33 | 34 | void statusCode(const std::string& statusCode); 35 | std::string& statusCode(void); 36 | 37 | bool jsonDecode(boost::property_tree::ptree& pt); 38 | bool jsonEncode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::string statusCode_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStopRequestData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaWebServer/OpcUaClient/MonitorStopRequestData.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | MonitorStopRequestData::MonitorStopRequestData(void) 28 | : variable_("") 29 | { 30 | } 31 | 32 | MonitorStopRequestData::~MonitorStopRequestData(void) 33 | { 34 | } 35 | 36 | void 37 | MonitorStopRequestData::variable(const std::string& variable) 38 | { 39 | variable_ = variable; 40 | } 41 | 42 | std::string& 43 | MonitorStopRequestData::variable(void) 44 | { 45 | return variable_; 46 | } 47 | 48 | bool 49 | MonitorStopRequestData::decode(boost::property_tree::ptree& pt) 50 | { 51 | boost::optional variable = pt.get_optional("Variable"); 52 | if (!variable) { 53 | Log(Error, "Variable do not exist in monitor start request"); 54 | return false; 55 | } 56 | variable_ = *variable; 57 | return true; 58 | } 59 | 60 | bool 61 | MonitorStopRequestData::encode(boost::property_tree::ptree& pt) 62 | { 63 | return false; 64 | } 65 | 66 | } 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStopRequestData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MonitorStopRequestData_h__ 20 | #define __OpcUaWebServer_MonitorStopRequestData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class MonitorStopRequestData 29 | { 30 | public: 31 | MonitorStopRequestData(void); 32 | ~MonitorStopRequestData(void); 33 | 34 | void variable(const std::string& variable); 35 | std::string& variable(void); 36 | 37 | bool decode(boost::property_tree::ptree& pt); 38 | bool encode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::string variable_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStopResponseData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 21 | #include "OpcUaWebServer/OpcUaClient/MonitorStopResponseData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | MonitorStopResponseData::MonitorStopResponseData(void) 29 | : statusCode_("") 30 | { 31 | } 32 | 33 | MonitorStopResponseData::~MonitorStopResponseData(void) 34 | { 35 | } 36 | 37 | void 38 | MonitorStopResponseData::statusCode(const std::string& statusCode) 39 | { 40 | statusCode_ = statusCode; 41 | } 42 | 43 | std::string& 44 | MonitorStopResponseData::statusCode(void) 45 | { 46 | return statusCode_; 47 | } 48 | 49 | bool 50 | MonitorStopResponseData::jsonEncode(boost::property_tree::ptree& pt) 51 | { 52 | if (statusCode_.length() == 0) return true; 53 | 54 | boost::property_tree::ptree statusCode; 55 | OpcUaString statusCodeString = statusCode_; 56 | if (!statusCodeString.jsonEncode(statusCode)) return false; 57 | pt.add_child("StatusCode", statusCode); 58 | return true; 59 | } 60 | 61 | bool 62 | MonitorStopResponseData::jsonDecode(boost::property_tree::ptree& pt) 63 | { 64 | return false; 65 | } 66 | 67 | } 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorStopResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MonitorStopResponseData_h__ 20 | #define __OpcUaWebServer_MonitorStopResponseData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class MonitorStopResponseData 29 | { 30 | public: 31 | MonitorStopResponseData(void); 32 | ~MonitorStopResponseData(void); 33 | 34 | void statusCode(const std::string& statusCode); 35 | std::string& statusCode(void); 36 | 37 | bool jsonDecode(boost::property_tree::ptree& pt); 38 | bool jsonEncode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::string statusCode_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorUpdateData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaWebServer/OpcUaClient/MonitorUpdateData.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | MonitorUpdateData::MonitorUpdateData(void) 28 | : dataValue_() 29 | , valueInfoEntry_() 30 | { 31 | } 32 | 33 | MonitorUpdateData::~MonitorUpdateData(void) 34 | { 35 | } 36 | 37 | void 38 | MonitorUpdateData::dataValue(OpcUaDataValue::SPtr dataValue) 39 | { 40 | dataValue_ = dataValue; 41 | } 42 | 43 | OpcUaDataValue::SPtr 44 | MonitorUpdateData::dataValue(void) 45 | { 46 | return dataValue_; 47 | } 48 | 49 | void 50 | MonitorUpdateData::valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry) 51 | { 52 | valueInfoEntry_ = valueInfoEntry; 53 | } 54 | 55 | ValueInfoEntry::SPtr& 56 | MonitorUpdateData::valueInfoEntry(void) 57 | { 58 | return valueInfoEntry_; 59 | } 60 | 61 | bool 62 | MonitorUpdateData::jsonDecode(boost::property_tree::ptree& pt) 63 | { 64 | return false; 65 | } 66 | 67 | bool 68 | MonitorUpdateData::jsonEncode(boost::property_tree::ptree& pt) 69 | { 70 | if (!dataValue_->jsonEncode(pt)) return false; 71 | return true; 72 | } 73 | 74 | } 75 | 76 | 77 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/MonitorUpdateData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_MonitorUpdateData_h__ 20 | #define __OpcUaWebServer_MonitorUpdateData_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 25 | #include "OpcUaWebServer/OpcUaClient/ValueInfo.h" 26 | 27 | namespace OpcUaWebServer 28 | { 29 | 30 | class MonitorUpdateData 31 | { 32 | public: 33 | MonitorUpdateData(void); 34 | ~MonitorUpdateData(void); 35 | 36 | void dataValue(OpcUaStackCore::OpcUaDataValue::SPtr dataValue); 37 | OpcUaStackCore::OpcUaDataValue::SPtr dataValue(void); 38 | void valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry); 39 | ValueInfoEntry::SPtr& valueInfoEntry(void); 40 | 41 | bool jsonDecode(boost::property_tree::ptree& pt); 42 | bool jsonEncode(boost::property_tree::ptree& pt); 43 | 44 | private: 45 | OpcUaStackCore::OpcUaDataValue::SPtr dataValue_; 46 | ValueInfoEntry::SPtr valueInfoEntry_; 47 | }; 48 | 49 | } 50 | 51 | #endif 52 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/OpcUaClientIf.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_OpcUaClientIf_h__ 20 | #define __OpcUaWebServer_OpcUaClientIf_h__ 21 | 22 | #include "OpcUaWebServer/Messages/Message.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class OpcUaClientIf 28 | { 29 | public: 30 | virtual ~OpcUaClientIf(void) {} 31 | 32 | virtual void clientMessage(Message::SPtr& message) = 0; 33 | }; 34 | 35 | } 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/OpcUaClientManagerIf.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_OpcUaClientManagerIf_h__ 20 | #define __OpcUaWebServer_OpcUaClientManagerIf_h__ 21 | 22 | #include "OpcUaWebServer/Messages/Message.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class OpcUaClientManagerIf 28 | { 29 | public: 30 | virtual ~OpcUaClientManagerIf(void) {} 31 | 32 | virtual void clientManagerMessage(Message::SPtr& message) = 0; 33 | }; 34 | 35 | } 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/PtreeConverter.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_PtreeConverter_h__ 20 | #define __OpcUaWebServer_PtreeConverter_h__ 21 | 22 | #include 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class PtreeConverter 28 | { 29 | public: 30 | PtreeConverter(void); 31 | ~PtreeConverter(void); 32 | 33 | bool xml2Json(boost::property_tree::ptree& xml, boost::property_tree::ptree& json); 34 | bool xml2JsonArray(boost::property_tree::ptree& xml, boost::property_tree::ptree& json); 35 | }; 36 | 37 | } 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ReadRequestData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaWebServer/OpcUaClient/ReadRequestData.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | ReadRequestData::ReadRequestData(void) 28 | : variable_("") 29 | { 30 | } 31 | 32 | ReadRequestData::~ReadRequestData(void) 33 | { 34 | } 35 | 36 | void 37 | ReadRequestData::variable(const std::string& variable) 38 | { 39 | variable_ = variable; 40 | } 41 | 42 | std::string& 43 | ReadRequestData::variable(void) 44 | { 45 | return variable_; 46 | } 47 | 48 | bool 49 | ReadRequestData::decode(boost::property_tree::ptree& pt) 50 | { 51 | boost::optional variable = pt.get_optional("Variable"); 52 | if (!variable) { 53 | Log(Error, "Variable do not exist in read request"); 54 | return false; 55 | } 56 | variable_ = *variable; 57 | return true; 58 | } 59 | 60 | bool 61 | ReadRequestData::encode(boost::property_tree::ptree& pt) 62 | { 63 | return false; 64 | } 65 | 66 | } 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ReadRequestData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ReadRequestData_h__ 20 | #define __OpcUaWebServer_ReadRequestData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class ReadRequestData 29 | { 30 | public: 31 | ReadRequestData(void); 32 | ~ReadRequestData(void); 33 | 34 | void variable(const std::string& variable); 35 | std::string& variable(void); 36 | 37 | bool decode(boost::property_tree::ptree& pt); 38 | bool encode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::string variable_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ReadResponseData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | #include 19 | #include 20 | #include "OpcUaStackCore/Base/Log.h" 21 | #include "OpcUaWebServer/OpcUaClient/ReadResponseData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | ReadResponseData::ReadResponseData(void) 29 | : dataValue_() 30 | , valueInfoEntry_() 31 | , statusCode_("") 32 | { 33 | } 34 | 35 | void 36 | ReadResponseData::statusCode(const std::string& statusCode) 37 | { 38 | statusCode_ = statusCode; 39 | } 40 | 41 | std::string& 42 | ReadResponseData::statusCode(void) 43 | { 44 | return statusCode_; 45 | } 46 | 47 | ReadResponseData::~ReadResponseData(void) 48 | { 49 | } 50 | 51 | void 52 | ReadResponseData::dataValue(OpcUaDataValue& dataValue) 53 | { 54 | OpcUaDataValue::SPtr dataValueTmp = boost::make_shared(); 55 | dataValueTmp->copyFrom(dataValue); 56 | this->dataValue(dataValueTmp); 57 | } 58 | 59 | void 60 | ReadResponseData::dataValue(OpcUaDataValue::SPtr dataValue) 61 | { 62 | dataValue_ = dataValue; 63 | } 64 | 65 | OpcUaDataValue::SPtr 66 | ReadResponseData::dataValue(void) 67 | { 68 | return dataValue_; 69 | } 70 | 71 | void 72 | ReadResponseData::valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry) 73 | { 74 | valueInfoEntry_ = valueInfoEntry; 75 | } 76 | 77 | ValueInfoEntry::SPtr& 78 | ReadResponseData::valueInfoEntry(void) 79 | { 80 | return valueInfoEntry_; 81 | } 82 | 83 | bool 84 | ReadResponseData::jsonDecode(boost::property_tree::ptree& pt) 85 | { 86 | return false; 87 | } 88 | 89 | bool 90 | ReadResponseData::jsonEncode(boost::property_tree::ptree& pt) 91 | { 92 | if (statusCode_.length() != 0) { 93 | pt.put("StatusCode", statusCode_); 94 | } 95 | else { 96 | if (!dataValue_->jsonEncode(pt)) return false; 97 | } 98 | return true; 99 | } 100 | 101 | } 102 | 103 | 104 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ReadResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-20120 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ReadResponseData_h__ 20 | #define __OpcUaWebServer_ReadResponseData_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 25 | #include "OpcUaWebServer/OpcUaClient/ValueInfo.h" 26 | 27 | namespace OpcUaWebServer 28 | { 29 | 30 | class ReadResponseData 31 | { 32 | public: 33 | ReadResponseData(void); 34 | ~ReadResponseData(void); 35 | 36 | void statusCode(const std::string& statusCode); 37 | std::string& statusCode(void); 38 | void dataValue(OpcUaStackCore::OpcUaDataValue& dataValue); 39 | void dataValue(OpcUaStackCore::OpcUaDataValue::SPtr dataValue); 40 | OpcUaStackCore::OpcUaDataValue::SPtr dataValue(void); 41 | void valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry); 42 | ValueInfoEntry::SPtr& valueInfoEntry(void); 43 | 44 | bool jsonDecode(boost::property_tree::ptree& pt); 45 | bool jsonEncode(boost::property_tree::ptree& pt); 46 | 47 | private: 48 | std::string statusCode_; 49 | OpcUaStackCore::OpcUaDataValue::SPtr dataValue_; 50 | ValueInfoEntry::SPtr valueInfoEntry_; 51 | }; 52 | 53 | } 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/RequestInfo.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaWebServer/OpcUaClient/RequestInfo.h" 20 | 21 | 22 | namespace OpcUaWebServer 23 | { 24 | 25 | 26 | RequestInfo::RequestInfo(void) 27 | : requestTimeout_(0) 28 | { 29 | } 30 | 31 | RequestInfo::~RequestInfo(void) 32 | { 33 | } 34 | 35 | void 36 | RequestInfo::requestTimeout(uint32_t requestTimeout) 37 | { 38 | requestTimeout_ = requestTimeout; 39 | } 40 | 41 | uint32_t 42 | RequestInfo::requestTimeout(void) const 43 | { 44 | return requestTimeout_; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/RequestInfo.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_RequestInfo_h__ 20 | #define __OpcUaWebServer_RequestInfo_h__ 21 | 22 | #include 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class RequestInfo 28 | { 29 | public: 30 | RequestInfo(void); 31 | ~RequestInfo(void); 32 | 33 | void requestTimeout(uint32_t requestTimeout); 34 | uint32_t requestTimeout(void) const; 35 | 36 | private: 37 | uint32_t requestTimeout_; 38 | }; 39 | 40 | } 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ServiceTransactionClient.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaWebServer/OpcUaClient/ServiceTransactionClient.h" 20 | 21 | namespace OpcUaWebServer 22 | { 23 | 24 | // ------------------------------------------------------------------------ 25 | // ------------------------------------------------------------------------ 26 | // 27 | // ServiceTransactionClientRead 28 | // 29 | // ------------------------------------------------------------------------ 30 | // ------------------------------------------------------------------------ 31 | ServiceTransactionClientRead::ServiceTransactionClientRead(void) 32 | : channelId_(0) 33 | , clientHandle_("") 34 | , variable_("") 35 | , valueInfoEntry_() 36 | , polling_(false) 37 | { 38 | } 39 | 40 | ServiceTransactionClientRead::~ServiceTransactionClientRead(void) 41 | { 42 | } 43 | 44 | 45 | // ------------------------------------------------------------------------ 46 | // ------------------------------------------------------------------------ 47 | // 48 | // ServiceTransactionClientWrite 49 | // 50 | // ------------------------------------------------------------------------ 51 | // ------------------------------------------------------------------------ 52 | ServiceTransactionClientWrite::ServiceTransactionClientWrite(void) 53 | : channelId_(0) 54 | , clientHandle_("") 55 | , variable_("") 56 | { 57 | } 58 | 59 | ServiceTransactionClientWrite::~ServiceTransactionClientWrite(void) 60 | { 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ServiceTransactionClient.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ServiceTransactionClient_h__ 20 | #define __OpcUaWebServer_ServiceTransactionClient_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackClient/ServiceSet/AttributeService.h" 25 | #include "OpcUaWebServer/OpcUaClient/ValueInfo.h" 26 | 27 | namespace OpcUaWebServer 28 | { 29 | 30 | class ServiceTransactionClientRead 31 | : public OpcUaStackCore::ServiceTransactionRead 32 | { 33 | public: 34 | typedef boost::shared_ptr SPtr; 35 | 36 | ServiceTransactionClientRead(void); 37 | ~ServiceTransactionClientRead(void); 38 | 39 | uint32_t channelId_; 40 | std::string clientHandle_; 41 | std::string variable_; 42 | ValueInfoEntry::SPtr valueInfoEntry_; 43 | 44 | // FIXME: temp.. 45 | bool polling_; 46 | std::set channelIdSet_; 47 | }; 48 | 49 | 50 | class ServiceTransactionClientWrite 51 | : public OpcUaStackCore::ServiceTransactionWrite 52 | { 53 | public: 54 | typedef boost::shared_ptr SPtr; 55 | 56 | ServiceTransactionClientWrite(void); 57 | ~ServiceTransactionClientWrite(void); 58 | 59 | uint32_t channelId_; 60 | std::string clientHandle_; 61 | std::string variable_; 62 | }; 63 | 64 | } 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ValueInfo.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-20120 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ValueInfo_h__ 20 | #define __OpcUaWebServer_ValueInfo_h__ 21 | 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include "OpcUaStackCore/BuildInTypes/OpcUaNodeId.h" 27 | #include "OpcUaStackCore/BuildInTypes/OpcUaType.h" 28 | #include "OpcUaWebServer/OpcUaClient/OpcUaClientConfig.h" 29 | 30 | namespace OpcUaWebServer 31 | { 32 | 33 | class ValueInfoEntry 34 | : public OpcUaStackCore::Object 35 | { 36 | public: 37 | typedef boost::shared_ptr SPtr; 38 | typedef std::map Map; 39 | 40 | ValueInfoEntry(void); 41 | ~ValueInfoEntry(void); 42 | 43 | // entry info 44 | uint32_t id_; 45 | std::string valueName_; 46 | OpcUaStackCore::OpcUaNodeId nodeId_; 47 | OpcUaStackCore::OpcUaBuildInType type_; 48 | bool array_; 49 | boost::property_tree::ptree metaData_; 50 | 51 | Object::SPtr object_; 52 | }; 53 | 54 | 55 | class ValueInfo 56 | { 57 | public: 58 | ValueInfo(void); 59 | ~ValueInfo(void); 60 | 61 | bool addClientConfig(OpcUaClientConfig::SPtr& opcUaClientConfig, const OpcUaStackCore::Object::SPtr& object); 62 | ValueInfoEntry::Map& valueInfoEntryMap(void); 63 | 64 | void valueNameVec(std::vector& valueNameVec); 65 | ValueInfoEntry::SPtr getValueInfo(const std::string& valueName); 66 | 67 | private: 68 | typedef std::map ValueInfoEntryIdMap; 69 | 70 | ValueInfoEntry::Map valueInfoEntryMap_; 71 | }; 72 | 73 | } 74 | 75 | #endif 76 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ValueInfoRequestData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 21 | #include "OpcUaWebServer/OpcUaClient/ValueInfoRequestData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | ValueInfoRequestData::ValueInfoRequestData(void) 29 | : variableVec_() 30 | { 31 | } 32 | 33 | ValueInfoRequestData::~ValueInfoRequestData(void) 34 | { 35 | } 36 | 37 | void 38 | ValueInfoRequestData::variableVec(std::vector& variableVec) 39 | { 40 | variableVec_ = variableVec; 41 | } 42 | 43 | std::vector& 44 | ValueInfoRequestData::variableVec(void) 45 | { 46 | return variableVec_; 47 | } 48 | 49 | bool 50 | ValueInfoRequestData::jsonDecode(boost::property_tree::ptree& pt) 51 | { 52 | boost::optional variables; 53 | variables = pt.get_child_optional("Variables"); 54 | if (!variables) return false; 55 | 56 | boost::property_tree::ptree::iterator it; 57 | for (it = variables->begin(); it != variables->end(); it++) { 58 | boost::property_tree::ptree arrayElement = it->second; 59 | 60 | OpcUaString element; 61 | if (!element.jsonDecode(arrayElement)) return false; 62 | variableVec_.push_back(element.value()); 63 | } 64 | 65 | return true; 66 | } 67 | 68 | bool 69 | ValueInfoRequestData::jsonEncode(boost::property_tree::ptree& pt) 70 | { 71 | return false; 72 | } 73 | 74 | } 75 | 76 | 77 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ValueInfoRequestData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ValueInfoRequestData_h__ 20 | #define __OpcUaWebServer_ValueInfoRequestData_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class ValueInfoRequestData 30 | { 31 | public: 32 | ValueInfoRequestData(void); 33 | ~ValueInfoRequestData(void); 34 | 35 | void variableVec(std::vector& variableVec); 36 | std::vector& variableVec(void); 37 | 38 | bool jsonDecode(boost::property_tree::ptree& pt); 39 | bool jsonEncode(boost::property_tree::ptree& pt); 40 | 41 | private: 42 | std::vector variableVec_; 43 | }; 44 | 45 | } 46 | 47 | #endif 48 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ValueInfoResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ValueInfoResponseData_h__ 20 | #define __OpcUaWebServer_ValueInfoResponseData_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class ValueInfoData 30 | { 31 | public: 32 | typedef std::vector Vec; 33 | 34 | ValueInfoData(void); 35 | ~ValueInfoData(void); 36 | 37 | void statusCode(const std::string& statusCode); 38 | std::string& statusCode(void); 39 | void variableName(const std::string& variableName); 40 | std::string& variableName(void); 41 | void variableType(const std::string& variableType); 42 | std::string& variableType(void); 43 | void isArray(bool isArray); 44 | bool isArray(void); 45 | void metaData(const boost::property_tree::ptree& metaData); 46 | boost::property_tree::ptree& metaData(void); 47 | 48 | bool encode(boost::property_tree::ptree& pt); 49 | bool decode(boost::property_tree::ptree& pt); 50 | 51 | private: 52 | std::string statusCode_; 53 | std::string variableName_; 54 | std::string variableType_; 55 | bool isArray_; 56 | boost::property_tree::ptree metaData_; 57 | }; 58 | 59 | class ValueInfoResponseData 60 | { 61 | public: 62 | ValueInfoResponseData(void); 63 | ~ValueInfoResponseData(void); 64 | 65 | void statusCode(const std::string& statusCode); 66 | std::string& statusCode(void); 67 | void valueInfoDataVec(ValueInfoData::Vec& valueInfoDataVec); 68 | ValueInfoData::Vec& valueInfoDataVec(void); 69 | 70 | bool encode(boost::property_tree::ptree& pt); 71 | bool decode(boost::property_tree::ptree& pt); 72 | 73 | private: 74 | std::string statusCode_; 75 | ValueInfoData::Vec valueInfoDataVec_; 76 | }; 77 | 78 | } 79 | 80 | #endif 81 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ValueListResponseData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 21 | #include "OpcUaWebServer/OpcUaClient/ValueListResponseData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | ValueListResponseData::ValueListResponseData(void) 29 | : valueVec_() 30 | { 31 | } 32 | 33 | ValueListResponseData::~ValueListResponseData(void) 34 | { 35 | } 36 | 37 | void 38 | ValueListResponseData::valueVec(std::vector& valueVec) 39 | { 40 | valueVec_ = valueVec; 41 | } 42 | 43 | std::vector& 44 | ValueListResponseData::valueVec(void) 45 | { 46 | return valueVec_; 47 | } 48 | 49 | bool 50 | ValueListResponseData::jsonDecode(boost::property_tree::ptree& pt) 51 | { 52 | return false; 53 | } 54 | 55 | bool 56 | ValueListResponseData::jsonEncode(boost::property_tree::ptree& pt) 57 | { 58 | boost::property_tree::ptree variables; 59 | 60 | for (auto it = valueVec_.begin(); it != valueVec_.end(); it++) { 61 | boost::property_tree::ptree arrayElement; 62 | OpcUaString str(*it); 63 | if (!str.jsonEncode(arrayElement)) return false; 64 | variables.push_back(std::make_pair("", arrayElement)); 65 | } 66 | 67 | pt.add_child("Variables", variables); 68 | return true; 69 | } 70 | 71 | } 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/ValueListResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_ValueListResponseData_h__ 20 | #define __OpcUaWebServer_ValueListResponseData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class ValueListResponseData 29 | { 30 | public: 31 | ValueListResponseData(void); 32 | ~ValueListResponseData(void); 33 | 34 | void valueVec(std::vector& valueVec); 35 | std::vector& valueVec(void); 36 | 37 | bool jsonDecode(boost::property_tree::ptree& pt); 38 | bool jsonEncode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::vector valueVec_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/WriteRequestData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WriteRequestData_h__ 20 | #define __OpcUaWebServer_WriteRequestData_h__ 21 | 22 | #include 23 | #include 24 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 25 | #include "OpcUaWebServer/OpcUaClient/ValueInfo.h" 26 | 27 | namespace OpcUaWebServer 28 | { 29 | 30 | class WriteRequestData 31 | { 32 | public: 33 | WriteRequestData(void); 34 | ~WriteRequestData(void); 35 | 36 | void variable(const std::string& variable); 37 | std::string& variable(void); 38 | void dataValue(OpcUaStackCore::OpcUaDataValue::SPtr dataValue); 39 | OpcUaStackCore::OpcUaDataValue::SPtr dataValue(void); 40 | void valueInfoEntry(const ValueInfoEntry::SPtr& valueInfoEntry); 41 | ValueInfoEntry::SPtr& valueInfoEntry(void); 42 | 43 | bool decodeVariable(boost::property_tree::ptree& pt); 44 | bool jsonDecode(boost::property_tree::ptree& pt); 45 | bool jsonEncode(boost::property_tree::ptree& pt); 46 | 47 | private: 48 | std::string variable_; 49 | OpcUaStackCore::OpcUaDataValue::SPtr dataValue_; 50 | ValueInfoEntry::SPtr valueInfoEntry_; 51 | }; 52 | 53 | } 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/WriteResponseData.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaStackCore/Base/Log.h" 20 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 21 | #include "OpcUaWebServer/OpcUaClient/WriteResponseData.h" 22 | 23 | using namespace OpcUaStackCore; 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | WriteResponseData::WriteResponseData(void) 29 | : statusCode_("") 30 | { 31 | } 32 | 33 | WriteResponseData::~WriteResponseData(void) 34 | { 35 | } 36 | 37 | void 38 | WriteResponseData::statusCode(const std::string& statusCode) 39 | { 40 | statusCode_ = statusCode; 41 | } 42 | 43 | std::string& 44 | WriteResponseData::statusCode(void) 45 | { 46 | return statusCode_; 47 | } 48 | 49 | bool 50 | WriteResponseData::jsonEncode(boost::property_tree::ptree& pt) 51 | { 52 | if (statusCode_.length() == 0) return true; 53 | 54 | boost::property_tree::ptree statusCode; 55 | OpcUaString statusCodeString = statusCode_; 56 | if (!statusCodeString.jsonEncode(statusCode)) return false; 57 | pt.add_child("StatusCode", statusCode); 58 | return true; 59 | } 60 | 61 | bool 62 | WriteResponseData::jsonDecode(boost::property_tree::ptree& pt) 63 | { 64 | return false; 65 | } 66 | 67 | } 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/OpcUaClient/WriteResponseData.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WriteResponseData_h__ 20 | #define __OpcUaWebServer_WriteResponseData_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class WriteResponseData 29 | { 30 | public: 31 | WriteResponseData(void); 32 | ~WriteResponseData(void); 33 | 34 | void statusCode(const std::string& statusCode); 35 | std::string& statusCode(void); 36 | 37 | bool jsonDecode(boost::property_tree::ptree& pt); 38 | bool jsonEncode(boost::property_tree::ptree& pt); 39 | 40 | private: 41 | std::string statusCode_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/Socket/SocketRaw.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_SocketRaw_h__ 20 | #define __OpcUaWebServer_SocketRaw_h__ 21 | 22 | #include "OpcUaStackCore/Network/TCPConnection.h" 23 | #include "OpcUaWebServer/Socket/SocketIf.h" 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class SocketRaw 29 | : public SocketIf 30 | { 31 | public: 32 | typedef boost::shared_ptr SPtr; 33 | 34 | SocketRaw(boost::asio::io_service& io_service); 35 | virtual ~SocketRaw(void); 36 | 37 | boost::asio::ip::tcp::endpoint remote_endpoint( 38 | void 39 | ) override; 40 | boost::asio::ip::tcp::endpoint local_endpoint( 41 | void 42 | ) override; 43 | void close( 44 | void 45 | ) override; 46 | void cancel( 47 | void 48 | ) override; 49 | void performHandshake( 50 | boost::shared_ptr& strand, 51 | const PerformHandshakeCompleteCallback& performHandshakeCompleteCallback 52 | ) override; 53 | void async_read_until( 54 | boost::shared_ptr& strand, 55 | boost::asio::streambuf& recvBuffer, 56 | const std::string& content, 57 | const ReceiveCallback& receiveCallback 58 | ) override; 59 | void async_read_exactly( 60 | boost::shared_ptr& strand, 61 | boost::asio::streambuf& recvBuffer, 62 | size_t contentSize, 63 | const ReceiveCallback& receiveCallback 64 | ) override; 65 | void async_write( 66 | boost::shared_ptr& strand, 67 | boost::asio::streambuf& sendBuffer, 68 | const WriteCompleteCallback& writeCompleteCallback 69 | ) override; 70 | void async_accept( 71 | boost::shared_ptr& strand, 72 | OpcUaStackCore::TCPAcceptor* acceptor, 73 | const AcceptCallback& acceptCallback 74 | ) override; 75 | 76 | private: 77 | OpcUaStackCore::TCPConnection tcpConnection_; 78 | }; 79 | 80 | } 81 | 82 | #endif 83 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/Web/index.html: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 21 | ASNeG Live Demo 22 | 24 | 25 | 26 |
    27 | ASNeG Logo 28 |
    29 | Simple WebSocket Demo
    30 | Control Panel Demo 31 |
    32 |
    33 | ASNeG.de 34 |
    35 |
    36 | 37 | 38 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/Web/pics/asneg_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/src/OpcUaWebServer/Web/pics/asneg_logo.png -------------------------------------------------------------------------------- /src/OpcUaWebServer/Web/projects/demo_controlpanel/css/panel.css: -------------------------------------------------------------------------------- 1 | .connection_status { 2 | float: right; 3 | margin: 2px 25px 2px 2px; 4 | width: 100px; 5 | height: 97px; 6 | } 7 | 8 | .connection_logo { 9 | width:70px; 10 | height:70px; 11 | margin-top: 10px; 12 | margin-left: 0px; 13 | } 14 | 15 | #logo { 16 | float:right; 17 | width:195px; 18 | margin:2px; 19 | } 20 | 21 | #varlist li a { 22 | display: block; 23 | font: bold 120% Arial, Helvetica, sans-serif; 24 | padding: 5px; 25 | text-decoration: none; 26 | } 27 | 28 | #varlist li a:hover { 29 | background: #cbfcc7; 30 | } 31 | 32 | #varlist a em { 33 | color: #333; 34 | display: block; 35 | font: normal 85% Verdana, Helvetica, sans-serif; 36 | line-height: 125%; 37 | } 38 | 39 | #varlist a span { 40 | font: normal 70% Verdana, Helvetica, sans-serif; 41 | line-height: 150%; 42 | } 43 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/Web/projects/demo_controlpanel/js/panel/chart.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Samuel Huebl (samuel.huebl@asneg.de) 16 | */ 17 | 18 | // ############################################## 19 | // Chart Builder 20 | // ############################################## 21 | 22 | function ChartBuilder() { 23 | 24 | // ********************************************** 25 | // public 26 | 27 | this.createLine = function(configObj) { 28 | var cnv_ctx = document.getElementById(configObj.cnv_id).getContext('2d'); 29 | 30 | var labelArray = []; 31 | var dataArray = []; 32 | var i; 33 | for (i=0; i 22 | #include "OpcUaStackCore/BuildInTypes/OpcUaDataValue.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class DataChangeNotify 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | DataChangeNotify(void); 32 | virtual ~DataChangeNotify(void); 33 | 34 | uint32_t& clientHandle(void); 35 | OpcUaStackCore::OpcUaDataValue& dataValue(void); 36 | 37 | protected: 38 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 39 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 40 | 41 | private: 42 | uint32_t clientHandle_; 43 | OpcUaStackCore::OpcUaDataValue dataValue_; 44 | }; 45 | 46 | } 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/EventNotify.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include "OpcUaStackCore/Base/Log.h" 19 | #include "OpcUaStackCore/BuildInTypes/JsonNumber.h" 20 | #include "OpcUaWebServer/WebGateway/EventNotify.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | EventNotify::EventNotify(void) 28 | : clientHandle_(0) 29 | , event_() 30 | { 31 | } 32 | 33 | EventNotify::~EventNotify(void) 34 | { 35 | } 36 | 37 | uint32_t& 38 | EventNotify::clientHandle(void) 39 | { 40 | return clientHandle_; 41 | } 42 | 43 | OpcUaVariantArray& 44 | EventNotify::event(void) 45 | { 46 | return event_; 47 | } 48 | 49 | bool 50 | EventNotify::jsonEncodeImpl(boost::property_tree::ptree& pt) const 51 | { 52 | bool rc = true; 53 | rc = rc & jsonNumberEncode(pt, clientHandle_, "ClientHandleData"); 54 | rc = rc & jsonArrayEncode(pt, event_, "Event"); 55 | return rc; 56 | } 57 | 58 | bool 59 | EventNotify::jsonDecodeImpl(const boost::property_tree::ptree& pt) 60 | { 61 | bool rc = true; 62 | rc = rc & jsonNumberDecode(pt, clientHandle_, "ClientHandleData"); 63 | rc = rc & jsonArrayDecode(pt, event_, "Event"); 64 | return rc; 65 | } 66 | 67 | } 68 | 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/EventNotify.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_EventNotify_h__ 19 | #define __OpcUaWebServer_EventNotify_h__ 20 | 21 | #include 22 | #include "OpcUaStackCore/BuildInTypes/OpcUaVariant.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class EventNotify 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | EventNotify(void); 32 | virtual ~EventNotify(void); 33 | 34 | uint32_t& clientHandle(void); 35 | OpcUaStackCore::OpcUaVariantArray& event(void); 36 | 37 | protected: 38 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 39 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 40 | 41 | private: 42 | uint32_t clientHandle_; 43 | OpcUaStackCore::OpcUaVariantArray event_; 44 | }; 45 | 46 | } 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/LoginResponse.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include 19 | #include "OpcUaStackCore/Base/Log.h" 20 | 21 | using namespace OpcUaStackCore; 22 | 23 | namespace OpcUaWebServer 24 | { 25 | 26 | LoginResponse::LoginResponse(void) 27 | : sessionId_("") 28 | { 29 | } 30 | 31 | LoginResponse::~LoginResponse(void) 32 | { 33 | } 34 | 35 | bool 36 | LoginResponse::jsonEncodeImpl(boost::property_tree::ptree& pt) const 37 | { 38 | return jsonObjectEncode(pt, sessionId_, "SessionId"); 39 | } 40 | 41 | bool 42 | LoginResponse::jsonDecodeImpl(const boost::property_tree::ptree& pt) 43 | { 44 | return jsonObjectDecode(pt, sessionId_, "SessionId"); 45 | } 46 | 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/LoginResponse.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_LoginResponse_h__ 19 | #define __OpcUaWebServer_LoginResponse_h__ 20 | 21 | #include 22 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class LoginResponse 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | LoginResponse(void); 32 | virtual ~LoginResponse(void); 33 | 34 | protected: 35 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 36 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 37 | 38 | private: 39 | OpcUaStackCore::OpcUaString sessionId_; 40 | }; 41 | 42 | } 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/LogoutRequest.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include 19 | #include "OpcUaStackCore/Base/Log.h" 20 | 21 | using namespace OpcUaStackCore; 22 | 23 | namespace OpcUaWebServer 24 | { 25 | 26 | LogoutRequest::LogoutRequest(void) 27 | { 28 | } 29 | 30 | LogoutRequest::~LogoutRequest(void) 31 | { 32 | } 33 | 34 | bool 35 | LogoutRequest::jsonEncodeImpl(boost::property_tree::ptree& pt) const 36 | { 37 | return true; 38 | } 39 | 40 | bool 41 | LogoutRequest::jsonDecodeImpl(const boost::property_tree::ptree& pt) 42 | { 43 | return true; 44 | } 45 | 46 | } 47 | 48 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/LogoutRequest.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_LogoutRequest_h__ 19 | #define __OpcUaWebServer_LogoutRequest_h__ 20 | 21 | #include 22 | #include "OpcUaStackCore/BuildInTypes/JsonFormatter.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class LogoutRequest 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | LogoutRequest(void); 32 | virtual ~LogoutRequest(void); 33 | 34 | protected: 35 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 36 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 37 | 38 | private: 39 | }; 40 | 41 | } 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/LogoutResponse.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include 19 | 20 | namespace OpcUaWebServer 21 | { 22 | 23 | LogoutResponse::LogoutResponse(void) 24 | { 25 | } 26 | 27 | LogoutResponse::~LogoutResponse(void) 28 | { 29 | } 30 | 31 | bool 32 | LogoutResponse::jsonEncodeImpl(boost::property_tree::ptree& pt) const 33 | { 34 | return true; 35 | } 36 | 37 | bool 38 | LogoutResponse::jsonDecodeImpl(const boost::property_tree::ptree& pt) 39 | { 40 | return true; 41 | } 42 | 43 | } 44 | 45 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/LogoutResponse.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_LogoutResponse_h__ 19 | #define __OpcUaWebServer_LogoutResponse_h__ 20 | 21 | #include 22 | #include "OpcUaStackCore/BuildInTypes/JsonFormatter.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class LogoutResponse 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | LogoutResponse(void); 32 | virtual ~LogoutResponse(void); 33 | 34 | protected: 35 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 36 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 37 | 38 | private: 39 | }; 40 | 41 | } 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/NotifyHeader.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include 19 | 20 | namespace OpcUaWebServer 21 | { 22 | 23 | NotifyHeader::NotifyHeader(void) 24 | : RequestHeader() 25 | { 26 | } 27 | 28 | NotifyHeader::NotifyHeader( 29 | const std::string& messageType, 30 | const std::string& clientHandle, 31 | const std::string& sessionId 32 | ) 33 | : RequestHeader(messageType, clientHandle, sessionId, 0) 34 | { 35 | 36 | } 37 | 38 | NotifyHeader::~NotifyHeader(void) 39 | { 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/NotifyHeader.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_NotifyHeader_h__ 19 | #define __OpcUaWebServer_NotifyHeader_h__ 20 | 21 | #include "OpcUaWebServer/WebGateway/RequestHeader.h" 22 | 23 | namespace OpcUaWebServer 24 | { 25 | 26 | class NotifyHeader 27 | : public RequestHeader 28 | { 29 | public: 30 | NotifyHeader(void); 31 | NotifyHeader( 32 | const std::string& messageType, 33 | const std::string& clientHandle, 34 | const std::string& sessionId 35 | ); 36 | virtual ~NotifyHeader(void); 37 | }; 38 | 39 | } 40 | 41 | #endif 42 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/RequestHeader.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_RequestHeader_h__ 19 | #define __OpcUaWebServer_RequestHeader_h__ 20 | 21 | #include 22 | #include 23 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class RequestHeader 29 | : public OpcUaStackCore::JsonFormatter 30 | { 31 | public: 32 | RequestHeader(void); 33 | RequestHeader(const RequestHeader& RequestHeader); 34 | RequestHeader( 35 | const OpcUaStackCore::OpcUaString& messageType, 36 | const OpcUaStackCore::OpcUaString& clientHandle, 37 | const OpcUaStackCore::OpcUaString& sessionId, 38 | uint32_t requestTimeout 39 | ); 40 | virtual ~RequestHeader(void); 41 | 42 | OpcUaStackCore::OpcUaString& messageType(void); 43 | OpcUaStackCore::OpcUaString& clientHandle(void); 44 | OpcUaStackCore::OpcUaString& sessionId(void); 45 | uint32_t requestTimeout(void) const; 46 | 47 | protected: 48 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 49 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 50 | 51 | private: 52 | OpcUaStackCore::OpcUaString messageType_; 53 | OpcUaStackCore::OpcUaString clientHandle_; 54 | OpcUaStackCore::OpcUaString sessionId_; 55 | uint32_t requestTimeout_; 56 | }; 57 | 58 | } 59 | 60 | #endif 61 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/ResponseHeader.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include 19 | #include 20 | #include "OpcUaStackCore/Base/Log.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | ResponseHeader::ResponseHeader(void) 28 | : RequestHeader() 29 | , statusCode_(Success) 30 | { 31 | } 32 | 33 | ResponseHeader::ResponseHeader(const RequestHeader& requestHeader) 34 | : RequestHeader(requestHeader) 35 | , statusCode_(Success) 36 | { 37 | auto str = messageType().toStdString(); 38 | boost::replace_all(str, "Request", "Response"); 39 | messageType() = OpcUaString(str); 40 | } 41 | 42 | ResponseHeader::ResponseHeader( 43 | const OpcUaString& messageType, 44 | const OpcUaString& clientHandle, 45 | const OpcUaString& sessionId 46 | ) 47 | : RequestHeader(messageType, clientHandle, sessionId, 0) 48 | , statusCode_(Success) 49 | { 50 | } 51 | 52 | ResponseHeader::~ResponseHeader(void) 53 | { 54 | } 55 | 56 | OpcUaStatusCode& 57 | ResponseHeader::statusCode(void) 58 | { 59 | return statusCode_; 60 | } 61 | 62 | bool 63 | ResponseHeader::jsonEncodeImpl(boost::property_tree::ptree& pt) const 64 | { 65 | bool rc = true; 66 | rc = rc & RequestHeader::jsonEncodeImpl(pt); 67 | rc = rc & jsonNumberEncode(pt, (uint32_t)statusCode_, "StatusCode"); 68 | return rc; 69 | } 70 | 71 | bool 72 | ResponseHeader::jsonDecodeImpl(const boost::property_tree::ptree& pt) 73 | { 74 | bool rc = true; 75 | rc = rc & RequestHeader::jsonDecodeImpl(pt); 76 | rc = rc & jsonNumberDecode(pt, *(uint32_t*)&statusCode_, "StatusCode", true, (uint32_t)0); 77 | return rc; 78 | } 79 | 80 | } 81 | 82 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/ResponseHeader.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_ResponseHeader_h__ 19 | #define __OpcUaWebServer_ResponseHeader_h__ 20 | 21 | #include "OpcUaStackCore/BuildInTypes/OpcUaStatusCode.h" 22 | #include "OpcUaWebServer/WebGateway/RequestHeader.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class ResponseHeader 28 | : public RequestHeader 29 | { 30 | public: 31 | ResponseHeader(void); 32 | ResponseHeader(const RequestHeader& RequestHeader); 33 | ResponseHeader( 34 | const OpcUaStackCore::OpcUaString& messageType, 35 | const OpcUaStackCore::OpcUaString& clientHandle, 36 | const OpcUaStackCore::OpcUaString& sessionId 37 | ); 38 | virtual ~ResponseHeader(void); 39 | 40 | OpcUaStackCore::OpcUaStatusCode& statusCode(void); 41 | 42 | protected: 43 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 44 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 45 | 46 | private: 47 | OpcUaStackCore::OpcUaStatusCode statusCode_; 48 | }; 49 | 50 | } 51 | 52 | #endif 53 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/SessionStatusNotify.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include "OpcUaStackCore/Base/Log.h" 19 | #include "OpcUaWebServer/WebGateway/SessionStatusNotify.h" 20 | 21 | using namespace OpcUaStackCore; 22 | 23 | namespace OpcUaWebServer 24 | { 25 | 26 | SessionStatusNotify::SessionStatusNotify(void) 27 | : sessionStatus_("") 28 | { 29 | } 30 | 31 | SessionStatusNotify::~SessionStatusNotify(void) 32 | { 33 | } 34 | 35 | OpcUaString& 36 | SessionStatusNotify::sessionStatus(void) 37 | { 38 | return sessionStatus_; 39 | } 40 | 41 | bool 42 | SessionStatusNotify::jsonEncodeImpl(boost::property_tree::ptree& pt) const 43 | { 44 | return jsonObjectEncode(pt, sessionStatus_, "SessionStatus"); 45 | } 46 | 47 | bool 48 | SessionStatusNotify::jsonDecodeImpl(const boost::property_tree::ptree& pt) 49 | { 50 | return jsonObjectDecode(pt, sessionStatus_, "SessionStatus"); 51 | } 52 | 53 | } 54 | 55 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/SessionStatusNotify.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_SessionStatusNotify_h__ 19 | #define __OpcUaWebServer_SessionStatusNotify_h__ 20 | 21 | #include 22 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class SessionStatusNotify 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | SessionStatusNotify(void); 32 | virtual ~SessionStatusNotify(void); 33 | 34 | OpcUaStackCore::OpcUaString& sessionStatus(void); 35 | 36 | protected: 37 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 38 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 39 | 40 | private: 41 | OpcUaStackCore::OpcUaString sessionStatus_; 42 | }; 43 | 44 | } 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/SubscriptionStatusNotify.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #include "OpcUaStackCore/Base/Log.h" 19 | #include "OpcUaStackCore/BuildInTypes/JsonNumber.h" 20 | #include "OpcUaWebServer/WebGateway/SubscriptionStatusNotify.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | SubscriptionStatusNotify::SubscriptionStatusNotify(void) 28 | : subscriptionId_(0) 29 | , subscriptionStatus_("") 30 | { 31 | } 32 | 33 | SubscriptionStatusNotify::~SubscriptionStatusNotify(void) 34 | { 35 | } 36 | 37 | uint32_t& 38 | SubscriptionStatusNotify::subscriptionId(void) 39 | { 40 | return subscriptionId_; 41 | } 42 | 43 | OpcUaString& 44 | SubscriptionStatusNotify::subscriptionStatus(void) 45 | { 46 | return subscriptionStatus_; 47 | } 48 | 49 | bool 50 | SubscriptionStatusNotify::jsonEncodeImpl(boost::property_tree::ptree& pt) const 51 | { 52 | bool rc = true; 53 | rc = rc & jsonNumberEncode(pt, subscriptionId_, "SubscriptionId"); 54 | rc = rc & jsonObjectEncode(pt, subscriptionStatus_, "SubscriptionStatus"); 55 | return rc; 56 | } 57 | 58 | bool 59 | SubscriptionStatusNotify::jsonDecodeImpl(const boost::property_tree::ptree& pt) 60 | { 61 | bool rc = true; 62 | rc = rc & jsonNumberDecode(pt, subscriptionId_, "SubscriptionId"); 63 | rc = rc & jsonObjectDecode(pt, subscriptionStatus_, "SubscriptionStatus"); 64 | return rc; 65 | } 66 | 67 | } 68 | 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/SubscriptionStatusNotify.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_SubscriptionStatusNotify_h__ 19 | #define __OpcUaWebServer_SubscriptionStatusNotify_h__ 20 | 21 | #include 22 | #include "OpcUaStackCore/BuildInTypes/OpcUaString.h" 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class SubscriptionStatusNotify 28 | : public OpcUaStackCore::JsonFormatter 29 | { 30 | public: 31 | SubscriptionStatusNotify(void); 32 | virtual ~SubscriptionStatusNotify(void); 33 | 34 | uint32_t& subscriptionId(void); 35 | OpcUaStackCore::OpcUaString& subscriptionStatus(void); 36 | 37 | protected: 38 | bool jsonEncodeImpl(boost::property_tree::ptree& pt) const override; 39 | bool jsonDecodeImpl(const boost::property_tree::ptree& pt) override; 40 | 41 | private: 42 | uint32_t subscriptionId_; 43 | OpcUaStackCore::OpcUaString subscriptionStatus_; 44 | }; 45 | 46 | } 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/WebGateway.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | */ 17 | 18 | #ifndef __OpcUaWebServer_WebGateway_h__ 19 | #define __OpcUaWebServer_WebGateway_h__ 20 | 21 | #include "ClientManager.h" 22 | #include "OpcUaStackCore/Base/Config.h" 23 | #include "OpcUaStackCore/Utility/IOThread.h" 24 | #include "OpcUaStackCore/Certificate/CryptoManager.h" 25 | #include "OpcUaWebServer/WebSocket/WebSocketServer.h" 26 | #include "OpcUaWebServer/WebGateway/ClientManager.h" 27 | #include "OpcUaWebServer/WebGateway/WebGatewayConfig.h" 28 | 29 | namespace OpcUaWebServer 30 | { 31 | 32 | class WebGateway 33 | { 34 | public: 35 | using StartupCompleteCallback = std::function; 36 | using ShutdownCompleteCallback = std::function; 37 | 38 | WebGateway(void); 39 | virtual ~WebGateway(void); 40 | 41 | void startup( 42 | OpcUaStackCore::Config* config, 43 | OpcUaStackCore::IOThread::SPtr ioThread, 44 | OpcUaStackCore::MessageBus::SPtr messageBus, 45 | OpcUaStackCore::CryptoManager::SPtr cryptoManager, 46 | const StartupCompleteCallback& startupCompleteCallback 47 | ); 48 | void shutdown( 49 | const ShutdownCompleteCallback& shutdownCompleteCallback 50 | ); 51 | 52 | bool getWebGatewayConfig(Config* config); 53 | 54 | private: 55 | void startupStrand( 56 | OpcUaStackCore::Config* config, 57 | OpcUaStackCore::IOThread::SPtr ioThread, 58 | OpcUaStackCore::MessageBus::SPtr messageBus, 59 | OpcUaStackCore::CryptoManager::SPtr cryptoManager, 60 | const StartupCompleteCallback& startupCompleteCallback 61 | ); 62 | void shutdownStrand( 63 | const ShutdownCompleteCallback& shutdownCompleteCallback 64 | ); 65 | 66 | WebGatewayConfig webGatewayConfig_; 67 | 68 | WebSocketConfig webSocketConfig_; 69 | WebSocketServer::SPtr webSocketServer_; 70 | 71 | boost::shared_ptr strand_ = nullptr; 72 | 73 | ClientManager clientManager_; 74 | 75 | }; 76 | 77 | } 78 | 79 | #endif 80 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebGateway/WebGatewayConfig.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebGatewayConfig_h__ 20 | #define __OpcUaWebServer_WebGatewayConfig_h__ 21 | 22 | #include 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | class WebGatewayConfig 28 | { 29 | public: 30 | WebGatewayConfig(void); 31 | virtual ~WebGatewayConfig(void); 32 | 33 | void active(bool active); 34 | bool active(void); 35 | void address(const std::string& address); 36 | std::string& address(void); 37 | void port(uint32_t port); 38 | uint32_t port(void); 39 | void maxConnections(uint32_t maxConnections); 40 | uint32_t maxConnections(void); 41 | void maxPacketLength(uint32_t maxPacketLength); 42 | uint32_t maxPacketLength(void); 43 | 44 | void ssl(bool ssl); 45 | bool ssl(void); 46 | void csrFile(const std::string& csrFile); 47 | std::string csrFile(void); 48 | void keyFile(const std::string& keyFile); 49 | std::string keyFile(void); 50 | 51 | private: 52 | bool active_; 53 | std::string address_; 54 | uint32_t port_; 55 | 56 | uint32_t maxConnections_ = 0; 57 | uint32_t maxPacketLength_ = 0; 58 | 59 | bool ssl_ = false; 60 | std::string csrFile_ = ""; 61 | std::string keyFile_ = ""; 62 | }; 63 | 64 | } 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpChannel.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include 20 | #include "OpcUaWebServer/WebServer/HttpChannel.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | uint32_t HttpChannel::gChannelId_ = 0; 28 | 29 | HttpChannel::HttpChannel(SocketIf::SPtr& socketIf) 30 | : socketIf_(socketIf) 31 | , channelId_() 32 | , recvBuffer_() 33 | , sendBuffer_() 34 | , httpRequest_() 35 | , httpResponse_() 36 | , slotTimerElement_() 37 | , timeout_(false) 38 | { 39 | slotTimerElement_ = boost::make_shared(); 40 | 41 | std::stringstream ss; 42 | ss << "Http" << gChannelId_++; 43 | id_ = gChannelId_; 44 | channelId_ = ss.str(); 45 | } 46 | 47 | HttpChannel::~HttpChannel(void) 48 | { 49 | } 50 | 51 | SocketIf& 52 | HttpChannel::socket(void) 53 | { 54 | return *socketIf_.get(); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpChannel.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HttpChannel_h__ 20 | #define __OpcUaWebServer_HttpChannel_h__ 21 | 22 | #include "OpcUaStackCore/Network/TCPConnection.h" 23 | #include "OpcUaStackCore/Utility/SlotTimer.h" 24 | #include "OpcUaWebServer/Socket/SocketIf.h" 25 | #include "OpcUaWebServer/WebServer/HttpRequest.h" 26 | #include "OpcUaWebServer/WebServer/HttpResponse.h" 27 | 28 | namespace OpcUaWebServer 29 | { 30 | 31 | class HttpChannel 32 | { 33 | public: 34 | typedef std::map Map; 35 | 36 | static uint32_t gChannelId_; 37 | 38 | HttpChannel(SocketIf::SPtr& socketIf); 39 | virtual ~HttpChannel(void); 40 | 41 | SocketIf& socket(void); 42 | 43 | OpcUaStackCore::SlotTimerElement::SPtr slotTimerElement_; 44 | 45 | uint32_t id_; 46 | bool timeout_; 47 | std::string channelId_; 48 | boost::asio::streambuf recvBuffer_; 49 | boost::asio::streambuf sendBuffer_; 50 | HttpRequest httpRequest_; 51 | HttpResponse httpResponse_; 52 | boost::asio::ip::tcp::endpoint partner_; 53 | bool shutdown_ = false; 54 | 55 | bool asyncRead_ = false; 56 | bool asyncWrite_ = false; 57 | 58 | private: 59 | SocketIf::SPtr socketIf_ = nullptr; 60 | }; 61 | 62 | } 63 | 64 | #endif 65 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpContent.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HttpContent_h__ 20 | #define __OpcUaWebServer_HttpContent_h__ 21 | 22 | #include "OpcUaStackCore/Base/Object.h" 23 | #include "OpcUaWebServer/WebServer/HttpServerIf.h" 24 | #include "OpcUaWebServer/WebServer/HttpConfig.h" 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class HttpContent 30 | : public OpcUaStackCore::Object 31 | , public HttpServerIf 32 | { 33 | public: 34 | typedef boost::shared_ptr SPtr; 35 | 36 | HttpContent(void); 37 | virtual ~HttpContent(void); 38 | 39 | void httpConfig(HttpConfig* httpConfig); 40 | bool startup(void); 41 | bool shutdown(void); 42 | 43 | //- WebServerIf ------------------------------------------------------- 44 | virtual void request(HttpRequest& httpRequest, HttpResponse& httpResponse); 45 | //- WebServerIf ------------------------------------------------------- 46 | 47 | private: 48 | bool checkPath(const std::string& path); 49 | HttpConfig* httpConfig_; 50 | }; 51 | 52 | } 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpRequest.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HttpRequest_h__ 20 | #define __OpcUaWebServer_HttpRequest_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class HttpRequest 29 | { 30 | public: 31 | HttpRequest(void); 32 | ~HttpRequest(void); 33 | 34 | std::string method(void); 35 | std::string path(void); 36 | std::string httpVersion(void); 37 | void content(const std::string& content); 38 | std::string& content(void); 39 | 40 | void clear(void); 41 | bool decodeRequestHeader(std::istream& is); 42 | bool getHeaderPara(const std::string& key, std::string& para); 43 | std::map& headerMap(); 44 | 45 | private: 46 | std::string method_; 47 | std::string path_; 48 | std::string httpVersion_; 49 | std::map headerMap_; 50 | std::string content_; 51 | }; 52 | 53 | } 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpResponse.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HttpResponse_h__ 20 | #define __OpcUaWebServer_HttpResponse_h__ 21 | 22 | #include 23 | #include 24 | #include 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class HttpResponse 30 | { 31 | public: 32 | HttpResponse(void); 33 | ~HttpResponse(void); 34 | 35 | void statusCode(uint32_t statusCode); 36 | uint32_t statusCode(void); 37 | void statusString(const std::string& statusString); 38 | std::string statusString(void); 39 | void content(const std::string& content); 40 | std::string& content(void); 41 | 42 | void clear(void); 43 | bool setHeaderPara(const std::string& key, const std::string& para); 44 | bool getHeaderPara(const std::string& key, std::string& para); 45 | bool encodeRequestHeader(std::ostream& os); 46 | 47 | private: 48 | uint32_t statusCode_; 49 | std::string statusString_; 50 | std::string content_; 51 | std::map headerMap_; 52 | }; 53 | 54 | } 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpServer.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HttpServer_h__ 20 | #define __OpcUaWebServer_HttpServer_h__ 21 | 22 | #include 23 | #include "OpcUaWebServer/WebServer/HttpServerBase.h" 24 | #include "OpcUaWebServer/WebServer/IPLogger.h" 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class HttpServer 30 | : public HttpServerBase 31 | { 32 | public: 33 | typedef std::function StartupCompleteCallback; 34 | typedef std::function ShutdownCompleteCallback; 35 | typedef boost::shared_ptr SPtr; 36 | 37 | HttpServer(HttpConfig* httpConfig); 38 | virtual ~HttpServer(void); 39 | 40 | void startup( 41 | const StartupCompleteCallback& startupCompleteCallback 42 | ); 43 | void shutdown( 44 | const ShutdownCompleteCallback& shutdownCompleteCallback 45 | ); 46 | 47 | void addHttpChannel(uint32_t count) override; 48 | void delHttpChannel(uint32_t count) override; 49 | 50 | private: 51 | void startupStrand( 52 | const StartupCompleteCallback& startupCompleteCallback 53 | ); 54 | void shutdownStrand( 55 | const ShutdownCompleteCallback& shutdownCompleteCallback 56 | ); 57 | void handleShutdown(void); 58 | std::string getPassword() const; 59 | HttpChannel* createHttpChannel(void); 60 | 61 | void accept(void); 62 | void handleAccept(const boost::system::error_code& error, HttpChannel* httpChannel); 63 | void handleAccept1(const boost::system::error_code& error){} 64 | void closeHttpChannel(void); 65 | 66 | void openHttpAcceptor(void); 67 | void closeHttpAcceptor(void); 68 | 69 | bool ssl_ = false; 70 | bool active_ = true; 71 | HttpConfig* httpConfig_; 72 | boost::asio::ssl::context* context_ = nullptr; 73 | IPLogger ipLogger_; 74 | 75 | bool shutdownFlag_ = false; 76 | ShutdownCompleteCallback shutdownCompleteCallback_; 77 | }; 78 | 79 | } 80 | 81 | #endif 82 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/HttpServerIf.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_HttpServerBaseIf_h__ 20 | #define __OpcUaWebServer_HttpServerBaseIf_h__ 21 | 22 | #include "OpcUaWebServer/WebServer/HttpRequest.h" 23 | #include "OpcUaWebServer/WebServer/HttpResponse.h" 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class HttpServerIf 29 | { 30 | public: 31 | virtual ~HttpServerIf(void) {} 32 | 33 | virtual void request(HttpRequest& httpRequest, HttpResponse& httpResponse) = 0; 34 | }; 35 | 36 | } 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/IPLogger.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaStackWebServer_IPLogger_h__ 20 | #define __OpcUaStackWebServer_IPLogger_h__ 21 | 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include "OpcUaStackCore/Base/os.h" 27 | #include "OpcUaStackCore/Base/Log.h" 28 | 29 | namespace OpcUaWebServer 30 | { 31 | 32 | class DLLEXPORT IPLogger 33 | { 34 | public: 35 | IPLogger(void); 36 | virtual ~IPLogger(void); 37 | 38 | static void logFileName(const std::string logFileName); 39 | static std::string logFileName(void); 40 | static void maxLogFileNumber(const uint32_t maxLogFileNumber); 41 | static uint32_t maxLogFileNumber(void); 42 | static void maxLogFileSize(const uint32_t maxLogFileSize); 43 | static uint32_t maxLogFileSize(void); 44 | static void maxIPAge(const uint32_t maxIPAge); 45 | static uint32_t maxIPAge(void); 46 | 47 | void logout(const std::string& ip); 48 | 49 | private: 50 | bool openLogFile(void); 51 | bool closeLogFile(void); 52 | void checkLogFile(void); 53 | void rotateLogFile(void); 54 | 55 | static boost::mutex mutex_; 56 | static uint32_t counter_; 57 | static std::string logFileName_; 58 | static uint32_t maxLogFileNumber_; 59 | static uint32_t maxLogFileSize_; 60 | static uint32_t maxIPAge_; 61 | 62 | bool isOpen_; 63 | boost::filesystem::ofstream ofStream_; 64 | typedef std::map IPMap; 65 | IPMap ipMap_; 66 | }; 67 | 68 | } 69 | 70 | #endif 71 | 72 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebServer/WebServer.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebServer_h__ 20 | #define __OpcUaWebServer_WebServer_h__ 21 | 22 | #include "OpcUaStackCore/Base/IOService.h" 23 | #include "OpcUaStackCore/Base/Config.h" 24 | #include "OpcUaStackCore/Utility/IOThread.h" 25 | #include "OpcUaStackServer/Application/ApplicationInfo.h" 26 | #include "OpcUaWebServer/WebServer/HttpServer.h" 27 | #include "OpcUaWebServer/WebServer/HttpConfig.h" 28 | #include "OpcUaWebServer/WebServer/HttpContent.h" 29 | 30 | namespace OpcUaWebServer 31 | { 32 | 33 | class WebServer 34 | { 35 | public: 36 | typedef std::function StartupCompleteCallback; 37 | typedef std::function ShutdownCompleteCallback; 38 | 39 | WebServer(void); 40 | ~WebServer(void); 41 | 42 | void startup( 43 | OpcUaStackCore::Config* config, 44 | const OpcUaStackCore::IOThread::SPtr& ioThread, 45 | const StartupCompleteCallback& startupCompleteCallback 46 | ); 47 | void shutdown( 48 | const ShutdownCompleteCallback& shutdownCompleteCallback 49 | ); 50 | 51 | private: 52 | void shutdownComplete(bool error); 53 | bool getHttpConfig(OpcUaStackCore::Config* config); 54 | bool getIPLoggerConfig(OpcUaStackCore::Config* config); 55 | 56 | ShutdownCompleteCallback shutdownCompleteCallback_; 57 | HttpServer::SPtr httpServer_; 58 | HttpContent::SPtr httpContent_; 59 | HttpConfig httpConfig_; 60 | }; 61 | 62 | } 63 | 64 | #endif 65 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/SendQueue.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2019 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_SendQueue_h__ 20 | #define __OpcUaWebServer_SendQueue_h__ 21 | 22 | #include 23 | #include "OpcUaWebServer/WebSocket/WebSocketMessage.h" 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class SendQueueElement 29 | { 30 | public: 31 | typedef boost::shared_ptr SPtr; 32 | 33 | SendQueueElement( 34 | WebSocketMessage::SPtr& webSocketMessage, 35 | std::function sendCompleteCallback, 36 | char headerByte 37 | ); 38 | ~SendQueueElement(void); 39 | 40 | WebSocketMessage::SPtr webSocketMessage(void); 41 | std::function sendCompleteCallback(void); 42 | char headerByte(void); 43 | 44 | SendQueueElement* next(void); 45 | void next(SendQueueElement* next); 46 | 47 | private: 48 | SendQueueElement* next_ = nullptr; 49 | 50 | WebSocketMessage::SPtr webSocketMessage_; 51 | std::function sendCompleteCallback_ = nullptr; 52 | char headerByte_ = 0x00; 53 | }; 54 | 55 | class SendQueue 56 | { 57 | public: 58 | typedef boost::shared_ptr SPtr; 59 | 60 | SendQueue(void); 61 | ~SendQueue(void); 62 | 63 | bool empty(void); 64 | void clear(void); 65 | uint32_t size(void); 66 | void enqueue( 67 | WebSocketMessage::SPtr& webSocketMessage, 68 | std::function sendCompleteCallback, 69 | char headerByte 70 | ); 71 | 72 | bool dequeue( 73 | WebSocketMessage::SPtr& webSocketMessage, 74 | std::function* sendCompleteCallback, 75 | char* headerByte 76 | ); 77 | 78 | private: 79 | uint32_t size_ = 0; 80 | SendQueueElement* front = nullptr; 81 | SendQueueElement* rear = nullptr; 82 | }; 83 | 84 | } 85 | 86 | #endif 87 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketChannel.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include 20 | #include "OpcUaWebServer/WebSocket/WebSocketChannel.h" 21 | 22 | using namespace OpcUaStackCore; 23 | 24 | namespace OpcUaWebServer 25 | { 26 | 27 | uint32_t WebSocketChannel::gChannelId_ = 0; 28 | 29 | WebSocketChannel::WebSocketChannel(SocketIf::SPtr& socketIf) 30 | : socketIf_(socketIf) 31 | , recvBuffer_() 32 | , sendBuffer_() 33 | , webSocketRequest_() 34 | , webSocketResponse_() 35 | , slotTimerElement_() 36 | , timeout_(false) 37 | { 38 | slotTimerElement_ = boost::make_shared(); 39 | 40 | gChannelId_++; 41 | id_ = gChannelId_; 42 | } 43 | 44 | WebSocketChannel::~WebSocketChannel(void) 45 | { 46 | } 47 | 48 | std::string 49 | WebSocketChannel::getId(void) 50 | { 51 | std::stringstream ss; 52 | ss << id_; 53 | return ss.str(); 54 | } 55 | 56 | SocketIf& 57 | WebSocketChannel::socket(void) 58 | { 59 | return *socketIf_.get(); 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketChannel.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebSocketChannel_h__ 20 | #define __OpcUaWebServer_WebSocketChannel_h__ 21 | 22 | #include 23 | #include "OpcUaStackCore/Network/TCPConnection.h" 24 | #include "OpcUaStackCore/Utility/SlotTimer.h" 25 | #include "OpcUaWebServer/Socket/SocketIf.h" 26 | #include "OpcUaWebServer/WebSocket/WebSocketRequest.h" 27 | #include "OpcUaWebServer/WebSocket/WebSocketResponse.h" 28 | #include "OpcUaWebServer/WebSocket/SendQueue.h" 29 | 30 | namespace OpcUaWebServer 31 | { 32 | 33 | class WebSocketChannel 34 | { 35 | public: 36 | typedef std::map Map; 37 | 38 | static uint32_t gChannelId_; 39 | 40 | WebSocketChannel(SocketIf::SPtr& socketIf); 41 | virtual ~WebSocketChannel(void); 42 | 43 | std::string getId(void); 44 | SocketIf& socket(void); 45 | 46 | OpcUaStackCore::SlotTimerElement::SPtr slotTimerElement_; 47 | 48 | bool shutdown_ = false; 49 | bool asyncWrite_ = false; 50 | bool asyncRead_ = false; 51 | 52 | bool timeout_; 53 | uint32_t id_; 54 | uint8_t opcode_; 55 | boost::asio::streambuf recvBuffer_; 56 | boost::asio::streambuf sendBuffer_; 57 | WebSocketRequest webSocketRequest_; 58 | WebSocketResponse webSocketResponse_; 59 | boost::asio::ip::tcp::endpoint partner_; 60 | SendQueue sendQueue_; 61 | 62 | private: 63 | SocketIf::SPtr socketIf_ = nullptr; 64 | }; 65 | 66 | } 67 | 68 | #endif 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketConfig.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015-2020 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebSocketConfig_h__ 20 | #define __OpcUaWebServer_WebSocketConfig_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class WebSocketConfig 29 | { 30 | public: 31 | WebSocketConfig(void); 32 | virtual ~WebSocketConfig(void); 33 | 34 | void enable(bool enable); 35 | bool enable(void); 36 | void address(const std::string& address); 37 | std::string& address(void); 38 | void port(uint32_t port); 39 | uint32_t port(void); 40 | void requestTimeout(uint32_t requestTimeout); 41 | uint32_t requestTimeout(void); 42 | void idleTimeout(uint32_t requestTimeout); 43 | uint32_t idleTimeout(void); 44 | void ioThread(const OpcUaStackCore::IOThread::SPtr& ioThread); 45 | OpcUaStackCore::IOThread::SPtr& ioThread(void); 46 | void strand(const boost::shared_ptr& strand); 47 | boost::shared_ptr& strand(void); 48 | void maxConnections(uint32_t maxConnections); 49 | uint32_t maxConnections(void); 50 | void maxPacketLength(uint32_t maxPacketLength); 51 | uint32_t maxPacketLength(void); 52 | 53 | void ssl(bool ssl); 54 | bool ssl(void); 55 | void csrFile(const std::string& csrFile); 56 | std::string csrFile(void); 57 | void keyFile(const std::string& keyFile); 58 | std::string keyFile(void); 59 | 60 | private: 61 | bool enable_; 62 | std::string address_; 63 | uint32_t port_; 64 | uint32_t requestTimeout_; 65 | uint32_t idleTimeout_; 66 | OpcUaStackCore::IOThread::SPtr ioThread_; 67 | boost::shared_ptr strand_; 68 | uint32_t maxConnections_ = 0; 69 | uint32_t maxPacketLength_ = 0; 70 | 71 | // security settings 72 | bool ssl_ = false; // activate or deactivate SSL security 73 | std::string csrFile_ = ""; // server SSL certificate 74 | std::string keyFile_ = ""; // server private key 75 | }; 76 | 77 | } 78 | 79 | #endif 80 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketMessage.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #include "OpcUaWebServer/WebSocket/WebSocketMessage.h" 20 | 21 | namespace OpcUaWebServer 22 | { 23 | 24 | WebSocketMessage::WebSocketMessage(void) 25 | : command_(C_Message) 26 | , channelId_(0) 27 | , message_("") 28 | { 29 | } 30 | 31 | WebSocketMessage::~WebSocketMessage(void) 32 | { 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketMessage.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebSocketMessage_h__ 20 | #define __OpcUaWebServer_WebSocketMessage_h__ 21 | 22 | #include 23 | #include 24 | #include 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class WebSocketMessage 30 | { 31 | public: 32 | typedef boost::shared_ptr SPtr; 33 | 34 | typedef enum { 35 | C_Message 36 | } Command; 37 | 38 | WebSocketMessage(void); 39 | virtual ~WebSocketMessage(void); 40 | 41 | Command command_; 42 | uint32_t channelId_; 43 | std::string message_; 44 | }; 45 | 46 | } 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketRequest.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebSocketRequest_h__ 20 | #define __OpcUaWebServer_WebSocketRequest_h__ 21 | 22 | #include 23 | #include 24 | 25 | namespace OpcUaWebServer 26 | { 27 | 28 | class WebSocketRequest 29 | { 30 | public: 31 | WebSocketRequest(void); 32 | ~WebSocketRequest(void); 33 | 34 | std::string method(void); 35 | std::string path(void); 36 | std::string httpVersion(void); 37 | void content(const std::string& content); 38 | std::string& content(void); 39 | 40 | void clear(void); 41 | bool decodeRequestHeader(std::istream& is); 42 | bool getHeaderPara(const std::string& key, std::string& para); 43 | bool setHeaderPara(const std::string& key, const std::string& para); 44 | std::map& headerMap(); 45 | 46 | private: 47 | std::string method_; 48 | std::string path_; 49 | std::string httpVersion_; 50 | std::map headerMap_; 51 | std::string content_; 52 | }; 53 | 54 | } 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/WebSocket/WebSocketResponse.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 3 | 4 | Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | 8 | Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | 12 | Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | im Rahmen der Lizenz finden Sie in der Lizenz. 14 | 15 | Autor: Kai Huebl (kai@huebl-sgh.de) 16 | 17 | */ 18 | 19 | #ifndef __OpcUaWebServer_WebSocketResponse_h__ 20 | #define __OpcUaWebServer_WebSocketResponse_h__ 21 | 22 | #include 23 | #include 24 | #include 25 | 26 | namespace OpcUaWebServer 27 | { 28 | 29 | class WebSocketResponse 30 | { 31 | public: 32 | WebSocketResponse(void); 33 | ~WebSocketResponse(void); 34 | 35 | void statusCode(uint32_t statusCode); 36 | uint32_t statusCode(void); 37 | void statusString(const std::string& statusString); 38 | std::string statusString(void); 39 | void content(const std::string& content); 40 | std::string& content(void); 41 | 42 | void clear(void); 43 | bool setHeaderPara(const std::string& key, const std::string& para); 44 | bool getHeaderPara(const std::string& key, std::string& para); 45 | bool encodeRequestHeader(std::ostream& os); 46 | 47 | private: 48 | uint32_t statusCode_; 49 | std::string statusString_; 50 | std::string content_; 51 | std::map headerMap_; 52 | }; 53 | 54 | } 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/certificate/createCertificate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 4 | # cleanup existing keys and certificates 5 | # 6 | 7 | # 8 | # Create private key. This private key is required for the generation of the 9 | # certificate request. 10 | # 11 | echo "create private key..." 12 | openssl genrsa 2048 > privatekey.pem 13 | 14 | 15 | # 16 | # Create csr file. A CSR file is a file that you can send to a certificaten 17 | # authority to receive a digital server certificate. 18 | # 19 | echo "create csr file..." 20 | openssl req -new -key privatekey.pem -out csr.pem \ 21 | -subj /C=DE/ST=Hessen/L=Neukirchen/O=ASNeG/OU=OPC\ UA\ Service\ Department/CN=ASNeG.de 22 | 23 | 24 | # 25 | # You can pass the signing request on to a third party for signing or sign it 26 | # yourself for development and testing. 27 | # 28 | # We are now signing the certificate ourselves. 29 | # 30 | echo "sign and create certificate..." 31 | openssl x509 -req -days 365 -in csr.pem -signkey privatekey.pem -out public.crt 32 | 33 | mv privatekey.pem websocket.pem 34 | mv public.crt websocket.crt 35 | 36 | echo "success" 37 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/certificate/csr.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE REQUEST----- 2 | MIICxjCCAa4CAQAwgYAxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZIZXNzZW4xEzAR 3 | BgNVBAcMCk5ldWtpcmNoZW4xDjAMBgNVBAoMBUFTTmVHMSIwIAYDVQQLDBlPUEMg 4 | VUEgU2VydmljZSBEZXBhcnRtZW50MRcwFQYDVQQDDA5PcGNVYVdlYlNlcnZlcjCC 5 | ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANp9u6odE/nEMWUS7sa4BRsN 6 | 9OykdwftjEwqX5RjokYT8Cy69uA/dPApP8fAsKNW17q6uh33p7bqjtT/xalriw8s 7 | T0X57WfVXjsLA+ba3m0b75miCCkO0fihX1biDE3K/yIOCRTl0diphVUGIqsNhOwc 8 | iEAmFdoYpOZdsv/HJCbLgHAs0T4yii1Noy5Rd42ezhutGp2UJDDkX4AgpuHHpPS3 9 | o2sFfQWSMfJ0gn5AbmAXrN248TQRiv9UB4/BwrlNzhmqMcR8860jFc30VMn1DgLz 10 | S7I+5cpZUr3RoiuDD0cyVIgfjaTi3FafFWs2LEMRJSQJHsOn1GYfj/MCe5ZU5zsC 11 | AwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQBGqNNtmyEogQoc0KNN/GRA1c7Ys/c4 12 | jQHtmFUWXkFynBKMj92Ca/EUl82t43RXI9TgXNd7W4cQIq9w7h8ic+qcHR3h3p00 13 | EhIK+fN1GhUF6OV0SHqZqiUCOOsLZE4OeyCRoM0xtiv8aJt7rDJa4VrSLaXozS0a 14 | ztBG/FYN6pwzMt8dnendC4gobtdHhQz0xAdoWgpBd0ceHF+7gLds4qw+GERvLivR 15 | I32GaVCPRMqg6jVRQ9UrQ+FcHCbi0QkB7Ya9bpJXoh8dkmynJFQTPS9Ixa1RFGnY 16 | Ad8Sg5G4FrziFaQxZdFNpLzJJ/4ZunDy94QqoqSoJQaq989kDqhGBhnN 17 | -----END CERTIFICATE REQUEST----- 18 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/certificate/websocket.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIDfjCCAmYCCQCDOzkLLHEsKzANBgkqhkiG9w0BAQsFADCBgDELMAkGA1UEBhMC 3 | REUxDzANBgNVBAgMBkhlc3NlbjETMBEGA1UEBwwKTmV1a2lyY2hlbjEOMAwGA1UE 4 | CgwFQVNOZUcxIjAgBgNVBAsMGU9QQyBVQSBTZXJ2aWNlIERlcGFydG1lbnQxFzAV 5 | BgNVBAMMDk9wY1VhV2ViU2VydmVyMB4XDTE5MTIyMzIxMzI1N1oXDTIwMTIyMjIx 6 | MzI1N1owgYAxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZIZXNzZW4xEzARBgNVBAcM 7 | Ck5ldWtpcmNoZW4xDjAMBgNVBAoMBUFTTmVHMSIwIAYDVQQLDBlPUEMgVUEgU2Vy 8 | dmljZSBEZXBhcnRtZW50MRcwFQYDVQQDDA5PcGNVYVdlYlNlcnZlcjCCASIwDQYJ 9 | KoZIhvcNAQEBBQADggEPADCCAQoCggEBANp9u6odE/nEMWUS7sa4BRsN9Oykdwft 10 | jEwqX5RjokYT8Cy69uA/dPApP8fAsKNW17q6uh33p7bqjtT/xalriw8sT0X57WfV 11 | XjsLA+ba3m0b75miCCkO0fihX1biDE3K/yIOCRTl0diphVUGIqsNhOwciEAmFdoY 12 | pOZdsv/HJCbLgHAs0T4yii1Noy5Rd42ezhutGp2UJDDkX4AgpuHHpPS3o2sFfQWS 13 | MfJ0gn5AbmAXrN248TQRiv9UB4/BwrlNzhmqMcR8860jFc30VMn1DgLzS7I+5cpZ 14 | Ur3RoiuDD0cyVIgfjaTi3FafFWs2LEMRJSQJHsOn1GYfj/MCe5ZU5zsCAwEAATAN 15 | BgkqhkiG9w0BAQsFAAOCAQEAvtKToFrLEbrywMQiC+J7i21Ss5ndEbf5OhH1dWzl 16 | yBL2n60vPatV/XpJ8E9ya7YwEVKRjydJg24uHKrGSlLfMbC7TiNsyQk/8MEVpo1U 17 | 2zZnwZVHa+YB9sBiJJb5BkFhKIiMS0J1tgRiPUb2cMRQ+KzaKzNpncsa5Q71293S 18 | OPqMdDo66K0Sj3xeVcXerPZ3GpAWfuVjZGFA3oZBLxHfEacArziWZ+VUhvAeoOST 19 | imL3ZrmU3Z4nQJUf8v2DYInFrjFbYTlSZhLRhMwlAdSQwgq4z4UAHON7xL7ZUPf0 20 | OgqxN0VHD7bvjNHu0BG1Ely0c1O3Wsh4MUihKv0SJ2hJ1w== 21 | -----END CERTIFICATE----- 22 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/certificate/websocket.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIEpAIBAAKCAQEA2n27qh0T+cQxZRLuxrgFGw307KR3B+2MTCpflGOiRhPwLLr2 3 | 4D908Ck/x8Cwo1bXurq6HfentuqO1P/FqWuLDyxPRfntZ9VeOwsD5trebRvvmaII 4 | KQ7R+KFfVuIMTcr/Ig4JFOXR2KmFVQYiqw2E7ByIQCYV2hik5l2y/8ckJsuAcCzR 5 | PjKKLU2jLlF3jZ7OG60anZQkMORfgCCm4cek9LejawV9BZIx8nSCfkBuYBes3bjx 6 | NBGK/1QHj8HCuU3OGaoxxHzzrSMVzfRUyfUOAvNLsj7lyllSvdGiK4MPRzJUiB+N 7 | pOLcVp8VazYsQxElJAkew6fUZh+P8wJ7llTnOwIDAQABAoIBAQC7+6W07SO8p0Jg 8 | VfO+YaFy74Uk/TO0THuDJInrn/WEGa9wrMOvmKlB4BuR/4V6Y0Nk0zdChUt1I0YU 9 | mKM16uNQAK2L5UaPKZLTddy7iOAKPBjfs/sVaDzbj+v5Uq+HVvpAEJdbtYfgw6mF 10 | x6uYRB9zDfFkT+BJLx7hXQie7HV8Mc8cCyFachkWV34TqsHJRTR9oNCcEVU7G7Td 11 | oW2ABecaHa2cFrSazHxerG87oI9wp/c71OilMgTKTWSZSY9wmoXcTsbHrdY2S/sD 12 | 1+yHtY3Si/TK8Q8S4SDwWojpY1856KWwsooS3VMtVV2SLMuCmxn5rey0YLtF9Qtf 13 | ztG53HkRAoGBAPlf8Sfyq3gNCVTE1+FrnqviYAFhUNHcITP2U0CRv5MlUb6mXf1b 14 | jqbqKEgmBdfiy+DFGt7Fh9MpW50gt6IT1RQv/RXewSYSe+RgwYon35fGRAbQ7Zq0 15 | IPjKEovZYUscZ3+D01qLbJPb34Q+aRXuJCz5VZM8iOn8/X87lx+PdKFtAoGBAOBL 16 | vnlxpinsZc+Cj1hjCbk5k6RgnuGSASlDHHKE3PzX/lWcF1+fQgKRohdipRXhTL36 17 | LgTydlBKxN8/kTPJbftup2Iq4tlKMSTE+2/AGlJqOSNFHpR2+C6T+q8v/3VO7Fu3 18 | afq5CEaGNIRPcyO4Abu77Cr3hNWM2CVXzaMomWpHAoGAT1r3i8XOSOKlIIOPSx2L 19 | HZlpAadtJ4sMSdPOBFMdCn8qtyeL607SY01KSkNHQr7aMAmpFlD3evvDOoopxXrY 20 | KJdoyyfagPoK0M71Z7huj4a5KQ4dPkip4WG0aypeqp88VDin7j1F7Ptf8l5F5IOm 21 | oWUqlTMDQqqOJIna+mEVNTUCgYBGrvgGs48G1S28eEuOMh/FVGS3v48yTN260CBt 22 | 4nr132eSOQ+QndKilpx7PCYEQCz8DZRlELfCU9248QJkTI0xWEy9fgBhM6VLDhyi 23 | uepRoJIDEGwzo05Q92dfwAOER2vq92EZlygJeY+hRpxlXD6HmBAz9i7RUYJoOkRe 24 | r5OxTwKBgQC6I4NrS8NRlg8WZOGuaJWQJkwDYsBvsAsM4Oz1IZBlJWG1sjLyu9CN 25 | 1shiQmDfW/Sy7/Tn96SfSsFZSrNboKeAcwFggcAqs1QE5zuBCdbAGa3WoIQxwDnV 26 | Vft6HRYAk+A+13Me7TQ1ZBhjHPB82KMesTVPZkVvSzbH9Lvt5CDZLQ== 27 | -----END RSA PRIVATE KEY----- 28 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/etc/init.d/OpcUaWebServer.in: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | ### BEGIN INIT INFO 4 | # Provides: OpcUaWebServer 5 | # Required-Start: network 6 | # Required-Stop: network 7 | # Default-Start: 2 3 4 5 8 | # Default-Stop: 0 1 6 9 | # Short-Description: opc ua web server 10 | # Description: start stop OpcUaWebServer 11 | ### END INIT INFO 12 | 13 | # 14 | # Copyright 2015-2016 Kai Huebl (kai@huebl-sgh.de) 15 | # 16 | # Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 17 | # Datei nur in Übereinstimmung mit der Lizenz erlaubt. 18 | # Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 19 | # 20 | # Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 21 | # erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 22 | # GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 23 | # 24 | # Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 25 | # im Rahmen der Lizenz finden Sie in der Lizenz. 26 | # 27 | # Autor: Kai Huebl (kai@huebl-sgh.de) 28 | # 29 | # 30 | 31 | . /lib/lsb/init-functions 32 | 33 | 34 | NAME="OpcUaWebServer" 35 | DAEMON="/usr/bin/OpcUaServer@OPCUASTACK_VERSION_MAJOR@" 36 | SERVICE="OpcUaWebServer" 37 | OPTS="/etc/OpcUaStack/OpcUaWebServer/OpcUaServer.xml" 38 | PID=/var/run/${SERVICE}.pid 39 | 40 | SCRIPTNAME=/etc/init.d/$NAME 41 | 42 | do_start() 43 | { 44 | echo "Start $NAME ..." 45 | export LD_LIBRARY_PATH=/usr/lib/OpcUaStack/:$LD_LIBRARY_PATH 46 | start-stop-daemon --start --quiet --background --make-pidfile --pidfile $PID --exec $DAEMON -- $OPTS 47 | echo "STATUS= $?" 48 | } 49 | 50 | do_stop() 51 | { 52 | echo "Stopping $NAME ..." 53 | start-stop-daemon --stop --signal 2 --retry 5 --pidfile $PID --exec $DAEMON 54 | rm $PID 55 | } 56 | 57 | do_status() 58 | { 59 | start-stop-daemon --status --exec $DAEMON 60 | if [ $? -eq 0 ]; then 61 | echo "process $DAMEON running"; 62 | else 63 | echo "process $DAMEON NOT running"; 64 | fi 65 | } 66 | 67 | 68 | case "$1" in 69 | start) 70 | echo "Start $NAME services ..." 71 | do_start 72 | echo " started." 73 | ;; 74 | stop) 75 | do_stop 76 | echo " stopped." 77 | ;; 78 | restart) 79 | do_stop 80 | do_start 81 | echo " done." 82 | ;; 83 | status) 84 | do_status 85 | ;; 86 | *) 87 | echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2 88 | exit 3 89 | ;; 90 | esac 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/etc/init/OpcUaWebServer.conf.in: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2015-2016 Kai Huebl (kai@huebl-sgh.de) 3 | # 4 | # Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 5 | # Datei nur in Übereinstimmung mit der Lizenz erlaubt. 6 | # Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 7 | # 8 | # Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 9 | # erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 10 | # GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 11 | # 12 | # Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 13 | # im Rahmen der Lizenz finden Sie in der Lizenz. 14 | # 15 | # Autor: Kai Huebl (kai@huebl-sgh.de) 16 | # 17 | 18 | # 19 | # opc ua demo application (UPSTART) 20 | # 21 | 22 | description "opc ua application" 23 | 24 | start on runlevel [2345] 25 | stop on runlevel [!2345] 26 | 27 | limit core unlimited unlimited 28 | 29 | # respawn the job up to 5 times within a 60 second period. 30 | # If the job exceeds these values, it will be stopped and 31 | # marked as failed. 32 | respawn 33 | respawn limit 5 60 34 | 35 | # umask for files created by this service 36 | umask 022 37 | 38 | # variables for all script sections 39 | env LD_LIBRARY_PATH=/usr/lib/OpcUaStack/:${LD_LIBRARY_PATH} 40 | 41 | # we have our own logging 42 | console none 43 | 44 | 45 | pre-start script 46 | echo "/var/log/core.%e.%s.%u.%g.%p.%t" > /proc/sys/kernel/core_pattern 47 | end script 48 | 49 | 50 | post-stop script 51 | end script 52 | 53 | 54 | # 55 | # 56 | # 57 | exec /usr/bin/OpcUaServer@OPCUASTACK_VERSION_MAJOR@ /etc/OpcUaStack/OpcUaWebServer/OpcUaServer.xml 58 | 59 | # 60 | # define the kill signal to shutdown the application 61 | # 62 | kill signal SIGINT 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/log/README: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/src/OpcUaWebServer/linux/log/README -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/script/postinst: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # 4 | # Copyright 2015-2018 Kai Huebl (kai@huebl-sgh.de) 5 | # 6 | # Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 7 | # Datei nur in Übereinstimmung mit der Lizenz erlaubt. 8 | # Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 9 | # 10 | # Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 11 | # erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 12 | # GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 13 | # 14 | # Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 15 | # im Rahmen der Lizenz finden Sie in der Lizenz. 16 | # 17 | # Autor: Kai Huebl (kai@huebl-sgh.de), Aleksey Timin (atimin@gmail.com) 18 | # 19 | 20 | echo "POSTINST RUN" 21 | 22 | if [ -x /sbin/start ] && [ -e "/etc/init/OpcUaWebServer.conf" ]; then 23 | # use upstart 24 | echo "INFO: starting daemon by upstart" 25 | /sbin/start OpcUaWebServer 26 | elif [ -x /usr/bin/systemctl ] && [ -e "/usr/lib/systemd/system/OpcUaWebServer.service" ]; then 27 | # use systemd 28 | echo "INFO: starting daemon by systemd" 29 | /usr/bin/systemctl enable OpcUaWebServer.service 30 | /usr/bin/systemctl start OpcUaWebServer.service 31 | else 32 | # use SYSV init script 33 | echo "INFO: starting SYSV init script" 34 | if [ -x "/etc/init.d/OpcUaWebServer" ]; then 35 | update-rc.d OpcUaWebServer defaults >/dev/null 36 | invoke-rc.d OpcUaWebServer start || exit $? 37 | fi 38 | fi 39 | 40 | /sbin/ldconfig 41 | 42 | echo "POSTINST RETURN" 43 | exit 0 44 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/script/postrm: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # 4 | # Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 5 | # 6 | # Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 7 | # Datei nur in Übereinstimmung mit der Lizenz erlaubt. 8 | # Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 9 | # 10 | # Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 11 | # erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 12 | # GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 13 | # 14 | # Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 15 | # im Rahmen der Lizenz finden Sie in der Lizenz. 16 | # 17 | # Autor: Kai Huebl (kai@huebl-sgh.de) 18 | # 19 | 20 | echo "POSTRM RUN" 21 | echo "POSTRM RETURN" 22 | exit 0 23 | 24 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/script/preinst: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # 4 | # Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 5 | # 6 | # Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 7 | # Datei nur in Übereinstimmung mit der Lizenz erlaubt. 8 | # Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 9 | # 10 | # Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 11 | # erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 12 | # GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 13 | # 14 | # Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 15 | # im Rahmen der Lizenz finden Sie in der Lizenz. 16 | # 17 | # Autor: Kai Huebl (kai@huebl-sgh.de) 18 | # 19 | 20 | echo "PREINST RUN" 21 | echo "PREINST RETURN" 22 | exit 0 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/script/prerm: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # 4 | # Copyright 2015 Kai Huebl (kai@huebl-sgh.de) 5 | # 6 | # Lizenziert gemäß Apache Licence Version 2.0 (die „Lizenz“); Nutzung dieser 7 | # Datei nur in Übereinstimmung mit der Lizenz erlaubt. 8 | # Eine Kopie der Lizenz erhalten Sie auf http://www.apache.org/licenses/LICENSE-2.0. 9 | # 10 | # Sofern nicht gemäß geltendem Recht vorgeschrieben oder schriftlich vereinbart, 11 | # erfolgt die Bereitstellung der im Rahmen der Lizenz verbreiteten Software OHNE 12 | # GEWÄHR ODER VORBEHALTE – ganz gleich, ob ausdrücklich oder stillschweigend. 13 | # 14 | # Informationen über die jeweiligen Bedingungen für Genehmigungen und Einschränkungen 15 | # im Rahmen der Lizenz finden Sie in der Lizenz. 16 | # 17 | # Autor: Kai Huebl (kai@huebl-sgh.de) 18 | # 19 | 20 | echo "PRERM RUN" 21 | 22 | if [ -x /sbin/stop ] && [ -e "/etc/init/OpcUaWebServer.conf" ]; then 23 | # use Ubuntu upstart 24 | echo "INFO: stopping daemon by upstart" 25 | /sbin/stop OpcUaWebServer 26 | elif [ -x /usr/bin/systemctl ] && [ -e "/usr/lib/systemd/system/OpcUaWebServer.service" ]; then 27 | # use systemd 28 | echo "INFO: stopping daemon by systemd" 29 | /usr/bin/systemctl stop OpcUaWebServer.service 30 | /usr/bin/systemctl enable OpcUaWebServer.service 31 | else 32 | # use SYSV init script 33 | if [ -e "/etc/init.d/OpcUaWebServer" ]; then 34 | echo "INFO: stopping daemon by SYS init script" 35 | invoke-rc.d OpcUaWebServer stop || exit $? 36 | update-rc.d -f OpcUaWebServer remove >/dev/null 37 | fi 38 | fi 39 | 40 | echo "PRERM RETURN" 41 | exit 0 42 | 43 | -------------------------------------------------------------------------------- /src/OpcUaWebServer/linux/usr/lib/systemd/system/OpcUaWebServer.service.in: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=opc ua web server 3 | 4 | [Service] 5 | Environment="LD_LIBRARY_PATH=/usr/lib/OpcUaStack:${LD_LIBRARY_PATH}" 6 | ExecStart=/usr/bin/OpcUaServer@OPCUASTACK_VERSION_MAJOR@ /etc/OpcUaStack/OpcUaWebServer/OpcUaServer.xml 7 | Restart=on-failure 8 | 9 | [Install] 10 | WantedBy=multi-user.target 11 | -------------------------------------------------------------------------------- /src/icon/asneg.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/src/icon/asneg.ico -------------------------------------------------------------------------------- /src/icon/asneg_install.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/src/icon/asneg_install.ico -------------------------------------------------------------------------------- /src/icon/asneg_uninstall.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ASNeG/OpcUaWebServer/cd6a001f119eda7cf62bbf5ea57900ac47b636f6/src/icon/asneg_uninstall.ico -------------------------------------------------------------------------------- /start.bat: -------------------------------------------------------------------------------- 1 | 2 | @echo OFF 3 | REM 4 | REM added the following string to the Path environment variable 5 | REM 6 | REM Computer -> Systemeigenschaften -> Erweiterte Systemeinstallung -> Umgebungsvariablen 7 | REM 8 | REM Name: Path 9 | REM String: C:\install\usr\lib;C:\local\boost_1_58_0\lib32-msvc-12.0;C:\install\usr\bin 10 | REM 11 | 12 | OpcUaServer3 CONSOLE C:\install\etc\OpcUaStack\OpcUaWebServer\OpcUaServer.xml 13 | 14 | 15 | pause 16 | --------------------------------------------------------------------------------