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

📄 sms.c

📁 中文短信的编解码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -