一、函数说明 1. void GetVerInfo(char * szRetVer); //获取版本信息函数 2. int iSetSerialNo(char* szCorp,char* szInputSN); //序列号授权函数 3. HANDLE hOpenComm(const char *szPort, const int iBaudRate ); //打开串口函数 4. bool bCloseComm(HANDLE hComm); //关闭串口函数 5. bool bAutoInit(HANDLE hComm, int iBaudRate, STRUCommInfo *CommInfo,int iSMSFormat, 6. char *szErrInfo); //自动初始化函数 7. bool bSendMsg(HANDLE hComm,char *szMsg,char *szPhNbr,char *szSCA,char *szNextMsg,int iSMSFormat,char *szErrInfo); //短信发送函数 8. int iRecvMsg(HANDLE hComm,SM_RCV_STRU *RcvSMS, int iSMSFormat,char *szErrInfo);//接收短信函数 9. bool bSendWapPush(HANDLE hComm,char* szPhNbr,char* szWapTitle, char* szWapUrl,char *szErrInfo); //发送WAP Push 短信函数 10.bool bMakeCall(HANDLE hComm, char * szPhNbr,char * szSpeakerID, char * szErrInfo));//拨打电话函数 11. bool bSendDTMF(HANDLE hComm,char *szDTMFStr,char *szErrInfo); //发送DTMF串函数 12. bool bHangUp(HANDLE hComm,char *szErrInfo); //挂机函数
二、函数详解
1. 获取版本信息函数
函数名称:void GetVerInfo(char* szRetVer); 入口参数:无 出口参数:szRetVer 函数返回:无 功能描述: 调用本函数,通过szRetVer 返回版本信息,例如“3.5-05.09.19”。
2. 序列号授权函数
函数名称:int iSetSerialNo(char* szCorp,char* szInputSN); 入口参数:szCorp ●公司标识 szInputSN ●授权的序列号 函数返回:1 ●序列号校验正确 -100 ●序列号校验错误 功能描述: 使用本函数,填写授权的序列号激活SMSCOM SDK的正式版本功能。其中,szCorp必须输入“北京华阳佳讯”或“www.ctc365.com”才能使用短信发送函数,否则短信发送函数不工作,直接返回执行错误false。其中,szInputSN 输入授权的序列号。 校验正确,函数返回1,短信发送函数将全部激活。 校验错误,函数返回-100,每次短信发送函数bSendMsg()的内容长度为80~140的随机数,余下的短信内容可再次调用bSendMsg()发送。
3. 打开串口函数 函数名称:HANDLE hOpenComm(const char *szPort,const int iBaudRate); 入口参数:szPort ●串口名称 iBaudRate ●串口速率 函数返回:HANDLE ●打开成功 INVALID_HANDLE_VALUE ●打开失败 功能描述: 调用此函数打开串口成功后,才可调用短信收发函数,串口使用完毕,调用bCloseComm()函数关闭串口。
4. 关闭串口函数
函数名称:bool bCloseComm(HANDLE hComm); 入口参数:hComm ●待关闭的串口句柄 函数返回:true ●关闭成功 false ●关闭失败 功能描述: 调用hOpenComm()函数打开串口成功,返回串口句柄HANDLE。串口使用完毕,请调用bCloseComm()函数关闭串口。
5. 自动初始化函数
函数名称:bool bAutoInit(HANDLE hComm, int iBaudRate ,STRUCommInfo *CommInfo,int iSMSFormat,char *szErrInfo); 入口参数:hComm ●串口句柄 iBaudRate ●通讯速率 iSMSFormat ●短信编码模式 出口参数:CommInfo ●获取的串口信息 szErrInfo ●初始化出错信息 函数返回:true ●初始化成功 false ●初始化失败 功能描述: 程序自动初始化串口(默认通讯速率为9600),并从SIM 中自动读取短信中心号码,保存到CommInfo->szSCA字段中。如果初始化失败,请到szErrInfo 中查看具体出错信息。其中,iSMSFormat 短信编码格式:0-PDU 格式(中国大陆使用),1-Text 格式(拉丁语系国家使用)。 6. 短信发送函数
函数名称:bool bSendMsg(HANDLE hComm,char *szMsg,char *szPhNbr,char *szSCA,char *szNextMsg,int iSMSFormat,char *szErrInfo); 入口参数:hComm ●串口句柄 szMsg ●短待的发信内容 szPhNbr ●目的手机号 szSCA ●短信中心号码(可以为空) iSMSFormat ●短信编码模式 出口参数:szNextMsg ●超长部分的待发内容 szErrInfo ●出错信息 函数返回:true ●发送成功 false ●发送失败 功能描述: 此函数用于发送短信,短信中心号码从bAutoInit()的CommInfo->szSCA中获取。单条短信内容长度为140,计算方法前面已经提及。对于超长短信,出口参数szNextMsg 返回超长部分的待发内容。所以短信发送成功后,请查看szNextMsg 是否为空,如果szNextMsg非空,请继续发送szNextMsg中的内容,一直到szNextMsg 为空才停止调用bSendMsg()。 注意事项: 如果您使用SDK 是测试版本或iSetSerialNo()返回错误,则bSendMsg()函数中的短信长度为80~140之间的随机数;iSetSerialNo()返回授权正确,单条短信内容长度为140,不会存在随机数问题。给小灵通发送短信时,目标号码为“区号”+“小灵通号”,例如:01081964927。 应用范例: bool bSndSucc=false; //发送成功标记 bool bRet=false; : //其他代码 while(strlen(szNeedSndMsg)>0) { bRet=bSendMsg(hComm, szNeedSndMsg, szPhNbr, szSCA, &szNextMsg[0], iSMSFormat, &szErrInfo[0]); if (bRet= =false) //发送失败 { bSndSucc=false; break; } else { if(strlen(szNextMsg)>0) //超长部分的待发内容 { strcpy(szNeedSndMsg,szNextMsg); } else { bSndSucc=true; /*发送成功*/ } } }
7. 短信接收函数
函数名称:int iRecvMsg(HANDLE hComm,SM_RCV_STRU *RcvSMS,int iSMSFormat,char *szErrInf); 入口参数:hComm ●串口句柄 RcvSMS ●接收到的短信内容 iSMSFormat ●短信编码格式 出口参数:szErrInfo ●出错信息 函数返回:N ●接收到的短信条数(N>=0) 功能描述: 此函数用于接收手机卡中未读短信,接收到的短信内容存放在RcvSMS 变量中,并将此短信从手机卡中删除。函数返回数表示接收到的短信条数。如果初始化失败,请到szErrInfo 中查看具体出错信息。 8. WAP Push短信发送函数
函数名称:bool bSendWapPush(HANDLE hComm,char* szPhNbr,char* szWapTitle,char* szWapUrl,char *szErrInfo); 入口参数:hComm ●串口句柄 szPhNbr ●目的手机号 szWapTitle ●短信标题 szWapUrl ●短信链接URL 出口参数:szErrInfo ●出错信息 函数返回:true ●发送成功 false ●发送失败 功能描述: 此函数用于发送WAP Push 短信。 注意事项: 应用范例: bool bSndSucc=false; //发送成功标记 bool bRet=false; char szErrInfo[512]; //存放返回的错误信息 : //其他代码 while(strlen(szNeedSndMsg)>0) { bRet=bSendWapPush(hComm,szTmpSndPh,szTmpMsg,szTmpUrl,&szErrInfo[0]); if (bRet= =false) //发送失败 { bSndSucc=false; break; } else /*发送成功*/ { bSndSucc=true; } }
9. 清空SIM卡短信函数
函数名称:bool bClrSIM (HANDLE hComm,char *szErrInfo); 入口参数:hComm ●串口句柄 出口参数:szErrInfo ●出错信息 函数返回:true ●操作成功 false ●操作失败 功能描述: 此函数用于清空手机SIM 卡内短信。 注意事项: 应用范例: bool bRet=false; char szErrInfo[300]; bRet=bClrSIM(hComm,&szErrInfo[0]); if(bRet) { m_State="清空成功"; } else { m_State="清空失败"; }
10. 建立语音呼叫函数
函数名称:bool bMakeCall(HANDLE hComm, char *szPhNbr,char *szSpeakerID, char *szErrInfo); 入口参数:hComm ●串口句柄 szPhNbr ●被叫号码 szSpeakerID ●语音通道ID 出口参数:szErrInfo ●出错信息 函数返回:true ●建立呼叫成功 false ●建立呼叫失败 功能描述: 此函数用于建立语音呼叫,其中语音通道ID (=0,1)是指Modem的Speaker/MicoPhone 使用的通道。不同的芯片,提供的语音通道数量不同。对于常用芯片,Q2303/Q2403A/Q2406Q/Q24系列,语音通道ID 可选数值为0或1; 应用范例: bool bRet=false; bRet=bMakeCall(hComm,”13800138000”,”0”, &szErrInfo[0]); if(bRet) { m_State="建立呼叫成功"; } else { m_State="建立呼叫失败"; }
11. 发送 DTMF串函数
函数名称:bool bSendDTMF (HANDLE hComm, char* szDTMFStr, char *szErrInfo); 入口参数:hComm ●串口句柄 szDTMFStr ●待发送的DTMF串 出口参数:szErrInfo ●出错信息 函数返回:true ●发送DTMF成功 false ●发送DTMF失败 功能描述: 在成功建立语音呼叫后,再使用此函数发送DTMF码(用户按键串) 应用范例: bool bRet=false; bRet= bSendDTMF (hComm,”13800138000#”, &szErrInfo[0]); if(bRet) { m_State="发送DTMF成功"; } else { m_State="发送DTMF失败"; }
12. 挂机函数 函数名称:bool bHangUp(HANDLE hComm, char *szErrInfo); 入口参数:hComm ●串口句柄 出口参数:szErrInfo ●出错信息 函数返回:true ●发送DTMF成功 false ●发送DTMF失败 功能描述: 电话语音通话完成后,使用此函数挂机。 应用范例: bool bRet=false; bRet= bHangUp (hComm, &szErrInfo[0]); if(bRet) { m_State="挂机成功"; } else { m_State="挂机失败"; }
13. 获取信号函数 函数名称:bool bGetCSQ(HANDLE hComm, char *szCSQ,char *szErrInfo); 入口参数:hComm ●串口句柄 出口参数:szCSQ ●信号强度 szErrInfo ●出错信息 函数返回:true ●发送DTMF成功 false ●发送DTMF失败 功能描述: 在插入手机卡的情况下,获取当前设备信号强度。szCSQ=(信号强度,信号质量) 例如”31,0”信号强度范围 0~31, 越大越好;99 表示没信号,此时应检查天线或SIM卡是否安装正确。信号质量越接近0越好。 应用范例: bool bRet=false; char szCSQ[10] bRet= bGetCSQ (hComm, ,&szCSQ[0],&szErrInfo[0]); if(bRet) //成功获取信号强度 { If(szCSQ 信号强度==“99”) 检查天线或SIM卡是否安装正确; Else if(szCSQ 信号强度<=“16”) 手机信号弱处理; Else 正常处理; } else { 获取信号失败处理; }
三、普通短信应用示例 #include "SMSCOM.h" : void SMSComDemo (void) { bool bRet=false,bSndSucc=false; int iErrCode=-255; int i,iTmpRcvSmsTotal=0; int iSMSFormat=0; //PDU方式收发短信(中国大陆使用) HANDLE hComm; //串口句柄 STRUCommInfo CommInfo; //串口设备信息 SM_RCV_STRU RcvSms; //接收到的短信 char szErrInfo[30],szVerInfo[30],szTmp[30]; char szNeedSndMsg[1024],szSndPhNbr[30],szSCA[30],szNextMsg[1024]; char szRcvPh[30],szRcvMsg[300],szRcvDateTime[30]; //初始化变量 memset(szNeedSndMsg,0,sizeof(szNeedSndMsg)); memset(szSndPhNbr,0,sizeof(szSndPhNbr)); memset(szSCA,0,sizeof(szSCA)); memset(szErrInfo,0,sizeof(szErrInfo)); memset(szVerInfo,0,sizeof(szVerInfo)); GetVerInfo(&szVerInfo[0]); //获取版本信息 //正版授权注册//iErrCode=1校验正确iErrCode=-100 错误 //iErrCode=iSetSerialNo("北京华阳佳讯",""); iErrCode=iSetSerialNo("www.ctc365.com",""); strcpy(szTmp,"COM4"); hComm=hOpenComm(szTmp,9600); //打开串口 if((hComm!=NULL)&&(hComm!=INVALID_HANDLE_VALUE)) { strcpy(szTmp,"打开成功"); bRet=bAutoInit(hComm,&CommInfo,iSMSFormat,szErrInfo); //自动初始化 strcpy(szSCA,CommInfo.szSCA); } else { strcpy(szTmp,"打开失败"); return; } Sleep(500); //--发送短信处理------------- strcpy(szSndPhNbr,"10086"); strcpy(szNeedSndMsg,"预计今天中午到京的\"法兰西巡逻兵\"特技飞行表演队的10 名队员及 其驾驶的10架表演飞机,直到中午11时40分才迟迟从武汉起飞.据了解,由于北京南苑机场上空能见度 达不到降落标准,特飞队中午备降首都国际机场."); while(strlen(szNeedSndMsg)>0) { memset(szNextMsg,0,sizeof(szNextMsg)); bRet=bSendMsg(hComm, szNeedSndMsg, szSndPhNbr, szSCA,&szNextMsg[0], iSMSFormat,&szErrInfo[0]); memset(szNeedSndMsg,0,sizeof(szNeedSndMsg)); if(bRet==false) //发送失败 { bSndSucc=false; break; } else { if(strlen(szNextMsg)>0) //超长部分的待发内容 { strcpy(szNeedSndMsg,szNextMsg); } else { bSndSucc=true; break; /*发送成功*/ } } } Sleep(1000); //--接收短信处理------------- // TODO: Add your control notification handler code here RcvSms.iSmsTotal=0; //初始化接收短信数 iTmpRcvSmsTotal=iRecvMsg(hComm,&RcvSms,iSMSFormat,szErrInfo); if(iTmpRcvSmsTotal>0) //接收到短信数>0 { for(i=0;i<iTmpRcvSmsTotal;i++) { strcpy(szRcvMsg,RcvSms.SMS[i].TP_UD); //短信内容 strcpy(szRcvDateTime,RcvSms.SMS[i].TP_SCTS); //发送时间 strcpy(szRcvPh,RcvSms.SMS[i].TPA); //发送者的手机号 } } //关闭串口 bRet=bCloseComm(hComm); }
|