Avatar

Please consider registering
guest

sp_LogInOut Log In sp_Registration Register

Register | Lost password?
Advanced Search

— Forum Scope —




— Match —





— Forum Options —





Minimum search word length is 3 characters - maximum search word length is 84 characters

sp_Feed Topic RSS sp_TopicIcon
Documentation for Android application development
November 23, 2023
13:47, EET
Avatar
Francesco Zambon
Member
Members
Forum Posts: 83
Member Since:
December 20, 2021
sp_UserOfflineSmall Offline

Good morning,

Please, I need to know if there is documentation for developing an OPC UA Client application for Android or the sources of a demo (such as for the Java server and client).

Searching the SDK I found the following resources:
README-android.txt
https://www.prosysopc.com/blog/developing-opc-ua-applications-in-android-studio/

I’m a beginner in Android application development and I’m looking for a good starting point to understand how to integrate the Prosys OPC client.

Thank you,
Francesco

November 24, 2023
14:50, EET
Avatar
Jimmy Ni
Moderator
Members

Moderators
Forum Posts: 26
Member Since:
February 1, 2019
sp_UserOfflineSmall Offline

Hello Francesco,

Thank you for contacting us. The the listed resources are the only public ones we have. I will send you an email to introduce how to import Prosys OPC UA SDK for Java to Android Studio and set up dependencies because it contains screenshots.

Best regards,
Jimmy

November 24, 2023
16:00, EET
Avatar
Francesco Zambon
Member
Members
Forum Posts: 83
Member Since:
December 20, 2021
sp_UserOfflineSmall Offline

Good morning Jimmy,

thank you very much for the support.
I created the Android project and connected to an OPC UA server.

I would like clarification on the following points.

1. what is the following method for?

ModelParserBase.setSkipValuesOnAndroid(true)

2. OPC UA client is very slow to connect to server (several minutes)
but disabling the following features

client.setInitTypeDictionaryAutoUsage(false);
client.setInitTypeDictionaryOnConnect(false);

it connects in two seconds.

Please could you explain better what they are for?
In case I needed TypeDictionaries, how should I initialize them manually?

Thanks,
Francesco

November 27, 2023
9:26, EET
Avatar
Bjarne Boström
Moderator
Moderators
Forum Posts: 1026
Member Since:
April 3, 2012
sp_UserOfflineSmall Offline

Hi,

1. That advice might have been old, the current default value is false. Depending on the Android environment the decoding of the Value tags within NodeSet XMLs (loaded on the server side) might not work, that flag that flag skips parsing of them. This is explained in the README-android.txt, copied below:

“NOTE: In the Server side, when NodeSet XMLs are parsed, the Value tags are parsed using com.prosysopc.ua.stack.encoding.xml.XmlDecoder that uses javax.xml.stream.XMLStreamReader.
Android has XML library limitations, you might need to call ModelParserBase.setSkipValuesOnAndroid(true) (the Value(s) are skipped) or somehow provide that
javax.xml.stream.XMLInputFactory.newInstance() works and javax.xml.stream.XMLInputFactory.createXMLStreamReader(Reader) returns a XMLStreamReader. If you use the ModelParserBase.setSkipValuesOnAndroid(true)
and the Values are skipped note that this includes the InputArguments and OutputArguments of OPC UA Methods defined in the model and thus they wouldn’t work for Clients.”

2. Both are related to support for custom Structures. We need to read a lot of metadata from the server in order to support them. Since we are already reading a lot, it will read the rest of the Types as well, since doing it in connect can be optimized (Read/Browse can be done in bulk).

So, basically you would set those 2 to false, if you know for sure that you do not need support for custom structures. It would skip reading the Types part. Though, an additional side-effect is that once you do anything with UaNodes we will make about 100 calls to the server to read the types part anyway (which is not needed if we managed to already get it during connect). This is inverse-Browse due to how it works and cannot be bulk (but the requests are small).

In the past com.prosysopc.ua.typedictionary.TypeDictionary had to be used manually, but starting 4.0.0 it happens by default automatically, client.setInitTypeDictionaryAutoUsage(false); would retain previous functionality. This must be set before calling connect(), after that it only happens if you would call disconnect and then connect again. In technical terms, this sets (in 5.0.0, skipping older explanations) com.prosysopc.ua.stack.encoding.EncoderContext.setDynamicDataTypeSpecificationProvider(Function) to ask the TypeDictionary if it is not found within the context.

The client.setInitTypeDictionaryOnConnect toggles is com.prosysopc.ua.typedictionary.TypeDictionary.init() called as part of the connect. IMPORTANT! If false, then it only inits on the first (manual call to) TypeDictionary.decode/binaryEncode (and .refresh). That doesn’t happen automatically, i.e. it doesn’t init itself when a unknown Structure is encountered. WARNING, doing the init outside of the connect can potentially be dangerous, because depending on the server you could see an equivalent stop in communication you saw during connect if set to true. For example, any Subscription might not get data, or might end up being deleted by the server depending on the implementation. Servers made with our SDK are most likely ok, assuming beefy enough hardware, as it processes requests in parallel, but some servers might not do that and might be blocked the init (and if that lasts longer than the lifetime of a subscription, the server might end up deleting it itself before it interacts with it).

If client.setInitTypeDictionaryAutoUsage(true) and client.setInitTypeDictionaryOnConnect(false), note that com.prosysopc.ua.stack.encoding.EncoderContext.getDataTypeSpecification(UaNodeId) for custom structures will only work for 1.04 Servers supporting DataTypeDefinition Attribute until the TypeDictionary is initialized manually.

So basically what the TypeDictionary.init() does it read/browse(s) all Types. Then it checks can it resolve all non-Codegen-unknown DataTypes into UaDataTypeSpecification via the 1.04 DataTypeDefinition Attribute. If not, it will read the older pre-1.04-DataTypeDictionary system and resolves them that way into UaDataTypeSpecification. The latter part is not very optimal, the old dictionary format is a complicated XML document combined with info from the nodes, and it is basically not possible to do it individually to a type, you must read all of them at once. Also, it is impossible to figure out does a server support 1.04 DataTypeDefinition for everything as far as I’m aware, other than reading all DataTypes and see if it had that for everything, in which case the dictionaries can be skipped.

Skipping some of the other details, but that is the short explanation.

November 27, 2023
11:13, EET
Avatar
Francesco Zambon
Member
Members
Forum Posts: 83
Member Since:
December 20, 2021
sp_UserOfflineSmall Offline

Hi Bjarne,

Thanks for the explanation.
I had read the Javadoc (com/prosysopc/ua/client/UaClient.html), but I preferred to ask in the forum to better understand the mechanism of dictionaries.
That’s enough for now.

Best regards,
Francesco

Forum Timezone: Europe/Helsinki

Most Users Ever Online: 1919

Currently Online:
17 Guest(s)

Currently Browsing this Page:
1 Guest(s)

Top Posters:

Heikki Tahvanainen: 402

hbrackel: 144

rocket science: 88

pramanj: 86

Francesco Zambon: 83

Ibrahim: 78

Sabari: 62

kapsl: 57

gjevremovic: 49

Xavier: 43

Member Stats:

Guest Posters: 0

Members: 737

Moderators: 7

Admins: 1

Forum Stats:

Groups: 3

Forums: 15

Topics: 1524

Posts: 6450

Newest Members:

fannielima, kristiewinkle8, rust, christamcdowall, redaahern07571, nigelbdhmp, travistimmons, AnnelCib, dalenegettinger, howardkennerley

Moderators: Jouni Aro: 1026, Pyry: 1, Petri: 0, Bjarne Boström: 1026, Jimmy Ni: 26, Matti Siponen: 346, Lusetti: 0

Administrators: admin: 1