Commit dbd12492 authored by ORD's avatar ORD Committed by GitHub

implement browse_next in client (#386)

* implement browse_next in client

* first attempt to decode custom extension objects, broken!

* fix several small errors

* add 0 as default for max nodes in browse, cleanup
parent 71ca6430
......@@ -276,6 +276,16 @@ class UaClient(object):
response.ResponseHeader.ServiceResult.check()
return response.Results
def browse_next(self, parameters):
self.logger.info("browse next")
request = ua.BrowseNextRequest()
request.Parameters = parameters
data = self._uasocket.send_request(request)
response = ua.BrowseNextResponse.from_binary(data)
self.logger.debug(response)
response.ResponseHeader.ServiceResult.check()
return response.Parameters.Results
def read(self, parameters):
self.logger.info("read")
request = ua.ReadRequest()
......
......@@ -328,8 +328,21 @@ class Node(object):
params = ua.BrowseParameters()
params.View.Timestamp = ua.get_win_epoch()
params.NodesToBrowse.append(desc)
params.RequestedMaxReferencesPerNode = 0
results = self.server.browse(params)
return results[0].References
references = self._browse_next(results)
return references
def _browse_next(self, results):
references = results[0].References
while results[0].ContinuationPoint:
params = ua.BrowseNextParameters()
params.ContinuationPoints = [results[0].ContinuationPoint]
params.ReleaseContinuationPoints = False
results = self.server.browse_next(params)
references.extend(results[0].References)
return references
def get_referenced_nodes(self, refs=ua.ObjectIds.References, direction=ua.BrowseDirection.Both, nodeclassmask=ua.NodeClass.Unspecified, includesubtypes=True):
"""
......
......@@ -498,6 +498,12 @@ def add_basetype_members(model):
struct.fields.insert(idx, field)
def fix_names(model):
for s in model.enums:
for f in s.values:
if f.name == "None":
f.name = "None_"
# temporary hack
import generate_model as gm
IgnoredEnums = ["NodeIdType"]
IgnoredStructs = ["QualifiedName", "NodeId", "ExpandedNodeId", "FilterOperand", "Variant", "DataValue", "LocalizedText", "ExtensionObject", "XmlElement"]
......@@ -351,15 +349,8 @@ class CodeGenerator(object):
else:
return field.uatype + "()"
def fix_names(model):
for s in model.enums:
for f in s.values:
if f.name == "None":
f.name = "None_"
if __name__ == "__main__":
import generate_model as gm
xmlpath = "Opc.Ua.Types.bsd"
protocolpath = "../opcua/ua/uaprotocol_auto.py"
p = gm.Parser(xmlpath)
......@@ -369,6 +360,6 @@ if __name__ == "__main__":
gm.remove_duplicates(model)
gm.remove_vector_length(model)
gm.split_requests(model)
fix_names(model)
gm.fix_names(model)
c = CodeGenerator(model, protocolpath)
c.run()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment