// 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; }
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; }