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

📄 cbgsmservice.cpp

📁 关于GPRS的c网络编程软件
💻 CPP
字号:
/*****************************************************************************
 *    GSM SMS Routines
 *
 *    Writen by Menghongwen@<menghongwen@smmail.cn>
 *
 *   Dec., 2004 copyright YINHUA Technology, all right reserved
\****************************************************************************/
#include <vcl.h>
#pragma hdrstop
#include "stdio.h"
#include "cbGSMService.h"

#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TGSMService::TGSMService(bool CreateSuspended,TSMSConfig *pcfg)
        : TThread(CreateSuspended)
{
    tpmr = 0x0;
    pConfig = pcfg;
    FreeOnTerminate = True;
}
//---------------------------------------------------------------------------
bool  __fastcall TGSMService::prepare4Stop()
{
    return hCommand.closecomm();
}
//---------------------------------------------------------------------------
bool  __fastcall TGSMService::prepare4Start()
{
    if(!hCommand.opencomm("COM2")) return false;

    if(!sms_TerminalReady()) return false;

    sms_SendMode(GSMSendAsPDU);

    sms_SetDefaultSC();
    hPDUs.sca = NULL;

    return true;
}
//---------------------------------------------------------------------------
bool  TGSMService::sms_TerminalReady()
{
    hCommand.atcommand("CREG?",false);
    hCommand.appendcr();
    if (hCommand.send()) {
       if (hCommand.querystring("0,1"))return true;
    }
    return false;
}
//---------------------------------------------------------------------------
bool  TGSMService::sms_SetDefaultSC()
{
    hCommand.atcommand("CSCA");
    hCommand.append(0x22);
    hCommand.append(0x2b);
    hCommand.appendstr(pConfig->asSmscString.c_str());
    hCommand.append(0x22);
    hCommand.appendcr();
    if(hCommand.send())
       if (hCommand.querystring())return true;
    return false;
}
//---------------------------------------------------------------------------
bool  TGSMService::sms_SendMode(TSMSSendMode mode)
{
    hCommand.atcommand("CMGF");
    if ( mode == GSMSendAsText ) hCommand.appendstr("1");
    else hCommand.appendstr("0");
    hCommand.appendcr();
    if(hCommand.send())
       if (hCommand.querystring())return true;
    return false;
}
//---------------------------------------------------------------------------
bool  TGSMService::sms_QueryMessage()
{
    hCommand.atcommand("CMGL");
    hCommand.appendstr("0");  
    hCommand.appendcr();
    hCommand.send(200);
    if (hCommand.querystring(__GSMRESPERR)) return false;
    if (hCommand.usRecv > 16 ) sms_ParsePDUString();
    return false;
}
//---------------------------------------------------------------------------
void  TGSMService::sms_DeleteMessage(short idx)
{
    char  szId[8];

    hCommand.atcommand("CMGD");
    sprintf(szId,"%d\x0",idx);
    hCommand.appendstr(szId);
    hCommand.appendcr();
    hCommand.send(200);
}
//---------------------------------------------------------------------------
BYTE  TGSMService::sms_SendMessage(PTGSMMessage pMsg)
{
    short receipt;
    char  szAsc[32];
    hPDUs.tpmr = tpmr;
//    if(tpmr >0xfe ) tpmr = 0; else tpmr++;

    hPDUs.tpda = &pMsg->address;
    hPDUs.tpudl = encode2UCS2(pMsg->asMessage,hPDUs.tpud);

    // send header first
    hCommand.atcommand("CMGS");
    sprintf(szAsc,"%03d\x0", hPDUs.length());
    hCommand.appendstr(szAsc);
    hCommand.appendcr();
    if(hCommand.send()) {
       if(!hCommand.querychar(0x3E)) {
          receipt = __GSMSMSESNDERROR + 1;
          goto __send_error_exit;
       }
    } else {
       receipt = __GSMSMSESNDERROR + 2;
       goto __send_error_exit;
    }
    // PDU content
    hCommand.cleardata();
    if (hPDUs.sca) {
       hCommand.append(hPDUs.sca->packagelen());
       hCommand.append(hPDUs.sca->typeOf());
       hCommand.append(hPDUs.sca->value,hPDUs.sca->valuelen());
    } else hCommand.append(0x0);

    hCommand.append(hPDUs.foctet.value);
    hCommand.append(hPDUs.tpmr);

    hCommand.append(hPDUs.tpda->semioctets());
    hCommand.append(hPDUs.tpda->typeOf());
    hCommand.append(hPDUs.tpda->value,hPDUs.tpda->valuelen());

    hCommand.append(hPDUs.tppid.value);
    hCommand.append(hPDUs.tpdcs.value);
    hCommand.append(hPDUs.tpvp);

    hCommand.append(hPDUs.tpudl);
    hCommand.append(hPDUs.tpud,hPDUs.tpudl);

    hCommand.toAscii();
    hCommand.appendcz();

    // send pdu string
    hCommand.send();
    if (hCommand.querystring(__GSMRESPERR)) {
       receipt = __GSMSMSESNDERROR + 3;
       goto __send_error_exit;
    }

    // BUG ???   Wait for response
    hCommand.cleardata();
    hCommand.appendstr("AT");
    hCommand.appendcr();
    Sleep(pConfig->msWaitingTime);
    hCommand.send();
    if (!hCommand.querystring(__GSMRESPERR)) {
        receipt = hCommand.queryShortValue("+CMGS:");
    } else receipt =  __GSMSMSNORECEIPT;

    __send_error_exit:
    return receipt;
}
//---------------------------------------------------------------------------
void  TGSMService::sms_ParsePDUString()
{
    short length,index,state,alpha,pudlength,useat;
    char *pCursor, *pHead;
    char  szTempud[190];
    PTGSMMessage newMsg;

    length = hCommand.usRecv;
    pHead = hCommand.recvAsString();
/*
pHead ="+CMGL: 1,1,,153 0891683108200109F02404A181160008409081718480208A6B228FCE60A862104E3A4E0A6D7779FB52A876845BA26237300260A853EF767B5F55516C53F87F517AD9007700770077002E00730068002E006300680069006E0061006D006F00620069006C0065002E0063006F006D54A88BE2529E74064E1A52A1FF0C53D19001004D004D004300585230003100380036003167E58BE24E1A52A1529E74065BC67801 \
+CMGL: 2,1,,49  0891683108200109F0040BA13108200103F90008409022005153201E8BF756DE7535FF1A00310033003700370034003400300033003600310035 \
+CMGL: 3,1,,108 0891683108200109F02405A19099F60008409042611332205C4EB27231768475286237FF0C60A8768498845B588D39752853735C0675285B8CFF0C8BF7901F52306211516C53F884254E1A70B9529E74067EED5B5862164E7051687403901A7F348D3953615145503C30028C228C22914D5408FF01 \
+CMGL: 4,1,,135 0891683108200109F02404A181160008409042618384207860A87684624B673A5BC67801662F003A003100320035003400310037002C8BF76CE8610F5BC6780176844FDD5BC6300260A853EF4EE5767B51657F514E0A84254E1A5385621662E86253003100380036003130010031003300380030003000320031003000310033003881EA52A94FEE65395BC678013002 \
+CMGL: 5,1,,137 0891683108200105F0240BA13109613103F0000840908241815420764E2D79CB56FD5E8690FD5FEB898152304E86002E624B4E0A73B091D14E0D591A4E86300253EA80FD7ED94F604E9453434E07003B53434E07898150655EB7002E53434E0789815FEB4E50003B53434E0789815E735B89003B53434E07898177E58DB3003B53434E07002E4E0D89815FD88BB062110021 \
+CMGL: 6,1,,77 0891683108200105F0240BA13109613103F00008409082516184203A54755475002C5E78798F002C771F5E78798F002E4E0059275BB65B5095F95FD95F974E0D5F974E86803600216CE2002C4EB24FAC4E008BB0002E \
+CMGL: 7,1,,127 0891683108200109F02404A18116000840904261231320700038670881F300310030670895F4FF0C60A8901A8FC777ED4FE167E58BE28BDD8D39300175338BF74E1A52A1300166F463625957991062168F6C54C1724C540EFF0C5C315DF281EA52A883B75F978D6253D6004E004F004B00490041767E4E0750CF7D20624B673A7684673A4F1A3002 \
+CMGL: 8,1,,126 0891683108907105F0040D91683198712247F00008409072129511006A97E956FD4E09661F96C656E253174EAC603B4EE37406002E4E3E529E624B673A53F77801644759566D3B52A8002E60A85F974E8C7B495956002E4EF7503C0039002E00384E07002E75358BDD003A0031003300330030003600390039003500380030003582CF5C0F59D0 \
+CMGL: 9,1,,103 0891683108200105F0240BA13109613103F00008409082518074205454755475002E002E5468672B514856DE53BB8FC74E86002E89E380015E084ECA5E745E2673ED4E3B4EFB002C4ED689818DDF4ED676845B66751F4EEC4EB270ED5C314E0D56DE53BB4E86002E4F604EEC5462003F \
+CMGL: 10,1,,142 0891683108200109F02405A19099F90008402141012295207E4E0A670853D15F694FE180055DF24EA7751F4E09540D5E788FD0513F83B7591A666E8FBE003500360035624B673AFF1B5F694FE17B2C4E00540D66F48D625F97591A666E8FBE003600390036FF1B6D3B52A88FD857287EE77EEDFF0C4E0D5BB995198FC7FF0C4F604E5F80FD62104E3A8FD94E2A670876845E788FD0513F \
+CMGL: 11,1,,53 0891683108200105F0240BA13109613103F0000840908251225420226CE55FC3002C8BA96211518D67654E008BB0002C5C318BA94F6080899EBB002154FC \
+CMGL: 12,1,,108 0891683108200109F02405A19099F60008409003513310205C4EB27231768475286237FF0C60A8768498845B588D39752853735C0675285B8CFF0C8BF7901F52306211516C53F884254E1A70B9529E74067EED5B5862164E7051687403901A7F348D3953615145503C30028C228C22914D5408FF01 \
+CMGL: 13,1,,31 0891683108200105F0240BA13109613103F00008409082513242200C54C854C854C8002E002E002E \
+CMGL: 14,1,,108 0891683108200109F02405A19099F60008409082615335205C4EB27231768475286237FF0C60A8768498845B588D39752853735C0675285B8CFF0C8BF7901F52306211516C53F884254E1A70B9529E74067EED5B5862164E7051687403901A7F348D3953615145503C30028C228C22914D5408FF01 \
+CMGL: 15,1,,49 0891683108200109F0040BA13108200103F90008409003712513201E8BF756DE7535FF1A00300032003100350034003800310032003100340034 \
+CMGL: 16,1,,23 0891683108200105F0240BA13107813071F00008402161325082200453EF4EE5 OK";
    length = strlen(pHead);
*/

    do {
       pCursor = strstr(pHead,"+CMGL:");
       if ( pCursor == NULL ) return;
       pHead = pCursor;
       pCursor+=6;
       pCursor = sms_parseInteger(pCursor,index);
       pCursor = sms_parseInteger(pCursor,state);
       pCursor = sms_parseInteger(pCursor,alpha);
       pCursor = sms_parseInteger(pCursor,pudlength);

       // skip control alpha
       while(*pCursor==0x0d || *pCursor==0x0a || *pCursor == 0x1a \
        || *pCursor==0x27 || *pCursor==0x20 ) pCursor++;

       if(!isdigit(*pCursor)) return;  // Send Error Message
       useat = hPDUr.sca.loadstring(pCursor);
       pCursor += useat;
       pCursor = sms_parseByte(pCursor, hPDUr.foctet.value);
       useat = hPDUr.tpoa.loadstring(pCursor,true);
       pCursor += useat;
       pCursor = sms_parseByte(pCursor, hPDUr.tppid.value);
       pCursor = sms_parseByte(pCursor, hPDUr.tpdcs.value);
       pCursor = sms_parseSemiOctets(pCursor, (BYTE *)&hPDUr.tpscts,7);
       pCursor = sms_parseByte(pCursor, hPDUr.tpudl);
       pCursor = sms_parseBCDString(pCursor,szTempud,hPDUr.tpudl);

       if(hPDUr.tpdcs.bitmap.alphabet==2)
          hPDUr.tpudl = decodeUcs2(szTempud, hPDUr.tpud, hPDUr.tpudl);
       else if(hPDUr.tpdcs.bitmap.alphabet==1)
          hPDUr.tpudl = decode8bit(szTempud, hPDUr.tpud, hPDUr.tpudl);
       else if(hPDUr.tpdcs.bitmap.alphabet==0)
          hPDUr.tpudl = decode7bit(szTempud, hPDUr.tpud, hPDUr.tpudl);
       else hPDUr.tpud[0] = 0x0; // empty

       newMsg = new TGSMMessage;
       newMsg->address = hPDUr.tpoa;
       newMsg->asMessage = (char *)hPDUr.tpud;
       bcd2ascb((char*)&hPDUr.tpscts, szTempud,6);
       newMsg->traceno = szTempud;
       putRecvMessage(newMsg);

       length -=(unsigned short)(pCursor-pHead);
       pHead = pCursor;
       sms_DeleteMessage(index);
    } while(length);
}
//---------------------------------------------------------------------------
char *TGSMService::sms_parseByte(char *p, BYTE &rc)
{
    char szByte[4];

    szByte[0] = *p++;
    szByte[1] = *p++;
    asc2bcd(szByte,&szByte[2],1);
    rc = szByte[2];
    return p;
}
//---------------------------------------------------------------------------
char *TGSMService::sms_parseSemiOctets(char *p,BYTE *prs, short olen)
{
    asc2bcdInv(p,prs,olen);
    p+=(olen+olen);
    return p;
}
//---------------------------------------------------------------------------
char *TGSMService::sms_parseBCDString(char *p,BYTE *prs, short olen)
{
    asc2bcd(p,prs,olen);
    p+=(olen+olen);
    return p;
}
//---------------------------------------------------------------------------
char *TGSMService::sms_parseInteger(char *p,short &ri)
// 00000,,000\r
{
    short  i=1;
    char szdigits[32];

    if ( p== NULL ) return NULL;

    while (*p == 0x20 ) p++;

    szdigits[0] = 0x30;
    while(*p!=',') {
       if (isdigit(*p) ) szdigits[i++] = *p++;
       else break;
       //if (*p == 0x0d) break;
    }

    if (*p == ',' ) p++;

    szdigits[i] = 0x0;
    ri = atoi(szdigits);
    return p;
}
//---------------------------------------------------------------------------
PTGSMMessage  TGSMService::querySendMessage()
{
    if(pConfig->hQueueOut!=NULL)
       if (pConfig->hQueueOut->Count()) return (PTGSMMessage)pConfig->hQueueOut->Pop();
    return NULL;
}
//---------------------------------------------------------------------------
void  TGSMService::putRecvMessage(PTGSMMessage pMsg)
{
    if(pConfig->hQueueIn!=NULL) if (pMsg!=NULL) pConfig->hQueueIn->Push(pMsg);
}
//---------------------------------------------------------------------------
void __fastcall TGSMService::Execute()
{
     ustart = GetTickCount();
     uscurrent = ustart;
     while(1){

        pMessage = querySendMessage();
        if ( pMessage != NULL ) {
           if(pMessage->msgtype == GSMMTMessage ) {
               pMessage->asMessage = IntToStr(sms_SendMessage(pMessage));
               pMessage->msgtype = GSMMTReceipt;
               putRecvMessage(pMessage);
           } else delete pMessage;
        } else {
             uscurrent = GetTickCount();
             uscurrent -= ustart;
             uscurrent /= 1000;
             if ( uscurrent > pConfig->msPollingTime ) {
                 sms_QueryMessage();
                 ustart = GetTickCount();
             }
        }

        if(WaitForSingleObject(pConfig->hevStopGSMService, 20) ==WAIT_OBJECT_0) {
           prepare4Stop();
           SetEvent(pConfig->hevThreadStoped);
           break;
        }
     }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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