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
3bc1bb8a
Commit
3bc1bb8a
authored
Apr 17, 2015
by
Olivier R-D
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
port event tests from c++ and enable
parent
41d35625
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
57 additions
and
92 deletions
+57
-92
example-client.py
example-client.py
+3
-3
example-server.py
example-server.py
+7
-7
opcua/client.py
opcua/client.py
+3
-0
opcua/node.py
opcua/node.py
+2
-0
opcua/server.py
opcua/server.py
+3
-1
opcua/subscription.py
opcua/subscription.py
+0
-1
opcua/subscription_server.py
opcua/subscription_server.py
+0
-2
tests.py
tests.py
+39
-78
No files found.
example-client.py
View file @
3bc1bb8a
...
@@ -18,9 +18,9 @@ class SubHandler(object):
...
@@ -18,9 +18,9 @@ class SubHandler(object):
if
__name__
==
"__main__"
:
if
__name__
==
"__main__"
:
from
IPython
import
embed
from
IPython
import
embed
logging
.
basicConfig
(
level
=
logging
.
INFO
)
logging
.
basicConfig
(
level
=
logging
.
WARN
)
logger
=
logging
.
getLogger
(
"KeepAlive"
)
#
logger = logging.getLogger("KeepAlive")
logger
.
setLevel
(
logging
.
DEBUG
)
#
logger.setLevel(logging.DEBUG)
client
=
Client
(
"opc.tcp://localhost:4841/freeopcua/server/"
)
client
=
Client
(
"opc.tcp://localhost:4841/freeopcua/server/"
)
try
:
try
:
client
.
connect
()
client
.
connect
()
...
...
example-server.py
View file @
3bc1bb8a
...
@@ -33,8 +33,8 @@ if __name__ == "__main__":
...
@@ -33,8 +33,8 @@ if __name__ == "__main__":
#logger = logging.getLogger("opcua.address_space")
#logger = logging.getLogger("opcua.address_space")
#logger = logging.getLogger("opcua.internal_server")
#logger = logging.getLogger("opcua.internal_server")
#logger.setLevel(logging.DEBUG)
#logger.setLevel(logging.DEBUG)
logger
=
logging
.
getLogger
(
"opcua.subscription_server"
)
#
logger = logging.getLogger("opcua.subscription_server")
logger
.
setLevel
(
logging
.
DEBUG
)
#
logger.setLevel(logging.DEBUG)
# now setup our server
# now setup our server
...
@@ -58,10 +58,10 @@ if __name__ == "__main__":
...
@@ -58,10 +58,10 @@ if __name__ == "__main__":
mymethod
=
myobj
.
add_method
(
idx
,
"mymethod"
,
func
,
[
ua
.
VariantType
.
Int64
],
[
ua
.
VariantType
.
Boolean
])
mymethod
=
myobj
.
add_method
(
idx
,
"mymethod"
,
func
,
[
ua
.
VariantType
.
Int64
],
[
ua
.
VariantType
.
Boolean
])
multiply_node
=
myobj
.
add_method
(
idx
,
"multiply"
,
multiply
,
[
ua
.
VariantType
.
Int64
,
ua
.
VariantType
.
Int64
],
[
ua
.
VariantType
.
Int64
])
multiply_node
=
myobj
.
add_method
(
idx
,
"multiply"
,
multiply
,
[
ua
.
VariantType
.
Int64
,
ua
.
VariantType
.
Int64
],
[
ua
.
VariantType
.
Int64
])
#creating an event object
# creating an event object
# The event object automatically will have members for all events properties
myevent
=
server
.
get_event_object
(
ObjectIds
.
BaseEventType
)
myevent
=
server
.
get_event_object
(
ObjectIds
.
BaseEventType
)
myevent
.
Message
.
Text
=
"This is my event"
myevent
.
Message
.
Text
=
"This is my event"
print
(
"My event is"
,
myevent
)
# starting!
# starting!
server
.
start
()
server
.
start
()
...
@@ -71,9 +71,9 @@ if __name__ == "__main__":
...
@@ -71,9 +71,9 @@ if __name__ == "__main__":
#enable following if you want to subscribe to nodes on server side
#enable following if you want to subscribe to nodes on server side
sub
=
server
.
create_subscription
(
500
,
handler
)
sub
=
server
.
create_subscription
(
500
,
handler
)
handle
=
sub
.
subscribe_data_change
(
myvar
)
handle
=
sub
.
subscribe_data_change
(
myvar
)
#
time.sleep(0.1)
#
trigger event, all subscribed clients wil receive it
#sub.unsubscribe(handle
)
myevent
.
trigger
(
)
#sub.delete()
embed
()
embed
()
finally
:
finally
:
server
.
stop
()
server
.
stop
()
...
...
opcua/client.py
View file @
3bc1bb8a
...
@@ -193,6 +193,9 @@ class Client(object):
...
@@ -193,6 +193,9 @@ class Client(object):
def
get_objects_node
(
self
):
def
get_objects_node
(
self
):
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ua
.
ObjectIds
.
ObjectsFolder
))
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ua
.
ObjectIds
.
ObjectsFolder
))
def
get_server_node
(
self
):
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ua
.
ObjectIds
.
Server
))
def
get_node
(
self
,
nodeid
):
def
get_node
(
self
,
nodeid
):
"""
"""
Get node using NodeId object or a string representing a NodeId
Get node using NodeId object or a string representing a NodeId
...
...
opcua/node.py
View file @
3bc1bb8a
...
@@ -17,6 +17,8 @@ class Node(object):
...
@@ -17,6 +17,8 @@ class Node(object):
self
.
nodeid
=
nodeid
self
.
nodeid
=
nodeid
elif
type
(
nodeid
)
in
(
str
,
bytes
):
elif
type
(
nodeid
)
in
(
str
,
bytes
):
self
.
nodeid
=
ua
.
NodeId
.
from_string
(
nodeid
)
self
.
nodeid
=
ua
.
NodeId
.
from_string
(
nodeid
)
elif
isinstance
(
nodeid
,
int
):
self
.
nodeid
=
ua
.
NodeId
(
nodeid
,
0
)
else
:
else
:
raise
Exception
(
"argument to node must be a NodeId object or a string defining a nodeid found {} of type {}"
.
format
(
nodeid
,
type
(
nodeid
)))
raise
Exception
(
"argument to node must be a NodeId object or a string defining a nodeid found {} of type {}"
.
format
(
nodeid
,
type
(
nodeid
)))
def
__eq__
(
self
,
other
):
def
__eq__
(
self
,
other
):
...
...
opcua/server.py
View file @
3bc1bb8a
...
@@ -77,13 +77,15 @@ class Server(object):
...
@@ -77,13 +77,15 @@ class Server(object):
self
.
iserver
.
stop
()
self
.
iserver
.
stop
()
self
.
bserver
.
stop
()
self
.
bserver
.
stop
()
def
get_root_node
(
self
):
def
get_root_node
(
self
):
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ObjectIds
.
RootFolder
))
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ObjectIds
.
RootFolder
))
def
get_objects_node
(
self
):
def
get_objects_node
(
self
):
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ObjectIds
.
ObjectsFolder
))
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ObjectIds
.
ObjectsFolder
))
def
get_server_node
(
self
):
return
self
.
get_node
(
ua
.
TwoByteNodeId
(
ObjectIds
.
Server
))
def
get_node
(
self
,
nodeid
):
def
get_node
(
self
,
nodeid
):
"""
"""
Get node using NodeId object or a string representing a NodeId
Get node using NodeId object or a string representing a NodeId
...
...
opcua/subscription.py
View file @
3bc1bb8a
...
@@ -127,7 +127,6 @@ class Subscription(object):
...
@@ -127,7 +127,6 @@ class Subscription(object):
def
subscribe_events
(
self
,
sourcenode
=
ObjectIds
.
Server
,
evtype
=
ObjectIds
.
BaseEventType
):
def
subscribe_events
(
self
,
sourcenode
=
ObjectIds
.
Server
,
evtype
=
ObjectIds
.
BaseEventType
):
sourcenode
=
self
.
_get_node
(
sourcenode
)
sourcenode
=
self
.
_get_node
(
sourcenode
)
evfilter
=
self
.
_get_filter_from_event_type
(
evtype
)
evfilter
=
self
.
_get_filter_from_event_type
(
evtype
)
print
(
"EVFILTER is "
,
evfilter
)
return
self
.
_subscribe
(
sourcenode
,
AttributeIds
.
EventNotifier
,
evfilter
)
return
self
.
_subscribe
(
sourcenode
,
AttributeIds
.
EventNotifier
,
evfilter
)
def
_subscribe
(
self
,
node
,
attr
,
mfilter
=
None
):
def
_subscribe
(
self
,
node
,
attr
,
mfilter
=
None
):
...
...
opcua/subscription_server.py
View file @
3bc1bb8a
...
@@ -383,7 +383,6 @@ class InternalSubscription(object):
...
@@ -383,7 +383,6 @@ class InternalSubscription(object):
item
=
self
.
_monitored_items
[
mid
]
item
=
self
.
_monitored_items
[
mid
]
fieldlist
=
ua
.
EventFieldList
()
fieldlist
=
ua
.
EventFieldList
()
fieldlist
.
ClientHandle
=
item
.
client_handle
fieldlist
.
ClientHandle
=
item
.
client_handle
print
(
"filter is "
,
item
.
parameters
.
FilterResult
,
" event is "
,
event
)
fieldlist
.
EventFields
=
self
.
_get_event_fields
(
item
.
parameters
.
FilterResult
,
event
)
fieldlist
.
EventFields
=
self
.
_get_event_fields
(
item
.
parameters
.
FilterResult
,
event
)
self
.
_triggered_events
.
append
(
fieldlist
)
self
.
_triggered_events
.
append
(
fieldlist
)
return
True
return
True
...
@@ -391,7 +390,6 @@ class InternalSubscription(object):
...
@@ -391,7 +390,6 @@ class InternalSubscription(object):
def
_get_event_fields
(
self
,
evfilter
,
event
):
def
_get_event_fields
(
self
,
evfilter
,
event
):
fields
=
[]
fields
=
[]
for
sattr
in
evfilter
.
SelectClauses
:
for
sattr
in
evfilter
.
SelectClauses
:
print
(
"looking at sattrs"
,
sattr
)
try
:
try
:
if
not
sattr
.
BrowsePath
:
if
not
sattr
.
BrowsePath
:
val
=
getattr
(
event
,
ua
.
AttributeIdsInv
[
sattr
.
Attribute
])
val
=
getattr
(
event
,
ua
.
AttributeIdsInv
[
sattr
.
Attribute
])
...
...
tests.py
View file @
3bc1bb8a
...
@@ -5,7 +5,7 @@ import io
...
@@ -5,7 +5,7 @@ import io
import
sys
import
sys
from
datetime
import
datetime
,
timedelta
from
datetime
import
datetime
,
timedelta
import
unittest
import
unittest
from
threading
import
Thread
,
Event
import
threading
try
:
try
:
from
queue
import
Queue
from
queue
import
Queue
except
ImportError
:
except
ImportError
:
...
@@ -17,6 +17,7 @@ from opcua import ua
...
@@ -17,6 +17,7 @@ from opcua import ua
from
opcua
import
Client
from
opcua
import
Client
from
opcua
import
Server
from
opcua
import
Server
from
opcua
import
uamethod
from
opcua
import
uamethod
from
opcua
import
Event
port_num1
=
48410
port_num1
=
48410
port_num2
=
48430
port_num2
=
48430
...
@@ -207,42 +208,42 @@ class CommonTests(object):
...
@@ -207,42 +208,42 @@ class CommonTests(object):
sub
.
unsubscribe
(
handle
)
sub
.
unsubscribe
(
handle
)
sub
.
delete
()
sub
.
delete
()
#
def test_subscribe_events(self):
def
test_subscribe_events
(
self
):
#
sub = self.opc.create_subscription(100, sclt)
sub
=
self
.
opc
.
create_subscription
(
100
,
sclt
)
#
handle = sub.subscribe_events()
handle
=
sub
.
subscribe_events
()
##
time.sleep(0.1)
time
.
sleep
(
0.1
)
#
sub.unsubscribe(handle)
sub
.
unsubscribe
(
handle
)
#
sub.delete()
sub
.
delete
()
#
def test_events(self):
def
test_events
(
self
):
#
msclt = MySubHandler()
msclt
=
MySubHandler
()
#
cond = msclt.setup()
cond
=
msclt
.
setup
()
#
sub = self.opc.create_subscription(100, msclt)
sub
=
self
.
opc
.
create_subscription
(
100
,
msclt
)
#
handle = sub.subscribe_events()
handle
=
sub
.
subscribe_events
()
#ev = ua.Event(
)
ev
=
Event
(
self
.
srv
.
iserver
.
isession
)
#msg =
"this is my msg "
msg
=
b
"this is my msg "
#ev.message
= msg
ev
.
Message
.
Text
=
msg
#tid = datetime.
datetime.now()
tid
=
datetime
.
now
()
#ev.t
ime = tid
ev
.
T
ime
=
tid
#ev.source_node = self.opc.get_server_node().nodeid
#ev.source_node = self.opc.get_server_node().nodeid
#ev.source_name = "our server node"
#ev.source_name = "our server node"
#ev.s
everity = 500
ev
.
S
everity
=
500
#self.srv.trigger_event(ev
)
ev
.
trigger
(
)
#
with cond:
with
cond
:
#
ret = cond.wait(50000)
ret
=
cond
.
wait
(
50000
)
#
if sys.version_info.major>2: self.assertEqual(ret, True) # we went into timeout waiting for subcsription callback
if
sys
.
version_info
.
major
>
2
:
self
.
assertEqual
(
ret
,
True
)
# we went into timeout waiting for subcsription callback
#else: pass # XXX
else
:
pass
# python2
#
self.assertIsNot(msclt.ev, None)# we did not receive event
self
.
assertIsNot
(
msclt
.
ev
,
None
)
# we did not receive event
#self.assertEqual(msclt.ev.message
, msg)
self
.
assertEqual
(
msclt
.
ev
.
Message
.
Text
,
msg
)
#self.assertEqual(msclt.ev.
time.to_datetime()
, tid)
#self.assertEqual(msclt.ev.
Time
, tid)
#self.assertEqual(msclt.ev.s
everity, 500)
self
.
assertEqual
(
msclt
.
ev
.
S
everity
,
500
)
#self.assertEqual(msclt.ev.source_n
ode, self.opc.get_server_node().nodeid)
self
.
assertEqual
(
msclt
.
ev
.
SourceN
ode
,
self
.
opc
.
get_server_node
().
nodeid
)
#time.sleep(0.1)
#time.sleep(0.1)
#
sub.unsubscribe(handle)
sub
.
unsubscribe
(
handle
)
#
sub.delete()
sub
.
delete
()
def
test_non_existing_path
(
self
):
def
test_non_existing_path
(
self
):
...
@@ -526,38 +527,6 @@ def add_server_methods(srv):
...
@@ -526,38 +527,6 @@ def add_server_methods(srv):
class
ServerProcess
(
Thread
):
'''
Start a server in another process/thread
'''
def
__init__
(
self
):
Thread
.
__init__
(
self
)
self
.
_exit
=
Event
()
self
.
started
=
Event
()
self
.
_queue
=
Queue
()
def
run
(
self
):
self
.
srv
=
Server
()
self
.
srv
.
set_endpoint
(
'opc.tcp://localhost:%d'
%
port_num1
)
add_server_methods
(
self
.
srv
)
self
.
srv
.
start
()
self
.
started
.
set
()
while
not
self
.
_exit
.
is_set
():
time
.
sleep
(
0.1
)
if
not
self
.
_queue
.
empty
():
ev
=
self
.
_queue
.
get
()
self
.
srv
.
trigger_event
(
ev
)
self
.
srv
.
stop
()
def
stop
(
self
):
self
.
_exit
.
set
()
def
trigger_event
(
self
,
ev
):
self
.
_queue
.
put
(
ev
)
class
TestClient
(
unittest
.
TestCase
,
CommonTests
):
class
TestClient
(
unittest
.
TestCase
,
CommonTests
):
'''
'''
Run common tests on client side
Run common tests on client side
...
@@ -567,11 +536,11 @@ class TestClient(unittest.TestCase, CommonTests):
...
@@ -567,11 +536,11 @@ class TestClient(unittest.TestCase, CommonTests):
'''
'''
@
classmethod
@
classmethod
def
setUpClass
(
self
):
def
setUpClass
(
self
):
# start server in its own process
# start our own server
global
globalserver
self
.
srv
=
Server
()
self
.
srv
=
globalserver
self
.
srv
.
set_endpoint
(
'opc.tcp://localhost:%d'
%
port_num1
)
add_server_methods
(
self
.
srv
)
self
.
srv
.
start
()
self
.
srv
.
start
()
self
.
srv
.
started
.
wait
()
# let it initialize
# start client
# start client
self
.
clt
=
Client
(
'opc.tcp://localhost:%d'
%
port_num1
)
self
.
clt
=
Client
(
'opc.tcp://localhost:%d'
%
port_num1
)
...
@@ -583,9 +552,6 @@ class TestClient(unittest.TestCase, CommonTests):
...
@@ -583,9 +552,6 @@ class TestClient(unittest.TestCase, CommonTests):
self
.
clt
.
disconnect
()
self
.
clt
.
disconnect
()
# stop the server in its own process
# stop the server in its own process
self
.
srv
.
stop
()
self
.
srv
.
stop
()
# wait for server to stop, otherwise we may try to start a
# new one before this one is really stopped
self
.
srv
.
join
()
def
test_service_fault
(
self
):
def
test_service_fault
(
self
):
request
=
ua
.
ReadRequest
()
request
=
ua
.
ReadRequest
()
...
@@ -638,14 +604,9 @@ class TestServer(unittest.TestCase, CommonTests):
...
@@ -638,14 +604,9 @@ class TestServer(unittest.TestCase, CommonTests):
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
logging
.
basicConfig
(
level
=
logging
.
WARN
)
logging
.
basicConfig
(
level
=
logging
.
WARN
)
globalserver
=
ServerProcess
()
#server process will be started by client tests
try
:
sclt
=
SubHandler
()
sclt
=
SubHandler
()
unittest
.
main
(
verbosity
=
3
)
unittest
.
main
(
verbosity
=
3
)
finally
:
globalserver
.
stop
()
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