123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #include "opcua_transportLayer.h"
- void TL_open(UA_connection *connection, AD_RawMessage *rawMessage)
- {
- UA_connection tmpConnection;
- switch(connection->transportLayer.connectionState)
- {
- connectionState_CLOSED :
- {
-
- TL_processHELMessage(&tmpConnection,rawMessage);
- connection->transportLayer.localConf.protocolVersion = TL_SERVER_PROTOCOL_VERSION;
- connection->transportLayer.localConf.recvBufferSize =
- tmpConnection.transportLayer.localConf.recvBufferSize;
- connection->transportLayer.localConf.sendBufferSize =
- tmpConnection.transportLayer.localConf.sendBufferSize;
- connection->transportLayer.localConf.maxMessageSize = TL_SERVER_MAX_MESSAGE_SIZE;
- connection->transportLayer.localConf.maxChunkCount = TL_SERVER_MAX_CHUNK_COUNT;
- TL_sendACK(connection);
- connection->transportLayer.connectionState = connectionState_ESTABLISHED;
- break;
- }
- connectionState_OPENING :
- {
-
-
- break;
- }
- connectionState_ESTABLISHED :
- {
- break;
- }
- }
- }
- Int32 TL_check(UA_connection *connection, AD_RawMessage *TL_messsage)
- {
- Int32 position = 4;
- UInt32 messageLength = 0;
- Int32 pos = 0;
- TL_getPacketType(&pos,TL_messsage);
- decoder_decodeBuiltInDatatype(TL_messsage->message,UINT32,&position,&messageLength);
- if (messageLength == TL_messsage->length &&
- messageLength < (connection->transportLayer.localConf.maxMessageSize))
- {
- return UA_ERROR;
- }
- return UA_NO_ERROR;
- }
- Int32 TL_receive(UA_connection *connection, AD_RawMessage *TL_message)
- {
- UInt32 bufferSize = connection->transportLayer.localConf.recvBufferSize = 8192;
- UInt32 length = 0;
- Int32 pos = 0;
- AD_RawMessage tmpRawMessage;
- struct TL_header tmpHeader;
-
- tmpRawMessage.message = (char *)opcua_malloc(bufferSize);
- tmpRawMessage.length = bufferSize;
- if(TL_check(connection,TL_message) == UA_NO_ERROR)
- {
- Int32 packetType = TL_getPacketType(&pos,TL_message);
- switch(packetType)
- {
- packetType_MSG:
- packetType_OPN:
- packetType_CLO:
- break;
- packetType_HEL:
- packetType_ACK:
- TL_process(connection,TL_message,packetType);
- break;
- packetType_ERR:
- TL_message->length = 0;
- TL_message->message = NULL;
-
- return UA_ERROR_RCV_ERROR;
- break;
- }
- }
- else
- {
-
-
- }
- return UA_NO_ERROR;
- }
- void TL_getMessageHeader(struct TL_header *header, AD_RawMessage *rawMessage)
- {
- int pos = 0;
- if(rawMessage->message[0] == 'H' &&
- rawMessage->message[1] == 'E' &&
- rawMessage->message[2] == 'L')
- {
- header->MessageType = TL_HEL;
- }
- else if(rawMessage->message[0] == 'A' &&
- rawMessage->message[1] == 'C' &&
- rawMessage->message[2] == 'K')
- {
- header->MessageType = TL_ACK;
- }
- else if(rawMessage->message[0] == 'E' &&
- rawMessage->message[1] == 'R' &&
- rawMessage->message[2] == 'R')
- {
- header->MessageType = TL_ERR;
- }
- else if(rawMessage->message[0] == 'O' &&
- rawMessage->message[1] == 'P' &&
- rawMessage->message[2] == 'N')
- {
- header->MessageType = TL_OPN;
- }
- else if(rawMessage->message[0] == 'C' &&
- rawMessage->message[1] == 'L' &&
- rawMessage->message[2] == 'O')
- {
- header->MessageType = TL_CLO;
- }
- else if(rawMessage->message[0] == 'M' &&
- rawMessage->message[1] == 'S' &&
- rawMessage->message[2] == 'G')
- {
- header->MessageType = TL_MSG;
- }
- else
- {
-
- }
- pos = pos + TL_MESSAGE_TYPE_LEN;
- decoder_decodeBuiltInDatatype(rawMessage->message,BYTE,&pos,&(header->Reserved));
- decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,&(header->MessageSize));
- }
- Int32 TL_getPacketType(Int32 *pos,AD_RawMessage *rawMessage)
- {
- if(rawMessage->message[*pos] == 'H' &&
- rawMessage->message[*pos+1] == 'E' &&
- rawMessage->message[*pos+2] == 'L')
- {
- return packetType_HEL;
- }
- else if(rawMessage->message[*pos] == 'A' &&
- rawMessage->message[*pos+1] == 'C' &&
- rawMessage->message[*pos+2] == 'K')
- {
- return packetType_ACK;
- }
- else if(rawMessage->message[*pos] == 'E' &&
- rawMessage->message[*pos+1] == 'R' &&
- rawMessage->message[*pos+2] == 'R')
- {
- return packetType_ERR;
- }
- else if(rawMessage->message[*pos] == 'O' &&
- rawMessage->message[*pos+1] == 'P' &&
- rawMessage->message[*pos+2] == 'N')
- {
- return packetType_OPN;
- }
- else if(rawMessage->message[*pos] == 'C' &&
- rawMessage->message[*pos+1] == 'L' &&
- rawMessage->message[*pos+2] == 'O')
- {
- return packetType_CLO;
- }
- else if(rawMessage->message[*pos] == 'M' &&
- rawMessage->message[*pos+1] == 'S' &&
- rawMessage->message[*pos+2] == 'G')
- {
- return packetType_MSG;
- }
- else
- {
- return -1;
- }
- }
- Int32 TL_process(UA_connection *connection,Int32 packetType, Int32 *pos, AD_RawMessage *rawMessage)
- {
- struct TL_header tmpHeader;
- switch(packetType)
- {
- packetType_HEL :
- if(connection->transportLayer.connectionState == connectionState_CLOSED)
- {
- decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
- (void*)(&(connection->transportLayer.remoteConf.protocolVersion)));
- decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
- (void*)(&(connection->transportLayer.remoteConf.recvBufferSize)));
- decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
- (void*)(&(connection->transportLayer.remoteConf.sendBufferSize)));
- decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
- (void*)(&(connection->transportLayer.remoteConf.maxMessageSize)));
- decoder_decodeBuiltInDatatype(rawMessage->message,UINT32,&pos,
- (void*)(&(connection->transportLayer.remoteConf.maxChunkCount)));
- decoder_decodeBuiltInDatatype(rawMessage->message,STRING,&pos,
- (void*)(&(connection->transportLayer.endpointURL)));
- }
- else
- {
- return UA_ERROR_MULTIPLY_HEL;
- }
- }
- return UA_NO_ERROR;
- }
- TL_send(AD_RawMessage *rawMessage)
- {
-
- }
|