Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
opcua-asyncio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nikola Balog
opcua-asyncio
Commits
122b99da
Commit
122b99da
authored
Jul 30, 2018
by
Christian Bergmiller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wip
parent
af2d044d
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
31 additions
and
29 deletions
+31
-29
opcua/client/client.py
opcua/client/client.py
+2
-0
opcua/common/node.py
opcua/common/node.py
+0
-1
opcua/common/structures.py
opcua/common/structures.py
+5
-5
opcua/common/ua_utils.py
opcua/common/ua_utils.py
+2
-2
opcua/common/xmlexporter.py
opcua/common/xmlexporter.py
+4
-4
opcua/server/server.py
opcua/server/server.py
+3
-2
opcua/tools.py
opcua/tools.py
+13
-13
test_external_server.py
test_external_server.py
+1
-1
tests/test_client.py
tests/test_client.py
+1
-1
No files found.
opcua/client/client.py
View file @
122b99da
...
@@ -515,6 +515,7 @@ class Client(object):
...
@@ -515,6 +515,7 @@ class Client(object):
return
subscription
return
subscription
def
get_namespace_array
(
self
):
def
get_namespace_array
(
self
):
"""COROUTINE"""
ns_node
=
self
.
get_node
(
ua
.
NodeId
(
ua
.
ObjectIds
.
Server_NamespaceArray
))
ns_node
=
self
.
get_node
(
ua
.
NodeId
(
ua
.
ObjectIds
.
Server_NamespaceArray
))
return
ns_node
.
get_value
()
return
ns_node
.
get_value
()
...
@@ -555,4 +556,5 @@ class Client(object):
...
@@ -555,4 +556,5 @@ class Client(object):
return
len
(
uries
)
-
1
return
len
(
uries
)
-
1
def
load_type_definitions
(
self
,
nodes
=
None
):
def
load_type_definitions
(
self
,
nodes
=
None
):
"""COROUTINE"""
return
load_type_definitions
(
self
,
nodes
)
return
load_type_definitions
(
self
,
nodes
)
opcua/common/node.py
View file @
122b99da
...
@@ -247,7 +247,6 @@ class Node:
...
@@ -247,7 +247,6 @@ class Node:
attributeid is a member of ua.AttributeIds
attributeid is a member of ua.AttributeIds
datavalue is a ua.DataValue object
datavalue is a ua.DataValue object
"""
"""
_logger
.
info
(
'Node set_attribute %r %r %r'
,
self
,
attributeid
,
datavalue
)
attr
=
ua
.
WriteValue
()
attr
=
ua
.
WriteValue
()
attr
.
NodeId
=
self
.
nodeid
attr
.
NodeId
=
self
.
nodeid
attr
.
AttributeId
=
attributeid
attr
.
AttributeId
=
attributeid
...
...
opcua/common/structures.py
View file @
122b99da
...
@@ -236,7 +236,7 @@ from opcua import ua
...
@@ -236,7 +236,7 @@ from opcua import ua
return
return
def
load_type_definitions
(
server
,
nodes
=
None
):
async
def
load_type_definitions
(
server
,
nodes
=
None
):
"""
"""
Download xml from given variable node defining custom structures.
Download xml from given variable node defining custom structures.
If no node is given, attemps to import variables from all nodes under
If no node is given, attemps to import variables from all nodes under
...
@@ -247,14 +247,14 @@ def load_type_definitions(server, nodes=None):
...
@@ -247,14 +247,14 @@ def load_type_definitions(server, nodes=None):
"""
"""
if
nodes
is
None
:
if
nodes
is
None
:
nodes
=
[]
nodes
=
[]
for
desc
in
server
.
nodes
.
opc_binary
.
get_children_descriptions
():
for
desc
in
await
server
.
nodes
.
opc_binary
.
get_children_descriptions
():
if
desc
.
BrowseName
!=
ua
.
QualifiedName
(
"Opc.Ua"
):
if
desc
.
BrowseName
!=
ua
.
QualifiedName
(
"Opc.Ua"
):
nodes
.
append
(
server
.
get_node
(
desc
.
NodeId
))
nodes
.
append
(
server
.
get_node
(
desc
.
NodeId
))
structs_dict
=
{}
structs_dict
=
{}
generators
=
[]
generators
=
[]
for
node
in
nodes
:
for
node
in
nodes
:
xml
=
node
.
get_value
()
xml
=
await
node
.
get_value
()
xml
=
xml
.
decode
(
"utf-8"
)
xml
=
xml
.
decode
(
"utf-8"
)
generator
=
StructGenerator
()
generator
=
StructGenerator
()
generators
.
append
(
generator
)
generators
.
append
(
generator
)
...
@@ -270,9 +270,9 @@ def load_type_definitions(server, nodes=None):
...
@@ -270,9 +270,9 @@ def load_type_definitions(server, nodes=None):
# register classes
# register classes
# every children of our node should represent a class
# every children of our node should represent a class
for
ndesc
in
node
.
get_children_descriptions
():
for
ndesc
in
await
node
.
get_children_descriptions
():
ndesc_node
=
server
.
get_node
(
ndesc
.
NodeId
)
ndesc_node
=
server
.
get_node
(
ndesc
.
NodeId
)
ref_desc_list
=
ndesc_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasDescription
,
direction
=
ua
.
BrowseDirection
.
Inverse
)
ref_desc_list
=
await
ndesc_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasDescription
,
direction
=
ua
.
BrowseDirection
.
Inverse
)
if
ref_desc_list
:
#some server put extra things here
if
ref_desc_list
:
#some server put extra things here
name
=
_clean_name
(
ndesc
.
BrowseName
.
Name
)
name
=
_clean_name
(
ndesc
.
BrowseName
.
Name
)
if
not
name
in
structs_dict
:
if
not
name
in
structs_dict
:
...
...
opcua/common/ua_utils.py
View file @
122b99da
...
@@ -230,7 +230,7 @@ async def get_base_data_type(datatype):
...
@@ -230,7 +230,7 @@ async def get_base_data_type(datatype):
raise
ua
.
UaError
(
"Datatype must be a subtype of builtin types {0!s}"
.
format
(
datatype
))
raise
ua
.
UaError
(
"Datatype must be a subtype of builtin types {0!s}"
.
format
(
datatype
))
def
get_nodes_of_namespace
(
server
,
namespaces
=
None
):
async
def
get_nodes_of_namespace
(
server
,
namespaces
=
None
):
"""
"""
Get the nodes of one or more namespaces .
Get the nodes of one or more namespaces .
Args:
Args:
...
@@ -241,7 +241,7 @@ def get_nodes_of_namespace(server, namespaces=None):
...
@@ -241,7 +241,7 @@ def get_nodes_of_namespace(server, namespaces=None):
"""
"""
if
namespaces
is
None
:
if
namespaces
is
None
:
namespaces
=
[]
namespaces
=
[]
ns_available
=
server
.
get_namespace_array
()
ns_available
=
await
server
.
get_namespace_array
()
if
not
namespaces
:
if
not
namespaces
:
namespaces
=
ns_available
[
1
:]
namespaces
=
ns_available
[
1
:]
...
...
opcua/common/xmlexporter.py
View file @
122b99da
...
@@ -87,7 +87,7 @@ class XmlExporter(object):
...
@@ -87,7 +87,7 @@ class XmlExporter(object):
addr_idx_to_xml_idx
[
addr_idx
]
=
xml_idx
+
1
addr_idx_to_xml_idx
[
addr_idx
]
=
xml_idx
+
1
return
addr_idx_to_xml_idx
return
addr_idx_to_xml_idx
def
_get_ns_idxs_of_nodes
(
self
,
nodes
):
async
def
_get_ns_idxs_of_nodes
(
self
,
nodes
):
"""
"""
get a list of all indexes used or references by nodes
get a list of all indexes used or references by nodes
"""
"""
...
@@ -95,7 +95,7 @@ class XmlExporter(object):
...
@@ -95,7 +95,7 @@ class XmlExporter(object):
for
node
in
nodes
:
for
node
in
nodes
:
node_idxs
=
[
node
.
nodeid
.
NamespaceIndex
]
node_idxs
=
[
node
.
nodeid
.
NamespaceIndex
]
node_idxs
.
append
(
node
.
get_browse_name
().
NamespaceIndex
)
node_idxs
.
append
(
node
.
get_browse_name
().
NamespaceIndex
)
node_idxs
.
extend
(
ref
.
NodeId
.
NamespaceIndex
for
ref
in
node
.
get_references
())
node_idxs
.
extend
(
ref
.
NodeId
.
NamespaceIndex
for
ref
in
await
node
.
get_references
())
node_idxs
=
list
(
set
(
node_idxs
))
# remove duplicates
node_idxs
=
list
(
set
(
node_idxs
))
# remove duplicates
for
i
in
node_idxs
:
for
i
in
node_idxs
:
if
i
!=
0
and
i
not
in
idxs
:
if
i
!=
0
and
i
not
in
idxs
:
...
@@ -329,8 +329,8 @@ class XmlExporter(object):
...
@@ -329,8 +329,8 @@ class XmlExporter(object):
# insert behind the namespace element
# insert behind the namespace element
self
.
etree
.
getroot
().
insert
(
1
,
aliases_el
)
self
.
etree
.
getroot
().
insert
(
1
,
aliases_el
)
def
_add_ref_els
(
self
,
parent_el
,
obj
):
async
def
_add_ref_els
(
self
,
parent_el
,
obj
):
refs
=
obj
.
get_references
()
refs
=
await
obj
.
get_references
()
refs_el
=
Et
.
SubElement
(
parent_el
,
'References'
)
refs_el
=
Et
.
SubElement
(
parent_el
,
'References'
)
for
ref
in
refs
:
for
ref
in
refs
:
...
...
opcua/server/server.py
View file @
122b99da
...
@@ -528,7 +528,7 @@ class Server:
...
@@ -528,7 +528,7 @@ class Server:
exp
.
build_etree
(
nodes
)
exp
.
build_etree
(
nodes
)
return
exp
.
write_xml
(
path
)
return
exp
.
write_xml
(
path
)
def
export_xml_by_ns
(
self
,
path
,
namespaces
=
None
):
async
def
export_xml_by_ns
(
self
,
path
,
namespaces
=
None
):
"""
"""
Export nodes of one or more namespaces to an XML file.
Export nodes of one or more namespaces to an XML file.
Namespaces used by nodes are always exported for consistency.
Namespaces used by nodes are always exported for consistency.
...
@@ -541,7 +541,7 @@ class Server:
...
@@ -541,7 +541,7 @@ class Server:
"""
"""
if
namespaces
is
None
:
if
namespaces
is
None
:
namespaces
=
[]
namespaces
=
[]
nodes
=
get_nodes_of_namespace
(
self
,
namespaces
)
nodes
=
await
get_nodes_of_namespace
(
self
,
namespaces
)
self
.
export_xml
(
nodes
,
path
)
self
.
export_xml
(
nodes
,
path
)
def
delete_nodes
(
self
,
nodes
,
recursive
=
False
):
def
delete_nodes
(
self
,
nodes
,
recursive
=
False
):
...
@@ -618,4 +618,5 @@ class Server:
...
@@ -618,4 +618,5 @@ class Server:
self
.
iserver
.
isession
.
add_method_callback
(
node
.
nodeid
,
callback
)
self
.
iserver
.
isession
.
add_method_callback
(
node
.
nodeid
,
callback
)
def
load_type_definitions
(
self
,
nodes
=
None
):
def
load_type_definitions
(
self
,
nodes
=
None
):
"""COROUTINE"""
return
load_type_definitions
(
self
,
nodes
)
return
load_type_definitions
(
self
,
nodes
)
opcua/tools.py
View file @
122b99da
...
@@ -257,7 +257,7 @@ def uawrite():
...
@@ -257,7 +257,7 @@ def uawrite():
print
(
args
)
print
(
args
)
def
uals
():
async
def
uals
():
parser
=
argparse
.
ArgumentParser
(
description
=
"Browse OPC-UA node and print result"
)
parser
=
argparse
.
ArgumentParser
(
description
=
"Browse OPC-UA node and print result"
)
add_common_args
(
parser
)
add_common_args
(
parser
)
parser
.
add_argument
(
"-l"
,
parser
.
add_argument
(
"-l"
,
...
@@ -277,46 +277,46 @@ def uals():
...
@@ -277,46 +277,46 @@ def uals():
args
.
long_format
=
1
args
.
long_format
=
1
client
=
Client
(
args
.
url
,
timeout
=
args
.
timeout
)
client
=
Client
(
args
.
url
,
timeout
=
args
.
timeout
)
client
.
set_security_string
(
args
.
security
)
await
client
.
set_security_string
(
args
.
security
)
client
.
connect
()
await
client
.
connect
()
try
:
try
:
node
=
get_node
(
client
,
args
)
node
=
get_node
(
client
,
args
)
print
(
"Browsing node {0} at {1}
\
n
"
.
format
(
node
,
args
.
url
))
print
(
"Browsing node {0} at {1}
\
n
"
.
format
(
node
,
args
.
url
))
if
args
.
long_format
==
0
:
if
args
.
long_format
==
0
:
_lsprint_0
(
node
,
args
.
depth
-
1
)
await
_lsprint_0
(
node
,
args
.
depth
-
1
)
elif
args
.
long_format
==
1
:
elif
args
.
long_format
==
1
:
_lsprint_1
(
node
,
args
.
depth
-
1
)
await
_lsprint_1
(
node
,
args
.
depth
-
1
)
else
:
else
:
_lsprint_long
(
node
,
args
.
depth
-
1
)
_lsprint_long
(
node
,
args
.
depth
-
1
)
finally
:
finally
:
client
.
disconnect
()
await
client
.
disconnect
()
sys
.
exit
(
0
)
sys
.
exit
(
0
)
print
(
args
)
print
(
args
)
def
_lsprint_0
(
node
,
depth
,
indent
=
""
):
async
def
_lsprint_0
(
node
,
depth
,
indent
=
""
):
if
not
indent
:
if
not
indent
:
print
(
"{0:30} {1:25}"
.
format
(
"DisplayName"
,
"NodeId"
))
print
(
"{0:30} {1:25}"
.
format
(
"DisplayName"
,
"NodeId"
))
print
(
""
)
print
(
""
)
for
desc
in
node
.
get_children_descriptions
():
for
desc
in
await
node
.
get_children_descriptions
():
print
(
"{0}{1:30} {2:25}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
()))
print
(
"{0}{1:30} {2:25}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
()))
if
depth
:
if
depth
:
_lsprint_0
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
await
_lsprint_0
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
def
_lsprint_1
(
node
,
depth
,
indent
=
""
):
async
def
_lsprint_1
(
node
,
depth
,
indent
=
""
):
if
not
indent
:
if
not
indent
:
print
(
"{0:30} {1:25} {2:25} {3:25}"
.
format
(
"DisplayName"
,
"NodeId"
,
"BrowseName"
,
"Value"
))
print
(
"{0:30} {1:25} {2:25} {3:25}"
.
format
(
"DisplayName"
,
"NodeId"
,
"BrowseName"
,
"Value"
))
print
(
""
)
print
(
""
)
for
desc
in
node
.
get_children_descriptions
():
for
desc
in
await
node
.
get_children_descriptions
():
if
desc
.
NodeClass
==
ua
.
NodeClass
.
Variable
:
if
desc
.
NodeClass
==
ua
.
NodeClass
.
Variable
:
val
=
Node
(
node
.
server
,
desc
.
NodeId
).
get_value
()
val
=
await
Node
(
node
.
server
,
desc
.
NodeId
).
get_value
()
print
(
"{0}{1:30} {2!s:25} {3!s:25}, {4!s:3}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
(),
desc
.
BrowseName
.
to_string
(),
val
))
print
(
"{0}{1:30} {2!s:25} {3!s:25}, {4!s:3}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
(),
desc
.
BrowseName
.
to_string
(),
val
))
else
:
else
:
print
(
"{0}{1:30} {2!s:25} {3!s:25}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
(),
desc
.
BrowseName
.
to_string
()))
print
(
"{0}{1:30} {2!s:25} {3!s:25}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
(),
desc
.
BrowseName
.
to_string
()))
if
depth
:
if
depth
:
_lsprint_1
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
await
_lsprint_1
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
def
_lsprint_long
(
pnode
,
depth
,
indent
=
""
):
def
_lsprint_long
(
pnode
,
depth
,
indent
=
""
):
...
...
test_external_server.py
View file @
122b99da
...
@@ -90,7 +90,7 @@ class Tests(unittest.TestCase):
...
@@ -90,7 +90,7 @@ class Tests(unittest.TestCase):
@
connect
@
connect
def
test_get_namespace_array
(
self
,
client
):
def
test_get_namespace_array
(
self
,
client
):
array
=
client
.
get_namespace_array
()
array
=
await
client
.
get_namespace_array
()
self
.
assertTrue
(
len
(
array
)
>
0
)
self
.
assertTrue
(
len
(
array
)
>
0
)
@
connect
@
connect
...
...
tests/test_client.py
View file @
122b99da
...
@@ -119,7 +119,7 @@ async def test_enumstrings_getvalue(server, client):
...
@@ -119,7 +119,7 @@ async def test_enumstrings_getvalue(server, client):
async
def
test_custom_enum_struct
(
server
,
client
):
async
def
test_custom_enum_struct
(
server
,
client
):
client
.
load_type_definitions
()
await
client
.
load_type_definitions
()
ns
=
await
client
.
get_namespace_index
(
'http://yourorganisation.org/struct_enum_example/'
)
ns
=
await
client
.
get_namespace_index
(
'http://yourorganisation.org/struct_enum_example/'
)
myvar
=
client
.
get_node
(
ua
.
NodeId
(
6009
,
ns
))
myvar
=
client
.
get_node
(
ua
.
NodeId
(
6009
,
ns
))
val
=
await
myvar
.
get_value
()
val
=
await
myvar
.
get_value
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment