Пример #1
0
// PDU解码,用于接收、阅读短消息
// 输入: pSrc - 源PDU串指针
// 输出: pDst - 目标PDU参数指针
// 返回: 用户信息串长度
int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)
{
	int nDstLength;			// 目标PDU串长度
	unsigned char tmp;		// 内部用的临时字节变量
	unsigned char buf[256];	// 内部用的缓冲区

	// SMSC地址信息段
	gsmString2Bytes(pSrc, &tmp, 2);	// 取长度
	tmp = (tmp - 1) * 2;	// SMSC号码串长度
	pSrc += 4;			// 指针后移,忽略了SMSC地址格式
	gsmSerializeNumbers(pSrc, pDst->SCA, tmp);	// 转换SMSC号码到目标PDU串
	pSrc += tmp;		// 指针后移

	// TPDU段基本参数
	gsmString2Bytes(pSrc, &tmp, 2);	// 取基本参数
	pSrc += 2;		// 指针后移

	// 取回复号码
	gsmString2Bytes(pSrc, &tmp, 2);	// 取长度
	if(tmp & 1) tmp += 1;	// 调整奇偶性
	pSrc += 4;			// 指针后移,忽略了回复地址(TP-RA)格式
	gsmSerializeNumbers(pSrc, pDst->TPA, tmp);	// 取TP-RA号码
	pSrc += tmp;		// 指针后移

	// TPDU段协议标识、编码方式、用户信息等
	gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2);	// 取协议标识(TP-PID)
	pSrc += 2;		// 指针后移
	gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2);	// 取编码方式(TP-DCS)
	pSrc += 2;		// 指针后移
	gsmSerializeNumbers(pSrc, pDst->TP_SCTS, 14);		// 服务时间戳字符串(TP_SCTS) 
	pSrc += 14;		// 指针后移
	gsmString2Bytes(pSrc, &tmp, 2);	// 用户信息长度(TP-UDL)
	pSrc += 2;		// 指针后移
	if(pDst->TP_DCS == GSM_7BIT)	
	{
		// 7-bit解码
		nDstLength = gsmString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);	// 格式转换
		gsmDecode7bit(buf, pDst->TP_UD, nDstLength);	// 转换到TP-DU
		nDstLength = tmp;
	}
	else if(pDst->TP_DCS == GSM_UCS2)
	{
		// UCS2解码
		nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2);			// 格式转换
		nDstLength = gsmDecodeUcs2(buf, pDst->TP_UD, nDstLength);	// 转换到TP-DU
	}
	else
	{
		// 8-bit解码
		nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2);			// 格式转换
		nDstLength = gsmDecode8bit(buf, pDst->TP_UD, nDstLength);	// 转换到TP-DU
	}

	// 返回目标字符串长度
	return nDstLength;
}
Пример #2
0
static void *user_msg_process(void *arg)
{
	if(arg == NULL) 
		return NULL;
	message_info_t *msg_info = arg;
	SMS_ACTION sms_action = SMS_ACTION_NULL;
	char user_msg_decode[100] = {0};
	char ip[10] = {0};
	unsigned char devnumber = 0;
	if(isUserMobileNumberValid(msg_info->send_number)==FALSE){
		DEBUG_MSG("invalid number from :%s\n",msg_info->send_number);
		return NULL;
	}
	DEBUG_MSG("valid number from :%s\n",msg_info->send_number);
	switch(msg_info->charset)
	{
		case CHARSET_7BITS://mainly use to send english
			if(strlen(msg_info->send_content)>100) return NULL;
			if(gsmDecode7bit(msg_info->send_content,user_msg_decode,strlen(msg_info->send_content))<0)
				return NULL;
			DEBUG_MSG("user_msg_decode = %s\n",user_msg_decode);
			if(strspn(user_msg_decode,"0123456789")<strlen(user_msg_decode)){
				DEBUG_MSG("Invalid characters contains!!\n");
				return NULL;
			}
			if(strcmp(user_msg_decode,"909")==0){
				sms_action = SMS_ACTION_GET_LIST;
			}else{
				char id[20] = {0};
				substring(user_msg_decode,id,0,strlen(user_msg_decode)-1);
				DEBUG_MSG("id = %s--\n",id);
				if(GetIPAndDevNumberByID(id,ip,&devnumber)==FALSE){
					return NULL;
				}
				DEBUG_MSG("ip = %s--\n",ip);
				sms_action  = (SMS_ACTION)(user_msg_decode[strlen(user_msg_decode)-1] - 0x30 + 1);
				if(sms_action > SMS_ACTION_MAX -2){
					return NULL;
				}
				DEBUG_MSG("action = %d--\n",sms_action);
			}
			break;
		default:
			break;
	}
	switch(sms_action)
	{
		case SMS_ACTION_GET_LIST:
			send_dev_list_by_sms(msg_info->send_number);
			break;
		case SMS_ACTION_CLOSE:
			switch_dev_control_func(ip,CMD_SW_CLOSE,devnumber);
			break;
		case SMS_ACTION_OPEN:
			switch_dev_control_func(ip,CMD_SW_OPEN,devnumber);
			break;
		case SMS_ACTION_GET_STATE:
			switch_dev_control_func(ip,CMD_SW_GET_STATE,devnumber);
			break;
		default:
			break;
	}
	return NULL;
}