📄 sms_func.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 + -