Browse Source

added activate session, works with UaAnsiC server! some refactoring is still necersarry

Stasik0 10 years ago
parent
commit
7a891f1918
3 changed files with 59 additions and 4 deletions
  1. 28 2
      examples/client_proper.c
  2. 2 1
      include/ua_client.h
  3. 29 1
      src/client/ua_client.c

+ 28 - 2
examples/client_proper.c

@@ -8,16 +8,42 @@
 #include <stdio.h>
 #include "networklayer_tcp.h"
 
+struct UA_Client {
+    UA_ClientNetworkLayer networkLayer;
+    UA_String endpointUrl;
+    UA_Connection connection;
+
+    UA_UInt32 sequenceNumber;
+    UA_UInt32 requestId;
+
+    /* Secure Channel */
+    UA_ChannelSecurityToken securityToken;
+    UA_ByteString clientNonce;
+    UA_ByteString serverNonce;
+	/* UA_SequenceHeader sequenceHdr; */
+	/* UA_NodeId authenticationToken; */
+
+    /* Session */
+    UA_NodeId sessionId;
+    UA_NodeId authenticationToken;
+};
+
 int main(int argc, char *argv[]) {
 	UA_Client *client = UA_Client_new();
 	UA_ClientNetworkLayer nl = ClientNetworkLayerTCP_new(UA_ConnectionConfig_standard);
-    UA_Client_connect(client, UA_ConnectionConfig_standard, nl, "opc.tcp://localhost:16664");
+    UA_Client_connect(client, UA_ConnectionConfig_standard, nl, "opc.tcp://localhost:48020");
+
+    UA_NodeId node;
+    node.namespaceIndex = 4;
+    node.identifierType = UA_NODEIDTYPE_STRING;
+    UA_String_copycstring("Demo.Static.Scalar.Int32", &node.identifier.string);
 
     UA_ReadRequest read_req;
     UA_ReadRequest_init(&read_req);
+
     read_req.nodesToRead = UA_ReadValueId_new();
     read_req.nodesToReadSize = 1;
-    read_req.nodesToRead[0].nodeId = UA_NODEID_STATIC(1, 73);
+    read_req.nodesToRead[0].nodeId = node;
     read_req.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUE;
     UA_ReadResponse read_resp = UA_Client_read(client, &read_req);
     printf("the answer is: %i\n", *(UA_Int32*)read_resp.results[0].value.dataPtr);

+ 2 - 1
include/ua_client.h

@@ -37,7 +37,8 @@ UA_StatusCode UA_EXPORT UA_Client_connect(UA_Client *client, UA_ConnectionConfig
 UA_StatusCode UA_EXPORT UA_Client_disconnect(UA_Client *client);
 
 /* Attribute Service Set */
-UA_ReadResponse UA_EXPORT UA_Client_read(UA_Client *client, const UA_ReadRequest *request);
+//TODO: had to remove const from the 2nd argument
+UA_ReadResponse UA_EXPORT UA_Client_read(UA_Client *client, UA_ReadRequest *request);
 UA_WriteResponse UA_EXPORT UA_Client_write(UA_Client *client, const UA_WriteRequest *request);
 
 /* View Service Set */    

+ 29 - 1
src/client/ua_client.c

@@ -245,6 +245,7 @@ static void synchronousRequest(const void *request, const UA_DataType *requestTy
     retval |= UA_SecureConversationMessageHeader_encodeBinary(&msgHeader, &message, &offset);
     retval |= UA_SymmetricAlgorithmSecurityHeader_encodeBinary(&symHeader, &message, &offset);
     retval |= UA_SequenceHeader_encodeBinary(&seqHeader, &message, &offset);
+
     retval |= UA_NodeId_encodeBinary(&requestId, &message, &offset);
     retval |= UA_encodeBinary(request, requestType, &message, &offset);
 
@@ -287,6 +288,25 @@ static void synchronousRequest(const void *request, const UA_DataType *requestTy
         respHeader->serviceResult = retval;
 }
 
+static UA_StatusCode ActivateSession(UA_Client *client) {
+	UA_ActivateSessionRequest request;
+	UA_ActivateSessionRequest_init(&request);
+
+    request.requestHeader.requestHandle = 2;
+    request.requestHeader.authenticationToken = client->authenticationToken;
+    request.requestHeader.timestamp = UA_DateTime_now();
+    request.requestHeader.timeoutHint = 10000;
+
+    UA_ActivateSessionResponse response;
+    synchronousRequest(&request, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST],
+                       &response, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE],
+                       client);
+
+    UA_ActivateSessionRequest_deleteMembers(&request);
+    UA_ActivateSessionResponse_deleteMembers(&response);
+    return response.responseHeader.serviceResult; // not deleted
+}
+
 static UA_StatusCode SessionHandshake(UA_Client *client) {
 
     UA_CreateSessionRequest request;
@@ -294,6 +314,7 @@ static UA_StatusCode SessionHandshake(UA_Client *client) {
 
     // todo: is this needed for all requests?
     UA_NodeId_copy(&client->authenticationToken, &request.requestHeader.authenticationToken);
+
     request.requestHeader.timestamp = UA_DateTime_now();
 	request.requestHeader.timeoutHint = 10000;
     UA_ByteString_copy(&client->clientNonce, &request.clientNonce);
@@ -309,6 +330,8 @@ static UA_StatusCode SessionHandshake(UA_Client *client) {
                        &response, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE],
                        client);
 
+    UA_NodeId_copy(&response.authenticationToken, &client->authenticationToken);
+
     UA_CreateSessionRequest_deleteMembers(&request);
     UA_CreateSessionResponse_deleteMembers(&response);
     return response.responseHeader.serviceResult; // not deleted
@@ -332,6 +355,8 @@ UA_StatusCode UA_Client_connect(UA_Client *client, UA_ConnectionConfig conf,
         retval = SecureChannelHandshake(client);
     if(retval == UA_STATUSCODE_GOOD)
         retval = SessionHandshake(client);
+    if(retval == UA_STATUSCODE_GOOD)
+        retval = ActivateSession(client);
     return retval;
 }
 
@@ -343,8 +368,11 @@ UA_StatusCode UA_EXPORT UA_Client_disconnect(UA_Client *client) {
 /* User-Facing Functions */
 /*************************/
 
-UA_ReadResponse UA_Client_read(UA_Client *client, const UA_ReadRequest *request) {
+UA_ReadResponse UA_Client_read(UA_Client *client, UA_ReadRequest *request) {
     UA_ReadResponse response;
+    //todo: probably move to synchronousRequest
+    UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+
     synchronousRequest(request, &UA_TYPES[UA_TYPES_READREQUEST], &response,
                        &UA_TYPES[UA_TYPES_READRESPONSE], client);
     return response;