📄 sms.c
字号:
at_send.ret_type = ATR_OK;
if(ERROR == at_set(sms->modem,&at_send))
{
sg_dbg("sms_send: at_set pdu");
return ERROR;
}
return OK;
}
int SMS_Send_gb2312(SMS_INFO * sms, char * da, char * s_gb)
{
int len,i;
if(NULL != da)
{
SMS_pdu_ctl(sms,SMS_PDU_DA,da);
}
SMS_pdu_ctl(sms,SMS_PDU_DCS,"08");
len = strlen(s_gb);
while(0 < len)
{
sms->len_pdu = sms->len_head + 2;
i = SMS_pdu_make_gb2312(sms,s_gb);
if(ERROR == SMS_pdu_cmgs(sms))
{
return ERROR;
}
len -= i;
s_gb += i;
}
return OK;
}
int SMS_Send_text(SMS_INFO * sms, char * da, char * text)
{
int len,i;
if(NULL != da)
{
SMS_pdu_ctl(sms,SMS_PDU_DA,da);
}
SMS_pdu_ctl(sms,SMS_PDU_DCS,"00");
len = strlen(text);
while(0 < len)
{
sms->len_pdu = sms->len_head + 2;
i = SMS_pdu_make_text(sms,text);
if(ERROR == SMS_pdu_cmgs(sms))
{
return ERROR;
}
len -= i;
text += i;
}
return OK;
}
int SMS_Send_data(SMS_INFO * sms, char * da, char * src, int len)
{
int i;
if(NULL != da)
{
SMS_pdu_ctl(sms,SMS_PDU_DA,da);
}
SMS_pdu_ctl(sms,SMS_PDU_DCS,"04");
while(0 < len)
{
sms->len_pdu = sms->len_head + 2;
i = SMS_pdu_make_data(sms,src,len);
if(ERROR == SMS_pdu_cmgs(sms))
{
return ERROR;
}
len -= i;
src += i;
}
return OK;
}
unsigned char SMS_UD_DSC08_reduce(unsigned char * src, unsigned char len, unsigned char * dst)
{
unsigned short unicode,gb;
unsigned char cnt,i;
gb = 0;
cnt=0;
for(i=0;i<len;)
{
unicode = (unsigned short)src[i++];
unicode *= 256;
unicode += (unsigned short)src[i++];
if(unicode < 0x0080)
{
gb = unicode;
dst[cnt++] = (unsigned char)(gb&0x007f);
continue;
}
else if((unicode >= 0x4e00) && (unicode <= 0x9fa0))
{
gb = unicode2gb_0x4E00_0x9FA0[unicode - 0x4e00];
}
else if((unicode >= 0xff01) && (unicode <= 0xFFE5))
{
gb = unicode2gb_0xFF01_0xFFE5[unicode - 0xFF01];
}
else if((unicode >= 0x3000) && (unicode <= 0x3229))
{
gb = unicode2gb_0x3000_0x3229[unicode - 0x3000];
}
else if((unicode >= 0x2015) && (unicode <= 0x2642))
{
gb = unicode2gb_0x2015_0x2642[unicode - 0x2015];
}
else if((unicode >= 0x00A4) && (unicode <= 0x0451))
{
gb = unicode2gb_0x00A4_0x0451[unicode - 0x00A4];
}
else
{
gb = 0xa1f5;
}
dst[cnt++] = (unsigned char)(gb/0x0100);
dst[cnt++] = (unsigned char)(gb&0x00ff);
}
dst[cnt] = 0;
return cnt;
}
unsigned char SMS_UD_DSC00_reduce(unsigned char * src, unsigned char len, unsigned char * dst)
{
unsigned short ush,tmp;
unsigned char cnt,i;
const unsigned short tab[8] = {0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080};
ush = 0;
i = 0;
for(cnt=0;cnt<len;cnt++)
{
if((cnt&0x07) == 0x07)
{
*dst++ = (unsigned char)(ush & 0x007f);
ush /= 0x0080;
cnt++;
}
tmp = src[i++];
tmp *= tab[cnt&0x07];
ush += tmp;
*dst++ = (unsigned char)(ush & 0x007f);
ush /= 0x0080;
}
*dst = 0;
return cnt;
}
void SMS_PDU_reduce(SMS_RECV_DATA * msg, unsigned char * pdu)
{
unsigned char cnt,len,uch;
/* SMSC */
len = (unsigned char)(*pdu++);
if(len != 0)
{
cnt = 0;
uch = *pdu++;
if(uch == 0x91)
{
msg->SMSC[cnt++] = '+';
}
len--;
while(len--)
{
uch = (unsigned char)(*pdu++);
msg->SMSC[cnt++] = (uch&0x0f)|0x30;
msg->SMSC[cnt++] = (uch/0x10)|0x30;
}
if(0x3f == msg->SMSC[cnt-1])
{
cnt--;
}
msg->SMSC[cnt] = 0;
}
else
{
msg->SMSC[0] = 0;
}
/* OCTET */
msg->Octet = (unsigned char)(*pdu++);
/* TP_OA */
len = (unsigned char)(*pdu++);
len = (len + 3) / 2;
cnt = 0;
uch = *pdu++;
if(uch == 0x91)
{
msg->OA[cnt++] = '+';
}
len--;
while(len--)
{
uch = (unsigned char)(*pdu++);
msg->OA[cnt++] = (uch&0x0f)|0x30;
msg->OA[cnt++] = (uch/0x10)|0x30;
}
if(0x3f == msg->OA[cnt-1])
{
cnt--;
}
msg->OA[cnt] = 0;
/* TP_PID */
msg->PID = (unsigned char)(*pdu++);
/* TP_DSC */
msg->DCS = (unsigned char)(*pdu++);
/* TP_SCTS */
cnt = 0;
/* YY */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
msg->SCTS[cnt++] = '/';
/* MM */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
msg->SCTS[cnt++] = '/';
/* DD */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
msg->SCTS[cnt++] = ',';
/* hh */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
msg->SCTS[cnt++] = ':';
/* mm */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
msg->SCTS[cnt++] = ':';
/* ss */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
/* + */
uch = (unsigned char)(*pdu++);
msg->SCTS[cnt++] = '+';
msg->SCTS[cnt++] = (uch&0x0f)|0x30;
msg->SCTS[cnt++] = (uch/0x10)|0x30;
msg->SCTS[cnt++] = 0;
/* TP_UDL */
msg->UDL = (unsigned char)(*pdu++);
/* sg_dbg("pdu TP_UDL:%X",len); */
/* TP_UD */
switch(msg->DCS)
{
case 0x00:
msg->UDL = SMS_UD_DSC00_reduce(pdu,msg->UDL,msg->UD);
break;
case 0x08:
msg->UDL = SMS_UD_DSC08_reduce(pdu,msg->UDL,msg->UD);
break;
default:
bcopy(pdu,msg->UD,msg->UDL);
break;
}
return;
}
int strHexTowforOne(unsigned char * scr, unsigned char * dst)
{
unsigned char uch;
int len;
len = 0;
while(1)
{
uch = *scr++;
if((uch >= '0') && (uch <= '9'))
{
uch -= '0';
}
else if((uch >= 'A') && (uch <= 'F'))
{
uch -= ('A' - 10);
}
else if('0' > uch)
{
break;
}
else
{
sg_dbg("strHexTowforOne: data err!");
return ERROR;
}
dst[len] = uch << 4;
uch = *scr++;
if((uch >= '0') && (uch <= '9'))
{
uch -= '0';
}
else if((uch >= 'A') && (uch <= 'F'))
{
uch -= ('A' - 10);
}
else
{
sg_dbg("strHexTowforOne: data err!");
return ERROR;
}
dst[len] += uch;
len++;
}
dst[len] = 0;
return len;
}
/*
* 函数名: SMS_Recv
* 描述: 短信接收
* 入口参数:
* int i_In_FD 串口句柄
* unsigned char * p_uch_Out_Data 读出的SMS数据的指针
* unsigned long p_ul_Out_Len 读出的SMS数据长度
* unsigned long * p_ul_Out_Resp 返回发送SMS的状态, 可自己定义
* 返回值:
* OK 成功
* ERROR 不成功, 可由*p_ul_Out_Resp 指示相应的出错类型
*/
int SMS_Recv(SMS_INFO * sms, SMS_RECV_DATA * msg, int index)
{
AT_CMD at_send = {
5,100000,NULL,(ATR_ERROR)
};
char at_cmg_[20];
AT_RX_BUF * p_rx;
int pdu_len;
at_send.at_str = at_cmg_;
for(;;index++)
{
sprintf(at_cmg_,"AT+CMGR=%d\r",index);
if(ERROR == at_set(sms->modem,&at_send))
{
if(index > sms->max_no)
{
sg_dbg("SMS_Recv: +CMGR err!");
return ERROR;
}
else
{
continue;
}
}
if((ATR_RET|ATR_UNKNOWN) == ((sms->modem->status)&(ATR_RET|ATR_UNKNOWN)))
{
char * p;
p_rx = at_get_rxbuf(sms->modem,ATR_RET);
if(0 == bcmp(p_rx->buf,"+CMGR:",6))
{
p = p_rx->buf + 6;
while((*p < '0') || (*p > '9'))
{
p++;
}
pdu_len = 0;
while((*p >= '0') && (*p <= '9'))
{
pdu_len *= 10;
pdu_len += *p - '0';
p++;
}
}
else
{
sg_dbg("+CMGR:--get err!");
continue;
}
p_rx = at_get_rxbuf(sms->modem,ATR_UNKNOWN);
if(NULL != p_rx)
{
if(0 < strHexTowforOne(p_rx->buf,p_rx->buf))
{
SMS_PDU_reduce(msg,p_rx->buf);
}
else
{
sg_dbg("get pdu ER!");
return ERROR;
}
break;
}
else
{
sg_dbg("get pdu ER!");
continue;
}
}
}
#if 1
sprintf(at_cmg_,"AT+CMGD=%d\r",index);
at_send.ret_type = ATR_OK;
if(ERROR == at_set(sms->modem,&at_send))
{
sg_dbg("SMS_Recv: +CMGD err!");
return ERROR;
}
#endif
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -