opcua 0.17 → 0.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -18
- data/Rakefile +20 -12
- data/cert/cert.h +52 -52
- data/cert/cert_key.h +99 -99
- data/example/bug5.rb +1 -1
- data/example/client_get_float.rb +12 -0
- data/example/server_values_callback.rb +36 -0
- data/example/server_xml.rb +85 -0
- data/ext/opcua/client/client.c +2 -2
- data/ext/opcua/helpers/values.c +36 -4
- data/ext/opcua/helpers/values.h +1 -2
- data/ext/opcua/server/server.c +82 -19
- data/opcua.gemspec +2 -2
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb55f4990d49244515c5e88b523c75f0dc5c623e39141ef643a643a8c1dbc81a
|
4
|
+
data.tar.gz: 28fff25fa88401d909166a4849925a61989bf94d1b8e8e7902179445e5bff485
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 567c3aba429205e5300e882cff79db5d9b16150b4480eafabcce9e11d1d4399f97ea5334794590be578f5141d97e94b2def62f08a686fbeb3ad5a4d770ef7ecb
|
7
|
+
data.tar.gz: 346e625516161b7566c94aac0fafe8e659f901fac4a826b5b3d2b374138bfc4394b927cd5074773d0cd5a3cfe41db0f82e23da74a2b284372b7cc065b72e3065
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# OPC-UA Ruby Bindings (open62541)
|
2
2
|
|
3
|
-
The development of OPC UA applications takes currently a lot of effort. This is caused by the large possibilities of the OPC UA specification. With this
|
3
|
+
The development of OPC UA applications takes currently a lot of effort. This is caused by the large possibilities of the OPC UA specification. With this implementation we want to define some conventions, which shoud make the technology more useable.
|
4
4
|
|
5
5
|
## Table of Contents
|
6
6
|
|
@@ -33,32 +33,28 @@ Copyright (C) 2019-* Jürgen "eTM" Mangler <juergen.mangler@gmail.com>. opcua-sm
|
|
33
33
|
|
34
34
|
```sh
|
35
35
|
# Debian/Ubuntu
|
36
|
-
apt install build-essential cmake-curses-gui libmbedtls-dev libxml2-dev libxslt-dev libz-dev libssl-dev libicu-dev
|
36
|
+
apt install build-essential cmake-curses-gui libmbedtls-dev libxml2-dev libxslt-dev libz-dev libssl-dev libicu-dev
|
37
37
|
# Fedora/Redhat
|
38
38
|
dnf install @buildsys-build @development-tools cmake libxml2-devel libxslt-devel zlib-devel libicu-devel mbedtls-devel
|
39
39
|
```
|
40
40
|
|
41
|
-
Dependency: https://github.com/open62541/open62541 >
|
41
|
+
Dependency: https://github.com/open62541/open62541 > 1.1 (master branch as of 2020-06-04)
|
42
42
|
|
43
43
|
```sh
|
44
44
|
git clone https://github.com/open62541/open62541.git
|
45
45
|
cd open62541
|
46
|
-
mkdir build
|
47
|
-
|
48
|
-
cmake ..
|
49
|
-
ccmake ..
|
50
|
-
# Configuration, see picture below
|
46
|
+
mkdir build && cd build
|
47
|
+
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUA_ENABLE_AMALGAMATION=ON -DUA_ENABLE_ENCRYPTION=ON -DUA_ENABLE_ENCRYPTION_MBEDTLS=ON ..
|
51
48
|
make
|
52
49
|
sudo make install
|
53
50
|
gem install opcua
|
54
51
|
```
|
55
52
|
|
56
|
-
![ccmake Config](config.png)
|
57
|
-
|
58
53
|
If the installation works correctly, but examples are still complaining about missing lib62541.so, try this:
|
59
54
|
|
60
55
|
```sh
|
61
|
-
sudo echo "/usr/local/lib"
|
56
|
+
sudo echo "/usr/local/lib" >> /etc/ld.so.conf.d/local.conf # add to libs path
|
57
|
+
sudo echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local.conf # add to libs path
|
62
58
|
sudo ldconfig # update libs
|
63
59
|
sudo ldconfig -p | grep libopen62541 # check if its there
|
64
60
|
```
|
@@ -75,7 +71,7 @@ The server has following functions:
|
|
75
71
|
* Find nodes in the adress space
|
76
72
|
* Loop for getting real life data
|
77
73
|
|
78
|
-
Every server application uses the
|
74
|
+
Every server application uses the Daemonite gem, which allows to run the server as service.
|
79
75
|
```ruby
|
80
76
|
Daemonite.new do
|
81
77
|
on startup do |opts|
|
@@ -101,7 +97,7 @@ server.add_namespace "https://yourdomain/testserver"
|
|
101
97
|
```
|
102
98
|
|
103
99
|
|
104
|
-
#### Create ObjectTypes
|
100
|
+
#### Create ObjectTypes
|
105
101
|
|
106
102
|
Basically all new created types are subtypes of the _BaseObjectType_. With ```server.types.add_object_type(:TestObjectType)``` a new type is defined in the information model. All nodes of the new created type are defined in the ```tap{}``` region.
|
107
103
|
|
@@ -137,7 +133,7 @@ With ```.add_object(:TestObject)``` a new object named _TestObject_ is added. Th
|
|
137
133
|
|
138
134
|
##### Add Method
|
139
135
|
|
140
|
-
Methods are added with the ```.add_method(:TestMethod)``` function. Per default the method has no input and output arguments. By adding additional arguments you can define input arguments. The code for defining a method with input arguments looks like
|
136
|
+
Methods are added with the ```.add_method(:TestMethod)``` function. Per default the method has no input and output arguments. By adding additional arguments you can define input arguments. The code for defining a method with input arguments looks like
|
141
137
|
```ruby
|
142
138
|
t.add_method :TestMethod, inputarg1: OPCUA::TYPES::STRING, inputarg2: OPCUA::TYPES::DATETIME do |node, inputarg1, inputarg2|
|
143
139
|
#do some stuff here
|
@@ -148,7 +144,7 @@ in the ```do...end```section you write the code which should be executed by call
|
|
148
144
|
|
149
145
|
#### Manifest Objects
|
150
146
|
|
151
|
-
ObjectTypes can be instiantiated with the ```.manifest``` method.
|
147
|
+
ObjectTypes can be instiantiated with the ```.manifest``` method.
|
152
148
|
|
153
149
|
```ruby
|
154
150
|
testobject =server.objects.manifest(:TestObjectType, to)
|
@@ -164,7 +160,7 @@ testobject.delete!
|
|
164
160
|
|
165
161
|
#### Find Nodes in the Addressspace
|
166
162
|
|
167
|
-
To get a specific node you should use the ```.find``` method.
|
163
|
+
To get a specific node you should use the ```.find``` method.
|
168
164
|
```ruby
|
169
165
|
tv = to.find :TestVariable
|
170
166
|
```
|
@@ -195,7 +191,7 @@ You can assign vlaues without definig a datatype. The correct _DataType_ will be
|
|
195
191
|
#### Loop for getting Real Life Data
|
196
192
|
The server loop looks like follows:
|
197
193
|
```ruby
|
198
|
-
run do
|
194
|
+
run do
|
199
195
|
sleep server.run
|
200
196
|
to.value = 'Testvariable1'
|
201
197
|
p to.value
|
@@ -204,7 +200,7 @@ The server loop looks like follows:
|
|
204
200
|
end
|
205
201
|
```
|
206
202
|
|
207
|
-
The loop starts with ```sleep server.run```. This is recommended by the open62541 developer. With the ```.value``` function you can write or get the value of a node.
|
203
|
+
The loop starts with ```sleep server.run```. This is recommended by the open62541 developer. With the ```.value``` function you can write or get the value of a node.
|
208
204
|
|
209
205
|
### Client
|
210
206
|
TBD. See examples subdirectory.
|
data/Rakefile
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
require 'rubygems/package_task'
|
2
|
-
require 'rake/extensiontask'
|
3
2
|
require 'fileutils'
|
4
3
|
|
5
4
|
spec = eval(File.read('opcua.gemspec'))
|
6
5
|
|
7
|
-
|
6
|
+
task :compile do
|
7
|
+
require 'rake/extensiontask'
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
puts `cert/generate_certificate.sh`
|
10
|
+
spec.extensions.each do |f|
|
11
|
+
Rake.application.clear
|
11
12
|
|
12
|
-
|
13
|
+
task :default => [:compile]
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
t = Rake::ExtensionTask.new "opcua/" + File.basename(File.dirname(f)), spec
|
16
|
+
Rake::Task[:default].invoke
|
17
|
+
end
|
18
|
+
Rake.application.clear
|
16
19
|
end
|
17
|
-
Rake.application.clear
|
18
20
|
|
19
|
-
task :default => [:
|
21
|
+
task :default => [:compile]
|
20
22
|
|
21
|
-
|
23
|
+
Gem::PackageTask.new(spec) do |pkg|
|
22
24
|
pkg.need_zip = true
|
23
25
|
pkg.need_tar = true
|
24
26
|
FileUtils.mkdir 'pkg' rescue nil
|
@@ -26,10 +28,16 @@ pkg = Gem::PackageTask.new(spec) do |pkg|
|
|
26
28
|
FileUtils.ln_sf "#{pkg.name}.gem", "pkg/#{spec.name}.gem"
|
27
29
|
end
|
28
30
|
|
29
|
-
task :push => :gem do
|
31
|
+
task :push => :gem do
|
30
32
|
`gem push pkg/opcua.gem`
|
31
33
|
end
|
32
34
|
|
33
|
-
task :install => :gem do
|
35
|
+
task :install => :gem do
|
34
36
|
`gem install pkg/opcua.gem`
|
35
37
|
end
|
38
|
+
|
39
|
+
task :clean do
|
40
|
+
FileUtils.rm_rf(File.join(__dir__,'tmp'))
|
41
|
+
FileUtils.rm_rf(File.join(__dir__,'lib','opcua','client.so'))
|
42
|
+
FileUtils.rm_rf(File.join(__dir__,'lib','opcua','server.so'))
|
43
|
+
end
|
data/cert/cert.h
CHANGED
@@ -1,70 +1,70 @@
|
|
1
1
|
unsigned char cert_der[] = {
|
2
2
|
0x30, 0x82, 0x03, 0x18, 0x30, 0x82, 0x02, 0x00, 0xa0, 0x03, 0x02, 0x01,
|
3
|
-
0x02, 0x02, 0x14,
|
4
|
-
|
3
|
+
0x02, 0x02, 0x14, 0x03, 0xe0, 0x16, 0xe5, 0x39, 0x98, 0x1c, 0x2d, 0x5b,
|
4
|
+
0x5c, 0x16, 0xa8, 0x17, 0xae, 0xe2, 0xff, 0xb7, 0x3f, 0x00, 0xc2, 0x30,
|
5
5
|
0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
|
6
6
|
0x05, 0x00, 0x30, 0x15, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,
|
7
7
|
0x03, 0x0c, 0x0a, 0x72, 0x75, 0x62, 0x79, 0x2d, 0x6f, 0x70, 0x63, 0x75,
|
8
|
-
0x61, 0x30, 0x1e, 0x17, 0x0d, 0x32,
|
9
|
-
|
10
|
-
0x31,
|
8
|
+
0x61, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x31, 0x32, 0x33, 0x32,
|
9
|
+
0x33, 0x30, 0x30, 0x31, 0x32, 0x5a, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x31,
|
10
|
+
0x31, 0x33, 0x32, 0x33, 0x30, 0x30, 0x31, 0x32, 0x5a, 0x30, 0x15, 0x31,
|
11
11
|
0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0a, 0x72, 0x75,
|
12
12
|
0x62, 0x79, 0x2d, 0x6f, 0x70, 0x63, 0x75, 0x61, 0x30, 0x82, 0x01, 0x22,
|
13
13
|
0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
|
14
14
|
0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a,
|
15
|
-
0x02, 0x82, 0x01, 0x01, 0x00,
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
15
|
+
0x02, 0x82, 0x01, 0x01, 0x00, 0x9a, 0x1b, 0x4c, 0x3a, 0xa9, 0x97, 0x95,
|
16
|
+
0xa0, 0xda, 0xd0, 0x87, 0x63, 0xae, 0x1a, 0xad, 0xb8, 0xa0, 0x1c, 0xf6,
|
17
|
+
0xbc, 0xd0, 0xeb, 0x82, 0x18, 0x9e, 0x93, 0xe4, 0x4f, 0x4e, 0x45, 0x7a,
|
18
|
+
0xe2, 0xf6, 0x03, 0x0b, 0x6d, 0xdc, 0xef, 0xea, 0x9a, 0x99, 0x73, 0xa8,
|
19
|
+
0xfc, 0x4e, 0xb1, 0xce, 0xff, 0x7f, 0xa2, 0x6a, 0x36, 0xd1, 0x3e, 0xba,
|
20
|
+
0x47, 0x08, 0xab, 0x48, 0x1f, 0xe8, 0xe5, 0x18, 0x9e, 0xb3, 0xfe, 0x86,
|
21
|
+
0xd5, 0x98, 0xa2, 0xd7, 0xda, 0xdb, 0x31, 0x38, 0xc7, 0xca, 0x55, 0x29,
|
22
|
+
0x09, 0x16, 0x6a, 0x22, 0x62, 0xc0, 0x2d, 0x00, 0xb5, 0x41, 0xb2, 0xca,
|
23
|
+
0x90, 0xf6, 0xa2, 0x25, 0xa5, 0xd9, 0xfe, 0x36, 0x76, 0x79, 0xb4, 0xb5,
|
24
|
+
0x78, 0x95, 0x44, 0x18, 0x2e, 0x39, 0x3e, 0xb6, 0x3b, 0x97, 0xd2, 0xb9,
|
25
|
+
0xab, 0x24, 0xbc, 0xc6, 0x1c, 0x88, 0xe1, 0x64, 0x8d, 0x30, 0xb0, 0xf4,
|
26
|
+
0x4b, 0x28, 0xd7, 0xd2, 0x3a, 0xfc, 0x28, 0x0b, 0x7e, 0x4d, 0xbb, 0xcb,
|
27
|
+
0x15, 0x22, 0xb5, 0x49, 0xdc, 0x74, 0xfa, 0x75, 0xa4, 0x4f, 0x5a, 0x54,
|
28
|
+
0xb7, 0xd2, 0x19, 0x20, 0xb5, 0x24, 0x7a, 0x76, 0xac, 0x75, 0x69, 0x35,
|
29
|
+
0x4a, 0x07, 0xa3, 0x59, 0x1a, 0x2f, 0x9b, 0xb3, 0xe3, 0xb5, 0x73, 0xad,
|
30
|
+
0x89, 0xc0, 0x43, 0xb4, 0x80, 0xd6, 0x47, 0x49, 0x0a, 0x8d, 0x37, 0x0b,
|
31
|
+
0x28, 0x63, 0x8e, 0xbf, 0x19, 0x97, 0xde, 0xe5, 0xb8, 0xaf, 0x63, 0x7f,
|
32
|
+
0x64, 0xe6, 0xa7, 0x2d, 0xbe, 0xa6, 0xbe, 0xe5, 0xa3, 0x19, 0xc1, 0x48,
|
33
|
+
0x3e, 0xcc, 0x15, 0x0c, 0xeb, 0x76, 0x90, 0xd1, 0x5c, 0xea, 0x44, 0x87,
|
34
|
+
0xd1, 0xac, 0x98, 0x58, 0x82, 0x59, 0x7a, 0x47, 0xa9, 0x80, 0x43, 0x2e,
|
35
|
+
0x67, 0x02, 0xca, 0xc7, 0xf7, 0xba, 0xa3, 0x1f, 0xde, 0x0e, 0xed, 0xc6,
|
36
|
+
0x61, 0xf8, 0xa5, 0x60, 0xc6, 0xfd, 0x49, 0x9e, 0x6f, 0x02, 0x03, 0x01,
|
37
37
|
0x00, 0x01, 0xa3, 0x60, 0x30, 0x5e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,
|
38
|
-
0x0e, 0x04, 0x16, 0x04, 0x14,
|
39
|
-
|
40
|
-
|
38
|
+
0x0e, 0x04, 0x16, 0x04, 0x14, 0xb8, 0x83, 0xec, 0xd8, 0x90, 0xf4, 0x00,
|
39
|
+
0xab, 0xdc, 0x1d, 0x0e, 0xca, 0xe2, 0x92, 0x48, 0xfd, 0xec, 0x06, 0x1d,
|
40
|
+
0xee, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
|
41
41
|
0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x1c, 0x06, 0x03, 0x55, 0x1d,
|
42
42
|
0x11, 0x04, 0x15, 0x30, 0x13, 0x86, 0x11, 0x72, 0x75, 0x62, 0x79, 0x2d,
|
43
43
|
0x6f, 0x70, 0x63, 0x75, 0x61, 0x3a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
|
44
44
|
0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,
|
45
45
|
0x03, 0x02, 0x05, 0xa0, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
|
46
46
|
0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
47
|
+
0x91, 0x40, 0xc9, 0x19, 0x2e, 0xe5, 0x2a, 0x79, 0xd8, 0x36, 0x10, 0xd9,
|
48
|
+
0xbe, 0x13, 0x07, 0x06, 0x69, 0x34, 0x0b, 0x07, 0xdc, 0x4d, 0x5a, 0xf1,
|
49
|
+
0xcd, 0xb0, 0x71, 0x41, 0xe1, 0xfb, 0xc3, 0x54, 0xa5, 0x80, 0xd8, 0xd3,
|
50
|
+
0xab, 0x43, 0x9d, 0xf1, 0xdf, 0x66, 0xd8, 0x89, 0xf7, 0x97, 0xc6, 0x41,
|
51
|
+
0x68, 0xd0, 0x5e, 0xa7, 0xd3, 0x7e, 0x2f, 0x5a, 0x28, 0xa3, 0xf0, 0x05,
|
52
|
+
0x6f, 0xda, 0x26, 0x75, 0x8c, 0xca, 0x23, 0x1f, 0x9f, 0xda, 0x37, 0x5a,
|
53
|
+
0xa6, 0x3c, 0xdc, 0x92, 0xb9, 0xfa, 0xc3, 0x65, 0xbb, 0x53, 0xe6, 0x37,
|
54
|
+
0x40, 0x87, 0x48, 0x1f, 0xbc, 0x27, 0x72, 0x6f, 0x7c, 0xb7, 0x68, 0x2e,
|
55
|
+
0x71, 0xa4, 0xc8, 0x82, 0x08, 0x3f, 0x10, 0xa6, 0x4c, 0x31, 0xaf, 0xb6,
|
56
|
+
0x63, 0xb0, 0x25, 0xd8, 0xb3, 0x6d, 0xb7, 0xe6, 0xf0, 0x80, 0x77, 0x17,
|
57
|
+
0x10, 0x68, 0x47, 0xe8, 0x08, 0x3d, 0xa8, 0x9c, 0xb7, 0x95, 0x73, 0xb6,
|
58
|
+
0xe1, 0xa3, 0xb0, 0xbc, 0x86, 0x68, 0x50, 0x18, 0x4e, 0x02, 0xc0, 0x22,
|
59
|
+
0x11, 0x63, 0x2c, 0xdf, 0x2e, 0x45, 0xb8, 0x93, 0xe8, 0x70, 0x6d, 0x8f,
|
60
|
+
0x0a, 0x84, 0x6f, 0x62, 0x5e, 0x4e, 0x01, 0x23, 0x01, 0xe1, 0x42, 0x1f,
|
61
|
+
0xeb, 0x24, 0xbe, 0xe9, 0x64, 0x9a, 0xff, 0x28, 0xb2, 0x48, 0xad, 0xbe,
|
62
|
+
0xff, 0x28, 0x19, 0xac, 0x83, 0xb1, 0x9f, 0xdf, 0xb2, 0xb9, 0x94, 0xe9,
|
63
|
+
0x9d, 0x6b, 0x97, 0x1c, 0x0b, 0x4a, 0x79, 0x82, 0x50, 0xd4, 0xa1, 0xaf,
|
64
|
+
0x3d, 0x30, 0xf9, 0xf0, 0xdb, 0x89, 0x57, 0xb2, 0x66, 0x0c, 0xd6, 0x45,
|
65
|
+
0xc3, 0xb6, 0x97, 0x46, 0x37, 0x92, 0x49, 0x1f, 0x39, 0x81, 0x3d, 0xa6,
|
66
|
+
0xd6, 0x2a, 0x62, 0x46, 0x31, 0xeb, 0x10, 0x80, 0xba, 0x2b, 0x00, 0x92,
|
67
|
+
0x75, 0x9f, 0xc7, 0xd0, 0xfd, 0x4a, 0x56, 0xf6, 0xbc, 0xc3, 0x3f, 0x9a,
|
68
|
+
0xf2, 0x94, 0x46, 0xa2
|
69
69
|
};
|
70
70
|
unsigned int cert_der_len = 796;
|
data/cert/cert_key.h
CHANGED
@@ -1,103 +1,103 @@
|
|
1
1
|
unsigned char cert_key_der[] = {
|
2
2
|
0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
0x88,
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
3
|
+
0x9a, 0x1b, 0x4c, 0x3a, 0xa9, 0x97, 0x95, 0xa0, 0xda, 0xd0, 0x87, 0x63,
|
4
|
+
0xae, 0x1a, 0xad, 0xb8, 0xa0, 0x1c, 0xf6, 0xbc, 0xd0, 0xeb, 0x82, 0x18,
|
5
|
+
0x9e, 0x93, 0xe4, 0x4f, 0x4e, 0x45, 0x7a, 0xe2, 0xf6, 0x03, 0x0b, 0x6d,
|
6
|
+
0xdc, 0xef, 0xea, 0x9a, 0x99, 0x73, 0xa8, 0xfc, 0x4e, 0xb1, 0xce, 0xff,
|
7
|
+
0x7f, 0xa2, 0x6a, 0x36, 0xd1, 0x3e, 0xba, 0x47, 0x08, 0xab, 0x48, 0x1f,
|
8
|
+
0xe8, 0xe5, 0x18, 0x9e, 0xb3, 0xfe, 0x86, 0xd5, 0x98, 0xa2, 0xd7, 0xda,
|
9
|
+
0xdb, 0x31, 0x38, 0xc7, 0xca, 0x55, 0x29, 0x09, 0x16, 0x6a, 0x22, 0x62,
|
10
|
+
0xc0, 0x2d, 0x00, 0xb5, 0x41, 0xb2, 0xca, 0x90, 0xf6, 0xa2, 0x25, 0xa5,
|
11
|
+
0xd9, 0xfe, 0x36, 0x76, 0x79, 0xb4, 0xb5, 0x78, 0x95, 0x44, 0x18, 0x2e,
|
12
|
+
0x39, 0x3e, 0xb6, 0x3b, 0x97, 0xd2, 0xb9, 0xab, 0x24, 0xbc, 0xc6, 0x1c,
|
13
|
+
0x88, 0xe1, 0x64, 0x8d, 0x30, 0xb0, 0xf4, 0x4b, 0x28, 0xd7, 0xd2, 0x3a,
|
14
|
+
0xfc, 0x28, 0x0b, 0x7e, 0x4d, 0xbb, 0xcb, 0x15, 0x22, 0xb5, 0x49, 0xdc,
|
15
|
+
0x74, 0xfa, 0x75, 0xa4, 0x4f, 0x5a, 0x54, 0xb7, 0xd2, 0x19, 0x20, 0xb5,
|
16
|
+
0x24, 0x7a, 0x76, 0xac, 0x75, 0x69, 0x35, 0x4a, 0x07, 0xa3, 0x59, 0x1a,
|
17
|
+
0x2f, 0x9b, 0xb3, 0xe3, 0xb5, 0x73, 0xad, 0x89, 0xc0, 0x43, 0xb4, 0x80,
|
18
|
+
0xd6, 0x47, 0x49, 0x0a, 0x8d, 0x37, 0x0b, 0x28, 0x63, 0x8e, 0xbf, 0x19,
|
19
|
+
0x97, 0xde, 0xe5, 0xb8, 0xaf, 0x63, 0x7f, 0x64, 0xe6, 0xa7, 0x2d, 0xbe,
|
20
|
+
0xa6, 0xbe, 0xe5, 0xa3, 0x19, 0xc1, 0x48, 0x3e, 0xcc, 0x15, 0x0c, 0xeb,
|
21
|
+
0x76, 0x90, 0xd1, 0x5c, 0xea, 0x44, 0x87, 0xd1, 0xac, 0x98, 0x58, 0x82,
|
22
|
+
0x59, 0x7a, 0x47, 0xa9, 0x80, 0x43, 0x2e, 0x67, 0x02, 0xca, 0xc7, 0xf7,
|
23
|
+
0xba, 0xa3, 0x1f, 0xde, 0x0e, 0xed, 0xc6, 0x61, 0xf8, 0xa5, 0x60, 0xc6,
|
24
|
+
0xfd, 0x49, 0x9e, 0x6f, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
|
25
|
+
0x01, 0x00, 0x86, 0x78, 0x3f, 0x62, 0x08, 0xcd, 0xee, 0x90, 0x77, 0x9e,
|
26
|
+
0xf2, 0x24, 0xb6, 0xad, 0x2c, 0xdd, 0x27, 0x49, 0x5e, 0xbb, 0x8f, 0x89,
|
27
|
+
0x90, 0xf1, 0xae, 0x9d, 0xd9, 0xe0, 0xa1, 0xa9, 0xda, 0xfa, 0xe4, 0x33,
|
28
|
+
0xef, 0xeb, 0x23, 0x98, 0x6d, 0x9c, 0x0d, 0x3e, 0x71, 0x3c, 0x07, 0xe6,
|
29
|
+
0xfb, 0x7a, 0xd2, 0x82, 0x84, 0x2f, 0xe5, 0x11, 0xd9, 0x35, 0x56, 0x89,
|
30
|
+
0x2e, 0xdc, 0x39, 0x3a, 0x7e, 0xeb, 0x2c, 0xa0, 0x72, 0x43, 0x3b, 0x77,
|
31
|
+
0x0c, 0xe7, 0x39, 0xd0, 0x8f, 0x7d, 0x36, 0x3e, 0x6d, 0x1a, 0x32, 0xe6,
|
32
|
+
0xd5, 0xae, 0x59, 0x86, 0x6b, 0x51, 0xbe, 0x4c, 0x26, 0x99, 0xab, 0xbb,
|
33
|
+
0xfd, 0x21, 0xe5, 0x3f, 0xff, 0x82, 0x0d, 0xdc, 0xf3, 0x64, 0x8e, 0xca,
|
34
|
+
0xe6, 0x56, 0x9f, 0x38, 0xeb, 0x86, 0xc0, 0x89, 0xed, 0xdd, 0x3a, 0xa7,
|
35
|
+
0x46, 0x2f, 0x6b, 0xf9, 0x50, 0xe6, 0x2a, 0x90, 0x9d, 0xf9, 0x04, 0xb7,
|
36
|
+
0xd8, 0xc3, 0xf6, 0x96, 0x9d, 0xc9, 0xd8, 0xa8, 0x67, 0x04, 0x66, 0xb5,
|
37
|
+
0x90, 0x29, 0xfa, 0xc9, 0x3c, 0xd7, 0x7c, 0x40, 0xf5, 0x4b, 0x69, 0x7e,
|
38
|
+
0x2a, 0xed, 0x67, 0x36, 0xdd, 0x86, 0x4c, 0x5b, 0xb8, 0x7c, 0xa1, 0x9b,
|
39
|
+
0x18, 0xe0, 0x69, 0x4d, 0xe3, 0x4f, 0x84, 0x4c, 0x75, 0x58, 0xdf, 0x35,
|
40
|
+
0x26, 0x8a, 0x73, 0xae, 0x1a, 0xae, 0x5c, 0x4c, 0xf9, 0xdd, 0x8a, 0x78,
|
41
|
+
0x69, 0x79, 0x4c, 0xa0, 0x65, 0x1e, 0x8c, 0xb9, 0x1a, 0xaa, 0x75, 0x24,
|
42
|
+
0x74, 0x28, 0xfb, 0x81, 0x4d, 0xd7, 0xd2, 0xfc, 0x38, 0xe8, 0xda, 0x48,
|
43
|
+
0x3e, 0x47, 0x31, 0xc5, 0x95, 0xf2, 0x8b, 0xb2, 0x36, 0x6a, 0xbe, 0x74,
|
44
|
+
0xcf, 0x9c, 0x7c, 0xc0, 0x04, 0x0d, 0x77, 0x8f, 0x0c, 0x31, 0x50, 0x71,
|
45
|
+
0x09, 0xf4, 0xf0, 0x8c, 0x36, 0x82, 0xb5, 0xa4, 0xdd, 0x78, 0x5b, 0x71,
|
46
|
+
0xfd, 0x70, 0x96, 0x6b, 0x10, 0x81, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x10,
|
47
|
+
0x48, 0xfc, 0x31, 0x0f, 0xb9, 0x2e, 0x70, 0x57, 0xd0, 0xb5, 0xdc, 0x26,
|
48
|
+
0xbb, 0x8d, 0x7d, 0xb6, 0xb0, 0x76, 0x32, 0x25, 0x90, 0xe5, 0xdd, 0x3c,
|
49
|
+
0x1c, 0xf7, 0x68, 0xc8, 0xf7, 0xff, 0x26, 0x5e, 0xae, 0xc1, 0x64, 0x3b,
|
50
|
+
0x55, 0xa1, 0x45, 0x66, 0xb8, 0x5d, 0x71, 0x86, 0x42, 0x2f, 0x98, 0x74,
|
51
|
+
0x3f, 0xae, 0xb1, 0x18, 0x87, 0x29, 0x12, 0xbd, 0xe6, 0x01, 0x30, 0x4c,
|
52
|
+
0x0a, 0x6c, 0x63, 0x0a, 0xaa, 0x32, 0x84, 0xc0, 0xae, 0x96, 0xa0, 0xb6,
|
53
|
+
0x6f, 0x59, 0x85, 0x4c, 0xa7, 0x6c, 0x80, 0x4b, 0x82, 0x9f, 0xca, 0x38,
|
54
|
+
0x03, 0x30, 0xdb, 0x11, 0x32, 0x11, 0x7f, 0xb0, 0x12, 0x8d, 0x05, 0x42,
|
55
|
+
0x01, 0x60, 0xb4, 0xfe, 0x04, 0x49, 0xbe, 0x2e, 0x53, 0xff, 0x04, 0xdc,
|
56
|
+
0x1a, 0x1c, 0x03, 0xf0, 0xfa, 0xaf, 0x7a, 0x31, 0x76, 0x89, 0xbd, 0x75,
|
57
|
+
0xb8, 0x95, 0x9f, 0x5e, 0x04, 0xe1, 0x02, 0x81, 0x81, 0x00, 0xc4, 0x36,
|
58
|
+
0x88, 0x20, 0x81, 0xe6, 0x50, 0xe5, 0x31, 0xa3, 0xb0, 0xd3, 0x9f, 0xcb,
|
59
|
+
0x41, 0x44, 0x93, 0x6b, 0xf4, 0x3c, 0x31, 0x50, 0x27, 0xa7, 0xf4, 0x0c,
|
60
|
+
0xeb, 0xe8, 0xd7, 0xa7, 0x31, 0xff, 0x08, 0xd2, 0x1d, 0xc7, 0x7d, 0x58,
|
61
|
+
0xe8, 0x44, 0x00, 0x1a, 0xf1, 0x99, 0x16, 0x38, 0xa3, 0x19, 0x19, 0x49,
|
62
|
+
0xc2, 0x3b, 0x7c, 0xf2, 0xe2, 0xaa, 0x5b, 0x9d, 0x47, 0x98, 0x0b, 0x9d,
|
63
|
+
0xa7, 0x2d, 0x28, 0x1b, 0x9b, 0xdf, 0xe7, 0xd4, 0x16, 0x8b, 0x64, 0xb3,
|
64
|
+
0x1c, 0xdc, 0xfa, 0xef, 0xe5, 0x4d, 0x74, 0x0f, 0xe9, 0x52, 0x63, 0x99,
|
65
|
+
0xde, 0x48, 0x08, 0x56, 0xee, 0x57, 0x98, 0x26, 0x04, 0xf4, 0x56, 0xd4,
|
66
|
+
0xeb, 0xc4, 0x6d, 0xc0, 0x82, 0x98, 0x5f, 0x07, 0x8a, 0x71, 0x76, 0x2c,
|
67
|
+
0x3b, 0x1a, 0xcb, 0xc1, 0xf8, 0x46, 0xfe, 0xec, 0x44, 0xf8, 0x4e, 0x7a,
|
68
|
+
0x95, 0x2c, 0x6f, 0x2c, 0xbd, 0x4f, 0x02, 0x81, 0x80, 0x5b, 0xef, 0x14,
|
69
|
+
0x50, 0x2b, 0xe6, 0xb2, 0x97, 0xa7, 0x4a, 0x9f, 0xe5, 0xe7, 0xa9, 0xd6,
|
70
|
+
0x2c, 0x16, 0x05, 0x48, 0x9e, 0x62, 0xc3, 0x86, 0x83, 0x74, 0x2b, 0x1e,
|
71
|
+
0x5b, 0x8a, 0x10, 0x0a, 0x45, 0x22, 0x38, 0x3c, 0xd3, 0xb4, 0x8e, 0xe4,
|
72
|
+
0xd2, 0x7e, 0xb7, 0x3f, 0x29, 0x8a, 0xd5, 0x06, 0xc2, 0x58, 0x85, 0x1e,
|
73
|
+
0xf1, 0x33, 0x8c, 0xb1, 0x90, 0x78, 0x3f, 0x58, 0x41, 0xc6, 0xe1, 0x9e,
|
74
|
+
0x0a, 0x7d, 0x26, 0xcd, 0x37, 0x98, 0x37, 0xba, 0x1c, 0xa9, 0x93, 0x81,
|
75
|
+
0x4a, 0x7f, 0x86, 0xd3, 0x2e, 0xeb, 0x62, 0x9b, 0x71, 0x90, 0xb7, 0x17,
|
76
|
+
0xce, 0x68, 0xfc, 0x6d, 0xd6, 0x4e, 0x7a, 0x25, 0xa1, 0x51, 0x7c, 0x22,
|
77
|
+
0xc1, 0x23, 0x40, 0xda, 0x99, 0x15, 0x5a, 0x7d, 0x91, 0xa7, 0x99, 0x34,
|
78
|
+
0x5f, 0x06, 0xf6, 0x52, 0xc9, 0x95, 0xa7, 0xb4, 0x39, 0xba, 0xe5, 0x6e,
|
79
|
+
0xe7, 0x0b, 0x1d, 0xa4, 0x41, 0x02, 0x81, 0x80, 0x64, 0x52, 0x0d, 0x5f,
|
80
|
+
0xb1, 0x8a, 0xf4, 0xa9, 0x7a, 0xab, 0xda, 0xe9, 0x18, 0xb6, 0x6f, 0x74,
|
81
|
+
0x84, 0x7b, 0x99, 0xb0, 0x7c, 0xf6, 0x22, 0x90, 0x78, 0xf3, 0x72, 0x5a,
|
82
|
+
0xe6, 0x88, 0x11, 0xc3, 0xf7, 0xda, 0x96, 0x67, 0x3c, 0xeb, 0x8c, 0x35,
|
83
|
+
0xd8, 0x67, 0xee, 0x46, 0xfb, 0x59, 0x91, 0xea, 0x6f, 0x47, 0x8b, 0x0b,
|
84
|
+
0xa7, 0x62, 0xf8, 0x09, 0x6a, 0x36, 0x0c, 0x38, 0xed, 0x17, 0x7a, 0x36,
|
85
|
+
0x58, 0x5f, 0x65, 0x5f, 0x21, 0xc5, 0x0a, 0x91, 0xd2, 0xb6, 0xd1, 0x77,
|
86
|
+
0x1a, 0xc6, 0x35, 0x53, 0x58, 0x98, 0x1a, 0x0f, 0x89, 0xe5, 0x4e, 0x05,
|
87
|
+
0x3e, 0x5e, 0x54, 0x16, 0x6d, 0x30, 0x63, 0x30, 0x1a, 0x85, 0x5a, 0xd6,
|
88
|
+
0x5f, 0xd7, 0x21, 0xee, 0x8e, 0x07, 0xe8, 0xfd, 0x02, 0x12, 0xb3, 0x55,
|
89
|
+
0x8c, 0x00, 0x6c, 0xd4, 0xbf, 0xda, 0x45, 0x99, 0x3f, 0x66, 0xe5, 0x86,
|
90
|
+
0x86, 0x81, 0x35, 0x79, 0x02, 0x81, 0x81, 0x00, 0xc0, 0x47, 0x19, 0xc5,
|
91
|
+
0x04, 0xd5, 0x06, 0x87, 0x64, 0xa9, 0x6b, 0xb5, 0x3e, 0x4d, 0xca, 0x45,
|
92
|
+
0xe5, 0x15, 0xca, 0x32, 0x5c, 0x72, 0x77, 0x6b, 0x61, 0x36, 0xdc, 0x94,
|
93
|
+
0x70, 0xda, 0x87, 0xf3, 0xde, 0xa6, 0xc8, 0xaf, 0x20, 0x5c, 0x44, 0x4e,
|
94
|
+
0xa6, 0xa4, 0xcb, 0xce, 0x8b, 0xfc, 0x3e, 0xaa, 0x4e, 0xd0, 0xc8, 0xf7,
|
95
|
+
0xf0, 0x64, 0x27, 0xc9, 0x5d, 0x14, 0xea, 0xc6, 0xe0, 0xfb, 0x5f, 0xb4,
|
96
|
+
0x8f, 0xbc, 0x74, 0xcc, 0x96, 0x85, 0xf0, 0x4b, 0xa0, 0x9e, 0x87, 0x11,
|
97
|
+
0xcd, 0x4d, 0xc3, 0xa9, 0x75, 0xd4, 0xfc, 0x91, 0x2e, 0xec, 0xa6, 0xe8,
|
98
|
+
0x33, 0xd1, 0x38, 0xa2, 0x48, 0x3a, 0xbb, 0x78, 0x0b, 0x3f, 0x6b, 0xef,
|
99
|
+
0xde, 0x07, 0x5b, 0x8c, 0xc6, 0x9e, 0x07, 0x1e, 0x78, 0x76, 0x23, 0xe7,
|
100
|
+
0x96, 0xcc, 0xdf, 0xf0, 0xf0, 0xe3, 0xd8, 0xc6, 0x9c, 0xee, 0x4f, 0xc9,
|
101
|
+
0x51, 0x68, 0xe5, 0x42
|
102
102
|
};
|
103
103
|
unsigned int cert_key_der_len = 1192;
|
data/example/bug5.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require_relative '../lib/opcua/client'
|
3
|
+
|
4
|
+
client = OPCUA::Client.new("opc.tcp://128.130.57.76:4840")
|
5
|
+
client.subscription_interval = 100 # default 500
|
6
|
+
|
7
|
+
if (node = client.get 1, 'DISPLAY_VOLTAGE') # get node from nodeid
|
8
|
+
p node
|
9
|
+
p node.value
|
10
|
+
else
|
11
|
+
p 'invalid nodeid'
|
12
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require_relative '../lib/opcua/server'
|
3
|
+
#require 'opcua/server'
|
4
|
+
|
5
|
+
Daemonite.new do
|
6
|
+
on startup do |opts|
|
7
|
+
opts['server'] = OPCUA::Server.new
|
8
|
+
opts['server'].add_namespace "https://centurio.work/kelch"
|
9
|
+
|
10
|
+
t = opts['server'].types.add_object_type(:Test).tap{ |t|
|
11
|
+
t.add_variable :Wert do |e|
|
12
|
+
p e.id
|
13
|
+
p e.value
|
14
|
+
end
|
15
|
+
}
|
16
|
+
|
17
|
+
v = opts['server'].objects.manifest(:Tester, t)
|
18
|
+
|
19
|
+
opts['value'] = v.find :Wert
|
20
|
+
rescue => e
|
21
|
+
puts e.message
|
22
|
+
end
|
23
|
+
|
24
|
+
run do |opts|
|
25
|
+
opts['server'].run
|
26
|
+
opts['value'].value = rand
|
27
|
+
sleep 0.01
|
28
|
+
rescue => e
|
29
|
+
puts e.message
|
30
|
+
end
|
31
|
+
|
32
|
+
on exit do
|
33
|
+
# we could disconnect here, but OPCUA::Server does not have an explicit disconnect
|
34
|
+
puts 'bye.'
|
35
|
+
end
|
36
|
+
end.loop!
|
@@ -0,0 +1,85 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require_relative '../lib/opcua/server'
|
3
|
+
|
4
|
+
Daemonite.new do
|
5
|
+
on startup do |opts|
|
6
|
+
srv = opts['server'] = OPCUA::Server.new
|
7
|
+
srv.import_UA # FIX
|
8
|
+
srv.import_nodeset File::read('nodeset1.xml')
|
9
|
+
srv.import_nodeset File::read('nodeset1.xml')
|
10
|
+
srv.import_nodeset File::read('nodeset1.xml')
|
11
|
+
DI = srv.imports['http://xxxxx/DI']
|
12
|
+
AID = srv.imports['http://xxxxx/AutoID']
|
13
|
+
|
14
|
+
srv.objects
|
15
|
+
|
16
|
+
# ab 106 im nodesets.rb
|
17
|
+
x = srv.data_types.add(qualifiedname,referencetype=UA::HasSubtype,nodeid=rand())
|
18
|
+
x.displayname['en-US'] = 'rrr'
|
19
|
+
x.displayname['de'] = 'rrr'
|
20
|
+
x.displayname.delete('de')
|
21
|
+
|
22
|
+
srv.data_types.bla.blurg.add(wieheissts')
|
23
|
+
srv.data_types.bla.blurg.push(wieheissts')
|
24
|
+
srv.data_types.bla.blurg.<<('wieheissts')
|
25
|
+
x = srv.data_types.bla.find name: 'bla', type: SUBXXXX
|
26
|
+
[x] = srv.data_types.bla.find_all name: 'bla', type: SUBXXXX
|
27
|
+
[x] = srv.data_types.bla.select name: 'bla', type: SUBXXXX
|
28
|
+
srv.data_types.bla.parent
|
29
|
+
|
30
|
+
# srv.event_types
|
31
|
+
# srv.interfaces_types
|
32
|
+
|
33
|
+
srv.reference_types.add(qualifiedname,symmetric,referencetype,nodeid)
|
34
|
+
srv.reference_types.add_symmetric(qualifiedname,referencetype,nodeid)
|
35
|
+
|
36
|
+
srv.variable_types
|
37
|
+
srv.object_types
|
38
|
+
|
39
|
+
p server.add_namespace "https://centurio.work/kelch"
|
40
|
+
p server.active_namespace
|
41
|
+
server.active_namespace = 0
|
42
|
+
p server.active_namespace
|
43
|
+
p server.namespaces
|
44
|
+
|
45
|
+
|
46
|
+
tools = opts['server'].objects.manifest(:KalimatC34, pt).find(:Tools)
|
47
|
+
|
48
|
+
t1 = tools.manifest(:Tool1,tt)
|
49
|
+
t2 = tools.manifest(:Tool2,tt)
|
50
|
+
t3 = tools.manifest(:Tool3,tt)
|
51
|
+
|
52
|
+
opts[:tn] = t1.find(:ToolNumber)
|
53
|
+
opts[:tn].description = 'test test'
|
54
|
+
opts[:tn].value = [0,1]
|
55
|
+
p opts[:tn].description
|
56
|
+
p opts[:tn].to_s
|
57
|
+
p opts[:tn].name
|
58
|
+
|
59
|
+
measurments_t1 = t1.find(:Measurements)
|
60
|
+
measurments_t1.manifest(:M1,mt)
|
61
|
+
m2 = measurments_t1.manifest(:M2,mt)
|
62
|
+
rescue => e
|
63
|
+
puts e.message
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
counter = 0
|
68
|
+
run do |opts|
|
69
|
+
GC.start
|
70
|
+
sleep opts['server'].run
|
71
|
+
# if counter % 100 == 0
|
72
|
+
# opts[:tn].value = [counter, counter]
|
73
|
+
# # opts[:tn].value = 1
|
74
|
+
# p opts[:tn].value
|
75
|
+
# end
|
76
|
+
# counter += 1
|
77
|
+
rescue => e
|
78
|
+
puts e.message
|
79
|
+
end
|
80
|
+
|
81
|
+
on exit do
|
82
|
+
# we could disconnect here, but OPCUA::Server does not have an explicit disconnect
|
83
|
+
puts 'bye.'
|
84
|
+
end
|
85
|
+
end.loop!
|
data/ext/opcua/client/client.c
CHANGED
@@ -320,7 +320,7 @@ static VALUE client_init(VALUE self,VALUE url,VALUE user,VALUE pass) { //{{{
|
|
320
320
|
}
|
321
321
|
char *pstr = (char *)StringValuePtr(vpstr);
|
322
322
|
|
323
|
-
retval =
|
323
|
+
retval = UA_Client_connectUsername(pss->master, nstr, ustr, pstr);
|
324
324
|
}
|
325
325
|
if (retval != UA_STATUSCODE_GOOD) {
|
326
326
|
pss->started = false;
|
@@ -631,7 +631,7 @@ void Init_client(void) {
|
|
631
631
|
cMethodNode = rb_define_class_under(cClient, "cMethodNode", cNode);
|
632
632
|
cVarNode = rb_define_class_under(cClient, "cVarNode", cNode);
|
633
633
|
|
634
|
-
Init_types();
|
634
|
+
Init_types(mOPCUA);
|
635
635
|
|
636
636
|
rb_define_alloc_func(cClient, client_alloc);
|
637
637
|
rb_define_method(cClient, "initialize", client_init, 3);
|
data/ext/opcua/helpers/values.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#include "values.h"
|
2
2
|
|
3
|
-
VALUE
|
3
|
+
VALUE mTYPES;
|
4
4
|
|
5
5
|
/* -- */
|
6
6
|
static void variant_set_one_dimension(UA_Variant *variant,UA_UInt32 len) { //{{{
|
@@ -154,8 +154,16 @@ bool value_to_variant(VALUE value, UA_Variant *variant, UA_UInt32 proposal) { //
|
|
154
154
|
case T_SYMBOL:
|
155
155
|
{
|
156
156
|
VALUE str = rb_obj_as_string(value);
|
157
|
-
|
158
|
-
|
157
|
+
if (proposal == UA_TYPES_BYTESTRING) {
|
158
|
+
UA_ByteString tmp = UA_BYTESTRING(StringValuePtr(str));
|
159
|
+
UA_Variant_setScalarCopy(variant, &tmp, &UA_TYPES[UA_TYPES_BYTESTRING]);
|
160
|
+
} else if (proposal == UA_TYPES_NODEID) {
|
161
|
+
UA_NodeId tmp = UA_NODEID(StringValuePtr(str));
|
162
|
+
UA_Variant_setScalarCopy(variant, &tmp, &UA_TYPES[UA_TYPES_NODEID]);
|
163
|
+
} else {
|
164
|
+
UA_String tmp = UA_STRING(StringValuePtr(str));
|
165
|
+
UA_Variant_setScalarCopy(variant, &tmp, &UA_TYPES[UA_TYPES_STRING]);
|
166
|
+
}
|
159
167
|
done = true;
|
160
168
|
break;
|
161
169
|
}
|
@@ -171,16 +179,19 @@ bool value_to_variant(VALUE value, UA_Variant *variant, UA_UInt32 proposal) { //
|
|
171
179
|
return done;
|
172
180
|
} //}}}
|
173
181
|
|
174
|
-
void Init_types() {/*{{{*/
|
182
|
+
void Init_types(VALUE mOPCUA) {/*{{{*/
|
175
183
|
mTYPES = rb_define_module_under(mOPCUA,"TYPES");
|
176
184
|
rb_define_const(mTYPES, "DATETIME", INT2NUM(UA_TYPES_DATETIME ));
|
177
185
|
rb_define_const(mTYPES, "BOOLEAN", INT2NUM(UA_TYPES_BOOLEAN ));
|
186
|
+
rb_define_const(mTYPES, "FLOAT", INT2NUM(UA_TYPES_FLOAT ));
|
178
187
|
rb_define_const(mTYPES, "DOUBLE", INT2NUM(UA_TYPES_DOUBLE ));
|
179
188
|
rb_define_const(mTYPES, "INT32", INT2NUM(UA_TYPES_INT32 ));
|
180
189
|
rb_define_const(mTYPES, "INT16", INT2NUM(UA_TYPES_INT16 ));
|
181
190
|
rb_define_const(mTYPES, "UINT32", INT2NUM(UA_TYPES_UINT32 ));
|
182
191
|
rb_define_const(mTYPES, "UINT16", INT2NUM(UA_TYPES_UINT16 ));
|
183
192
|
rb_define_const(mTYPES, "STRING", INT2NUM(UA_TYPES_STRING ));
|
193
|
+
rb_define_const(mTYPES, "BYTESTRING", INT2NUM(UA_TYPES_BYTESTRING ));
|
194
|
+
rb_define_const(mTYPES, "NODEID", INT2NUM(UA_TYPES_NODEID ));
|
184
195
|
}/*}}}*/
|
185
196
|
|
186
197
|
static VALUE UA_TYPES_DATETIME_to_value(UA_DateTime data) { //{{{
|
@@ -189,6 +200,9 @@ static VALUE UA_TYPES_DATETIME_to_value(UA_DateTime data) { //{{{
|
|
189
200
|
static VALUE UA_TYPES_BOOLEAN_to_value(UA_Boolean data) { //{{{
|
190
201
|
return data ? Qtrue : Qfalse;
|
191
202
|
} //}}}
|
203
|
+
static VALUE UA_TYPES_FLOAT_to_value(UA_Float data) { //{{{
|
204
|
+
return DBL2NUM((double)data);
|
205
|
+
} //}}}
|
192
206
|
static VALUE UA_TYPES_DOUBLE_to_value(UA_Double data) { //{{{
|
193
207
|
return DBL2NUM(data);
|
194
208
|
} //}}}
|
@@ -213,6 +227,9 @@ static VALUE UA_TYPES_UINT16_to_value(UA_UInt16 data) { //{{{
|
|
213
227
|
static VALUE UA_TYPES_STRING_to_value(UA_String data) { //{{{
|
214
228
|
return rb_str_export_locale(rb_str_new((char *)(data.data),data.length));
|
215
229
|
} //}}}
|
230
|
+
static VALUE UA_TYPES_BYTESTRING_to_value(UA_ByteString data) { //{{{
|
231
|
+
return rb_str_export_locale(rb_str_new((char *)(data.data),data.length));
|
232
|
+
} //}}}
|
216
233
|
|
217
234
|
VALUE extract_value(UA_Variant value) { //{{{
|
218
235
|
VALUE ret = rb_ary_new2(2);
|
@@ -228,6 +245,9 @@ VALUE extract_value(UA_Variant value) { //{{{
|
|
228
245
|
} else if (UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_BOOLEAN])) {
|
229
246
|
rb_ary_store(ret,0,UA_TYPES_BOOLEAN_to_value(*(UA_Boolean *)value.data));
|
230
247
|
rb_ary_store(ret,1,ID2SYM(rb_intern("VariantType.Boolean")));
|
248
|
+
} else if (UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_FLOAT])) {
|
249
|
+
rb_ary_store(ret,0,UA_TYPES_FLOAT_to_value(*(UA_Float *)value.data));
|
250
|
+
rb_ary_store(ret,1,ID2SYM(rb_intern("VariantType.Float")));
|
231
251
|
} else if (UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DOUBLE])) {
|
232
252
|
rb_ary_store(ret,0,UA_TYPES_DOUBLE_to_value(*(UA_Double *)value.data));
|
233
253
|
rb_ary_store(ret,1,ID2SYM(rb_intern("VariantType.Double")));
|
@@ -252,6 +272,11 @@ VALUE extract_value(UA_Variant value) { //{{{
|
|
252
272
|
} else if (UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_STRING])) {
|
253
273
|
rb_ary_store(ret,0,UA_TYPES_STRING_to_value(*(UA_String *)value.data));
|
254
274
|
rb_ary_store(ret,1,ID2SYM(rb_intern("VariantType.String")));
|
275
|
+
} else if (UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_BYTESTRING])) {
|
276
|
+
rb_ary_store(ret,0,UA_TYPES_BYTESTRING_to_value(*(UA_ByteString *)value.data));
|
277
|
+
rb_ary_store(ret,1,ID2SYM(rb_intern("VariantType.String")));
|
278
|
+
} else {
|
279
|
+
//printf("Unknown Datatype\n");
|
255
280
|
}
|
256
281
|
} else if (value.arrayDimensionsSize == 1 || (value.arrayDimensionsSize == 0 && value.arrayLength > 0)) {
|
257
282
|
if (UA_Variant_hasArrayType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
|
@@ -268,6 +293,13 @@ VALUE extract_value(UA_Variant value) { //{{{
|
|
268
293
|
for (int i=0; i < value.arrayLength; i++) {
|
269
294
|
rb_ary_push(res,UA_TYPES_BOOLEAN_to_value(((UA_Boolean *)value.data)[i]));
|
270
295
|
}
|
296
|
+
} else if (UA_Variant_hasArrayType(&value, &UA_TYPES[UA_TYPES_FLOAT])) {
|
297
|
+
VALUE res = rb_ary_new();
|
298
|
+
rb_ary_store(ret,0,res);
|
299
|
+
rb_ary_store(ret,1,ID2SYM(rb_intern("VariantType.Float")));
|
300
|
+
for (int i=0; i < value.arrayLength; i++) {
|
301
|
+
rb_ary_push(res,UA_TYPES_FLOAT_to_value(((UA_Float *)value.data)[i]));
|
302
|
+
}
|
271
303
|
} else if (UA_Variant_hasArrayType(&value, &UA_TYPES[UA_TYPES_DOUBLE])) {
|
272
304
|
VALUE res = rb_ary_new();
|
273
305
|
rb_ary_store(ret,0,res);
|
data/ext/opcua/helpers/values.h
CHANGED
@@ -4,9 +4,8 @@
|
|
4
4
|
#include <open62541.h>
|
5
5
|
#include <ruby.h>
|
6
6
|
|
7
|
-
VALUE mTYPES;
|
8
7
|
RUBY_EXTERN bool value_to_variant(VALUE value, UA_Variant *variant, UA_UInt32 proposal);
|
9
|
-
RUBY_EXTERN void Init_types();
|
8
|
+
RUBY_EXTERN void Init_types(VALUE mOPCUA);
|
10
9
|
RUBY_EXTERN VALUE extract_value(UA_Variant value);
|
11
10
|
|
12
11
|
#endif
|
data/ext/opcua/server/server.c
CHANGED
@@ -335,11 +335,39 @@ static VALUE node_add_method(int argc, VALUE* argv, VALUE self) { //{{{
|
|
335
335
|
return node_wrap(CLASS_OF(self),node_alloc(parent->master,node_add_method_ua_simple(nstr,parent,opts,blk)));
|
336
336
|
} //}}}
|
337
337
|
|
338
|
-
static
|
338
|
+
static void node_add_variable_callback( //{{{
|
339
|
+
UA_Server *server,
|
340
|
+
const UA_NodeId *sessionId, void *sessionContext,
|
341
|
+
const UA_NodeId *nodeId, void *nodeContext,
|
342
|
+
const UA_NumericRange *range, const UA_DataValue *data
|
343
|
+
) {
|
344
|
+
node_struct *me = (node_struct *)nodeContext;
|
345
|
+
|
346
|
+
// printf(
|
347
|
+
// "NodeId %d, %-16.*s\n",
|
348
|
+
// me->id.namespaceIndex,
|
349
|
+
// (int)me->id.identifier.string.length,
|
350
|
+
// me->id.identifier.string.data
|
351
|
+
// );
|
352
|
+
|
353
|
+
VALUE args = rb_ary_new();
|
354
|
+
rb_ary_push(args, Data_Wrap_Struct(cVarNode,NULL,NULL,me));
|
355
|
+
VALUE para = extract_value(data->value);
|
356
|
+
rb_ary_push(args,rb_ary_entry(para,0));
|
357
|
+
if (me->method != Qnil) {
|
358
|
+
rb_proc_call(me->method,args);
|
359
|
+
}
|
360
|
+
} //}}}
|
361
|
+
static UA_NodeId node_add_variable_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedText dn, UA_QualifiedName qn, node_struct *parent, UA_Byte accesslevelmask, VALUE blk) { //{{{
|
339
362
|
UA_VariableAttributes vAttr = UA_VariableAttributes_default;
|
340
363
|
vAttr.displayName = dn;
|
341
364
|
vAttr.accessLevel = accesslevelmask;
|
342
365
|
|
366
|
+
node_struct *me = node_alloc(parent->master,n);
|
367
|
+
me->method = blk;
|
368
|
+
rb_gc_register_address(&blk);
|
369
|
+
rb_gc_register_address(&me->method);
|
370
|
+
|
343
371
|
UA_Server_addVariableNode(parent->master->master,
|
344
372
|
n,
|
345
373
|
parent->id,
|
@@ -347,9 +375,13 @@ static UA_NodeId node_add_variable_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedTe
|
|
347
375
|
qn,
|
348
376
|
UA_NODEID_NUMERIC(0, type),
|
349
377
|
vAttr,
|
350
|
-
|
378
|
+
(void *)me,
|
351
379
|
NULL);
|
352
380
|
|
381
|
+
UA_ValueCallback callback ;
|
382
|
+
callback.onWrite = node_add_variable_callback;
|
383
|
+
UA_Server_setVariableNode_valueCallback(parent->master->master, n, callback);
|
384
|
+
|
353
385
|
UA_Server_addReference(parent->master->master,
|
354
386
|
n,
|
355
387
|
UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
|
@@ -357,15 +389,28 @@ static UA_NodeId node_add_variable_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedTe
|
|
357
389
|
true);
|
358
390
|
|
359
391
|
return n;
|
360
|
-
}
|
361
|
-
static UA_NodeId node_add_variable_ua_simple(UA_Int32 type,
|
392
|
+
} //}}}
|
393
|
+
static UA_NodeId node_add_variable_ua_simple(UA_Int32 type, VALUE str, node_struct *parent, UA_Byte accesslevelmask, bool numeric, VALUE blk) { //{{{
|
394
|
+
int nodeid = nodecounter++;
|
395
|
+
char *nstr = (char *)StringValuePtr(str);
|
396
|
+
|
397
|
+
UA_NodeId n;
|
398
|
+
if (numeric) {
|
399
|
+
n = UA_NODEID_NUMERIC(parent->master->default_ns,nodeid);
|
400
|
+
rb_hash_aset(parent->master->methods,INT2NUM(nodeid),blk);
|
401
|
+
} else {
|
402
|
+
n = UA_NODEID_STRING(parent->master->default_ns,nstr);
|
403
|
+
rb_hash_aset(parent->master->methods,str,blk);
|
404
|
+
}
|
405
|
+
rb_gc_register_address(&blk);
|
362
406
|
return node_add_variable_ua(
|
363
407
|
type,
|
364
|
-
|
408
|
+
n,
|
365
409
|
UA_LOCALIZEDTEXT("en-US", nstr),
|
366
410
|
UA_QUALIFIEDNAME(parent->master->default_ns, nstr),
|
367
411
|
parent,
|
368
|
-
accesslevelmask
|
412
|
+
accesslevelmask,
|
413
|
+
blk
|
369
414
|
);
|
370
415
|
} //}}}
|
371
416
|
static VALUE node_add_variable_wrap(int argc, VALUE* argv, VALUE self, UA_Byte accesslevelmask, bool numeric) { //{{{
|
@@ -375,22 +420,28 @@ static VALUE node_add_variable_wrap(int argc, VALUE* argv, VALUE self, UA_Byte a
|
|
375
420
|
rb_raise(rb_eArgError, "wrong number of arguments");
|
376
421
|
}
|
377
422
|
|
423
|
+
Data_Get_Struct(self, node_struct, parent);
|
424
|
+
if (!parent->exists) rb_raise(rb_eRuntimeError, "Node does not exist anymore.");
|
425
|
+
|
426
|
+
VALUE name;
|
427
|
+
VALUE ttype;
|
428
|
+
VALUE blk;
|
429
|
+
rb_gc_register_address(&blk);
|
430
|
+
|
431
|
+
rb_scan_args(argc, argv, "11&", &name, &ttype, &blk);
|
432
|
+
|
378
433
|
UA_UInt32 type;
|
379
|
-
if (
|
380
|
-
type = NUM2INT(argv[1]);
|
381
|
-
} else {
|
434
|
+
if (NIL_P(ttype)) {
|
382
435
|
type = UA_NS0ID_BASEDATAVARIABLETYPE;
|
436
|
+
} else {
|
437
|
+
type = NUM2INT(ttype);
|
383
438
|
}
|
384
439
|
|
385
|
-
|
386
|
-
if (!parent->exists) rb_raise(rb_eRuntimeError, "Node does not exist anymore.");
|
387
|
-
|
388
|
-
VALUE str = rb_obj_as_string(argv[0]);
|
440
|
+
VALUE str = rb_obj_as_string(name);
|
389
441
|
if (NIL_P(str) || TYPE(str) != T_STRING)
|
390
442
|
rb_raise(rb_eTypeError, "cannot convert obj to string");
|
391
|
-
char *nstr = (char *)StringValuePtr(str);
|
392
443
|
|
393
|
-
return node_wrap(cVarNode,node_alloc(parent->master,node_add_variable_ua_simple(type,
|
444
|
+
return node_wrap(cVarNode,node_alloc(parent->master,node_add_variable_ua_simple(type,str,parent,accesslevelmask,numeric,blk)));
|
394
445
|
} //}}}
|
395
446
|
static VALUE node_add_variable(int argc, VALUE* argv, VALUE self) { //{{{
|
396
447
|
return node_add_variable_wrap(argc,argv,self,UA_ACCESSLEVELMASK_READ,true);
|
@@ -564,10 +615,22 @@ static UA_StatusCode node_manifest_iter(UA_NodeId child_id, UA_Boolean is_invers
|
|
564
615
|
UA_BrowsePathResult property = node_browse_path(parent->master->master, child_id, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), pqn, false);
|
565
616
|
UA_QualifiedName_clear(&pqn);
|
566
617
|
|
618
|
+
VALUE blk;
|
619
|
+
if (child_id.identifierType == UA_NODEIDTYPE_NUMERIC) {
|
620
|
+
blk = rb_hash_aref(parent->master->methods,INT2NUM(child_id.identifier.numeric));
|
621
|
+
} else if (child_id.identifierType == UA_NODEIDTYPE_STRING) {
|
622
|
+
blk = rb_hash_aref(parent->master->methods,rb_str_new((const char *)child_id.identifier.string.data,child_id.identifier.string.length));
|
623
|
+
} else if (child_id.identifierType == UA_NODEIDTYPE_BYTESTRING) {
|
624
|
+
blk = rb_hash_aref(parent->master->methods,rb_str_new((const char *)child_id.identifier.byteString.data,child_id.identifier.byteString.length));
|
625
|
+
} else {
|
626
|
+
blk = Qnil;
|
627
|
+
}
|
628
|
+
|
629
|
+
|
567
630
|
if (property.statusCode == UA_STATUSCODE_GOOD) {
|
568
|
-
node_add_variable_ua(UA_NS0ID_PROPERTYTYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al);
|
631
|
+
node_add_variable_ua(UA_NS0ID_PROPERTYTYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al,blk);
|
569
632
|
} else {
|
570
|
-
node_add_variable_ua(UA_NS0ID_BASEDATAVARIABLETYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al);
|
633
|
+
node_add_variable_ua(UA_NS0ID_BASEDATAVARIABLETYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al,blk);
|
571
634
|
}
|
572
635
|
|
573
636
|
UA_BrowsePathResult_clear(&property);
|
@@ -978,7 +1041,7 @@ void Init_server(void) {
|
|
978
1041
|
rb_define_const(mOPCUA, "BASEDATAVARIABLETYPE", INT2NUM(UA_NS0ID_BASEDATAVARIABLETYPE));
|
979
1042
|
rb_define_const(mOPCUA, "PROPERTYTYPE", INT2NUM(UA_NS0ID_PROPERTYTYPE));
|
980
1043
|
|
981
|
-
Init_types();
|
1044
|
+
Init_types(mOPCUA);
|
982
1045
|
|
983
1046
|
cServer = rb_define_class_under(mOPCUA, "Server", rb_cObject);
|
984
1047
|
cNode = rb_define_class_under(cServer, "Node", rb_cObject);
|
@@ -1013,7 +1076,7 @@ void Init_server(void) {
|
|
1013
1076
|
rb_define_method(cNode, "exists?", node_exists, 0);
|
1014
1077
|
|
1015
1078
|
rb_define_method(cTypeTopNode, "add_object_type", node_add_object_type, 1);
|
1016
|
-
rb_define_method(cTypeTopNode, "add_reference_type", node_add_reference_type,
|
1079
|
+
rb_define_method(cTypeTopNode, "add_reference_type", node_add_reference_type, 2);
|
1017
1080
|
rb_define_method(cTypeTopNode, "folder", node_type_folder, 0);
|
1018
1081
|
|
1019
1082
|
rb_define_method(cTypeSubNode, "add_object_type", node_add_object_type, 1);
|
data/opcua.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "opcua"
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.22"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.license = "LGPL-3.0"
|
6
6
|
s.summary = "Preliminary release of opcua (open62541) ruby bindings. C performance, Ruby elegance, simplicity, and productivity."
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.required_ruby_version = '>=2.5.0'
|
17
17
|
|
18
|
-
s.authors = ['Juergen eTM Mangler','Florian Pauker']
|
18
|
+
s.authors = ['Juergen eTM Mangler','Florian Pauker','Matthias Ehrendorfer']
|
19
19
|
|
20
20
|
s.email = 'juergen.mangler@gmail.com'
|
21
21
|
s.homepage = 'https://github.com/etm/opcua-smart'
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opcua
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.22'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juergen eTM Mangler
|
8
8
|
- Florian Pauker
|
9
|
-
|
9
|
+
- Matthias Ehrendorfer
|
10
|
+
autorequire:
|
10
11
|
bindir: tools
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2021-01-23 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: daemonite
|
@@ -74,6 +75,7 @@ files:
|
|
74
75
|
- cert/cert.h
|
75
76
|
- cert/cert_key.h
|
76
77
|
- example/bug5.rb
|
78
|
+
- example/client_get_float.rb
|
77
79
|
- example/client_get_sync.rb
|
78
80
|
- example/client_get_value.rb
|
79
81
|
- example/client_method.rb
|
@@ -83,6 +85,8 @@ files:
|
|
83
85
|
- example/server.rb
|
84
86
|
- example/server_deep.rb
|
85
87
|
- example/server_values.rb
|
88
|
+
- example/server_values_callback.rb
|
89
|
+
- example/server_xml.rb
|
86
90
|
- example/test.rb
|
87
91
|
- ext/opcua/client/client.c
|
88
92
|
- ext/opcua/client/client.h
|
@@ -121,7 +125,7 @@ homepage: https://github.com/etm/opcua-smart
|
|
121
125
|
licenses:
|
122
126
|
- LGPL-3.0
|
123
127
|
metadata: {}
|
124
|
-
post_install_message:
|
128
|
+
post_install_message:
|
125
129
|
rdoc_options: []
|
126
130
|
require_paths:
|
127
131
|
- lib
|
@@ -136,8 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
140
|
- !ruby/object:Gem::Version
|
137
141
|
version: '0'
|
138
142
|
requirements: []
|
139
|
-
rubygems_version: 3.
|
140
|
-
signing_key:
|
143
|
+
rubygems_version: 3.1.4
|
144
|
+
signing_key:
|
141
145
|
specification_version: 4
|
142
146
|
summary: Preliminary release of opcua (open62541) ruby bindings. C performance, Ruby
|
143
147
|
elegance, simplicity, and productivity.
|