⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms_func.cpp

📁 符合移动协议的见空系统,很有使用简直,希望多下载
💻 CPP
字号:

#include "SMS_Func.h"
#include "DataList.h"
#include "BaseMain.h"

extern CDMA_MODEM  mdm;
extern CPack *gp_SPack, *gp_RPack;
extern HANDLE	gOkEvent, gErrEvent;
extern CDMA_PACK gRPackData, gSPackData, gReceivePackData;
extern INT8U *pt_Rev, *pt_Read;
extern SMS_INDEX 		 sms_index[LenSMS];
extern PTSMS_INDEX 		ptCur_index,ptRcv_index;
extern INT8U			sms_rcv[32];
extern CAVLTree<CIntPtrMap> gSendPackTree;
extern CRITICAL_SECTION	g_csRcv, g_csSync;
extern HANDLE gpModemThread;
extern int gSendPackCount;
extern INTQUEUE  g_Rev_Queue;

void modem_read (void)
{
	UINT j;

	UCHAR at_read[12]={"AT+CMGR=1\xd\xa"};
	BOOLEAN 	rslt;

	BOOLEAN		snd_length;
	UCHAR at_ok[3]={"OK"};
	UCHAR at_error[6]={"ERROR"};

	//UCHAR *ptOK1,*ptOK2;
	INT8U	Cur_sms_No;
	UCHAR *ptOK,*ptStr;
	INT16U 	LenStrChr;
	INT8U	err;
	if( Get_SMS_No(&snd_length,&Cur_sms_No,at_read) == FALSE)
	{
		return;
	}
	rslt=FALSE;
	//////////
	pt_Rev=gRPackData.packed_data;
	memset(pt_Rev,NULL,PACK_LENGTH-1);	/////for debug
	pt_Rev=gRPackData.packed_data;

	if(snd_length == TRUE)
	{
		gp_SPack->snd_uart_b(at_read,12);
	}
	else
	{
		gp_SPack->snd_uart_b(at_read,11);
	}
  Sleep(500);
	ptStr = &gRPackData.packed_data[0];
	LenStrChr = PACK_LENGTH -1;
	for(j=0;j<PACK_LENGTH;j++)	////2005.12.26
	{
    Sleep(50);
		ptOK  = (INT8U	*)mem_chr(ptStr,'O',LenStrChr);
		if(ptOK != NULL)
		{
			if(memcmp(ptOK,at_ok,2) == 0)
			{
				rslt=TRUE;
				break;
			}
			else if(memcmp((ptOK - 3),at_error,5) == 0)
			{
				break;
			}
			else
			{
				++ptStr;
				LenStrChr = &gRPackData.packed_data[PACK_LENGTH - 1]  - ptStr;
			}
		}
		else
		{
			if(j > 260)
			{
				break;
			}
		}
		if(ptOK >= &gRPackData.packed_data[PACK_LENGTH-1])
		{
			break;			////2005.12.28
		}
	}
	if(rslt==TRUE)
	{
		if(depack_mdm(Cur_sms_No))
  		delete_msm(Cur_sms_No);
	}
  else
  {
    //MergeObjectInfo("读取包失败!");
    EnterCriticalSection(&g_csRcv);
    g_Rev_Queue.push(Cur_sms_No);
    LeaveCriticalSection(&g_csRcv);
  }
}

bool depack_mdm(INT8S Cur_sms_No)
{
  char szMsgHead[1000];
  CAVLNode<CIntPtrMap>  *tNode=NULL;
	INT8U *pt_start,*pt_end,*pt_test, *ptObjectID;
  INT16U mObjectID;
  UCHAR chk_rslt;
  int lTimerId;

	memset(&gReceivePackData.packed_data[0],NULL,PACK_LENGTH-1);	/////for debug
	pt_start = (INT8U *)mem_chr(&gRPackData.packed_data[38],'!',(PACK_LENGTH - 39));
  if(!pt_start)
  {
    MergeObjectInfo("接受到非法数据包!");
    return true;
  }
	pt_test=pt_start+1;
	pt_end = (INT8U *)mem_chr(pt_test,'!',(PACK_LENGTH-(pt_start - (INT8U *)(&gRPackData.packed_data))));
  if(!pt_end)
  {
    MergeObjectInfo("接受到非法数据包!");
    return true;
  }
	str_cpy(&gReceivePackData.packed_data[0],pt_start,(pt_end-pt_start+1));
  gp_RPack->SetPack(&gReceivePackData);

  //get pack from telno;
  pt_start = (INT8U*)mem_chr(&gRPackData.packed_data[28], '+', (PACK_LENGTH - 39));
  if(!pt_start)
    return true;
  pt_test = pt_start+1;
  pt_end = (INT8U*)mem_chr(pt_test,'\"', (PACK_LENGTH-(pt_start - (INT8U *)(&gRPackData.packed_data))));
  if(!pt_end)
    return true;
  str_cpy(mdm.FRMSite_No, pt_test, (pt_end-pt_test));

  chk_rslt = gp_RPack->DePack_Data();
  if(chk_rslt == 0x00)
  {
     CIntPtrMap tPack(gp_RPack->GetPackId(), "");
     ptObjectID = &gReceivePackData.depack_data[PRTCL_POS_VARIABLE + 1];
     mObjectID = INT8Upt_2_INT16U(ptObjectID);
     Swap_INT16U(&mObjectID);
     if(mObjectID == 0x0009 && gp_SPack->GetPackId()==gp_RPack->GetPackId())
     {
        if(gReceivePackData.depack_data[PRTCL_POS_CMMD] != 0x00)
        {
          MergeRevPackInfo("应答包标志出错:");
          SetEvent(gErrEvent);
        }
        else
          SetEvent(gOkEvent);
     }
     else if(tNode = gSendPackTree.Search(&tPack))
     {
       gSendPackCount--;

       strcpy(szMsgHead, tNode->Data->m_pOther);
	  	 gSendPackTree.Delete(&tPack);

       if(gReceivePackData.depack_data[PRTCL_POS_CMMD] != 0x00)
          MergeRevPackInfo("应答包标志出错:");
       else
       {
          MergeRevPackInfo(szMsgHead);
          DealReceiveData();
       }
       if(gSendPackCount==0)
         SetEvent(gOkEvent);
     }
     else
     {
       if(gp_RPack->GetPackId() < 0x8000)
          return true;   //应答包超时,此应答包为无效应答.
       if(gSendPackTree.IsEmpty())
       {
          DealDevicePack();
       }
       else
       {
          EnterCriticalSection(&g_csRcv);
          g_Rev_Queue.push(Cur_sms_No);
          LeaveCriticalSection(&g_csRcv);
          return false;
       }
     }
  }
  else if(chk_rslt==ACK_CRC)
    MergeObjectInfo("应答包CRC校验错");
  return true;
}

void  DealDevicePack()
{
  char szTitle[1000];
  static char szType[][20]=
  {
    "",
    "告警主动上报",
    "开站主动上报",
    "巡检主动上报",
    "修复确认主动上报",
    "配置变更上报",
    "登录到监控中心上报",
    "心跳上报",
    "监控软件更新上报",
    "GPRS登录失败上报",
    "批采结束上报",
    "",
  };
  INT16U iObjectId;
  INT8U PosCRC;
  INT8U *ptPosLen,*ptPosObjectID,*ptVariable, *ptPackEnd;
	PosCRC = gReceivePackData.len_depack;
	PosCRC -= 3;
	gReceivePackData.depack_data[PosCRC++] = 0x00;
	gReceivePackData.depack_data[PosCRC] = 0x00;
	ptPackEnd = &gReceivePackData.depack_data[0] + gReceivePackData.len_depack - 1;
	ptPosLen = &gReceivePackData.depack_data[PRTCL_POS_VARIABLE];
  iObjectId = INT8Upt_2_INT16U(ptPosLen+1);
	Swap_INT16U(&iObjectId);
  ptVariable = ptPosLen + 3;
  ptPosLen += *ptPosLen;
  if(iObjectId != 0x0141)
  {
    return;
  }
  sprintf(szTitle, "成功接受设备%s包:", szType[*ptVariable]);
  MergeRevPackInfo(szTitle);
  Deal_Pack_ACK();
  if(*ptVariable != 0x01 && *ptVariable != 0x08) //告警主动上报, 软件更新上报
    return;
	while(ptPosLen < ptPackEnd)
  {
    ptPosObjectID = ptPosLen + 1;
    ptVariable = ptPosLen + 3;
    iObjectId = INT8Upt_2_INT16U(ptPosObjectID);
  	Swap_INT16U(&iObjectId);
    GetPackData(ptPosObjectID, ptVariable, ptPosLen);
    ptPosLen += *ptPosLen;
		if(*ptPosLen == 0)
		{
			break;
		}
  }
}

void Deal_Pack_ACK()
{
    memset(gSPackData.depack_data, 0 , DEPACK_LENGTH);
    str_cpy(gSPackData.depack_data, gReceivePackData.depack_data, gReceivePackData.len_depack);
  	gSPackData.depack_data[PRTCL_POS_NP] = DEAL_NORMAL;
	  gSPackData.depack_data[PRTCL_POS_CMMD] = ACK_NORMAL;
	  gSPackData.len_depack = gReceivePackData.len_depack;
    gp_SPack->SetPack(&gSPackData);
	  gp_SPack->Generate_Pack_CRC();
	  gp_SPack->Pack_Data();
    gp_SPack->Send_Data();
}
void MergeRevPackInfo(char *szHead)
{
   String InfoLine="", InfoTitle;
   InfoTitle = szHead;
   InfoLine = InfoTitle + (char*)gReceivePackData.packed_data+"\r";
   EnterCriticalSection(&g_csSync);
   Form1->Memo1->Lines->Add(InfoLine);
   LeaveCriticalSection(&g_csSync);
}

void MergeObjectInfo(String Info)
{
  EnterCriticalSection(&g_csSync);
  Form1->Memo1->Lines->Add(Info);
  LeaveCriticalSection(&g_csSync);
}

void delete_msm(INT8S	del_No)
{
	UCHAR j;
	SCHAR Srslt;
	UCHAR at_delete[12]={"AT+CMGD=0\xd"};
	UCHAR at_ok[3] = {"OK"};
	UCHAR *ptOK,*ptStr;
	UCHAR snd_length;

	if(mdm.mdm_init_ok == FALSE)
	{
		return;
	}

	if(del_No >= 10)
	{
		at_delete[8] = del_No/10 + 0x30;
		at_delete[9] = del_No%10 + 0x30;
		at_delete[10] = 0x0d;
		snd_length = TRUE;
	}
	else if(del_No >= 0)
	{
		at_delete[8] = del_No + 0x30;
		at_delete[9] = 0x0d;
		snd_length = FALSE;
	}
	pt_Rev=gRPackData.packed_data;
	memset(pt_Rev,NULL,PACK_LENGTH);	/////for debug
	pt_Rev=gRPackData.packed_data;
	if(snd_length == TRUE)
	{
		gp_SPack->snd_uart_b(at_delete,11);
	}
	else
	{
		gp_SPack->snd_uart_b(at_delete,10);
	}
	ptStr= gRPackData.packed_data;
	for(j=0;j<100;j++)
	{
		ptOK = (INT8U *)mem_chr(ptStr,at_ok[0],strlen((const char *)ptStr));
		if(ptOK != NULL)
		{
			Srslt=memcmp(ptOK,at_ok,2);
			if(Srslt == 0)
			{
				break;
			}
		}
	}
	if(Srslt < 0)
	{
		mdm.mdm_init_ok = FALSE;
	}
}

void Init_sms_index()
{
  for(int i=0; i<LenSMS; i++)
  {
    sms_index[i].sms_index = -1;
    if(i+1 == LenSMS)
      sms_index[i].ptNext = &sms_index[0];
    else
      sms_index[i].ptNext = &sms_index[i+1];
  }
  ptCur_index = &sms_index[0];
  ptRcv_index = &sms_index[0];
}

void Init_modem (void)
{
	UCHAR i,j,n;
	UCHAR at_sms_auto_rcv[] = {"AT+CNMI=2,1,0,0,0 \xd\xa"};
	//UCHAR at_at[5]={"AT\xd\xa"};
	UCHAR at_ok[3]={"OK"};
	UCHAR *ptOK;
	UCHAR rslt;
	INT16U		LenStrChr;

	////////////////
	for(n=0;n<10;n++)
  {
		memset(&sms_rcv[0],NULL,32);
		rslt=FALSE;
		/////*
		rslt=FALSE;
		for(i=0;i<6;i++)
		{
      pt_Rev=gRPackData.packed_data;
  		memset(pt_Rev,NULL,PACK_LENGTH-1);	/////for debug
			pt_Rev=gRPackData.packed_data;
			gp_SPack->snd_uart_b(at_sms_auto_rcv,20);
			LenStrChr = PACK_LENGTH -1;
			for(j=0;j<100;j++)
			{
				////////////////////////////
				ptOK = (INT8U *)mem_chr(gRPackData.packed_data,at_ok[0],LenStrChr);
				if(ptOK && memcmp(ptOK, at_ok,2) == 0)
				{
					rslt=TRUE;
					break;
				}
				else
				{
					rslt=FALSE;
				}
				LenStrChr = &gRPackData.packed_data[PACK_LENGTH - 1]  - ptOK;
			}
			if(rslt == TRUE)
			{
				break;
			}
    }
    if(rslt == TRUE)
    {
      mdm.mdm_init_ok=TRUE;
      break;
    }
  }
}

BOOLEAN Get_SMS_No(INT8U	*snd_length,INT8U	*Cur_sms_No,INT8U		*ptStr)
{
  while (!g_Rev_Queue.empty())
  {
    *Cur_sms_No = g_Rev_Queue.front();
    if(*Cur_sms_No >= 10)
    {
      *(ptStr + 8) = *Cur_sms_No/10 + 0x30;
			*(ptStr + 9) = *Cur_sms_No%10 + 0x30;
			*(ptStr + 10) = 0x0d;
			*(ptStr + 11) = 0x0a;
			*snd_length = TRUE;
    }
    else if(*Cur_sms_No >= 0)
    {
      *(ptStr + 8) = *Cur_sms_No + 0x30;
			*(ptStr + 9) = 0x0d;
			*(ptStr + 10) = 0x0a;
			*snd_length = FALSE;
    }
    EnterCriticalSection(&g_csRcv);
    g_Rev_Queue.pop();
    LeaveCriticalSection(&g_csRcv);
    return(TRUE);
  }
	//////////
	return(FALSE);

}

void Empty_msm()
{
	UCHAR j;
	SCHAR Srslt;
	UCHAR at_delete[12]={"AT+CMGD=1,4\xd"};
	UCHAR at_ok[3] = {"OK"};
	UCHAR *ptOK,*ptStr;
	UCHAR snd_length;

	pt_Rev=gRPackData.packed_data;
	memset(pt_Rev,NULL,PACK_LENGTH);	/////for debug
	pt_Rev=gRPackData.packed_data;

  gp_SPack->snd_uart_b(at_delete,12);
	ptStr= gRPackData.packed_data;
	for(j=0;j<100;j++)
	{
		ptOK = (INT8U *)mem_chr(ptStr,at_ok[0],strlen((const char *)ptStr));
		if(ptOK)
		{
			Srslt=memcmp(ptOK,at_ok,2);
			if(Srslt == 0)
			{
				break;
			}
		}
	}
}

void Thread_Status(bool flag)
{
  static bool bpend = FALSE;
  if(!bpend && flag)
  {
    ResumeThread(gpModemThread);
    bpend = TRUE;
  }
  else if(!flag && bpend)
  {
    SuspendThread(gpModemThread);
    bpend = FALSE;
  }
}

DWORD WINAPI ModemThread(LPVOID pParam)
{
  while(1)
  {
    if(mdm.mdm_init_ok == FALSE)
		{
			Init_modem();
		}
		else
		{
			modem_read();
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -