Browse Source

used new structures+decoding/encoding functions to answer HEL pack

FlorianPalm 11 years ago
parent
commit
4cb3cc8a5c
4 changed files with 16 additions and 64 deletions
  1. 1 1
      examples/src/opcuaServer.c
  2. 1 1
      src/UA_connection.h
  3. 5 2
      src/UA_stackInternalTypes.c
  4. 9 60
      src/opcua_transportLayer.c

+ 1 - 1
examples/src/opcuaServer.c

@@ -138,7 +138,7 @@ void server_run()
 		{
 			printf("data will be sent \n");
 			n = write(newsockfd,connection.writeData.data,connection.writeData.length);
-			printf("sent data \n");
+			printf("written %d bytes \n",n);
 			connection.newDataToWrite = 0;
 			UA_free(connection.writeData.data);
 			connection.writeData.data = NULL;

+ 1 - 1
src/UA_connection.h

@@ -9,7 +9,7 @@
 #define OPCUA_CONNECTIONHELPER_H_
 #include "opcua.h"
 
-enum packetType
+enum UA_MessageType
 {
 	UA_MESSAGETYPE_HEL = 0x48454C, // H E L
 	UA_MESSAGETYPE_ACK = 0x41434B, // A C k

+ 5 - 2
src/UA_stackInternalTypes.c

@@ -15,8 +15,11 @@ UA_Int32 UA_MessageType_calcSize(UA_MessageType const * ptr){
 
 UA_Int32 UA_MessageType_encode(UA_MessageType const * src, UA_Int32* pos, char* dst){
 	UA_Int32 retval = UA_SUCCESS;
-	UA_Byte *tmpBuf;
-	tmpBuf = (UA_Byte*)&(src); //messageType to Byte representation
+	UA_Byte tmpBuf[3];
+	tmpBuf[0] = (UA_Byte)((((UA_Int32)*src) >> 16) );
+	tmpBuf[1] = (UA_Byte)((((UA_Int32)*src) >> 8));
+	tmpBuf[2] = (UA_Byte)(((UA_Int32)*src));
+
 	retval |= UA_Byte_encode(&(tmpBuf[0]),pos,dst);
 	retval |= UA_Byte_encode(&(tmpBuf[1]),pos,dst);
 	retval |= UA_Byte_encode(&(tmpBuf[2]),pos,dst);

+ 9 - 60
src/opcua_transportLayer.c

@@ -114,72 +114,19 @@ UA_Int32 TL_receive(UA_connection *connection, UA_ByteString *packet)
 
 #define Cmp3Byte(data,pos,a,b,c) (*((Int32*) ((data)+(pos))) & 0xFFFFFF) == (Int32)(((Byte)(a))|((Byte)(b))<<8|((Byte)(c))<<16)
 
-UA_Int32 TL_getPacketType(UA_ByteString *packet, UA_Int32 *pos)
-{
-	UA_Int32 retVal = -1;
-	// printf("TL_getPacketType - entered \n");
-	// printf("TL_getPacketType - pos = %d \n",*pos);
-
-	if(packet->data[*pos] == 'H' &&
-	   packet->data[*pos+1] == 'E' &&
-	   packet->data[*pos+2] == 'L')
-	{
-		*pos += 3 * sizeof(UA_Byte);
-		retVal = UA_MESSAGETYPE_HEL;
-	}
-	else if(packet->data[*pos] == 'A' &&
-	        packet->data[*pos+1] == 'C' &&
-	        packet->data[*pos+2] == 'K')
-	{
-		*pos += 3 * sizeof(UA_Byte);
-		retVal = UA_MESSAGETYPE_ACK;
-	}
-	else if(packet->data[*pos] == 'E' &&
-			packet->data[*pos+1] == 'R' &&
-			packet->data[*pos+2] == 'R')
-	{
-		*pos += 3 * sizeof(UA_Byte);
-		retVal =  UA_MESSAGETYPE_ERR;
-	}
-	else if(packet->data[*pos] == 'O' &&
-	        packet->data[*pos+1] == 'P' &&
-	        packet->data[*pos+2] == 'N')
-	{
-		*pos += 3 * sizeof(UA_Byte);
-		retVal =  UA_MESSAGETYPE_OPN;
-	}
-	else if(packet->data[*pos] == 'C' &&
-	        packet->data[*pos+1] == 'L' &&
-	        packet->data[*pos+2] == 'O')
-	{
-		*pos += 3 * sizeof(UA_Byte);
-		retVal =  UA_MESSAGETYPE_CLO;
-	}
-	else if(packet->data[*pos] == 'M' &&
-			packet->data[*pos+1] == 'S' &&
-			packet->data[*pos+2] == 'G')
-	{
-		*pos += 3 * sizeof(UA_Byte);
-		retVal =  UA_MESSAGETYPE_MSG;
-	}
-	//TODO retVal == -1 -- ERROR no valid message received
-	return retVal;
-}
-
 
 UA_Int32 TL_process(UA_connection *connection,UA_Int32 packetType, UA_Int32 *pos)
 {
 	UA_Int32 tmpPos = 0;
 	UA_ByteString tmpMessage;
-	UA_Byte reserved;
-	UA_UInt32 messageSize;
 	UA_OPCUATcpHelloMessage *helloMessage;
 	UA_OPCUATcpAcknowledgeMessage *ackMessage;
 	UA_OPCUATcpMessageHeader *ackHeader;
-	UA_alloc((void**)(&helloMessage),UA_OPCUATcpHelloMessage_calcSize(UA_NULL));
+
+
 
 	printf("TL_process - entered \n");
-	struct TL_header tmpHeader;
+
 	switch(packetType)
 	{
 	case UA_MESSAGETYPE_HEL :
@@ -188,6 +135,8 @@ UA_Int32 TL_process(UA_connection *connection,UA_Int32 packetType, UA_Int32 *pos
 			printf("TL_process - extracting header information \n");
 			printf("TL_process - pos = %d \n",*pos);
 
+			UA_alloc((void**)(&helloMessage),UA_OPCUATcpHelloMessage_calcSize(UA_NULL));
+
 			UA_OPCUATcpHelloMessage_decode(connection->readData.data,pos,helloMessage);
 
 			/* extract information from received header */
@@ -206,6 +155,7 @@ UA_Int32 TL_process(UA_connection *connection,UA_Int32 packetType, UA_Int32 *pos
 
 			connection->transportLayer.remoteConf.maxChunkCount = helloMessage->maxChunkCount;
 			printf("TL_process - maxChunkCount = %d \n",connection->transportLayer.remoteConf.maxChunkCount);
+
 			UA_String_copy(&(helloMessage->endpointUrl), &(connection->transportLayer.endpointURL));
 
 			/* send back acknowledge */
@@ -227,13 +177,12 @@ UA_Int32 TL_process(UA_connection *connection,UA_Int32 packetType, UA_Int32 *pos
 
 			//allocate memory in stream
 			UA_alloc((void**)&(tmpMessage.data),ackHeader->messageSize);
+			tmpMessage.length = ackHeader->messageSize;
+
 			//encode header and message
 			UA_OPCUATcpMessageHeader_encode(ackHeader,&tmpPos,tmpMessage.data);
 			UA_OPCUATcpAcknowledgeMessage_encode(ackMessage,&tmpPos,tmpMessage.data);
 
-
-			tmpMessage.length = SIZE_OF_ACKNOWLEDGE_MESSAGE;
-
 			printf("TL_process - Size messageToSend = %d \n",ackHeader->messageSize);
 			/* ------------------------ Body ------------------------ */
 			// protocol version
@@ -246,7 +195,7 @@ UA_Int32 TL_process(UA_connection *connection,UA_Int32 packetType, UA_Int32 *pos
 			printf("TL_process - localConf.maxMessageSize = %d \n", connection->transportLayer.localConf.maxMessageSize);
 			//maximum chunk count
 			printf("TL_process - localConf.maxChunkCount = %d \n", connection->transportLayer.localConf.maxChunkCount);
-
+			UA_ByteString_printf("encoded data",&tmpMessage);
 			TL_send(connection, &tmpMessage);
 		}
 		else