From 7ed845b2e12935b5fd0fb211d9249d85ea1a2a55 Mon Sep 17 00:00:00 2001 From: SnickerSun Date: Wed, 29 May 2024 17:44:54 +0800 Subject: [PATCH] =?utf8?q?cat1=20server=E4=B8=AD=E6=B7=BB=E5=8A=A0sms?= =?utf8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../slip/cat1Service/cat1_server.cpp | 61 ++- .../peripheral/utils/custom_utils_at_cmd.c | 23 +- code/sdk/drivers/peripheral/utils/pdu.c | 365 ++++++------------ code/sdk/drivers/peripheral/utils/pdu.h | 17 +- 4 files changed, 192 insertions(+), 274 deletions(-) diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp index 9ac12cbec..5f60e4b2a 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_server.cpp @@ -273,7 +273,56 @@ void udp_send_msg_toCat1(uint8_t cmd,char *content) #define MSG_SPLIT_CHAR "," #define MSG_SPLIT_CHAR2 "@" +static int decodeSMS(char* msg) +{ +// FE150117ref:0@total_num:1@seq:1@data:0100240D91688139687502F200084250926172722316662F6211670B53CB621153EF80FD9700898198847EA6 + + runtime_status_t * runtime = get_device_runtime_status(); + int msglen = strlen(msg)+1; + if (msglen < 25) + { + PRINT("sms msg len is too short !\r\n"); + return -1; + } + + char* msgbuf = (char*)malloc(msglen); + if (msgbuf == NULL) return -2; + memcpy_s(msgbuf,msglen,msg,msglen); + msgbuf[msglen-1] = '\0'; + + char* p = MSG_SPLIT_CHAR; + if (strstr(msgbuf,MSG_SPLIT_CHAR2) != NULL) + { + p = MSG_SPLIT_CHAR2; + } + char *pchStrTmpIn = nullptr; + char *s = nullptr; + for (s = strtok_r(msgbuf,p,&pchStrTmpIn); s!=NULL;s=strtok_r(NULL,p,&pchStrTmpIn)) + { + if((strlen(s)> 4) && (strncmp(s,"ref:",4) == 0) ) + { + char* ptmp=s+4; + PRINT("ref %s\r\n",ptmp); + }else if ((strlen(s)> 10) && (strncmp(s,"total_num:",10) == 0) ) + { + char* ptmp=s+10; + PRINT("total_num %s\r\n",ptmp); + }else if ((strlen(s)> 4) && (strncmp(s,"seq:",4) == 0) ) + { + char* ptmp=s+4; + PRINT("seq %s\r\n",ptmp); + }else if ((strlen(s)> 5) && (strncmp(s,"data:",5) == 0) ) + { + char* ptmp=s+5; + PRINT("data %s\r\n",ptmp); + pdu_decode_example(ptmp); + } + } + free(msgbuf); + msgbuf=NULL; + return 0; +} // const char* msgboot = "BOOTUP:pyVer,PY_SRV_V4,modemVer,EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312"; // const char* msgver ="pyVer,PY_SRV_V4,modemVer,EG810MCNLAR06A01M08_VOLTE_OCPU_QPY_BETA0312"; static int decodeVersion(char* msg) @@ -633,8 +682,11 @@ int cat1_handle_version_msg(struct tcp_msg_t *msg) int cat1_handle_sms(struct tcp_msg_t *msg) { char* smsmsg=msg->buffer; - WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1 cat1_handle_sms %s\n",smsmsg); - //添加到消息列表里 + // WEARABLE_LOGI(WEARABLE_LOG_MODULE_MAIN_SERVICE,"cat1 cat1_handle_sms %s\n",smsmsg); + if (decodeSMS(smsmsg) ==0 ) + { + //添加到消息列表里 + } return 1; } @@ -873,9 +925,6 @@ static int udp_packet_parse(char *rx_buffer, int len) case UDP_CMD_GET_RECV_NETWORKSTAT: index = cat1_handle_networ_msg(msg); break; - case UDP_MSG_SMS: - index = cat1_handle_sms(msg); - break; case UDP_CMD_GET_TIME: index = cat1_handle_timesync(msg); break; @@ -923,6 +972,8 @@ static int udp_packet_parse(char *rx_buffer, int len) #endif break; case UDP_MSG_RECV_CAT1_SMS_CONTENT://接收单条短信内容 + case UDP_MSG_SMS: + index = cat1_handle_sms(msg); break; default: PRINT("error message: %s\n", rx_buffer); diff --git a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c index 4aa3b33ef..069aa70d7 100644 --- a/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c +++ b/code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c @@ -476,28 +476,7 @@ static uint32_t custom_utils_pdudec(uint8_t *para, uint32_t paraLen, char *strCo const char *inpdustr = (const char*)argv[0]; - struct tm sms_broken_time={0}; - time_t sms_broken_timestamp=0; - int timezone = 0; //单位15分钟 - char phone_number[24]={0}; - int phone_number_size=24; - char pduarray[128]={0}; - int pduarray_size = 128; - char text[128]={0}; - int text_size=128; - - /** - strHex2bytearray 0891683108705505F0240D91685125419665F1000842508281025223108BA152127684597D597D768457FA91D1 ret 0 - output_sms_text_length 16, index 29 - pdustr len 45,phonenumb:8615521469561 ,text:计划的好好的基金 ,txtlen:24, receive time 0124-04-28 18:20:25 offset 28800 , timestampe 1716891625 - */ - - ret=strHex2bytearray(inpdustr,(char*)pduarray,&pduarray_size); - printf("strHex2bytearray %s ret %d\n",inpdustr,ret); - ret = pdu_decode((unsigned char*)pduarray,pduarray_size,&sms_broken_time,&timezone,&sms_broken_timestamp,(char*)phone_number,phone_number_size,(char*)text,text_size); - printf("pdustr len %d,phonenumb:%s ,text:%s ,txtlen:%d, ",text_size,phone_number,text,ret); - printf("receive time %04d-%02d-%02d %02d:%02d:%02d offset %d , timestampe %d\n",sms_broken_time.tm_year,sms_broken_time.tm_mon,sms_broken_time.tm_mday,sms_broken_time.tm_hour,sms_broken_time.tm_min,sms_broken_time.tm_sec, - timezone,sms_broken_timestamp); + pdu_decode_example(inpdustr); return ERRCODE_SUCC; } diff --git a/code/sdk/drivers/peripheral/utils/pdu.c b/code/sdk/drivers/peripheral/utils/pdu.c index 0ad06c0e9..4ad060256 100644 --- a/code/sdk/drivers/peripheral/utils/pdu.c +++ b/code/sdk/drivers/peripheral/utils/pdu.c @@ -32,115 +32,6 @@ SwapDecimalNibble(const unsigned char x) { return (x / 16) + ((x % 16) * 10); } - -// Encode/Decode PDU: Translate ASCII 7bit characters to 8bit buffer. -// SMS encoding example from: http://www.dreamfabric.com/sms/. -// -// 7-bit ASCII: "hellohello" -// [0]:h [1]:e [2]:l [3]:l [4]:o [5]:h [6]:e [7]:l [8]:l [9]:o -// 1101000 1100101 1101100 1101100 1101111 1101000 1100101 1101100 1101100 1101111 -// | ||| ||||| | ||||||| |||||| -// /-------------/ ///-------/// /////-///// \------------\ ||||||| \\\\\\ . -// | ||| ||||| | ||||||| |||||| -// input buffer position -// 10000000 22111111 33322222 44443333 55555333 66666655 77777776 98888888 --999999 -// | ||| ||||| | ||||||| |||||| -// 8bit encoded buffer -// 11101000 00110010 10011011 11111101 01000110 10010111 11011001 11101100 00110111 -// E8 32 9B FD 46 97 D9 EC 37 - - -// // Encode PDU message by merging 7 bit ASCII characters into 8 bit octets. -// static int -// EncodePDUMessage(const char* sms_text, int sms_text_length, unsigned char* output_buffer, int buffer_size) -// { -// // Check if output buffer is big enough. -// if ((sms_text_length * 7 + 7) / 8 > buffer_size) -// return -1; - -// int output_buffer_length = 0; -// int carry_on_bits = 1; -// int i = 0; - -// for (; i < sms_text_length - 1; ++i) { -// output_buffer[output_buffer_length++] = -// ((sms_text[i] & BITMASK_7BITS) >> (carry_on_bits - 1)) | -// ((sms_text[i + 1] & BITMASK_7BITS) << (8 - carry_on_bits)); -// carry_on_bits++; -// if (carry_on_bits == 8) { -// carry_on_bits = 1; -// ++i; -// } -// } - - -// if (i < sms_text_length) -// output_buffer[output_buffer_length++] = (sms_text[i] & BITMASK_7BITS) >> (carry_on_bits - 1); - -// return output_buffer_length; -// } - -// // Decode PDU message by splitting 8 bit encoded buffer into 7 bit ASCII -// // characters. -// static int -// DecodePDUMessage(const unsigned char* buffer, int buffer_length, char* output_sms_text, int sms_text_length) -// { -// int output_text_length = 0; -// if (buffer_length > 0) -// output_sms_text[output_text_length++] = BITMASK_7BITS & buffer[0]; - -// int carry_on_bits = 1; -// int i = 1; -// for (; i < buffer_length; ++i) { - -// output_sms_text[output_text_length++] = BITMASK_7BITS & ((buffer[i] << carry_on_bits) | (buffer[i - 1] >> (8 - carry_on_bits))); - -// if (output_text_length == sms_text_length) break; - -// carry_on_bits++; - -// if (carry_on_bits == 8) { -// carry_on_bits = 1; -// output_sms_text[output_text_length++] = buffer[i] & BITMASK_7BITS; -// if (output_text_length == sms_text_length) break; -// } - -// } -// if (output_text_length < sms_text_length) // Add last remainder. -// output_sms_text[output_text_length++] = buffer[i - 1] >> (8 - carry_on_bits); - -// return output_text_length; -// } - -// Encode a digit based phone number for SMS based format. -static int -EncodePhoneNumber(const char* phone_number, unsigned char* output_buffer, int buffer_size) -{ - int output_buffer_length = 0; - const int phone_number_length = strlen(phone_number); - - // Check if the output buffer is big enough. - if ((phone_number_length + 1) / 2 > buffer_size) - return -1; - - int i = 0; - for (; i < phone_number_length; ++i) { - - if (phone_number[i] < '0' && phone_number[i] > '9') - return -1; - - if (i % 2 == 0) { - output_buffer[output_buffer_length++] = BITMASK_HIGH_4BITS | (phone_number[i] - '0'); - } else { - output_buffer[output_buffer_length - 1] = - (output_buffer[output_buffer_length - 1] & BITMASK_LOW_4BITS) | - ((phone_number[i] - '0') << 4); - } - } - - return output_buffer_length; -} - // Decode a digit based phone number for SMS based format. static int DecodePhoneNumber(const unsigned char* buffer, int phone_number_length, char* output_phone_number) @@ -212,68 +103,62 @@ uint8_t *utf82uni (const uint8_t *uft8_in,uint8_t **uni_out) return 0; } +// 十六进制数据映射表 +static const char HexTbl[]={"0123456789ABCDEF"}; + +// 十六进制字符转为数字 +static unsigned char HexChar2Number(char hex) +{ + unsigned char value = 0; + if(hex >= '0' && hex <= '9') + { + value = hex - '0'; + } + else if(hex >= 'A' && hex <= 'Z') + { + value = hex - 'A' + 10; + } + else if(hex >= 'a' && hex <= 'z') + { + value = hex - 'a' + 10; + } + + return value; +} + +// 两个十六进制字符转为十进制数据 +static unsigned char strHex2Byte(char *pHex) +{ + unsigned char value; + value = HexChar2Number(pHex[0]) << 4; + value |= HexChar2Number(pHex[1]); + + return value; +} - -// // Encode a SMS message to PDU、 -// int -// pdu_encode(const char* service_center_number, const char* phone_number, const char* sms_text, -// unsigned char* output_buffer, int buffer_size) -// { -// if (buffer_size < 2) -// return -1; - -// int output_buffer_length = 0; - -// // 1. Set SMS center number. -// int length = 0; -// if (service_center_number && strlen(service_center_number) > 0) { -// output_buffer[1] = TYPE_OF_ADDRESS_INTERNATIONAL_PHONE; -// length = EncodePhoneNumber(service_center_number, -// output_buffer + 2, buffer_size - 2); -// if (length < 0 && length >= 254) -// return -1; -// length++; // Add type of address. -// } -// output_buffer[0] = length; -// output_buffer_length = length + 1; -// if (output_buffer_length + 4 > buffer_size) -// return -1; // Check if it has space for four more bytes. - -// // 2. Set type of message. -// output_buffer[output_buffer_length++] = SMS_SUBMIT; -// output_buffer[output_buffer_length++] = 0x00; // Message reference. - -// // 3. Set phone number. -// output_buffer[output_buffer_length] = strlen(phone_number); -// output_buffer[output_buffer_length + 1] = TYPE_OF_ADDRESS_INTERNATIONAL_PHONE; -// length = EncodePhoneNumber(phone_number, -// output_buffer + output_buffer_length + 2, -// buffer_size - output_buffer_length - 2); -// output_buffer_length += length + 2; -// if (output_buffer_length + 4 > buffer_size) -// return -1; // Check if it has space for four more bytes. - - -// // 4. Protocol identifiers. -// output_buffer[output_buffer_length++] = 0x00; // TP-PID: Protocol identifier. -// output_buffer[output_buffer_length++] = 0x00; // TP-DCS: Data coding scheme. -// output_buffer[output_buffer_length++] = 0xB0; // TP-VP: Validity: 10 days - -// // 5. SMS message. -// const int sms_text_length = strlen(sms_text); -// if (sms_text_length > SMS_MAX_7BIT_TEXT_LENGTH) -// return -1; -// output_buffer[output_buffer_length++] = sms_text_length; -// length = EncodePDUMessage(sms_text, sms_text_length, -// output_buffer + output_buffer_length, -// buffer_size - output_buffer_length); -// if (length < 0) -// return -1; -// output_buffer_length += length; - -// return output_buffer_length; -// } +int strHex2bytearray(char *inputHexstr, char *output_bytes, int *max_output_bytes_count) +{ + if(inputHexstr == NULL || output_bytes == NULL || max_output_bytes_count == NULL) + { + return -1; + } + int inputlen=strlen(inputHexstr); + if (inputlen%2 != 0 || inputlen<2) + return -2; + int outputlen = inputlen/2; + if (*max_output_bytes_count < outputlen) + { + outputlen = *max_output_bytes_count; + } + for (int i = 0; i< outputlen ; i++) + { + output_bytes[i]=strHex2Byte(&inputHexstr[i*2]); + } + *max_output_bytes_count = outputlen; + return 0; + +} int pdu_decode(unsigned char* buffer, int buffer_length, struct tm* output_sms_time, int* output_sms_zone,time_t *output_sms_timestamp, @@ -339,7 +224,7 @@ int pdu_decode(unsigned char* buffer, int buffer_length, 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); + // printf("output_sms_text_length %d, index %d\n",output_sms_text_length,sms_start + 1); unsigned char * unicodebuf=buffer+sms_start+1; @@ -364,95 +249,83 @@ int pdu_decode(unsigned char* buffer, int buffer_length, return decoded_sms_text_size; } - -// 十六进制数据映射表 -static const char HexTbl[]={"0123456789ABCDEF"}; - -// 十六进制字符转为数字 -static unsigned char HexChar2Number(char hex) +/** + * 输入: inpdustr pdu hex string , 申请好内存的变量: 时间戳 output_sms_timestamp, + * 发送电话号缓存output_sender_phone_number及缓存长度 sender_phone_number_size + * 短信缓存output_sms_text及缓存长度sms_text_size + * 输出: + * 时间戳 output_sms_timestamp + * 发送电话号output_sender_phone_number + * 短信内容output_sms_text + * 返回: + * 成功返回sms的文本长度,失败返回 负值 +*/ +int pdu_decode_hexstr(unsigned char* inpdustr, + time_t *output_sms_timestamp, + char* output_sender_phone_number, int sender_phone_number_size, + char* output_sms_text, int sms_text_size) { - unsigned char value = 0; - if(hex >= '0' && hex <= '9') - { - value = hex - '0'; - } - else if(hex >= 'A' && hex <= 'Z') + + if( inpdustr ==NULL || output_sms_timestamp ==NULL || output_sender_phone_number == NULL || output_sms_text==NULL) { - value = hex - 'A' + 10; + return -11; } - else if(hex >= 'a' && hex <= 'z') + char pduarray[256]={0}; + int pduarray_size = 256; + struct tm sms_broken_time={0}; + int timezone = 0; //单位15分钟 + + + int ret=strHex2bytearray((char*)inpdustr,(char*)pduarray,&pduarray_size); + // printf("strHex2bytearray %s ret %d\n",inpdustr,ret); + if (ret != 0) { - value = hex - 'a' + 10; + return -12; } - - return value; + + ret = pdu_decode((unsigned char*)pduarray,pduarray_size,&sms_broken_time,&timezone,output_sms_timestamp,output_sender_phone_number,sender_phone_number_size,(char*)output_sms_text,sms_text_size); + // printf("pdustr len %d,phonenumb:%s ,text:%s ,txtlen:%d, ",strlen(inpdustr),output_sender_phone_number,output_sms_text,ret); + // printf("receive time %04d-%02d-%02d %02d:%02d:%02d offset %d , timestampe %d\n",sms_broken_time.tm_year,sms_broken_time.tm_mon,sms_broken_time.tm_mday,sms_broken_time.tm_hour,sms_broken_time.tm_min,sms_broken_time.tm_sec, + // timezone,*output_sms_timestamp); + return ret; } - -// 两个十六进制字符转为十进制数据 -static unsigned char strHex2Byte(char *pHex) +/** +strHex2bytearray 0891683108705505F0240D91685125419665F1000842508281025223108BA152127684597D597D768457FA91D1 ret 0 +output_sms_text_length 16, index 29 +pdustr len 45,phonenumb:8615521469561 ,text:计划的好好的基金 ,txtlen:24, receive time 0124-04-28 18:20:25 offset 28800 , timestampe 1716891625 +*/ + +int pdu_decode_example(const char *inpdustr ) { - unsigned char value; - value = HexChar2Number(pHex[0]) << 4; - value |= HexChar2Number(pHex[1]); - - return value; -} + int ret=0; + time_t sms_broken_timestamp=0; + char phone_number[24]={0}; + int phone_number_size=24; + char text[256]={0}; + int text_size=256; -int strHex2bytearray(char *inputHexstr, char *output_bytes, int *max_output_bytes_count) -{ - if(inputHexstr == NULL || output_bytes == NULL || max_output_bytes_count == NULL) + ret = pdu_decode_hexstr(inpdustr,&sms_broken_timestamp,phone_number,phone_number_size,text,text_size); + + if (ret <= 0) { - return -1; + 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); } - int inputlen=strlen(inputHexstr); - if (inputlen%2 != 0 || inputlen<2) - return -2; - int outputlen = inputlen/2; - if (*max_output_bytes_count < outputlen) - { - outputlen = *max_output_bytes_count; - } - for (int i = 0; i< outputlen ; i++) - { - output_bytes[i]=strHex2Byte(&inputHexstr[i*2]); - } - *max_output_bytes_count = outputlen; - return 0; - + return ret; } - - -// int main_pdu_decode_example() -// { - -// struct tm sms_broken_time={0}; -// time_t sms_broken_timestamp=0; -// int timezone = 0; //单位15分钟 -// char phone_number[24]={0}; -// int phone_number_size=24; -// char text[256]={0}; -// int text_size=256; - -// /** -// strHex2bytearray 0891683108705505F0240D91685125419665F1000842508281025223108BA152127684597D597D768457FA91D1 ret 0 -// output_sms_text_length 16, index 29 -// pdustr len 45,phonenumb:8615521469561 ,text:计划的好好的基金 ,txtlen:24, receive time 0124-04-28 18:20:25 offset 28800 , timestampe 1716891625 -// */ - -// char * inputpdutxt="0891683108705505F0240D91685125419665F1000842508281025223108BA152127684597D597D768457FA91D1"; -// int ret=strHex2bytearray(inputpdutxt,text,&text_size); -// printf("strHex2bytearray %s ret %d\n",inputpdutxt,ret); -// ret = pdu_decode(text,text_size,&sms_broken_time,&timezone,&sms_broken_timestamp,phone_number,phone_number_size,text,text_size); -// printf("pdustr len %d,phonenumb:%s ,text:%s ,txtlen:%d, ",text_size,phone_number,text,ret); -// printf("receive time %04d-%02d-%02d %02d:%02d:%02d offset %d , timestampe %d\n",sms_broken_time.tm_year,sms_broken_time.tm_mon,sms_broken_time.tm_mday,sms_broken_time.tm_hour,sms_broken_time.tm_min,sms_broken_time.tm_sec, -// timezone,sms_broken_timestamp); - -// return 0; -// } - // int main() // { -// return main_pdu_decode_example(); + // const char *inpdustr = "0891683108705505F0240D91685125419665F1000842508281025223108BA152127684597D597D768457FA91D1"; +// return pdu_decode_example(inpdustr); // } \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/utils/pdu.h b/code/sdk/drivers/peripheral/utils/pdu.h index 0a24e77d3..0481bd816 100644 --- a/code/sdk/drivers/peripheral/utils/pdu.h +++ b/code/sdk/drivers/peripheral/utils/pdu.h @@ -32,7 +32,22 @@ int pdu_decode( unsigned char* pdu, int pdu_len, * Convert Hex String to binary array */ int strHex2bytearray(char *inputHexstr, char *output_bytes, int *max_output_bytes_count); - +/** + * 输入: inpdustr pdu hex string , 申请好内存的变量: 时间戳 output_sms_timestamp, + * 发送电话号缓存output_sender_phone_number及缓存长度 sender_phone_number_size + * 短信缓存output_sms_text及缓存长度sms_text_size + * 输出: + * 时间戳 output_sms_timestamp + * 发送电话号output_sender_phone_number + * 短信内容output_sms_text + * 返回: + * 成功返回sms的文本长度,失败返回 负值 +*/ +int pdu_decode_hexstr(unsigned char* inpdustr, + time_t *output_sms_timestamp, + char* output_sender_phone_number, int sender_phone_number_size, + char* output_sms_text, int sms_text_size); +int pdu_decode_example(const char *inpdustr ); #endif // SMS_SMS_H_ -- 2.17.1