}
+void GetASCIICode7Bit(uint8_t*pTempInt, int nlen,char *out_char)
+{
+ int i=0, j=0;
+ int Point=0;//每7次就转换出8个ASCII码
+ for(i=0; j<nlen; i++, j++/*, pTempInt++*/)
+ {
+ uint8_t nRet = 0;
+
+
+
+ if(Point==0)
+ nRet = (pTempInt[i]<<Point) & (0x7F);
+ else
+ {
+ printf("GetASCIICode7Bit:%02X %02X\r\n",pTempInt[i],pTempInt[i-1]);
+
+ nRet = (((pTempInt[i]<<Point)) | (pTempInt[i-1])>>(8-Point)) & 0x7F;
+ }
+
+
+ out_char[j]=nRet;
+ printf("GetASCIICode7Bit:%c %02X\r\n",nRet,nRet);
+ if(Point==6)//每7位可以多转换一个ASCII码
+ {
+ j++;
+ nRet = (pTempInt[i]>>1)&(0x7F);
+ out_char[j]=nRet;
+ }
+
+ Point=(Point+1)%7;
+ }
+
+ return ;
+}
+
+
int pdu_decode(unsigned char* buffer, int buffer_length,
struct tm* output_sms_time, int* output_sms_zone,time_t *output_sms_timestamp,
char* output_sender_phone_number, int sender_phone_number_size,
printf("delive_start +1 > buffer_len\n");
return -2;
}
+ //0000 00100
+ //
+ uint8_t have_sms_head=0;
+
if ((buffer[sms_deliver_start] & SMS_DELIVER_ONE_MESSAGE) != SMS_DELIVER_ONE_MESSAGE)
{
- printf("buffer[%d]=%02X",sms_deliver_start,buffer[sms_deliver_start]);
- return -3;
+ printf("buffer[%d]=%02X\r\n",sms_deliver_start,buffer[sms_deliver_start]);
+ //return -3;
+ }
+ //如果bit6为1则表示后面有消息头
+ if((buffer[sms_deliver_start] & 0b01000000))
+ {
+ have_sms_head++;
+ printf("have have_sms_head\r\n");
}
+
+
const int sender_number_length = buffer[sms_deliver_start + 1];
if (sender_number_length + 1 > sender_phone_number_size)
{
DecodePhoneNumber(buffer + sms_deliver_start + 3, sender_number_length, output_sender_phone_number);
const int sms_pid_start = sms_deliver_start + 3 + (buffer[sms_deliver_start + 1] + 1) / 2;
+
+ uint8_t is_uint8_bit=0;
+
+ if(buffer[sms_pid_start+1]==0)
+ {
+ is_uint8_bit++;
+ }
#if 0
// Decode timestamp.
struct tm sms_broken_time;
(*output_sms_timestamp) = mktime(output_sms_time) ;
#endif
- const int sms_start = sms_pid_start + 2 + 7;
+ int sms_start = sms_pid_start + 2 + 7;
if (sms_start + 1 > buffer_length) return -5; // Invalid input buffer.
const int output_sms_text_length = buffer[sms_start];
if (sms_text_size < output_sms_text_length) return -6; // Cannot hold decoded buffer.
// printf("output_sms_text_length %d, index %d\n",output_sms_text_length,sms_start + 1);
-
+
+ if(have_sms_head)
+ {
+ //有消息头
+ sms_start=sms_start+buffer[sms_pid_start+2+7+1]+1;
+
+ }
unsigned char * unicodebuf=buffer+sms_start+1;
int unicodebuflen=buffer_length-(sms_start+1);
char * utf8p=output_sms_text;
- int jj;
- for(jj=0; jj < unicodebuflen/2;jj++){
- uni2utf8((const uint8_t *)(unicodebuf+jj*2),&utf8p);
+
+ //if()
+ int decoded_sms_text_size;
+ if(is_uint8_bit==0)
+ {
+ int jj;
+ for(jj=0; jj < unicodebuflen/2;jj++){
+ uni2utf8((const uint8_t *)(unicodebuf+jj*2),&utf8p);
+ }
+ decoded_sms_text_size = (utf8p - output_sms_text);
}
- int decoded_sms_text_size = (utf8p - output_sms_text);
+ else
+ {
+ printf("GetASCIICode7Bit %d\r\n",output_sms_text_length);
+ GetASCIICode7Bit((uint8_t *)unicodebuf,output_sms_text_length,utf8p);
+ decoded_sms_text_size=output_sms_text_length;
+ }
+
// const int decoded_sms_text_size = DecodePDUMessage(buffer + sms_start + 1, buffer_length - (sms_start + 1),
// output_sms_text, output_sms_text_length);
else
output_sms_text[sms_text_size-1] = 0;
+ // if()
+ // {
+ // printf("长短信\r\n");
+ // // output_sms_text[0]=output_sms_text[0]<<1;
+ // // if (decoded_sms_text_size < sms_text_size)
+ // // memmove(&output_sms_text[0],&output_sms_text[9],decoded_sms_text_size-6);
+ // // else
+ // // memmove(&output_sms_text[0],&output_sms_text[9],decoded_sms_text_size-7);
+
+ // }
+
return decoded_sms_text_size;
}
static uint32_t ancs_msg_index =0;
-// typedef struct
-// {
-// uint32_t ref;
-// uint16_t num;
-// char *phone_number;
-// char *text;
-// }pdu_data;
-
-// static pdu_data[20]={0};
+typedef struct
+{
+ uint32_t ref;
+ uint16_t total_num;
+ uint16_t num;
+ uint16_t seq;
+ char *phone_number;
+ char *text;
+}pdu_data;
+
+#define PDU_DATA_MAX 20
+static uint8_t pdu_flag=0;
+static pdu_data pdu_data_t[PDU_DATA_MAX]={0};
int pdu_decode_example(const char *inpdustr, uint32_t ref,uint16_t num, uint16_t seq)
{
int text_size=256;
ret = pdu_decode_hexstr(inpdustr,&sms_broken_timestamp,phone_number,phone_number_size,text,text_size);
-
+
if (ret <= 0)
{
printf("pdu_decode_hexstr Error %d",ret);
- }else{
- printf(" recv sms phonenumber %s len %d, timestamp %d , smstxt %s len %d , pdu_decode_hexstr ret %d\n",phone_number,strlen(phone_number),sms_broken_timestamp,text,strlen(text),ret);
- struct tm * timenow =localtime(&sms_broken_timestamp);
- printf("receive timenow %04d-%02d-%02d %02d:%02d:%02d \n",
- timenow->tm_year+1900,
- timenow->tm_mon+1,
- timenow->tm_mday,
- timenow->tm_hour,
- timenow->tm_min,
- timenow->tm_sec);
+ return -1;
+ }
+
+ pdu_data_t[pdu_flag].ref=ref;
+ pdu_data_t[pdu_flag].total_num=num;
+ if(pdu_data_t[pdu_flag].phone_number)
+ {
+ free(pdu_data_t[pdu_flag].phone_number);
+ pdu_data_t[pdu_flag].phone_number=NULL;
+ }
+ pdu_data_t[pdu_flag].phone_number=malloc(strlen(phone_number)+1);
+ memset(pdu_data_t[pdu_flag].phone_number,0,strlen(phone_number)+1);
+ memcpy(pdu_data_t[pdu_flag].phone_number,phone_number,strlen(phone_number));
+
+ if(pdu_data_t[pdu_flag].text)
+ {
+ free(pdu_data_t[pdu_flag].text);
+ pdu_data_t[pdu_flag].text=NULL;
+ }
+
+ pdu_data_t[pdu_flag].text=malloc(strlen(text)+1);
+ memset(pdu_data_t[pdu_flag].text,0,strlen(text)+1);
+ memcpy(pdu_data_t[pdu_flag].text,text,strlen(text));
+
+ pdu_data_t[pdu_flag].seq=seq;
+
+ if(pdu_data_t[pdu_flag].total_num==1)
+ {
message_data(0,0,phone_number,text,0);
+
+ free(pdu_data_t[pdu_flag].phone_number);
+ free(pdu_data_t[pdu_flag].text);
+ pdu_data_t[pdu_flag].ref=0;
+
+ }
+ else
+ {
+ for(int i=0;i<PDU_DATA_MAX;i++)
+ {
+ //ref对上证明
+ if(ref==pdu_data_t[i].ref)
+ {
+ pdu_data_t[i].num++;
+
+ if(pdu_data_t[i].num==pdu_data_t[i].total_num)
+ {
+ int8_t find_fist_seq=-1;
+ //数量足够开始拼装完整数据,再进行发送,给应用层
+ for(int x=0;x<pdu_data_t[i].total_num;x++)
+ {
+
+ for(int y=0;y<PDU_DATA_MAX;y++)
+ {
+ if(x+1==pdu_data_t[y].seq && ref==pdu_data_t[y].ref)
+ {
+ if(find_fist_seq==-1)
+ {
+ find_fist_seq=y;
+ break;
+ }
+ else
+ {
+ //realloc()
+ char * new_txt=malloc(strlen(pdu_data_t[find_fist_seq].text)+strlen(pdu_data_t[y].text)+1);
+ memset(new_txt,0,strlen(pdu_data_t[find_fist_seq].text)+strlen(pdu_data_t[y].text)+1);
+ memcpy(new_txt,pdu_data_t[find_fist_seq].text,strlen(pdu_data_t[find_fist_seq].text));
+ memcpy(new_txt+strlen(pdu_data_t[find_fist_seq].text),pdu_data_t[y].text,strlen(pdu_data_t[y].text));
+
+ pdu_data_t[y].num=0;
+ pdu_data_t[y].seq=0;
+ pdu_data_t[y].total_num=0;
+ free(pdu_data_t[y].phone_number);
+ pdu_data_t[y].phone_number=NULL;
+ free(pdu_data_t[y].text);
+ pdu_data_t[y].text=NULL;
+
+
+ free(pdu_data_t[find_fist_seq].text);
+ pdu_data_t[find_fist_seq].text=new_txt;
+
+ }
+ }
+ }
+ }
+ printf("pdu_data_t[%d].text %s\r\n",find_fist_seq,pdu_data_t[find_fist_seq].text);
+
+ message_data(0,0,pdu_data_t[find_fist_seq].phone_number,pdu_data_t[find_fist_seq].text,0);
+ free(pdu_data_t[find_fist_seq].phone_number);
+ pdu_data_t[find_fist_seq].phone_number=NULL;
+ free(pdu_data_t[find_fist_seq].text);
+ pdu_data_t[find_fist_seq].text=NULL;
+ pdu_data_t[find_fist_seq].ref=0;
+
+
+ }
+ }
+ }
}
+
+ pdu_flag++;
+
return ret;
}
/** 分条短信例子,暂时解码有瑕疵,但并没丢失数据