Skip to content

Commit dbd1249

Browse files
authored
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
1 parent 71ca643 commit dbd1249

4 files changed

Lines changed: 32 additions & 12 deletions

File tree

opcua/client/ua_client.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,16 @@ def browse(self, parameters):
276276
response.ResponseHeader.ServiceResult.check()
277277
return response.Results
278278

279+
def browse_next(self, parameters):
280+
self.logger.info("browse next")
281+
request = ua.BrowseNextRequest()
282+
request.Parameters = parameters
283+
data = self._uasocket.send_request(request)
284+
response = ua.BrowseNextResponse.from_binary(data)
285+
self.logger.debug(response)
286+
response.ResponseHeader.ServiceResult.check()
287+
return response.Parameters.Results
288+
279289
def read(self, parameters):
280290
self.logger.info("read")
281291
request = ua.ReadRequest()

opcua/common/node.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,21 @@ def get_references(self, refs=ua.ObjectIds.References, direction=ua.BrowseDirect
328328
params = ua.BrowseParameters()
329329
params.View.Timestamp = ua.get_win_epoch()
330330
params.NodesToBrowse.append(desc)
331+
params.RequestedMaxReferencesPerNode = 0
331332
results = self.server.browse(params)
332-
return results[0].References
333+
334+
references = self._browse_next(results)
335+
return references
336+
337+
def _browse_next(self, results):
338+
references = results[0].References
339+
while results[0].ContinuationPoint:
340+
params = ua.BrowseNextParameters()
341+
params.ContinuationPoints = [results[0].ContinuationPoint]
342+
params.ReleaseContinuationPoints = False
343+
results = self.server.browse_next(params)
344+
references.extend(results[0].References)
345+
return references
333346

334347
def get_referenced_nodes(self, refs=ua.ObjectIds.References, direction=ua.BrowseDirection.Both, nodeclassmask=ua.NodeClass.Unspecified, includesubtypes=True):
335348
"""

schemas/generate_model.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,12 @@ def add_basetype_members(model):
498498
struct.fields.insert(idx, field)
499499

500500

501+
def fix_names(model):
502+
for s in model.enums:
503+
for f in s.values:
504+
if f.name == "None":
505+
f.name = "None_"
506+
501507

502508

503509

schemas/generate_protocol_python.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# temporary hack
2-
import generate_model as gm
31

42
IgnoredEnums = ["NodeIdType"]
53
IgnoredStructs = ["QualifiedName", "NodeId", "ExpandedNodeId", "FilterOperand", "Variant", "DataValue", "LocalizedText", "ExtensionObject", "XmlElement"]
@@ -351,15 +349,8 @@ def get_default_value(self, field):
351349
else:
352350
return field.uatype + "()"
353351

354-
355-
def fix_names(model):
356-
for s in model.enums:
357-
for f in s.values:
358-
if f.name == "None":
359-
f.name = "None_"
360-
361-
362352
if __name__ == "__main__":
353+
import generate_model as gm
363354
xmlpath = "Opc.Ua.Types.bsd"
364355
protocolpath = "../opcua/ua/uaprotocol_auto.py"
365356
p = gm.Parser(xmlpath)
@@ -369,6 +360,6 @@ def fix_names(model):
369360
gm.remove_duplicates(model)
370361
gm.remove_vector_length(model)
371362
gm.split_requests(model)
372-
fix_names(model)
363+
gm.fix_names(model)
373364
c = CodeGenerator(model, protocolpath)
374365
c.run()

0 commit comments

Comments
 (0)