opcua 0.21 → 0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dede52136945d72311f619c6fe2299896aeb67eb00db4a6a2ebc0c985422c7d6
4
- data.tar.gz: 285eb4c834021ae986c91d492a7e77fb847947be66c69284c24a187dfee816d5
3
+ metadata.gz: e0bd449baa58c495096569ded2e6a50df7e0554ff273b0c853ae8302dc33e544
4
+ data.tar.gz: b6d8ee15542d9be07673ea0522c88f19e0309261ff454cf47f4f1d3b8b8fc927
5
5
  SHA512:
6
- metadata.gz: a75f3952786bdf049432cf6dd46a11f770f6da45d5fcbf8a95ed9528e122e1918cafbfacf8e2a7c80c40987c598601a5326834c4905ecb5e080adfc52b91ee0e
7
- data.tar.gz: 699a713490e9059cf6ed4b610b159da174e2117210bdff60dcedf502d9586318cc7c39343ffa71dbbcdb16b7e5e821be7f25c451c0cb8f5994839db133cae2b1
6
+ metadata.gz: 880f9af425e78f1dfd71e30383b4133201e1af01bd23de16c96a18e5ca0e75d0696b856d3453d8ea75fce4578f2574b823645b0ca39671c0fb626855e9dbc159
7
+ data.tar.gz: f695ee96bdfe1c19a632698b25171e08142b425cd1eeca2f10cb1f72fed7b58cc996bddedf4f833f072b2016696772b37c87a6def87f3ddef7549724321ab813
data/README.md CHANGED
@@ -50,6 +50,8 @@ sudo make install
50
50
  gem install opcua
51
51
  ```
52
52
 
53
+ If you get errors during compilation, please file an issue in github. Maybe the API open62541 API changed (constant improvements are happening).
54
+
53
55
  If the installation works correctly, but examples are still complaining about missing lib62541.so, try this:
54
56
 
55
57
  ```sh
@@ -122,11 +124,24 @@ Multible variables can be defined at once with the ```.add_variables``` command.
122
124
  t.add_variables :TestVar1, :TestVar2
123
125
  ```
124
126
  By default variables are read-only.
125
- If you want to add a variable with read/write support you must use the ```.add_Varable_rw``` method.
127
+ If you want to add a variable with read/write support you must use the ```.add_variable_rw``` method.
126
128
  ```ruby
127
129
  t.add_variable_rw :TestVar1
128
130
  ```
129
131
 
132
+ It is also possible to add a block to the variable. The block is called
133
+ whenever the variable is changed. Each block gets three parameters passed:
134
+ nodeid, new value, and if the value has been changed through a client (true) or
135
+ internally in the server (false).
136
+
137
+ ```ruby
138
+ t.add_variable_rw :Value do |node,value,external|
139
+ p node.id # ObjectVarNode object, which has properties such as #id, #value
140
+ p value # new content of the variable
141
+ p external # true || false
142
+ end
143
+ ```
144
+
130
145
  ##### Add Object
131
146
 
132
147
  With ```.add_object(:TestObject)``` a new object named _TestObject_ is added. The second parameter is optional and definies of which type the new object is. Default the object is from _BaseObjectType_. In this example the created object is from _FolderType_. All child nodes of the object can be definded in the ```tap{}``` area.
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, 0x05, 0x1e, 0x58, 0x4d, 0x94, 0xf5, 0x46, 0x0f, 0xf5,
4
- 0xd2, 0xe0, 0xb9, 0x56, 0xa7, 0x5a, 0x46, 0xe1, 0x3d, 0x3f, 0xa1, 0x30,
3
+ 0x02, 0x02, 0x14, 0x11, 0x2f, 0x7b, 0xb4, 0x32, 0x5f, 0x6d, 0xe3, 0x4f,
4
+ 0x2c, 0x3a, 0x98, 0xb9, 0x10, 0xb5, 0x3a, 0x2b, 0xfa, 0xc1, 0x30, 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, 0x30, 0x30, 0x37, 0x31, 0x34, 0x31,
9
- 0x37, 0x32, 0x39, 0x32, 0x35, 0x5a, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x37,
10
- 0x30, 0x34, 0x31, 0x37, 0x32, 0x39, 0x32, 0x35, 0x5a, 0x30, 0x15, 0x31,
8
+ 0x61, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x31, 0x32, 0x37, 0x31,
9
+ 0x36, 0x30, 0x30, 0x32, 0x39, 0x5a, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x31,
10
+ 0x31, 0x37, 0x31, 0x36, 0x30, 0x30, 0x32, 0x39, 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, 0xce, 0x51, 0xee, 0xa9, 0xf6, 0xe0, 0x2c,
16
- 0x30, 0x8c, 0x04, 0x3a, 0x0d, 0x74, 0x78, 0x7a, 0x93, 0x00, 0x47, 0xeb,
17
- 0x85, 0x26, 0x38, 0x70, 0x52, 0xeb, 0xcc, 0xf4, 0x21, 0xfe, 0x68, 0x8b,
18
- 0x1d, 0x57, 0xce, 0x9f, 0xb9, 0x18, 0x62, 0x99, 0x90, 0x4d, 0xc5, 0x00,
19
- 0x41, 0x71, 0x9d, 0x71, 0xcf, 0xf2, 0xca, 0xd5, 0x88, 0x21, 0x40, 0xfb,
20
- 0x38, 0x1d, 0xc4, 0xd4, 0xb5, 0xfd, 0x51, 0xdc, 0x9f, 0x8d, 0xed, 0x7b,
21
- 0x15, 0xf4, 0xd8, 0x08, 0x07, 0x06, 0x50, 0xe4, 0x86, 0xcc, 0x72, 0x63,
22
- 0xc1, 0x8e, 0x4c, 0xd1, 0xac, 0xc5, 0xdd, 0xac, 0xff, 0x3f, 0x0a, 0xde,
23
- 0x7e, 0x84, 0x4e, 0xf9, 0x92, 0x35, 0x1a, 0xca, 0x94, 0x85, 0x35, 0x1c,
24
- 0xcc, 0x9b, 0xda, 0x04, 0x07, 0xd5, 0x07, 0xf9, 0x7f, 0xb0, 0x5f, 0xdc,
25
- 0x97, 0x1a, 0xac, 0x8b, 0xdb, 0x56, 0x2e, 0x3f, 0x4c, 0x1d, 0x3e, 0xab,
26
- 0x0f, 0xde, 0x43, 0x18, 0xc0, 0xa8, 0x61, 0xff, 0xac, 0xe6, 0x46, 0x90,
27
- 0x60, 0xb1, 0x6c, 0x72, 0x3d, 0x38, 0x27, 0xcb, 0xb4, 0x3c, 0x6e, 0x61,
28
- 0x6f, 0x9e, 0x44, 0xfd, 0xe7, 0xd7, 0x07, 0x9b, 0x5a, 0x00, 0xfa, 0x17,
29
- 0x8c, 0xa7, 0x8a, 0x31, 0x5d, 0x77, 0x18, 0xd4, 0xec, 0xa3, 0x54, 0x64,
30
- 0xe2, 0x7b, 0x56, 0xde, 0xf2, 0x6f, 0x94, 0xc3, 0xd4, 0xa9, 0xe0, 0xed,
31
- 0x96, 0xa2, 0x5c, 0x57, 0xa7, 0x49, 0xc4, 0x84, 0xe8, 0x8e, 0xc5, 0xb0,
32
- 0xd1, 0x56, 0x05, 0x36, 0xe8, 0xd1, 0xd5, 0x57, 0xb7, 0xbc, 0x31, 0xc3,
33
- 0xe6, 0x3f, 0x78, 0x09, 0x3e, 0x25, 0xdc, 0x05, 0x62, 0xd3, 0xef, 0xde,
34
- 0xa8, 0xb9, 0x42, 0x3a, 0x16, 0x82, 0xc7, 0x83, 0x46, 0x65, 0xf2, 0xe0,
35
- 0xbb, 0xf4, 0x25, 0x4f, 0x5d, 0xcb, 0x7c, 0x96, 0x76, 0x7c, 0x4c, 0xed,
36
- 0xcb, 0xe3, 0xbb, 0x0c, 0xaa, 0x44, 0xbf, 0x36, 0x47, 0x02, 0x03, 0x01,
15
+ 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0xb5, 0x71, 0x62, 0xfe, 0x5b, 0xb7,
16
+ 0xc2, 0xbc, 0x0e, 0x37, 0xf4, 0xa3, 0x73, 0x29, 0x2e, 0x6e, 0x19, 0x53,
17
+ 0x60, 0xeb, 0xfe, 0x18, 0x78, 0xda, 0xf6, 0xbd, 0xc2, 0x2c, 0xdf, 0x1e,
18
+ 0x45, 0x08, 0xef, 0x98, 0xe8, 0x14, 0x43, 0xb2, 0x82, 0x48, 0xa8, 0x85,
19
+ 0xc1, 0x96, 0x19, 0x6c, 0x15, 0xee, 0x76, 0x4f, 0x7b, 0xe7, 0xcd, 0x49,
20
+ 0x57, 0x8d, 0xb8, 0xde, 0x3b, 0xe6, 0xb2, 0x4b, 0xea, 0x88, 0xd8, 0x5d,
21
+ 0x4f, 0x55, 0x97, 0x00, 0x22, 0x4f, 0xcf, 0x05, 0x84, 0xfe, 0x00, 0x25,
22
+ 0x3c, 0xeb, 0x74, 0x99, 0x7a, 0xc9, 0xd4, 0x5b, 0x56, 0x02, 0xc1, 0x08,
23
+ 0x54, 0x7b, 0xc6, 0xec, 0x9a, 0x0e, 0x60, 0x75, 0xe6, 0xbc, 0xde, 0x51,
24
+ 0x17, 0xfe, 0x5d, 0x5e, 0xef, 0x68, 0x83, 0x80, 0x83, 0xa2, 0xcb, 0x3a,
25
+ 0x30, 0x0d, 0xdd, 0x90, 0xb9, 0x1d, 0xca, 0x04, 0x71, 0x61, 0xb6, 0x1a,
26
+ 0x9f, 0xad, 0x66, 0x91, 0x8c, 0x30, 0xc1, 0x52, 0x00, 0xc5, 0x7e, 0xda,
27
+ 0x8a, 0xef, 0xb7, 0x68, 0x74, 0x99, 0x38, 0x89, 0x93, 0xba, 0x85, 0x71,
28
+ 0x31, 0x24, 0xa8, 0x1a, 0x04, 0xdd, 0x41, 0x0b, 0x51, 0xb5, 0x24, 0x51,
29
+ 0x79, 0x8a, 0x34, 0x7b, 0x82, 0xa9, 0xfa, 0xd9, 0x01, 0x62, 0x8a, 0x92,
30
+ 0x67, 0x40, 0x37, 0xc2, 0x0d, 0xee, 0xbe, 0xc2, 0xa4, 0x3d, 0x63, 0x7f,
31
+ 0xe5, 0x3f, 0x23, 0xd5, 0x08, 0x1c, 0x0b, 0x67, 0x14, 0x2a, 0xc4, 0x5f,
32
+ 0xd2, 0xdf, 0x53, 0x72, 0x24, 0xc9, 0x55, 0xe4, 0xd4, 0x4b, 0x92, 0x78,
33
+ 0x68, 0x17, 0x51, 0xa5, 0x0d, 0x3a, 0xe9, 0xde, 0x59, 0xfa, 0x92, 0x30,
34
+ 0x12, 0xc7, 0x72, 0x4b, 0xf3, 0x3b, 0xbf, 0x7d, 0x95, 0x55, 0x48, 0x8e,
35
+ 0x68, 0x8a, 0xf7, 0x49, 0x66, 0x77, 0x77, 0xb2, 0xd5, 0x1b, 0x09, 0xa1,
36
+ 0xa6, 0xf4, 0x2c, 0xec, 0x4f, 0xdf, 0xf1, 0xf4, 0x83, 0x02, 0x03, 0x01,
37
37
  0x00, 0x01, 0xa3, 0x60, 0x30, 0x5e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,
38
- 0x0e, 0x04, 0x16, 0x04, 0x14, 0x6a, 0xa0, 0xd5, 0x2a, 0xf6, 0x52, 0x09,
39
- 0x4c, 0x9b, 0xa8, 0xb4, 0xb7, 0xe0, 0xe7, 0x94, 0x84, 0xd0, 0xa3, 0xb4,
40
- 0x23, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
38
+ 0x0e, 0x04, 0x16, 0x04, 0x14, 0x94, 0x96, 0x95, 0x63, 0xe7, 0xf5, 0x26,
39
+ 0x38, 0x3e, 0xdf, 0x99, 0xec, 0x11, 0x08, 0xaf, 0x91, 0xde, 0xc6, 0x01,
40
+ 0x44, 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
- 0xc3, 0x70, 0xea, 0x90, 0x39, 0xc2, 0x8e, 0xe7, 0x4f, 0xd1, 0xc6, 0x99,
48
- 0x53, 0xaf, 0x8f, 0x19, 0xec, 0xaa, 0x05, 0x9b, 0xa4, 0x69, 0x2c, 0x00,
49
- 0x11, 0xcd, 0x66, 0xa3, 0x50, 0x0f, 0xe6, 0x2b, 0x83, 0x27, 0xfe, 0x72,
50
- 0xde, 0x41, 0x03, 0x0b, 0x4c, 0xe4, 0xd8, 0xc3, 0x54, 0xeb, 0x3c, 0xbc,
51
- 0xb6, 0x87, 0xba, 0x92, 0x1e, 0x49, 0xcf, 0x7f, 0x5a, 0x57, 0xa7, 0x3e,
52
- 0x8b, 0xd0, 0x45, 0x7e, 0x3d, 0x95, 0x36, 0x73, 0x0f, 0x16, 0x75, 0x68,
53
- 0x1c, 0xf5, 0x4d, 0x90, 0xa9, 0x7c, 0xc8, 0xc1, 0x6d, 0x89, 0xaf, 0x74,
54
- 0x28, 0xb8, 0xe2, 0xde, 0x10, 0x6e, 0x81, 0x79, 0x65, 0xbc, 0x6c, 0xfb,
55
- 0xe8, 0x07, 0xec, 0x1e, 0x22, 0x6a, 0x2c, 0x50, 0xae, 0xb7, 0x18, 0x4c,
56
- 0x3a, 0xef, 0x1f, 0xe2, 0xfd, 0x11, 0xf0, 0x95, 0x10, 0x3d, 0xbd, 0x6e,
57
- 0x17, 0x24, 0xd7, 0x46, 0x0a, 0x42, 0x6b, 0x88, 0xf5, 0x56, 0x12, 0x6e,
58
- 0xf1, 0xff, 0xaf, 0x40, 0x08, 0x3e, 0x68, 0xa3, 0x3e, 0x38, 0xfa, 0xd6,
59
- 0x96, 0x56, 0xd6, 0x8b, 0x67, 0x6c, 0x2a, 0x5f, 0x5a, 0xfa, 0xaa, 0x9d,
60
- 0xd1, 0x54, 0x92, 0x0b, 0x90, 0x2c, 0x9e, 0xcc, 0x7d, 0x48, 0x5f, 0x19,
61
- 0x59, 0x74, 0xb6, 0xae, 0x0c, 0x33, 0x33, 0x74, 0x72, 0xef, 0xa5, 0xa9,
62
- 0xfe, 0x8b, 0xc8, 0x48, 0x26, 0x49, 0x88, 0x65, 0x07, 0x60, 0x34, 0x80,
63
- 0x78, 0x83, 0x1f, 0x82, 0xc0, 0xcb, 0x73, 0x83, 0xe2, 0x7b, 0x6d, 0x7c,
64
- 0x3c, 0x6d, 0x27, 0xd8, 0x8e, 0xbb, 0x2f, 0x8c, 0xe2, 0x8b, 0x02, 0xb5,
65
- 0xe6, 0x01, 0x53, 0x74, 0xf0, 0xbe, 0xf6, 0xdd, 0x40, 0x33, 0x35, 0x97,
66
- 0x87, 0x17, 0xe0, 0xf2, 0x33, 0xc9, 0x38, 0x6f, 0xe0, 0x5d, 0x48, 0x55,
67
- 0xe0, 0x14, 0xe1, 0x61, 0xca, 0xdb, 0x34, 0x4b, 0xd7, 0x06, 0x6d, 0xcd,
68
- 0x94, 0x84, 0x98, 0xa2
47
+ 0x7a, 0xf8, 0xe9, 0xa9, 0x0d, 0x31, 0xc9, 0x68, 0x6e, 0x18, 0xa6, 0xb4,
48
+ 0x25, 0xf2, 0x46, 0x5c, 0xbe, 0x13, 0x31, 0x53, 0xa6, 0x64, 0x79, 0x47,
49
+ 0x1d, 0xdf, 0x01, 0xf1, 0xf7, 0x50, 0x22, 0x70, 0x1d, 0xe7, 0x85, 0x44,
50
+ 0xc6, 0x3b, 0x1c, 0x90, 0xca, 0x2a, 0x83, 0xc7, 0x54, 0x2f, 0xaa, 0xf5,
51
+ 0x6b, 0x17, 0x38, 0x0f, 0x2a, 0xb1, 0x83, 0x94, 0x79, 0x13, 0xcc, 0x95,
52
+ 0x40, 0xc0, 0xfa, 0x58, 0xfb, 0xe5, 0xc0, 0xb5, 0x8f, 0xdf, 0x18, 0x07,
53
+ 0x03, 0x7d, 0x2d, 0xb7, 0x78, 0x18, 0x80, 0x12, 0x55, 0x8c, 0x56, 0x0b,
54
+ 0x2e, 0x75, 0xce, 0x7a, 0xcf, 0xa0, 0xf9, 0x98, 0x4f, 0x68, 0xdb, 0x81,
55
+ 0x27, 0x2d, 0x17, 0x2c, 0x0b, 0x0f, 0xb9, 0xd9, 0x37, 0x85, 0x21, 0x92,
56
+ 0xd1, 0x1a, 0xb6, 0x72, 0x00, 0x74, 0x8e, 0x28, 0xcf, 0x88, 0xfe, 0x18,
57
+ 0x88, 0x02, 0x2c, 0xff, 0xc8, 0xef, 0xf9, 0xf1, 0xf1, 0xab, 0x02, 0xad,
58
+ 0xa9, 0x66, 0x97, 0x25, 0xb9, 0x9d, 0xce, 0xab, 0xa6, 0x5d, 0xbb, 0xf0,
59
+ 0x1d, 0x0e, 0x1b, 0x2a, 0x80, 0x67, 0xa8, 0x7d, 0x03, 0xab, 0x07, 0x5a,
60
+ 0x48, 0xf5, 0x6e, 0x67, 0x9d, 0x9c, 0xdb, 0xce, 0x79, 0x4e, 0x35, 0x22,
61
+ 0x64, 0x97, 0x75, 0xe6, 0x32, 0x70, 0xf0, 0x32, 0xc3, 0x7c, 0x02, 0x5b,
62
+ 0x6e, 0x82, 0x89, 0xa3, 0xd1, 0x33, 0x69, 0x0f, 0xf8, 0x1a, 0x3e, 0x35,
63
+ 0x35, 0x0e, 0xe0, 0x54, 0x0f, 0x49, 0x00, 0xdc, 0x57, 0x89, 0x7b, 0x8b,
64
+ 0x1c, 0x3b, 0xcc, 0x18, 0x81, 0x39, 0xfc, 0x80, 0x61, 0xc9, 0xc7, 0xd6,
65
+ 0x9e, 0x5b, 0xfe, 0x54, 0x3b, 0x15, 0x9e, 0x9c, 0x8e, 0xe4, 0xb1, 0x77,
66
+ 0x7a, 0x81, 0xfd, 0xc0, 0x75, 0x3b, 0xd9, 0xb3, 0x98, 0x4c, 0xa4, 0x53,
67
+ 0xd0, 0xc3, 0xa8, 0x70, 0x95, 0x86, 0x1e, 0xc4, 0x77, 0xa4, 0x2f, 0x13,
68
+ 0xe6, 0x36, 0x51, 0x1a
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, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
3
- 0xce, 0x51, 0xee, 0xa9, 0xf6, 0xe0, 0x2c, 0x30, 0x8c, 0x04, 0x3a, 0x0d,
4
- 0x74, 0x78, 0x7a, 0x93, 0x00, 0x47, 0xeb, 0x85, 0x26, 0x38, 0x70, 0x52,
5
- 0xeb, 0xcc, 0xf4, 0x21, 0xfe, 0x68, 0x8b, 0x1d, 0x57, 0xce, 0x9f, 0xb9,
6
- 0x18, 0x62, 0x99, 0x90, 0x4d, 0xc5, 0x00, 0x41, 0x71, 0x9d, 0x71, 0xcf,
7
- 0xf2, 0xca, 0xd5, 0x88, 0x21, 0x40, 0xfb, 0x38, 0x1d, 0xc4, 0xd4, 0xb5,
8
- 0xfd, 0x51, 0xdc, 0x9f, 0x8d, 0xed, 0x7b, 0x15, 0xf4, 0xd8, 0x08, 0x07,
9
- 0x06, 0x50, 0xe4, 0x86, 0xcc, 0x72, 0x63, 0xc1, 0x8e, 0x4c, 0xd1, 0xac,
10
- 0xc5, 0xdd, 0xac, 0xff, 0x3f, 0x0a, 0xde, 0x7e, 0x84, 0x4e, 0xf9, 0x92,
11
- 0x35, 0x1a, 0xca, 0x94, 0x85, 0x35, 0x1c, 0xcc, 0x9b, 0xda, 0x04, 0x07,
12
- 0xd5, 0x07, 0xf9, 0x7f, 0xb0, 0x5f, 0xdc, 0x97, 0x1a, 0xac, 0x8b, 0xdb,
13
- 0x56, 0x2e, 0x3f, 0x4c, 0x1d, 0x3e, 0xab, 0x0f, 0xde, 0x43, 0x18, 0xc0,
14
- 0xa8, 0x61, 0xff, 0xac, 0xe6, 0x46, 0x90, 0x60, 0xb1, 0x6c, 0x72, 0x3d,
15
- 0x38, 0x27, 0xcb, 0xb4, 0x3c, 0x6e, 0x61, 0x6f, 0x9e, 0x44, 0xfd, 0xe7,
16
- 0xd7, 0x07, 0x9b, 0x5a, 0x00, 0xfa, 0x17, 0x8c, 0xa7, 0x8a, 0x31, 0x5d,
17
- 0x77, 0x18, 0xd4, 0xec, 0xa3, 0x54, 0x64, 0xe2, 0x7b, 0x56, 0xde, 0xf2,
18
- 0x6f, 0x94, 0xc3, 0xd4, 0xa9, 0xe0, 0xed, 0x96, 0xa2, 0x5c, 0x57, 0xa7,
19
- 0x49, 0xc4, 0x84, 0xe8, 0x8e, 0xc5, 0xb0, 0xd1, 0x56, 0x05, 0x36, 0xe8,
20
- 0xd1, 0xd5, 0x57, 0xb7, 0xbc, 0x31, 0xc3, 0xe6, 0x3f, 0x78, 0x09, 0x3e,
21
- 0x25, 0xdc, 0x05, 0x62, 0xd3, 0xef, 0xde, 0xa8, 0xb9, 0x42, 0x3a, 0x16,
22
- 0x82, 0xc7, 0x83, 0x46, 0x65, 0xf2, 0xe0, 0xbb, 0xf4, 0x25, 0x4f, 0x5d,
23
- 0xcb, 0x7c, 0x96, 0x76, 0x7c, 0x4c, 0xed, 0xcb, 0xe3, 0xbb, 0x0c, 0xaa,
24
- 0x44, 0xbf, 0x36, 0x47, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
25
- 0x01, 0x00, 0xca, 0xf3, 0x97, 0x94, 0xc3, 0x8f, 0x82, 0x88, 0x82, 0xc3,
26
- 0x09, 0xa4, 0x00, 0xa5, 0x1e, 0xd6, 0x09, 0x99, 0xb5, 0x98, 0xf5, 0x9e,
27
- 0xe1, 0x07, 0x00, 0x83, 0x4c, 0xc7, 0x3f, 0xad, 0xf0, 0xe2, 0x7d, 0x64,
28
- 0x78, 0x83, 0xa7, 0xf4, 0x1d, 0xe0, 0xf0, 0x4f, 0x50, 0x50, 0x10, 0x05,
29
- 0xf3, 0x55, 0xbe, 0x1c, 0x3e, 0x6e, 0x39, 0x5f, 0xe5, 0x7f, 0x2e, 0xf1,
30
- 0x56, 0xd8, 0x6a, 0x86, 0xa3, 0x42, 0xa4, 0x67, 0x2e, 0x03, 0xcc, 0x24,
31
- 0xd1, 0xc8, 0xaf, 0x32, 0xd5, 0x89, 0xb0, 0x04, 0xfa, 0x12, 0x04, 0xfb,
32
- 0x95, 0xe9, 0xa1, 0x7d, 0xcc, 0xd6, 0x0c, 0x5a, 0x91, 0xc0, 0xdc, 0x3f,
33
- 0x9f, 0x8a, 0x6e, 0x08, 0x9b, 0xab, 0xfb, 0x58, 0xe2, 0xaa, 0x76, 0xc8,
34
- 0xbf, 0xdc, 0x40, 0x77, 0x26, 0xbb, 0xaf, 0x70, 0xac, 0xda, 0x4a, 0xd7,
35
- 0xde, 0x7f, 0x74, 0xc7, 0xeb, 0x65, 0xe1, 0x02, 0xab, 0x5b, 0x1c, 0x3a,
36
- 0xbd, 0x01, 0xb7, 0x00, 0x0a, 0x55, 0x72, 0x21, 0xb2, 0xa9, 0x4a, 0x4f,
37
- 0xa4, 0x1d, 0x48, 0x92, 0xc0, 0x57, 0x24, 0xf9, 0xd1, 0x63, 0xb3, 0x64,
38
- 0x09, 0xe7, 0xb6, 0x2a, 0x0d, 0x50, 0xdd, 0xdf, 0xe9, 0xeb, 0x77, 0x5a,
39
- 0xf1, 0x91, 0x63, 0xd1, 0xfb, 0x8d, 0x03, 0x5d, 0x34, 0xcd, 0xd2, 0x6c,
40
- 0x0b, 0xbe, 0x77, 0xc1, 0x76, 0x62, 0xef, 0x71, 0xe3, 0x5d, 0x0c, 0xb3,
41
- 0x48, 0xdd, 0x63, 0x35, 0x48, 0xdd, 0xa0, 0x71, 0xbc, 0x7e, 0x53, 0xa7,
42
- 0x5e, 0x58, 0x53, 0x00, 0xe1, 0x65, 0xd2, 0x19, 0x8e, 0xe7, 0x99, 0xf2,
43
- 0xf1, 0x5d, 0xa4, 0xcd, 0x7e, 0xb4, 0x62, 0x76, 0x65, 0x99, 0x49, 0x31,
44
- 0xcc, 0x93, 0x31, 0xe5, 0xc6, 0xc5, 0xfc, 0x17, 0x94, 0x15, 0xd6, 0x39,
45
- 0x30, 0xef, 0x97, 0x77, 0x76, 0xb0, 0xc8, 0x2d, 0xf1, 0xe9, 0xda, 0xd1,
46
- 0xe6, 0x85, 0xd9, 0x4f, 0x3c, 0x89, 0x02, 0x81, 0x81, 0x00, 0xf7, 0xb2,
47
- 0x98, 0xca, 0x7a, 0x84, 0x5f, 0x3e, 0x11, 0xc2, 0x7a, 0x72, 0xf9, 0x15,
48
- 0xd3, 0x05, 0xad, 0xb1, 0x96, 0xdc, 0xa0, 0xb6, 0x88, 0x61, 0x40, 0x54,
49
- 0x76, 0xc9, 0x3f, 0xc1, 0x0e, 0x5d, 0xd2, 0x7d, 0xc4, 0x50, 0x44, 0x61,
50
- 0x18, 0x93, 0x5a, 0xe1, 0xe8, 0xec, 0x8b, 0xe5, 0xd7, 0x54, 0xbc, 0xeb,
51
- 0x23, 0x30, 0xbd, 0x9b, 0xde, 0xc6, 0x52, 0xe5, 0xc8, 0x18, 0xc5, 0x45,
52
- 0x1b, 0x38, 0x80, 0x54, 0xa8, 0x60, 0x77, 0x8f, 0x9e, 0xaa, 0x93, 0x38,
53
- 0xa4, 0x74, 0xe5, 0x58, 0xa5, 0x5d, 0x2d, 0xa6, 0x30, 0xfa, 0x13, 0xfd,
54
- 0xf9, 0xf6, 0x57, 0xcc, 0x13, 0x5d, 0x25, 0xf1, 0x19, 0x7e, 0xe4, 0x7c,
55
- 0xb7, 0xc2, 0x0c, 0x18, 0x59, 0x64, 0x50, 0xd2, 0x4e, 0x7e, 0x37, 0x83,
56
- 0xc1, 0x92, 0x89, 0x20, 0x30, 0xd5, 0x18, 0x9a, 0xb7, 0x2b, 0x7b, 0xb4,
57
- 0x7f, 0xc9, 0xf6, 0xd3, 0x12, 0xad, 0x02, 0x81, 0x81, 0x00, 0xd5, 0x3c,
58
- 0x4a, 0x14, 0xbb, 0x71, 0x0f, 0xc1, 0x33, 0x01, 0x82, 0xe2, 0xb6, 0x66,
59
- 0x99, 0x82, 0xc9, 0xfe, 0x77, 0xed, 0xda, 0x4a, 0x2b, 0xb3, 0xf6, 0xa7,
60
- 0x7d, 0xd7, 0x17, 0xa4, 0xd3, 0x2c, 0x5a, 0x73, 0x21, 0x0a, 0x67, 0x29,
61
- 0x65, 0x1c, 0x7a, 0xc8, 0x72, 0x4e, 0xef, 0xc1, 0xa8, 0x69, 0xe0, 0x6b,
62
- 0xd8, 0x0d, 0x56, 0x56, 0x51, 0x05, 0xc9, 0x6f, 0x41, 0x88, 0x03, 0x68,
63
- 0xe9, 0xef, 0xa0, 0x5e, 0xb3, 0xce, 0x1d, 0x4e, 0x27, 0xc9, 0x09, 0x47,
64
- 0x2e, 0x71, 0x9d, 0x7f, 0xa7, 0x4c, 0xb2, 0x2a, 0xf2, 0x6c, 0xce, 0xc9,
65
- 0x76, 0x89, 0x64, 0xc7, 0x29, 0x96, 0xd5, 0xf7, 0xe8, 0x72, 0x7c, 0x5e,
66
- 0x45, 0x76, 0x4c, 0x80, 0x0a, 0x70, 0x02, 0xed, 0x00, 0xb9, 0xad, 0xe0,
67
- 0xec, 0x3f, 0xe7, 0x08, 0xfc, 0x29, 0xbc, 0x2c, 0xf5, 0x15, 0xec, 0x02,
68
- 0xf0, 0x74, 0x5f, 0x63, 0xff, 0x43, 0x02, 0x81, 0x80, 0x10, 0xa3, 0x2c,
69
- 0x64, 0x1d, 0x4a, 0x9a, 0xe3, 0x1e, 0x6a, 0x43, 0xb3, 0x49, 0x4b, 0xcf,
70
- 0xfa, 0xc7, 0xa9, 0xf0, 0x0a, 0x2d, 0xb9, 0x54, 0xfb, 0xc3, 0x48, 0x69,
71
- 0x1a, 0x27, 0x70, 0x1e, 0x38, 0xeb, 0x14, 0x8b, 0x85, 0x20, 0xb2, 0xac,
72
- 0xe5, 0xe8, 0xea, 0xd7, 0xac, 0x5b, 0xd1, 0x3a, 0x5f, 0x74, 0xb9, 0x0e,
73
- 0x8a, 0x0d, 0x92, 0x54, 0xaa, 0x59, 0x93, 0x19, 0x97, 0xa0, 0x58, 0x7d,
74
- 0xf5, 0x93, 0x99, 0x1c, 0x1e, 0x2e, 0xa9, 0xb4, 0xec, 0x9c, 0x2a, 0xe7,
75
- 0xd0, 0xfa, 0x3e, 0xb4, 0x0c, 0xc8, 0x2e, 0x2b, 0x88, 0x00, 0xa3, 0xc4,
76
- 0x90, 0x69, 0x61, 0x49, 0xc3, 0xad, 0xf2, 0xbd, 0xd5, 0xaa, 0x1f, 0x3e,
77
- 0x70, 0x88, 0x43, 0x72, 0x6d, 0xac, 0x88, 0x13, 0xc1, 0xa2, 0x94, 0xf5,
78
- 0x01, 0x94, 0xb8, 0x56, 0xcf, 0x59, 0x71, 0xba, 0xef, 0xee, 0xc5, 0x36,
79
- 0xf8, 0x27, 0xde, 0x11, 0x99, 0x02, 0x81, 0x80, 0x2b, 0xca, 0x84, 0xe0,
80
- 0x3b, 0x1a, 0x5e, 0x04, 0xec, 0x47, 0xac, 0x2c, 0x89, 0x0f, 0x0b, 0x09,
81
- 0xac, 0x18, 0x01, 0x63, 0x2c, 0x88, 0x3c, 0xef, 0x69, 0x81, 0x3e, 0x3b,
82
- 0xb5, 0x14, 0x59, 0x75, 0xeb, 0x61, 0x67, 0x70, 0xae, 0x7c, 0xf6, 0xd1,
83
- 0xe1, 0x79, 0x56, 0xd8, 0x55, 0x2e, 0xad, 0x3a, 0x89, 0x27, 0x3c, 0xa8,
84
- 0x88, 0x89, 0x93, 0x7c, 0x1f, 0xc1, 0x24, 0x71, 0x1d, 0x5a, 0x27, 0x68,
85
- 0xd9, 0xc3, 0x79, 0x23, 0xa4, 0x2b, 0x0f, 0xca, 0x9e, 0x88, 0x2a, 0xc6,
86
- 0x94, 0x74, 0xc9, 0xd3, 0xdb, 0x67, 0x2c, 0x80, 0x21, 0xfb, 0x87, 0xc7,
87
- 0x71, 0x95, 0xe1, 0x39, 0xa3, 0xd9, 0x94, 0xb8, 0x26, 0x48, 0x69, 0xf5,
88
- 0x80, 0x82, 0x6f, 0x22, 0x4f, 0xc7, 0x82, 0x75, 0x9f, 0x7a, 0xe8, 0xa9,
89
- 0xba, 0xf5, 0xc2, 0x6b, 0x83, 0xc4, 0xab, 0xd4, 0x83, 0xb2, 0x9a, 0xd5,
90
- 0x1b, 0x5d, 0xfa, 0xe7, 0x02, 0x81, 0x80, 0x01, 0x3b, 0xaf, 0x5b, 0xad,
91
- 0x06, 0xa6, 0x3d, 0x6c, 0x66, 0x4f, 0x3d, 0x98, 0x15, 0xbd, 0x14, 0xee,
92
- 0x8b, 0xb0, 0x6b, 0x06, 0x62, 0x1c, 0x34, 0xee, 0x8f, 0x10, 0x42, 0x75,
93
- 0x78, 0x75, 0x9a, 0x07, 0x6d, 0x26, 0x29, 0xc3, 0xf0, 0x22, 0xd8, 0x17,
94
- 0xdb, 0xb8, 0x8c, 0x2b, 0x28, 0xad, 0x9b, 0x0c, 0x93, 0x65, 0xff, 0xb9,
95
- 0x5b, 0x06, 0x66, 0x0b, 0xe3, 0xf5, 0x4e, 0x3b, 0xb8, 0x29, 0xb9, 0xf8,
96
- 0xdf, 0xd0, 0x07, 0x2d, 0x77, 0x6b, 0x83, 0x1c, 0x3d, 0xdb, 0xaa, 0xe3,
97
- 0xea, 0xcf, 0x30, 0xd9, 0x8b, 0x27, 0x89, 0xf4, 0x67, 0xea, 0xd1, 0xd4,
98
- 0x16, 0x3e, 0x56, 0x6a, 0x9a, 0x02, 0x62, 0xfb, 0xda, 0x1b, 0xff, 0x84,
99
- 0x03, 0x1e, 0xc9, 0xf7, 0xd8, 0x18, 0xef, 0x0c, 0x97, 0x3d, 0xfa, 0xb7,
100
- 0x3d, 0xd6, 0xdd, 0x52, 0x47, 0xb4, 0xa8, 0x6f, 0x1b, 0xec, 0xb2, 0x0d,
101
- 0xcd, 0x40, 0x63
3
+ 0xb0, 0xb5, 0x71, 0x62, 0xfe, 0x5b, 0xb7, 0xc2, 0xbc, 0x0e, 0x37, 0xf4,
4
+ 0xa3, 0x73, 0x29, 0x2e, 0x6e, 0x19, 0x53, 0x60, 0xeb, 0xfe, 0x18, 0x78,
5
+ 0xda, 0xf6, 0xbd, 0xc2, 0x2c, 0xdf, 0x1e, 0x45, 0x08, 0xef, 0x98, 0xe8,
6
+ 0x14, 0x43, 0xb2, 0x82, 0x48, 0xa8, 0x85, 0xc1, 0x96, 0x19, 0x6c, 0x15,
7
+ 0xee, 0x76, 0x4f, 0x7b, 0xe7, 0xcd, 0x49, 0x57, 0x8d, 0xb8, 0xde, 0x3b,
8
+ 0xe6, 0xb2, 0x4b, 0xea, 0x88, 0xd8, 0x5d, 0x4f, 0x55, 0x97, 0x00, 0x22,
9
+ 0x4f, 0xcf, 0x05, 0x84, 0xfe, 0x00, 0x25, 0x3c, 0xeb, 0x74, 0x99, 0x7a,
10
+ 0xc9, 0xd4, 0x5b, 0x56, 0x02, 0xc1, 0x08, 0x54, 0x7b, 0xc6, 0xec, 0x9a,
11
+ 0x0e, 0x60, 0x75, 0xe6, 0xbc, 0xde, 0x51, 0x17, 0xfe, 0x5d, 0x5e, 0xef,
12
+ 0x68, 0x83, 0x80, 0x83, 0xa2, 0xcb, 0x3a, 0x30, 0x0d, 0xdd, 0x90, 0xb9,
13
+ 0x1d, 0xca, 0x04, 0x71, 0x61, 0xb6, 0x1a, 0x9f, 0xad, 0x66, 0x91, 0x8c,
14
+ 0x30, 0xc1, 0x52, 0x00, 0xc5, 0x7e, 0xda, 0x8a, 0xef, 0xb7, 0x68, 0x74,
15
+ 0x99, 0x38, 0x89, 0x93, 0xba, 0x85, 0x71, 0x31, 0x24, 0xa8, 0x1a, 0x04,
16
+ 0xdd, 0x41, 0x0b, 0x51, 0xb5, 0x24, 0x51, 0x79, 0x8a, 0x34, 0x7b, 0x82,
17
+ 0xa9, 0xfa, 0xd9, 0x01, 0x62, 0x8a, 0x92, 0x67, 0x40, 0x37, 0xc2, 0x0d,
18
+ 0xee, 0xbe, 0xc2, 0xa4, 0x3d, 0x63, 0x7f, 0xe5, 0x3f, 0x23, 0xd5, 0x08,
19
+ 0x1c, 0x0b, 0x67, 0x14, 0x2a, 0xc4, 0x5f, 0xd2, 0xdf, 0x53, 0x72, 0x24,
20
+ 0xc9, 0x55, 0xe4, 0xd4, 0x4b, 0x92, 0x78, 0x68, 0x17, 0x51, 0xa5, 0x0d,
21
+ 0x3a, 0xe9, 0xde, 0x59, 0xfa, 0x92, 0x30, 0x12, 0xc7, 0x72, 0x4b, 0xf3,
22
+ 0x3b, 0xbf, 0x7d, 0x95, 0x55, 0x48, 0x8e, 0x68, 0x8a, 0xf7, 0x49, 0x66,
23
+ 0x77, 0x77, 0xb2, 0xd5, 0x1b, 0x09, 0xa1, 0xa6, 0xf4, 0x2c, 0xec, 0x4f,
24
+ 0xdf, 0xf1, 0xf4, 0x83, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
25
+ 0x00, 0x61, 0x09, 0x01, 0xde, 0xae, 0x76, 0x87, 0x0e, 0x34, 0x5e, 0x4a,
26
+ 0x73, 0xd8, 0x5d, 0xa0, 0xbb, 0x92, 0x51, 0xed, 0xeb, 0x47, 0x2c, 0x1d,
27
+ 0x1c, 0x20, 0x81, 0x65, 0xea, 0x7e, 0xe1, 0x76, 0xa9, 0xca, 0x22, 0x68,
28
+ 0x00, 0xe9, 0x3f, 0xd3, 0x82, 0x9f, 0x8b, 0x8b, 0x07, 0xa6, 0xf9, 0x06,
29
+ 0xd5, 0x74, 0x41, 0x1b, 0x9c, 0x9a, 0xc9, 0xac, 0x00, 0x9c, 0x1e, 0x6c,
30
+ 0x4a, 0xd0, 0x80, 0x10, 0x18, 0x16, 0x55, 0x59, 0xc7, 0xfa, 0xe4, 0x14,
31
+ 0x7a, 0xc3, 0x00, 0x97, 0xb3, 0x54, 0x17, 0x98, 0x5b, 0x3f, 0xa0, 0xa3,
32
+ 0xb7, 0x3d, 0xa5, 0x93, 0x12, 0x44, 0x28, 0xe3, 0xfe, 0x20, 0x8a, 0x37,
33
+ 0xda, 0xd1, 0x12, 0x3f, 0x2c, 0x19, 0x82, 0xab, 0x5d, 0x55, 0x9c, 0xc8,
34
+ 0x49, 0x07, 0x47, 0x4f, 0x06, 0xfa, 0x1a, 0x47, 0x35, 0xa4, 0x27, 0x8b,
35
+ 0x15, 0x5c, 0x3a, 0x56, 0xfe, 0x3b, 0xfd, 0xd7, 0xd7, 0xf4, 0xe1, 0xe0,
36
+ 0x79, 0xb0, 0x31, 0xc9, 0xa3, 0x85, 0x18, 0x34, 0x31, 0x57, 0x70, 0xd0,
37
+ 0x90, 0xc6, 0xf0, 0x23, 0x66, 0x69, 0x2b, 0x25, 0x88, 0x98, 0x8d, 0x33,
38
+ 0xe8, 0xdf, 0x4d, 0x65, 0xa1, 0x3b, 0xe0, 0xc9, 0x17, 0x08, 0x0a, 0x91,
39
+ 0x69, 0x66, 0x42, 0x72, 0xd4, 0x0e, 0x21, 0xac, 0xb3, 0x7b, 0x15, 0x0c,
40
+ 0xcb, 0x12, 0x4f, 0xfb, 0x17, 0x3b, 0x30, 0x2f, 0xc3, 0x29, 0xfb, 0x6f,
41
+ 0xa6, 0x6c, 0xd9, 0xcb, 0x95, 0xb2, 0xbd, 0x8a, 0x4e, 0x95, 0xc0, 0xc4,
42
+ 0xe5, 0xa0, 0x34, 0xef, 0x02, 0x27, 0x3a, 0x5e, 0x14, 0x7d, 0xeb, 0x85,
43
+ 0x10, 0xc8, 0x0f, 0xa3, 0x04, 0x18, 0xdb, 0x8f, 0x7f, 0x18, 0x54, 0x69,
44
+ 0x5a, 0x17, 0x0b, 0x25, 0x91, 0x9d, 0xf8, 0x52, 0x42, 0x83, 0x1e, 0x33,
45
+ 0xef, 0xaa, 0x74, 0x0f, 0x11, 0x30, 0xa4, 0x2a, 0x89, 0x18, 0x59, 0xca,
46
+ 0x66, 0xd3, 0xfe, 0x28, 0x01, 0x02, 0x81, 0x81, 0x00, 0xe7, 0x54, 0x64,
47
+ 0x56, 0x50, 0x22, 0x66, 0xa8, 0x85, 0x9d, 0xef, 0x48, 0x82, 0x50, 0x74,
48
+ 0xbd, 0xc3, 0x52, 0x70, 0x1e, 0x74, 0xc0, 0x2d, 0xbf, 0x80, 0x55, 0x74,
49
+ 0x8e, 0x71, 0xf8, 0xa0, 0xec, 0xea, 0x23, 0x4c, 0x71, 0x0c, 0x3f, 0xdb,
50
+ 0x93, 0x63, 0xd8, 0x03, 0xfa, 0xd8, 0x09, 0xd0, 0x46, 0xe4, 0x00, 0xbd,
51
+ 0x95, 0xbc, 0xe2, 0xca, 0xfd, 0x24, 0xa8, 0x6d, 0xf3, 0x35, 0x0e, 0xe0,
52
+ 0xf0, 0x85, 0xf8, 0x3f, 0x3a, 0xf0, 0x7e, 0xb7, 0x8f, 0x98, 0x37, 0x12,
53
+ 0xf0, 0x03, 0xbc, 0x57, 0xd5, 0xf6, 0xf9, 0xbd, 0x81, 0x40, 0x91, 0x57,
54
+ 0xd4, 0x66, 0x4e, 0x64, 0x74, 0x14, 0xb3, 0xf9, 0x65, 0x99, 0x70, 0x85,
55
+ 0xac, 0xce, 0xc5, 0x49, 0x5b, 0x31, 0x24, 0xc4, 0xa0, 0xd6, 0x5e, 0xda,
56
+ 0x2c, 0x9c, 0xdf, 0xdd, 0xc5, 0x49, 0xb1, 0x7f, 0x8a, 0x7b, 0x63, 0x57,
57
+ 0xb0, 0x71, 0x35, 0x01, 0x01, 0x02, 0x81, 0x81, 0x00, 0xc3, 0x8d, 0xd3,
58
+ 0xe5, 0x8c, 0x16, 0x7f, 0x86, 0x03, 0x30, 0x35, 0xff, 0x38, 0xc6, 0x87,
59
+ 0x59, 0xae, 0x50, 0x1a, 0x26, 0xbc, 0x53, 0xb6, 0x8a, 0xb9, 0x31, 0xfa,
60
+ 0x5a, 0xb5, 0xe6, 0xc1, 0x4d, 0x40, 0x38, 0x45, 0x32, 0xb5, 0xa8, 0x2f,
61
+ 0xe9, 0x6a, 0x30, 0x32, 0x9f, 0x04, 0xd0, 0x68, 0xbe, 0x90, 0xcb, 0x43,
62
+ 0x68, 0xa3, 0x06, 0xfa, 0xd1, 0x14, 0x11, 0x85, 0x46, 0x1b, 0xbb, 0xb5,
63
+ 0xd9, 0xa3, 0x72, 0x54, 0xb9, 0x57, 0xba, 0x32, 0x76, 0x70, 0x00, 0xf3,
64
+ 0xb0, 0xae, 0x4e, 0x68, 0xd5, 0xc4, 0x87, 0xd8, 0xfc, 0x52, 0x53, 0x96,
65
+ 0x1e, 0x6a, 0xd0, 0x09, 0x81, 0xc4, 0xfa, 0x4b, 0x8a, 0xf3, 0x6c, 0x7e,
66
+ 0x44, 0xd4, 0x57, 0x78, 0xbd, 0x1e, 0x2d, 0xdb, 0xf8, 0x6f, 0xee, 0x57,
67
+ 0xf7, 0x41, 0x33, 0x2e, 0x0e, 0x8a, 0x16, 0x03, 0x1d, 0xac, 0xc0, 0x91,
68
+ 0xcd, 0x2b, 0x61, 0x71, 0x83, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x0f, 0x24,
69
+ 0xda, 0xac, 0x5e, 0x02, 0xd2, 0x99, 0xa6, 0x05, 0x4a, 0xeb, 0x2c, 0xfb,
70
+ 0x06, 0x36, 0x10, 0x34, 0xd7, 0x76, 0xcb, 0xa6, 0x5a, 0xd5, 0xd0, 0xa8,
71
+ 0xb1, 0xe2, 0x2b, 0x12, 0x58, 0x0f, 0x1f, 0xd0, 0xe5, 0xad, 0xfa, 0x6d,
72
+ 0x4a, 0x43, 0xca, 0x0f, 0xb8, 0x9a, 0x06, 0x8c, 0xea, 0xaa, 0xe5, 0x8f,
73
+ 0xf3, 0x41, 0x5c, 0x2e, 0x68, 0xe6, 0xaf, 0x00, 0xf4, 0xdf, 0x45, 0x9c,
74
+ 0x62, 0xa4, 0x25, 0xd6, 0xa1, 0x9d, 0xd3, 0x25, 0x58, 0xa2, 0xa3, 0x47,
75
+ 0x75, 0x23, 0x73, 0xcb, 0x6b, 0x9a, 0x5c, 0x31, 0x95, 0x52, 0xfb, 0x92,
76
+ 0x27, 0x94, 0xd3, 0x51, 0x08, 0x2f, 0xa4, 0xd7, 0x8e, 0x28, 0x5d, 0x28,
77
+ 0x6f, 0x4c, 0x02, 0x1b, 0x90, 0xec, 0x74, 0x35, 0xe3, 0x47, 0x4e, 0x27,
78
+ 0x48, 0x11, 0xf5, 0xe9, 0xad, 0xdd, 0x29, 0xd6, 0xb2, 0x27, 0xe4, 0xee,
79
+ 0x53, 0x9c, 0x6f, 0xb1, 0x01, 0x02, 0x81, 0x80, 0x18, 0x03, 0xa2, 0xb1,
80
+ 0xdd, 0xb2, 0x25, 0x96, 0xdf, 0x6d, 0x5c, 0x34, 0x2b, 0x54, 0xb5, 0xea,
81
+ 0x5d, 0x6d, 0x98, 0xc8, 0x88, 0xf7, 0xfe, 0xc2, 0xaa, 0x5b, 0x68, 0xd3,
82
+ 0x1a, 0xe3, 0x6b, 0x79, 0x81, 0x19, 0x67, 0xe6, 0x02, 0x48, 0xd5, 0x19,
83
+ 0x64, 0xe0, 0xe6, 0x56, 0x80, 0xd0, 0xd7, 0x0c, 0x0f, 0xdb, 0xe6, 0x3b,
84
+ 0x43, 0x49, 0xe8, 0x23, 0x24, 0xc3, 0xc2, 0x0a, 0x09, 0xfd, 0xd3, 0x27,
85
+ 0x16, 0xdb, 0x43, 0x6c, 0x3f, 0x49, 0xae, 0x48, 0xbd, 0x18, 0x60, 0xd4,
86
+ 0xa1, 0x93, 0x1f, 0x6c, 0xa0, 0xe5, 0xcd, 0xcf, 0xae, 0x8c, 0x75, 0x32,
87
+ 0xe7, 0x0b, 0x05, 0x1f, 0xda, 0x80, 0xa2, 0x26, 0x3e, 0x1e, 0x64, 0xa3,
88
+ 0x2f, 0x30, 0x4e, 0xb3, 0x6a, 0xb1, 0x57, 0x01, 0xfb, 0x3c, 0xd9, 0xb0,
89
+ 0x93, 0x61, 0x25, 0x96, 0xc3, 0x7e, 0x50, 0x83, 0xa4, 0x63, 0x41, 0x84,
90
+ 0x60, 0x7f, 0x66, 0xe1, 0x02, 0x81, 0x80, 0x65, 0x47, 0x60, 0x82, 0x1e,
91
+ 0x4c, 0x1a, 0x29, 0x18, 0xca, 0x78, 0xf8, 0x8d, 0x22, 0xad, 0x4d, 0xcf,
92
+ 0x36, 0xa7, 0x82, 0x79, 0xda, 0x37, 0x0c, 0x0c, 0x2d, 0x8c, 0x15, 0xd2,
93
+ 0xd9, 0x45, 0x37, 0xbb, 0xf3, 0x2c, 0xa3, 0xce, 0xad, 0x88, 0xdc, 0x5d,
94
+ 0xae, 0x08, 0x00, 0xf3, 0x3a, 0xdd, 0xa7, 0x8f, 0xe6, 0xd8, 0x7e, 0xf8,
95
+ 0x73, 0xe1, 0x2e, 0x92, 0x40, 0xdd, 0xdc, 0x6d, 0xdd, 0xe3, 0x1c, 0x31,
96
+ 0xbf, 0x7e, 0x9e, 0x8d, 0xb2, 0xf5, 0xb4, 0x85, 0x45, 0xf5, 0x9f, 0xd1,
97
+ 0x7b, 0x16, 0x7e, 0x15, 0x5b, 0x31, 0xbf, 0x4b, 0x62, 0xda, 0x33, 0x4d,
98
+ 0xc7, 0x9d, 0x07, 0xd5, 0x48, 0xdf, 0x22, 0x91, 0xc1, 0xdc, 0xfb, 0x1f,
99
+ 0x4a, 0x03, 0x10, 0x5f, 0x80, 0x2e, 0x2c, 0x91, 0x75, 0x52, 0x84, 0xd8,
100
+ 0x3c, 0x10, 0x21, 0xf7, 0x13, 0x62, 0xfa, 0x87, 0x9e, 0x9c, 0x9d, 0xa5,
101
+ 0xfd, 0xf2, 0xc2
102
102
  };
103
103
  unsigned int cert_key_der_len = 1191;
@@ -9,8 +9,14 @@ client = OPCUA::Client.new("opc.tcp://localhost:4840")
9
9
  client.subscription_interval = 100 # default 500
10
10
 
11
11
  node = client.get 2, '/KalimatC34/Tools/Tool1/ToolNumber' # get node from nodeid
12
+ n2 = client.get 2, '/KalimatC34/Tools/Tool2/ToolNumber' # get node from nodeid
13
+ p node.unsubscribe
12
14
  node.on_change do |value,timestamp|
13
15
  p value
16
+ if value == 2
17
+ p 'unsub'
18
+ p node.unsubscribe
19
+ end
14
20
  end
15
21
 
16
22
  while true
@@ -0,0 +1,43 @@
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{ |u|
11
+ u.add_object(:Measurements, opts['server'].types.folder).tap{ |v|
12
+ v.add_object(:BitRegister, opts['server'].types.folder).tap{ |w|
13
+ w.add_variable_rw :Wert do |node,value,external|
14
+ if external
15
+ p node.id
16
+ p value
17
+ end
18
+ end
19
+ }
20
+ }
21
+ }
22
+
23
+ v = opts['server'].objects.manifest(:Tester, t)
24
+
25
+ opts['mm'] = v.find :Measurements
26
+ opts['br'] = opts['mm'].find :BitRegister
27
+ opts['value'] = opts['br'].find :Wert
28
+ rescue => e
29
+ puts e.message
30
+ end
31
+
32
+ run do |opts|
33
+ opts['server'].run
34
+ opts['value'].value = rand
35
+ rescue => e
36
+ puts e.message
37
+ end
38
+
39
+ on exit do
40
+ # we could disconnect here, but OPCUA::Server does not have an explicit disconnect
41
+ puts 'bye.'
42
+ end
43
+ end.loop!
@@ -33,6 +33,7 @@ static node_struct * node_alloc(client_struct *client, UA_NodeId nodeid) { //{{{
33
33
  ns->id = nodeid;
34
34
  ns->on_change = Qnil;
35
35
  ns->waiting = 0;
36
+ ns->monId = 0;
36
37
 
37
38
  return ns;
38
39
  } //}}}
@@ -99,7 +100,6 @@ static VALUE node_on_change(VALUE self) { //{{{
99
100
  rb_gc_register_address(&ns->on_change);
100
101
 
101
102
  rb_ary_push(ns->master->subs,self);
102
- ns->master->subs_changed = true;
103
103
 
104
104
  return self;
105
105
  } //}}}
@@ -184,7 +184,7 @@ static VALUE node_on_value_change(VALUE self) { // {{{
184
184
  /* -- */
185
185
  static void client_free(client_struct *pss) { //{{{
186
186
  if (pss != NULL) {
187
- if (!pss->firstrun) {
187
+ if (pss->subrun) {
188
188
  // do we need to delete the individual monResponse (#UA_MonitoredItemCreateResult_clear)?
189
189
  UA_Client_Subscriptions_deleteSingle(pss->master,pss->subscription_response.subscriptionId);
190
190
  }
@@ -201,11 +201,10 @@ static VALUE client_alloc(VALUE self) { //{{{
201
201
 
202
202
  pss->master = UA_Client_new();
203
203
  pss->config = UA_Client_getConfig(pss->master);
204
- pss->firstrun = true;
204
+ pss->subrun = false;
205
205
  pss->started = true;
206
206
  pss->debug = true;
207
207
  pss->subs = rb_ary_new();
208
- pss->subs_changed = false;
209
208
  pss->subscription_interval = 500;
210
209
  pss->default_ns = 2;
211
210
 
@@ -491,6 +490,20 @@ static VALUE node_to_s(VALUE self) { //{{{
491
490
  }
492
491
  return ret;
493
492
  } //}}}
493
+ static VALUE unsubscribe(VALUE self) { //{{{
494
+ node_struct *ns;
495
+
496
+ Data_Get_Struct(self, node_struct, ns);
497
+
498
+ if (ns->master->subrun && ns->monId > 0) {
499
+ UA_Client_MonitoredItems_deleteSingle(ns->master->master, ns->master->subscription_response.subscriptionId, ns->monId);
500
+ ns->monId = 0;
501
+ rb_ary_delete(ns->master->subs, self);
502
+ return Qtrue;
503
+ } else {
504
+ return Qfalse;
505
+ }
506
+ } //}}}
494
507
 
495
508
  static VALUE node_call(int argc, VALUE* argv, VALUE self) { //{{{
496
509
  node_struct *ns;
@@ -553,7 +566,7 @@ static VALUE node_call(int argc, VALUE* argv, VALUE self) { //{{{
553
566
  }
554
567
  } //}}}
555
568
 
556
- static void client_run_handler(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, UA_DataValue *value) { //{{{
569
+ static void client_run_handler(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, UA_DataValue *value) { //{{{
557
570
  VALUE val = (VALUE)monContext;
558
571
 
559
572
  if (NIL_P(val) || TYPE(val) != T_NIL) {
@@ -573,7 +586,7 @@ static void client_run_handler(UA_Client *client, UA_UInt32 subId, void *subCon
573
586
  rb_proc_call(val,args);
574
587
  }
575
588
  } //}}}
576
- static void client_run_iterate(VALUE key) { //{{{
589
+ static void client_run_iterate(VALUE key) { //{{{
577
590
  node_struct *ns;
578
591
  Data_Get_Struct(key, node_struct, ns);
579
592
 
@@ -583,26 +596,28 @@ static void client_run_iterate(VALUE key) { //{{{
583
596
  UA_Client_MonitoredItems_createDataChange(ns->master->master, ns->master->subscription_response.subscriptionId,
584
597
  UA_TIMESTAMPSTORETURN_BOTH,
585
598
  monRequest, (void *)ns->on_change, client_run_handler, NULL);
599
+ ns->monId = monResponse.monitoredItemId;
586
600
 
587
601
  if(monResponse.statusCode != UA_STATUSCODE_GOOD) {
588
602
  rb_raise(rb_eRuntimeError, "Monitoring item failed: %s\n", UA_StatusCode_name(monResponse.statusCode));
589
603
  }
604
+ UA_MonitoredItemCreateResult_clear(&monResponse);
605
+ UA_MonitoredItemCreateRequest_clear(&monRequest);
590
606
  } //}}}
591
607
  static VALUE client_run(VALUE self) { //{{{
592
608
  client_struct *pss;
593
609
  Data_Get_Struct(self, client_struct, pss);
594
610
  if (!pss->started) rb_raise(rb_eRuntimeError, "Client disconnected.");
595
611
 
596
- if (pss->firstrun) {
597
- pss->firstrun = false;
598
- pss->subs_changed = false;
612
+ if (!pss->subrun) {
613
+ pss->subrun = true;
599
614
  pss->subscription_response = UA_Client_Subscriptions_create(pss->master, pss->subscription_request, NULL, NULL, NULL);
600
615
  if (pss->subscription_response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
601
616
  rb_raise(rb_eRuntimeError, "Subscription could not be created.");
602
-
603
- for (int i = 0; i < RARRAY_LEN(pss->subs); i++) {
604
- client_run_iterate(rb_ary_entry(pss->subs,i));
605
- }
617
+ }
618
+ while (RARRAY_LEN(pss->subs)>0) {
619
+ VALUE aentry = rb_ary_pop(pss->subs);
620
+ client_run_iterate(aentry);
606
621
  }
607
622
  UA_Client_run_iterate(pss->master, 100);
608
623
 
@@ -613,7 +628,7 @@ static VALUE client_disconnect(VALUE self) { //{{{
613
628
  Data_Get_Struct(self, client_struct, pss);
614
629
  if (!pss->started) rb_raise(rb_eRuntimeError, "Client disconnected.");
615
630
 
616
- if (!pss->firstrun) {
631
+ if (pss->subrun) {
617
632
  // do we need to delete the individual monResponse (#UA_MonitoredItemCreateResult_clear)?
618
633
  UA_Client_Subscriptions_deleteSingle(pss->master,pss->subscription_response.subscriptionId);
619
634
  }
@@ -648,6 +663,7 @@ void Init_client(void) {
648
663
 
649
664
  rb_define_method(cNode, "to_s", node_to_s, 0);
650
665
  rb_define_method(cNode, "id", node_id, 0);
666
+ rb_define_method(cNode, "unsubscribe", unsubscribe, 0);
651
667
 
652
668
  rb_define_method(cMethodNode, "call", node_call, -1);
653
669
 
@@ -11,11 +11,10 @@ typedef struct client_struct {
11
11
  UA_CreateSubscriptionResponse subscription_response;
12
12
 
13
13
  UA_UInt32 subscription_interval;
14
- bool firstrun;
14
+ bool subrun;
15
15
  bool started;
16
16
  bool debug;
17
17
  VALUE subs;
18
- bool subs_changed;
19
18
  UA_UInt16 default_ns;
20
19
  } client_struct;
21
20
 
@@ -23,5 +22,6 @@ typedef struct node_struct {
23
22
  client_struct *master;
24
23
  VALUE on_change;
25
24
  UA_NodeId id;
25
+ UA_UInt32 monId;
26
26
  int waiting;
27
27
  } node_struct;
@@ -39,7 +39,6 @@ bool server_node_get_reference(UA_Server *server, UA_NodeId parent, UA_NodeId *r
39
39
  // qn.name.data
40
40
  // );
41
41
 
42
- UA_BrowseResult_deleteMembers(&bRes);
43
42
  UA_BrowseResult_clear(&bRes);
44
43
  return true;
45
44
  }
@@ -63,13 +62,11 @@ bool server_node_get_reference_by_name(UA_Server *server, UA_NodeId parent, UA_Q
63
62
  if (UA_QualifiedName_equal(&qn,&name)) {
64
63
  UA_NodeId_copy(&ref->nodeId.nodeId,result);
65
64
 
66
- UA_BrowseResult_deleteMembers(&bRes);
67
65
  UA_BrowseResult_clear(&bRes);
68
66
  return true;
69
67
  }
70
68
  }
71
69
 
72
- UA_BrowseResult_deleteMembers(&bRes);
73
70
  UA_BrowseResult_clear(&bRes);
74
71
  return false;
75
72
  }
@@ -100,7 +97,6 @@ bool client_node_get_reference_by_name(UA_Client *client, UA_NodeId parent, UA_Q
100
97
  }
101
98
  }
102
99
 
103
- UA_BrowseResponse_deleteMembers(&bResp);
104
100
  UA_BrowseResponse_clear(&bResp);
105
101
  return success;
106
102
  }
@@ -126,7 +122,6 @@ bool client_node_get_reference_by_type(UA_Client *client, UA_NodeId parent, UA_N
126
122
  }
127
123
  }
128
124
 
129
- UA_BrowseResponse_deleteMembers(&bResp);
130
125
  UA_BrowseResponse_clear(&bResp);
131
126
  return success;
132
127
  }
@@ -164,7 +159,6 @@ bool client_node_list_references(UA_Client *client, UA_NodeId parent, bool inver
164
159
 
165
160
  }
166
161
  }
167
- UA_BrowseResponse_deleteMembers(&bResp);
168
162
  UA_BrowseResponse_clear(&bResp);
169
163
  return false;
170
164
  }
@@ -335,11 +335,56 @@ 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 UA_NodeId node_add_variable_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedText dn, UA_QualifiedName qn, node_struct *parent, UA_Byte accesslevelmask) { //{{{
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
+ UA_Guid internal = UA_GUID("00000001-0000-0000-0000-000000000000");
346
+
347
+ // if (sessionId->identifierType == UA_NODEIDTYPE_NUMERIC) {
348
+ // printf("sessionId ns=%d;i=%d\n", sessionId->namespaceIndex, sessionId->identifier.numeric);
349
+ // } else if(sessionId->identifierType == UA_NODEIDTYPE_STRING) {
350
+ // printf("sessionId ns=%d;s=%.*s\n", sessionId->namespaceIndex, (int)sessionId->identifier.string.length, sessionId->identifier.string.data);
351
+ // } else if(sessionId->identifierType == UA_NODEIDTYPE_GUID) {
352
+ // if (UA_Guid_equal(&(sessionId->identifier.guid),&internal)) {
353
+ // printf("sessionId internal session\n");
354
+ // } else {
355
+ // printf("sessionId ns=%d;g=%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",sessionId->namespaceIndex,UA_PRINTF_GUID_DATA(sessionId->identifier.guid));
356
+ // }
357
+ // } else if(sessionId->identifierType == UA_NODEIDTYPE_BYTESTRING) {
358
+ // printf("sessionId ns=%d;b=%.*s\n", sessionId->namespaceIndex, (int)sessionId->identifier.string.length, sessionId->identifier.string.data);
359
+ // } else if(UA_NodeId_isNull(sessionId)) {
360
+ // printf("sessionId is null");
361
+ // } else {
362
+ // printf("sessionId ns=%d;unsupported\n",sessionId->namespaceIndex);
363
+ // }
364
+
365
+ VALUE args = rb_ary_new();
366
+ rb_ary_push(args, Data_Wrap_Struct(cVarNode,NULL,NULL,me));
367
+ VALUE para = extract_value(data->value);
368
+ rb_ary_push(args,rb_ary_entry(para,0));
369
+ if (UA_Guid_equal(&(sessionId->identifier.guid),&internal)) {
370
+ rb_ary_push(args,Qfalse);
371
+ } else {
372
+ rb_ary_push(args,Qtrue);
373
+ }
374
+ if (me->method != Qnil) {
375
+ rb_proc_call(me->method,args);
376
+ }
377
+ } //}}}
378
+ 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
379
  UA_VariableAttributes vAttr = UA_VariableAttributes_default;
340
380
  vAttr.displayName = dn;
341
381
  vAttr.accessLevel = accesslevelmask;
342
382
 
383
+ node_struct *me = node_alloc(parent->master,n);
384
+ me->method = blk;
385
+ rb_gc_register_address(&blk);
386
+ rb_gc_register_address(&me->method);
387
+
343
388
  UA_Server_addVariableNode(parent->master->master,
344
389
  n,
345
390
  parent->id,
@@ -347,9 +392,13 @@ static UA_NodeId node_add_variable_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedTe
347
392
  qn,
348
393
  UA_NODEID_NUMERIC(0, type),
349
394
  vAttr,
350
- NULL,
395
+ (void *)me,
351
396
  NULL);
352
397
 
398
+ UA_ValueCallback callback ;
399
+ callback.onWrite = node_add_variable_callback;
400
+ UA_Server_setVariableNode_valueCallback(parent->master->master, n, callback);
401
+
353
402
  UA_Server_addReference(parent->master->master,
354
403
  n,
355
404
  UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
@@ -357,15 +406,28 @@ static UA_NodeId node_add_variable_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedTe
357
406
  true);
358
407
 
359
408
  return n;
360
- } //}}}
361
- static UA_NodeId node_add_variable_ua_simple(UA_Int32 type, char* nstr, node_struct *parent, UA_Byte accesslevelmask, bool numeric) { //{{{
409
+ } //}}}
410
+ static UA_NodeId node_add_variable_ua_simple(UA_Int32 type, VALUE str, node_struct *parent, UA_Byte accesslevelmask, bool numeric, VALUE blk) { //{{{
411
+ int nodeid = nodecounter++;
412
+ char *nstr = (char *)StringValuePtr(str);
413
+
414
+ UA_NodeId n;
415
+ if (numeric) {
416
+ n = UA_NODEID_NUMERIC(parent->master->default_ns,nodeid);
417
+ rb_hash_aset(parent->master->methods,INT2NUM(nodeid),blk);
418
+ } else {
419
+ n = UA_NODEID_STRING(parent->master->default_ns,nstr);
420
+ rb_hash_aset(parent->master->methods,str,blk);
421
+ }
422
+ rb_gc_register_address(&blk);
362
423
  return node_add_variable_ua(
363
424
  type,
364
- numeric ? UA_NODEID_NUMERIC(parent->master->default_ns,nodecounter++) : UA_NODEID_STRING(parent->master->default_ns,nstr),
425
+ n,
365
426
  UA_LOCALIZEDTEXT("en-US", nstr),
366
427
  UA_QUALIFIEDNAME(parent->master->default_ns, nstr),
367
428
  parent,
368
- accesslevelmask
429
+ accesslevelmask,
430
+ blk
369
431
  );
370
432
  } //}}}
371
433
  static VALUE node_add_variable_wrap(int argc, VALUE* argv, VALUE self, UA_Byte accesslevelmask, bool numeric) { //{{{
@@ -375,22 +437,28 @@ static VALUE node_add_variable_wrap(int argc, VALUE* argv, VALUE self, UA_Byte a
375
437
  rb_raise(rb_eArgError, "wrong number of arguments");
376
438
  }
377
439
 
440
+ Data_Get_Struct(self, node_struct, parent);
441
+ if (!parent->exists) rb_raise(rb_eRuntimeError, "Node does not exist anymore.");
442
+
443
+ VALUE name;
444
+ VALUE ttype;
445
+ VALUE blk;
446
+ rb_gc_register_address(&blk);
447
+
448
+ rb_scan_args(argc, argv, "11&", &name, &ttype, &blk);
449
+
378
450
  UA_UInt32 type;
379
- if (argc == 2 && argv[1] != Qnil) {
380
- type = NUM2INT(argv[1]);
381
- } else {
451
+ if (NIL_P(ttype)) {
382
452
  type = UA_NS0ID_BASEDATAVARIABLETYPE;
453
+ } else {
454
+ type = NUM2INT(ttype);
383
455
  }
384
456
 
385
- Data_Get_Struct(self, node_struct, parent);
386
- if (!parent->exists) rb_raise(rb_eRuntimeError, "Node does not exist anymore.");
387
-
388
- VALUE str = rb_obj_as_string(argv[0]);
457
+ VALUE str = rb_obj_as_string(name);
389
458
  if (NIL_P(str) || TYPE(str) != T_STRING)
390
459
  rb_raise(rb_eTypeError, "cannot convert obj to string");
391
- char *nstr = (char *)StringValuePtr(str);
392
460
 
393
- return node_wrap(cVarNode,node_alloc(parent->master,node_add_variable_ua_simple(type,nstr,parent,accesslevelmask,numeric)));
461
+ return node_wrap(cVarNode,node_alloc(parent->master,node_add_variable_ua_simple(type,str,parent,accesslevelmask,numeric,blk)));
394
462
  } //}}}
395
463
  static VALUE node_add_variable(int argc, VALUE* argv, VALUE self) { //{{{
396
464
  return node_add_variable_wrap(argc,argv,self,UA_ACCESSLEVELMASK_READ,true);
@@ -449,10 +517,18 @@ static UA_NodeId node_add_object_ua(UA_Int32 type, UA_NodeId n, UA_LocalizedText
449
517
 
450
518
  return n;
451
519
  } //}}}
452
- static UA_NodeId node_add_object_ua_simple(UA_Int32 type, char* nstr, node_struct *parent, node_struct *datatype, VALUE ref) { //{{{
520
+ static UA_NodeId node_add_object_ua_simple(UA_Int32 type, char* nstr, node_struct *parent, node_struct *datatype, VALUE ref, bool numeric) { //{{{
521
+ int nodeid = nodecounter++;
522
+ UA_NodeId n;
523
+ if (numeric) {
524
+ n = UA_NODEID_NUMERIC(parent->master->default_ns,nodeid);
525
+ } else {
526
+ n = UA_NODEID_STRING(parent->master->default_ns,nstr);
527
+ }
528
+
453
529
  return node_add_object_ua(
454
530
  type,
455
- UA_NODEID_STRING(parent->master->default_ns,nstr),
531
+ n,
456
532
  UA_LOCALIZEDTEXT("en-US", nstr),
457
533
  UA_QUALIFIEDNAME(parent->master->default_ns, nstr),
458
534
  parent,
@@ -489,7 +565,7 @@ static VALUE node_add_object(int argc, VALUE* argv, VALUE self) { //{{{
489
565
  rb_raise(rb_eTypeError, "cannot convert obj to string");
490
566
  char *nstr = (char *)StringValuePtr(str);
491
567
 
492
- return node_wrap(CLASS_OF(self),node_alloc(parent->master,node_add_object_ua_simple(type,nstr,parent,datatype,argv[2])));
568
+ return node_wrap(CLASS_OF(self),node_alloc(parent->master,node_add_object_ua_simple(type,nstr,parent,datatype,argv[2],true)));
493
569
  } //}}}
494
570
 
495
571
  static UA_StatusCode node_manifest_iter(UA_NodeId child_id, UA_Boolean is_inverse, UA_NodeId reference_type_id, void *handle) { //{{{
@@ -564,10 +640,22 @@ static UA_StatusCode node_manifest_iter(UA_NodeId child_id, UA_Boolean is_invers
564
640
  UA_BrowsePathResult property = node_browse_path(parent->master->master, child_id, UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION), pqn, false);
565
641
  UA_QualifiedName_clear(&pqn);
566
642
 
643
+ VALUE blk;
644
+ if (child_id.identifierType == UA_NODEIDTYPE_NUMERIC) {
645
+ blk = rb_hash_aref(parent->master->methods,INT2NUM(child_id.identifier.numeric));
646
+ } else if (child_id.identifierType == UA_NODEIDTYPE_STRING) {
647
+ blk = rb_hash_aref(parent->master->methods,rb_str_new((const char *)child_id.identifier.string.data,child_id.identifier.string.length));
648
+ } else if (child_id.identifierType == UA_NODEIDTYPE_BYTESTRING) {
649
+ blk = rb_hash_aref(parent->master->methods,rb_str_new((const char *)child_id.identifier.byteString.data,child_id.identifier.byteString.length));
650
+ } else {
651
+ blk = Qnil;
652
+ }
653
+
654
+
567
655
  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);
656
+ node_add_variable_ua(UA_NS0ID_PROPERTYTYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al,blk);
569
657
  } else {
570
- node_add_variable_ua(UA_NS0ID_BASEDATAVARIABLETYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al);
658
+ node_add_variable_ua(UA_NS0ID_BASEDATAVARIABLETYPE,UA_NODEID_STRING(parent->master->default_ns,buffer),dn,qn,newnode,al,blk);
571
659
  }
572
660
 
573
661
  UA_BrowsePathResult_clear(&property);
@@ -758,7 +846,7 @@ static VALUE node_value_set(VALUE self, VALUE value) { //{{{
758
846
  }
759
847
 
760
848
  UA_Server_writeValue(ns->master->master, ns->id, variant);
761
- UA_Variant_deleteMembers(&variant);
849
+ UA_Variant_clear(&variant);
762
850
  }
763
851
  return self;
764
852
  } //}}}
data/lib/opcua/server.rb CHANGED
@@ -46,11 +46,23 @@ module OPCUA
46
46
  def add_property_rw(*item)
47
47
  item.each { |e| add_property_rw e }
48
48
  end
49
- def add_variables(*item)
50
- item.each { |e| add_variable e }
49
+ def add_variables(*item,&blk)
50
+ item.each do |e|
51
+ if blk.nil?
52
+ add_variable e
53
+ else
54
+ add_variable e, &blk
55
+ end
56
+ end
51
57
  end
52
- def add_variables_rw(*item)
53
- item.each { |e| add_variable_rw e }
58
+ def add_variables_rw(*item,&blk)
59
+ item.each do |e|
60
+ if blk.nil?
61
+ add_variable_rw e
62
+ else
63
+ add_variable_rw e, &blk
64
+ end
65
+ end
54
66
  end
55
67
  end
56
68
  end
data/opcua.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "opcua"
3
- s.version = "0.21"
3
+ s.version = "0.26"
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.21'
4
+ version: '0.26'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
8
8
  - Florian Pauker
9
- autorequire:
9
+ - Matthias Ehrendorfer
10
+ autorequire:
10
11
  bindir: tools
11
12
  cert_chain: []
12
- date: 2020-07-14 00:00:00.000000000 Z
13
+ date: 2021-02-23 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: daemonite
@@ -84,6 +85,7 @@ files:
84
85
  - example/server.rb
85
86
  - example/server_deep.rb
86
87
  - example/server_values.rb
88
+ - example/server_values_callback.rb
87
89
  - example/server_xml.rb
88
90
  - example/test.rb
89
91
  - ext/opcua/client/client.c
@@ -123,7 +125,7 @@ homepage: https://github.com/etm/opcua-smart
123
125
  licenses:
124
126
  - LGPL-3.0
125
127
  metadata: {}
126
- post_install_message:
128
+ post_install_message:
127
129
  rdoc_options: []
128
130
  require_paths:
129
131
  - lib
@@ -138,8 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
140
  - !ruby/object:Gem::Version
139
141
  version: '0'
140
142
  requirements: []
141
- rubygems_version: 3.1.2
142
- signing_key:
143
+ rubygems_version: 3.1.4
144
+ signing_key:
143
145
  specification_version: 4
144
146
  summary: Preliminary release of opcua (open62541) ruby bindings. C performance, Ruby
145
147
  elegance, simplicity, and productivity.