Modified for W5500 Ethernet initialize Added the Ethernet interface re-initialize code Added the connection retry

Dependents:   ThingPlug_Ethernet_Example

Fork of GMMP_mbed by Eric Jung

Operation/GMMP_Operation.cpp

Committer:
hkjung
Date:
2015-08-12
Revision:
5:9bbb6933559b
Parent:
4:1e04850ce835

File content as of revision 5:9bbb6933559b:

/**
 * @file GMMP_Operation.cpp
 * @date 2015/07/20
 * @version 0.0.1.0
 **/

/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
#include <stdarg.h>
*/
#include <time.h>

#include "GMMP_Operation.h"

long g_nTID = 0;
int g_bLog = false;

int g_nErrorLevel = GMMP_ERROR_LEVEL_ERROR;


//GW/Device 등록/해지 Request
int GMMP_SetReg(const char* pszAuthID,
		const char* pszAuthKey,
		const char* pszDomainCode,
		const char* pszGWID,
		const char* pszManufactureID)
{
  debugln("GMMP_SetReg()");

	int nRet = GMMP_SUCCESS;

	if(pszGWID == NULL) {
		GwRegist_Req stRegist_Req;
		memset(&stRegist_Req, 0 ,sizeof(stRegist_Req));

		nRet = SetHeader((void*)&stRegist_Req, sizeof(stRegist_Req), 1,  1, OPERATION_GW_REG_REQ, pszAuthID, NULL);
		if(nRet != GMMP_SUCCESS) {
			return nRet;
		}

		memcpy(stRegist_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
		memcpy(stRegist_Req.body.usManufactureID, pszManufactureID, strlen(pszManufactureID));

		GMMP_Trace(&stRegist_Req.header, &stRegist_Req.body);

		nRet = GMMP_GW_Reg_Req((GwRegist_Req*)&stRegist_Req);

	}
	else
	{
    /*
		if(pszAuthKey == NULL || strlen(pszAuthKey) > LEN_AUTH_KEY || strlen(pszGWID) > LEN_GW_ID)
		{
			return LIB_PARAM_ERROR;
		}
    */

		DeviceRegist_Req stRegist_Req;

		memset(&stRegist_Req, 0 ,sizeof(stRegist_Req));

		nRet = SetHeader((void*)&stRegist_Req, sizeof(stRegist_Req), 1,  1, OPERATION_DEVICE_REG_REQ, pszAuthID, pszAuthKey);
		if(nRet != GMMP_SUCCESS)
		{
			return nRet;
		}

		memcpy(stRegist_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
		memcpy(stRegist_Req.body.usGWID, pszGWID, strlen(pszGWID));
		memcpy(stRegist_Req.body.usManufactureID, pszManufactureID, strlen(pszManufactureID));

		GMMP_Trace(&stRegist_Req.header, &stRegist_Req.body);

		nRet =  GMMP_Device_Reg_Req((DeviceRegist_Req*)&stRegist_Req);
	}

	return nRet;
}

int GMMP_SetDeReg(const char* pszAuthID,
		const char* pszAuthKey,
		const char* pszDomainCode,
		const char* pszGWID,
		const char* pszDeviceID)
{
  /*
	if(pszAuthID == NULL
			|| pszAuthKey == NULL
			|| pszDomainCode == NULL
			|| pszGWID == NULL
			|| strlen(pszAuthID) > LEN_AUTH_ID
			|| strlen(pszAuthKey) > LEN_AUTH_KEY
			|| strlen(pszDomainCode) > LEN_DOMAIN_CODE
			|| strlen(pszGWID) > LEN_GW_ID)
	{
		return LIB_PARAM_ERROR;
	}
  */

	int nRet = GMMP_SUCCESS;

	if(pszDeviceID == NULL) //GW DeReg
	{
		GwDeRegist_Req stDeRegist_Req;
		memset(&stDeRegist_Req, 0 ,sizeof(stDeRegist_Req));

		nRet = SetHeader((void*)&stDeRegist_Req,  sizeof(stDeRegist_Req), 1, 1,  OPERATION_GW_DEREG_REQ, pszAuthID, pszAuthKey);
		if(nRet != GMMP_SUCCESS)
		{
			return nRet;
		}

		memcpy(stDeRegist_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
		memcpy(stDeRegist_Req.body.usGWID, pszGWID, strlen(pszGWID));

		GMMP_Trace(&stDeRegist_Req.header, &stDeRegist_Req.body);

		nRet  =  GMMP_GW_DeReg_Req((GwDeRegist_Req*)&stDeRegist_Req);
	}
	else
	{
		DeviceDeRegist_Req stDeviceDeRegist_Req;

		memset(&stDeviceDeRegist_Req, 0 ,sizeof(stDeviceDeRegist_Req));

		nRet = SetHeader((void*)&stDeviceDeRegist_Req, sizeof(stDeviceDeRegist_Req), 1,  1, OPERATION_DEVICE_DEREG_REQ, pszAuthID, pszAuthKey);
		if(nRet != GMMP_SUCCESS)
		{
			return nRet;
		}

		memcpy(stDeviceDeRegist_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
		memcpy(stDeviceDeRegist_Req.body.usGWID, pszGWID, strlen(pszGWID));
		memcpy(stDeviceDeRegist_Req.body.usDeviceID, pszDeviceID, strlen(pszDeviceID));

		GMMP_Trace(&stDeviceDeRegist_Req.header, &stDeviceDeRegist_Req.body);

		nRet =  GMMP_Device_DeReg_Req((DeviceDeRegist_Req*)&stDeviceDeRegist_Req);
	}

	return nRet;
}

//Profile Info Request
int GMMP_SetProfile(const char* pszAuthID, const char* pszAuthKey, const char* pszDomainCode, const char* pszGWID, const char* pszDeviceID)
{
  /*
	if(pszAuthID == NULL
			|| pszAuthKey == NULL
			|| pszDomainCode == NULL
			|| pszGWID ==NULL
			|| strlen(pszAuthID) > LEN_AUTH_ID
			|| strlen(pszAuthKey) > LEN_AUTH_KEY
			|| strlen(pszDomainCode) > LEN_DOMAIN_CODE
			|| strlen(pszGWID) > LEN_GW_ID)
	{
		return LIB_PARAM_ERROR;
	}
  */

	int nRet = GMMP_SUCCESS;

	Profile_Req  stProfile_Req;

	memset(&stProfile_Req, 0 ,sizeof(stProfile_Req));

	nRet = SetHeader((void*)&stProfile_Req, sizeof(stProfile_Req), 1,  1, OPERATION_PROFILE_REQ, pszAuthID, pszAuthKey);
	if(nRet != GMMP_SUCCESS)
	{
		return nRet;
	}

	memcpy(stProfile_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
	memcpy(stProfile_Req.body.usGWID, pszGWID, strlen(pszGWID));

	if(pszDeviceID != NULL) //Device 판단
	{
		if(strlen(pszDeviceID) > LEN_DEVICE_ID) //Device ID 길이 확인
		{
		}
		else
		{
			memcpy(stProfile_Req.body.usDeviceID, pszDeviceID, strlen(pszDeviceID));
		}
	}

	GMMP_Trace(&stProfile_Req.header, &stProfile_Req.body);

	nRet =  GMMP_Profile_Req(&stProfile_Req);

	return nRet;
}

//수집 데이터 보고  Request
int GMMP_SetDelivery(const char* pszAuthID,
		const char* pszAuthKey,
		const char* pszDomainCode,
		const char* pszGWID,
		const char* pszDeviceID,
		const char cReportType,
		const char cMediaType,
		const char* pszMessageBody,
		const int nTotalCount,
		const int nCurrentCount)
{
  /*
	if(pszAuthID == NULL
			|| pszAuthKey == NULL
			|| pszDomainCode == NULL
			|| pszGWID == NULL
			|| strlen(pszAuthID) > LEN_AUTH_ID
			|| strlen(pszAuthKey) > LEN_AUTH_KEY
			|| strlen(pszDomainCode) > LEN_DOMAIN_CODE
			|| strlen(pszGWID) > LEN_GW_ID
			|| cReportType < 0x00
			|| cReportType > 0x04
			|| cMediaType < 0x01
			|| pszMessageBody == NULL
			|| strlen(pszMessageBody) > MAX_MSG_BODY)
	{
		return LIB_PARAM_ERROR;
	}
  */

	int nMessageBodyLen = strlen(pszMessageBody);

  //debug("msgBodyLen = ");
  //debugln(nMessageBodyLen);
  DBG("msgBodyLen = %d", nMessageBodyLen);

	int nRet = GMMP_SUCCESS;

	Delivery_Req stDelivery_Req;

  //debug(F("ReqSize = "));
  //debugln(sizeof(stDelivery_Req));
  DBG("ReqSize = %d", sizeof(stDelivery_Req));

	memset(&stDelivery_Req, 0, sizeof(stDelivery_Req));

	int PacketSize = sizeof(stDelivery_Req) - MAX_MSG_BODY + nMessageBodyLen ; //Message Body의 속성은 Optinal이다

//  debug(F("pacektSize = "));
//  debugln(PacketSize);
	DBG("packetSize = %d", PacketSize);

	nRet = SetHeader((void*)&stDelivery_Req, PacketSize, nTotalCount,  nCurrentCount, OPERATION_DELIVERY_REQ, pszAuthID, pszAuthKey);
	if(nRet != GMMP_SUCCESS)
	{
		return nRet;
	}

	memcpy(stDelivery_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
	memcpy(stDelivery_Req.body.usGWID, pszGWID, strlen(pszGWID));

	if(pszDeviceID != NULL) //Device 판단
	{
		if(strlen(pszDeviceID) > LEN_DEVICE_ID) //Device ID 길이 확인
		{
		}
		else
		{
			memcpy(stDelivery_Req.body.usDeviceID, pszDeviceID, strlen(pszDeviceID));
		}
	}

	stDelivery_Req.body.ucReportType = cReportType;
	stDelivery_Req.body.ucMediaType = cMediaType;

	if(nMessageBodyLen > 0)
	{
		memcpy(stDelivery_Req.body.usMessageBody, pszMessageBody, nMessageBodyLen);
	}

	GMMP_Trace(&stDelivery_Req.header, &stDelivery_Req.body);

	nRet = GMMP_Delivery_Req(&stDelivery_Req, PacketSize);

	return nRet;
}

//제어 수신 기능은 Thread에서 처리
//제어 수신 보고  Response
int GMMP_SetControl(const char* pszAuthID, const char* pszAuthKey, const char* pszDomainCode, const char* pszGWID, const char* pszDeviceID, const char cControlType, const char cResultCode)
{
  /*
	if(pszAuthID == NULL
			|| pszAuthKey == NULL
			|| pszDomainCode == NULL
			|| pszGWID ==NULL
			|| strlen(pszAuthID) > LEN_AUTH_ID
			|| strlen(pszAuthKey) > LEN_AUTH_KEY
			|| strlen(pszDomainCode) > LEN_DOMAIN_CODE
			|| strlen(pszGWID) > LEN_GW_ID)
	{
		return LIB_PARAM_ERROR;
	}
  */

	int nRet = GMMP_SUCCESS;

	Control_Rsp stControl_Rsp;

	memset(&stControl_Rsp, 0 ,sizeof(stControl_Rsp));

	nRet = SetHeader((void*)&stControl_Rsp, sizeof(stControl_Rsp), 1,  1, OPERATION_CONTROL_RSP, pszAuthID, pszAuthKey);
	if(nRet != GMMP_SUCCESS)
	{
		return nRet;
	}

	memcpy(stControl_Rsp.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
	memcpy(stControl_Rsp.body.usGWID, pszGWID, strlen(pszGWID));

	if(pszDeviceID != NULL) //Device 판단
	{
		if(strlen(pszDeviceID) > LEN_DEVICE_ID) //Device ID 길이 확인
		{
		}
		else
		{
			memcpy(stControl_Rsp.body.usDeviceID, pszDeviceID, strlen(pszDeviceID));
		}
	}

	stControl_Rsp.body.ucControlType = cControlType;
	stControl_Rsp.body.ucResultCode = cResultCode;

	GMMP_Trace(&stControl_Rsp.header, &stControl_Rsp.body);

	nRet =  GMMP_Control_Rsp(&stControl_Rsp);

	return nRet;
}

//제어 동작 완료 결과 보고 Request
int GMMP_SetNotifi(const char* pszAuthID,
		const char* pszAuthKey,
		const char* pszDomainCode,
		const char* pszGWID,
		const char* pszDeviceID,
		const char cControlType,
		const char cResultCode,
		const char* pszMessageBody,
		const int nMessageSize)
{
  /*
	if(pszAuthID == NULL
			|| pszAuthKey == NULL
			|| pszDomainCode == NULL
			|| pszGWID ==NULL
			|| strlen(pszAuthID) > LEN_AUTH_ID
			|| strlen(pszAuthKey) > LEN_AUTH_KEY
			|| strlen(pszDomainCode) > LEN_DOMAIN_CODE
			|| strlen(pszGWID) > LEN_GW_ID)
	{
		return LIB_PARAM_ERROR;
	}
  */

	int nRet = GMMP_SUCCESS;

	Notifi_Req stNotifi_Req;

	memset(&stNotifi_Req, 0 ,sizeof(stNotifi_Req));

	int PacketSize =sizeof(stNotifi_Req) - MAX_MSG_BODY + nMessageSize ; //Message Body의 속성은 Optinal이다

	nRet = SetHeader((void*)&stNotifi_Req, PacketSize, 1,  1, OPERATION_NOTIFICATION_REQ, pszAuthID, pszAuthKey);
	if(nRet != GMMP_SUCCESS)
	{
		return nRet;
	}

	memcpy(stNotifi_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
	memcpy(stNotifi_Req.body.usGWID, pszGWID, strlen(pszGWID));

	if(pszDeviceID != NULL) //Device 판단
	{
		if(strlen(pszDeviceID) > LEN_DEVICE_ID) //Device ID 길이 확인
		{
		}
		else
		{
			memcpy(stNotifi_Req.body.usDeviceID, pszDeviceID, strlen(pszDeviceID));
		}
	}

	stNotifi_Req.body.ucControlType = cControlType;
	stNotifi_Req.body.ucResultCode = cResultCode;

	if(pszMessageBody != NULL) //Message 사용 판단
	{
		if(nMessageSize > MAX_MSG_BODY)
		{
		}
		else
		{
			memcpy(stNotifi_Req.body.usMessageBody, pszMessageBody, nMessageSize);
		}
	}

	GMMP_Trace(&stNotifi_Req.header, &stNotifi_Req.body);

	nRet =  GMMP_Notifi_Req(&stNotifi_Req, PacketSize);

	return nRet;
}

int GMMP_SetHB(const char* pszAuthID,
		const char* pszAuthKey,
		const char* pszDomainCode,
		const char* pszGWID)
{
  /*
	if(pszAuthID == NULL
			|| pszAuthKey == NULL
			|| pszDomainCode == NULL
			|| pszGWID ==NULL
			|| strlen(pszAuthID) > LEN_AUTH_ID
			|| strlen(pszAuthKey) > LEN_AUTH_KEY
			|| strlen(pszDomainCode) > LEN_DOMAIN_CODE
			|| strlen(pszGWID) > LEN_GW_ID)
	{
		return LIB_PARAM_ERROR;
	}
  */

	int nRet = GMMP_SUCCESS;

	HB_Req stHB_Req;

	memset(&stHB_Req, 0 ,sizeof(stHB_Req));

	nRet = SetHeader((void*)&stHB_Req, sizeof(stHB_Req), 1,  1, OPERATION_HEARTBEAT_REQ, pszAuthID, pszAuthKey);
	if(nRet != GMMP_SUCCESS)
	{
		return nRet;
	}

	memcpy(stHB_Req.body.usDomainCode, pszDomainCode, strlen(pszDomainCode));
	memcpy(stHB_Req.body.usGWID, pszGWID, strlen(pszGWID));

	GMMP_Trace(&stHB_Req.header, &stHB_Req.body);

	nRet =  GMMP_Heartbeat_Req(&stHB_Req);

	return nRet;
}

//GW/Device 등록/해지 Response
int GMMP_GetReg(GwRegist_Rsp* pstGwRegist_Rsp, DeviceRegist_Rsp* pstDeviceRegist_Rsp)
{
	int nRet = GMMP_SUCCESS;

	if(pstGwRegist_Rsp != NULL)
	{
		nRet = GMMP_GW_Reg_Rsp(pstGwRegist_Rsp);
		GMMP_Trace(&pstGwRegist_Rsp->header, &pstGwRegist_Rsp->body);
	}
	else
	{
		nRet = GMMP_Device_Reg_Rsp(pstDeviceRegist_Rsp);
		GMMP_Trace(&pstDeviceRegist_Rsp->header, &pstDeviceRegist_Rsp->body);
	}

	CloseSocket();

	return nRet;
}

int GMMP_GetDeReg(GwDeRegist_Rsp* pstGwRegist_Rsp, DeviceDeRegist_Rsp* pstDeviceDeRegist_Rsp)
{
	int nRet = GMMP_SUCCESS;

	if(pstGwRegist_Rsp != NULL)
	{
		nRet = GMMP_GW_DeReg_Rsp(pstGwRegist_Rsp);
		GMMP_Trace(&pstGwRegist_Rsp->header, &pstGwRegist_Rsp->body);
	}
	else
	{
		nRet = GMMP_Device_DeReg_Rsp(pstDeviceDeRegist_Rsp);
		GMMP_Trace(&pstDeviceDeRegist_Rsp->header, &pstDeviceDeRegist_Rsp->body);
	}

	CloseSocket();

	return nRet;
}

//Profile Info Response
int GMMP_GetProfile(Profile_Rsp* pstProfile_Rsp)
{
	int nRet = GMMP_Profile_Rsp(pstProfile_Rsp);

	GMMP_Trace(&pstProfile_Rsp->header, &pstProfile_Rsp->body);

	CloseSocket();

	return nRet;
}

//수집 데이터 보고  Response
int GMMP_GetDelivery(Delivery_Rsp* pstDelivery_Rsp)
{
	int nRet = GMMP_Delivery_Rsp(pstDelivery_Rsp);

	GMMP_Trace(&pstDelivery_Rsp->header, &pstDelivery_Rsp->body);

	CloseSocket();

	return nRet;
}
//제어 동작 완료 결과 보고 Response
int GMMP_GetNotifi(Notifi_Rsp* pstNotifi_Rsp)
{
	int nRet = GMMP_Notifi_Rsp(pstNotifi_Rsp);

	GMMP_Trace(&pstNotifi_Rsp->header, &pstNotifi_Rsp->body);

	CloseSocket();

	return nRet;
}

int GMMP_GetHB(HB_Rsp* pstHB_Rsp) //TCP Always ON 모드일 경우 (Thread 생성) 사용 TCP Disconnect하지 않음
{
	int nRet = GMMP_Heartbeat_Rsp(pstHB_Rsp);

	GMMP_Trace(&pstHB_Rsp->header, &pstHB_Rsp->body);

	return nRet;
}

int GMMP_Read(GMMPHeader* pstGMMPHeader, void** pBody)
{
  return GMMP_Read2(pstGMMPHeader, pBody, 1);
}

int GMMP_Read2(GMMPHeader* pstGMMPHeader, void** pBody, byte blocking)
{
	ConvertShort cvtShort;
	//ConvertInt cvtint;

	int nRet = 0;
	int nHeaderSize = sizeof(GMMPHeader);

	memset(pstGMMPHeader, 0, nHeaderSize);

	cvtShort.sU8 = 0;
	//cvtint.sU8 = 0;

	nRet = 0;

	nRet = ReadTCP2((char*)pstGMMPHeader, nHeaderSize, blocking);
	if (nRet != GMMP_SUCCESS)
	{
		return nRet;
	}

	memcpy(cvtShort.usShort, pstGMMPHeader->usMessageLength, sizeof(pstGMMPHeader->usMessageLength));
	cvtShort.sU8 = btols(cvtShort.sU8);

	if (cvtShort.sU8 < nHeaderSize)
	{
		return GMMP_HEADER_SIZE_ERROR;
	}

	int nBodySize = 0;

	if ((*pBody = MallocBody(pstGMMPHeader->ucMessageType, &nBodySize))== NULL || nBodySize <= 0)
	{
		return GMMP_MALLOC_ERROR;
	}

	memset(*pBody, 0, nBodySize);

	int ReadPacketSize = cvtShort.sU8 -  nHeaderSize;

	nRet = ReadTCP2((char*)(*pBody), ReadPacketSize, blocking);
	if(nRet != GMMP_SUCCESS)
	{
		CloseSocket();

		return nRet;
	}

	return GMMP_SUCCESS;
}

int GMMP_Recv(GMMPHeader* pstGMMPHeader, void* pBody)
{
	GMMP_Trace(pstGMMPHeader, pBody);

	char cMessageType =  pstGMMPHeader->ucMessageType ;

	if(cMessageType == OPERATION_GW_REG_RSP)
	{
		stGwRegistrationRspHdr* pstRspHdr =(stGwRegistrationRspHdr*) pBody;
		OG_Reg_Recv(pstGMMPHeader, pstRspHdr, NULL);
	}
	else if(cMessageType == OPERATION_GW_DEREG_RSP)
	{
		stGwDeRegistrationRspHdr* pstRspHdr =(stGwDeRegistrationRspHdr*) pBody;
		OG_DeReg_Recv(pstGMMPHeader, pstRspHdr, NULL);
	}
	else if(cMessageType  == OPERATION_PROFILE_RSP)
	{
		stProfileRspHdr* pstRspHdr =(stProfileRspHdr*) pBody;
		OG_Profile_Recv(pstGMMPHeader, pstRspHdr);
	}
	else if(cMessageType == OPERATION_DEVICE_REG_RSP)
	{
		stDeviceRegistrationRspHdr* pstRspHdr =(stDeviceRegistrationRspHdr*) pBody;
		OG_Reg_Recv(pstGMMPHeader, NULL, pstRspHdr);
	}
	else if(cMessageType == OPERATION_DEVICE_DEREG_RSP)
	{
		stDeviceDeRegistrationRspHdr* pstRspHdr =(stDeviceDeRegistrationRspHdr*) pBody;
		OG_DeReg_Recv(pstGMMPHeader, NULL,  pstRspHdr);
	}
	else if(cMessageType  == OPERATION_DELIVERY_RSP)
	{
		stPacketDeliveryRspHdr* pstRspHdr =(stPacketDeliveryRspHdr*) pBody;
		OG_Delivery_Recv(pstGMMPHeader,  pstRspHdr);
	}
	else if(cMessageType  == OPERATION_CONTROL_REQ)
	{
		stControlReqHdr* pstReqHdr =(stControlReqHdr*) pBody;
		GMMP_Ctrl_Recv(pstGMMPHeader,  pstReqHdr);
	}
	else if(cMessageType  == OPERATION_HEARTBEAT_RSP)
	{
		stHeartBeatMsgRspHdr* pstRspHdr =(stHeartBeatMsgRspHdr*) pBody;
		OG_HB_Recv(pstGMMPHeader,  pstRspHdr);
	}
	else if(cMessageType  == OPERATION_NOTIFICATION_RSP)
	{
		stNotificationRspHdr* pstRspHdr =(stNotificationRspHdr*) pBody;
		OG_Notifi_Recv(pstGMMPHeader,  pstRspHdr);
	}

	return GMMP_SUCCESS;
}

int GMMP_Ctrl_Recv(GMMPHeader* pstGMMPHeader,  stControlReqHdr* pstReqHdr)
{
	char cControlType = pstReqHdr->ucControlType;

	//단순 제어 명령어인 경우
	switch(cControlType)
	{
		case CONTROL_Reset:
				break;
		case CONTROL_Turn_Off:
				break;
		case CONTROL_Report_On:
				break;
		case CONTROL_Report_Off:
				break;
		case CONTROL_Time_Sync:
				break;
		case CONTROL_Pause:
				break;
		case CONTROL_Restart:
				break;
		case CONTROL_Signal_Power_Check:
				break;
		case CONTROL_Diagnostic:
				break;
		case CONTROL_Reserved:
				break;
		case CONTROL_Profile_Reset:
				break;
		case CONTROL_Status_Check:
				break;
		case CONTROL_FW_Download: //FTP 연결
				break;
		case CONTROL_FW_Update:
				break;
		case CONTROL_App_Download: //FTP 연결
				break;
		case CONTROL_App_Update:
				break;
		case CONTROL_Remote_Access: //Remote Info 연결
				break;
		case CONTROL_Multimedia_Control_Start: //Multimedia URL Info 연결
				break;
		case CONTROL_Multimedia_Control_Pause:
				break;
		case CONTROL_Multimedia_Control_Stop:
				break;
		case CONTROL_Multimedia_Control_Restart:
				break;
		default:
			break;
	}

	OG_Ctrl_Recv(pstGMMPHeader, pstReqHdr);

	return 1;
}

void SetTID(long nTid)
{
	g_nTID = nTid;
}

long GetTID()
{
	return g_nTID;
}

//protected
int SetHeader(void* pData,
		int nPacketSize,
		int nTotalCount,
		int nCurrentCount,
		const char cMessageType,
		const char* pszAuthID,
		const char* pszAuthKey)
{
	GMMPHeader* pHeader = (GMMPHeader*)pData;
	ConvertShort cvtShort;

//  debug(F("authID len = "));
//  debugln(strlen(pszAuthID));
	DBG("authID len = %d", strlen(pszAuthID));

	memset(pHeader, 0, sizeof(GMMPHeader));
	memset(cvtShort.usShort, 0, sizeof(cvtShort.usShort));

	pHeader->ucVersion = GMMP_VERSION;

	ConvertInt cvtInt;

	time_t t; time ( &t );

//  debug(F("TIME = "));
//  debugln(t);
	DBG("TIME = %d", t);

	memcpy(cvtInt.usInt, &t, sizeof(cvtInt.usInt));

	cvtInt.sU8 = ltobi(cvtInt.sU8);

	memcpy(&pHeader->unOriginTimeStamp, &cvtInt.usInt, sizeof(cvtInt.usInt));
	memcpy(&pHeader->usAuthID, pszAuthID, strlen(pszAuthID));

	if(pszAuthKey != NULL)
	{
		memcpy(&pHeader->usAuthKey, pszAuthKey, strlen(pszAuthKey));
	}

//  debug(F("TID = "));
//  debugln(g_nTID);
	DBG("TID = %ld", g_nTID);

	memcpy(&cvtInt.usInt, &g_nTID, sizeof(g_nTID));
	cvtInt.sU8 = ltobi(cvtInt.sU8);

	memcpy(pHeader->usTID, &cvtInt.usInt, sizeof(pHeader->usTID));

	cvtShort.sU8 = ltobs((short)nPacketSize);
	memcpy(pHeader->usMessageLength, cvtShort.usShort, sizeof(cvtShort.usShort));

	cvtShort.sU8 = ltobs((short)nTotalCount);
	memcpy(pHeader->usTotalCount, cvtShort.usShort, sizeof(cvtShort.usShort));

	cvtShort.sU8 = ltobs((short)nCurrentCount);
	memcpy(pHeader->usCurrentCount, cvtShort.usShort, sizeof(cvtShort.usShort));

	pHeader->ucMessageType = cMessageType;

	return GMMP_SUCCESS;
}

int SetIntiSocket(void)
{	
	return Connect();
}

char* MallocBody(const char Type, int* nBodySize)
{
	char* pBuffer = NULL;

	switch(Type)
	{
		case OPERATION_GW_REG_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stGwRegistrationRspHdr));
			*nBodySize = sizeof(stGwRegistrationRspHdr);
			break;
		}
		case OPERATION_GW_DEREG_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stGwDeRegistrationRspHdr));
			*nBodySize = sizeof(stGwDeRegistrationRspHdr);
			break;
		}
		case OPERATION_PROFILE_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stProfileRspHdr));
			*nBodySize = sizeof(stProfileRspHdr);
			break;
		}
		case OPERATION_DEVICE_REG_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stDeviceRegistrationRspHdr));
			*nBodySize = sizeof(stDeviceRegistrationRspHdr);
			break;
		}
		case OPERATION_DEVICE_DEREG_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stDeviceDeRegistrationRspHdr));
			*nBodySize = sizeof(stDeviceDeRegistrationRspHdr);
			break;
		}
		case OPERATION_DELIVERY_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stPacketDeliveryRspHdr));
			*nBodySize = sizeof(stPacketDeliveryRspHdr);
			break;
		}
		case OPERATION_CONTROL_REQ:
		{
			pBuffer = (char*)malloc(sizeof(stControlReqHdr));
			*nBodySize = sizeof(stControlReqHdr);
			break;
		}
		case OPERATION_HEARTBEAT_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stHeartBeatMsgRspHdr));
			*nBodySize = sizeof(stHeartBeatMsgRspHdr);
			break;
		}
		case OPERATION_NOTIFICATION_RSP:
		{
			pBuffer = (char*)malloc(sizeof(stNotificationRspHdr));
			*nBodySize = sizeof(stNotificationRspHdr);
			break;
		}
		default:
		{
			nBodySize = 0;
		}
	}

	return pBuffer;
}

int GMMP_Trace(GMMPHeader* pstGMMPHeader, void* pBody)
{
	ConvertInt cvtint;

	char cMessageType =  pstGMMPHeader->ucMessageType ;

	memcpy(cvtint.usInt, pstGMMPHeader->usTID, sizeof(pstGMMPHeader->usTID));
	cvtint.sU8 = btoli(cvtint.sU8);

	if(cMessageType == OPERATION_GW_REG_REQ)
	{
		stGwRegistrationReqHdr* pstRspHdr =(stGwRegistrationReqHdr*) pBody;
	}
	else if(cMessageType == OPERATION_GW_REG_RSP)
	{
		stGwRegistrationRspHdr* pstRspHdr =(stGwRegistrationRspHdr*) pBody;
	}
	else if(cMessageType == OPERATION_GW_DEREG_REQ)
	{
		stGwDeRegistrationReqHdr* pstRspHdr =(stGwDeRegistrationReqHdr*) pBody;
	}
	else if(cMessageType == OPERATION_GW_DEREG_RSP)
	{
		stGwDeRegistrationRspHdr* pstRspHdr =(stGwDeRegistrationRspHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_PROFILE_REQ)
	{
		stProfileReqHdr* pstRspHdr =(stProfileReqHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_PROFILE_RSP)
	{
		stProfileRspHdr* pstRspHdr =(stProfileRspHdr*) pBody;

		memcpy(cvtint.usInt, pstRspHdr->unHeartbeatPeriod, sizeof(pstRspHdr->unHeartbeatPeriod));
		cvtint.sU8 = btoli(cvtint.sU8);

		memcpy(cvtint.usInt, pstRspHdr->unReportPeriod, sizeof(pstRspHdr->unReportPeriod));
		cvtint.sU8 = btoli(cvtint.sU8);

		memcpy(cvtint.usInt, pstRspHdr->unReportOffset, sizeof(pstRspHdr->unReportOffset));
		cvtint.sU8 = btoli(cvtint.sU8);

		memcpy(cvtint.usInt, pstRspHdr->unResponseTimeout, sizeof(pstRspHdr->unResponseTimeout));
		cvtint.sU8 = btoli(cvtint.sU8);
	}
	else if(cMessageType == OPERATION_DEVICE_REG_REQ)
	{
		stDeviceRegistrationReqHdr* pstRspHdr =(stDeviceRegistrationReqHdr*) pBody;
	}
	else if(cMessageType == OPERATION_DEVICE_REG_RSP)
	{
		stDeviceRegistrationRspHdr* pstRspHdr =(stDeviceRegistrationRspHdr*) pBody;
	}
	else if(cMessageType == OPERATION_DEVICE_DEREG_REQ)
	{
		stDeviceDeRegistrationReqHdr* pstRspHdr =(stDeviceDeRegistrationReqHdr*) pBody;
	}
	else if(cMessageType == OPERATION_DEVICE_DEREG_RSP)
	{
		stDeviceDeRegistrationRspHdr* pstRspHdr =(stDeviceDeRegistrationRspHdr*) pBody;
	}
	else if(cMessageType == OPERATION_DELIVERY_REQ)
	{
		stPacketDeliveryReqHdr* pstRspHdr =(stPacketDeliveryReqHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_DELIVERY_RSP)
	{
		stPacketDeliveryRspHdr* pstRspHdr =(stPacketDeliveryRspHdr*) pBody;

		memcpy(cvtint.usInt, pstRspHdr->unBackOffTime, sizeof(pstRspHdr->unBackOffTime));
		cvtint.sU8 = btoli(cvtint.sU8);
	}
	else if(cMessageType  == OPERATION_CONTROL_REQ)
	{
		stControlReqHdr* pstReqHdr =(stControlReqHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_CONTROL_RSP)
	{
		stControlRspHdr* pstRspHdr =(stControlRspHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_HEARTBEAT_REQ)
	{
		stHeartBeatMsgRspHdr* pstRspHdr =(stHeartBeatMsgRspHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_HEARTBEAT_RSP)
	{
		stHeartBeatMsgRspHdr* pstRspHdr =(stHeartBeatMsgRspHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_NOTIFICATION_REQ)
	{
		stNotificationReqHdr* pstRspHdr =(stNotificationReqHdr*) pBody;
	}
	else if(cMessageType  == OPERATION_NOTIFICATION_RSP)
	{
		stNotificationRspHdr* pstRspHdr =(stNotificationRspHdr*) pBody;
	}

	return GMMP_SUCCESS;
}