mirror of https://github.com/ARMmbed/mbed-os.git
Fixed SMS receive in PDU: certain length sms last char was missing.
parent
6ccbb59979
commit
e99c18c233
|
@ -895,13 +895,14 @@ nsapi_size_or_error_t AT_CellularSMS::get_sms(char* buf, uint16_t len, char* pho
|
||||||
index+=14;
|
index+=14;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int udl = hex_str_to_int(pdu+index, 2);
|
||||||
index +=2;
|
index +=2;
|
||||||
|
|
||||||
int paddingBits = 0;
|
int paddingBits = 0;
|
||||||
int parts = 1;
|
|
||||||
int partnro = 1;
|
int partnro = 1;
|
||||||
if (userDataHeader) {
|
if (userDataHeader) {
|
||||||
// we need to read User Defined Header to know what part number this message is.
|
// we need to read User Defined Header to know what part number this message is.
|
||||||
index += read_udh_from_pdu(pdu+index, info, partnro, parts, paddingBits);
|
index += read_udh_from_pdu(pdu+index, info, partnro, paddingBits);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (part_number) {
|
if (part_number) {
|
||||||
|
@ -910,7 +911,7 @@ nsapi_size_or_error_t AT_CellularSMS::get_sms(char* buf, uint16_t len, char* pho
|
||||||
|
|
||||||
if (msg) {
|
if (msg) {
|
||||||
// we are reading the message
|
// we are reading the message
|
||||||
err = read_pdu_payload(pdu+index, dataScheme, msg, paddingBits, partnro == parts);
|
err = read_pdu_payload(pdu+index, udl, dataScheme, msg, paddingBits);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (dataScheme == 0x00) {
|
if (dataScheme == 0x00) {
|
||||||
|
@ -933,9 +934,8 @@ nsapi_size_or_error_t AT_CellularSMS::get_sms(char* buf, uint16_t len, char* pho
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// read params from User DEfined Header
|
// read params from User Defined Header
|
||||||
int AT_CellularSMS::read_udh_from_pdu(const char* pdu, sms_info_t *info, int &part_number, int &parts,
|
int AT_CellularSMS::read_udh_from_pdu(const char* pdu, sms_info_t *info, int &part_number, int &padding_bits) {
|
||||||
int &padding_bits) {
|
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int udhLength = hex_str_to_int(pdu, 2);
|
int udhLength = hex_str_to_int(pdu, 2);
|
||||||
|
@ -943,6 +943,7 @@ int AT_CellularSMS::read_udh_from_pdu(const char* pdu, sms_info_t *info, int &pa
|
||||||
|
|
||||||
// if there is padding bits then udhlen is octet bigger as we need to keep septet boundary
|
// if there is padding bits then udhlen is octet bigger as we need to keep septet boundary
|
||||||
padding_bits = ((udhLength+1) * 8 ) % 7; // +1 is for udhLength itself
|
padding_bits = ((udhLength+1) * 8 ) % 7; // +1 is for udhLength itself
|
||||||
|
|
||||||
if (padding_bits) {
|
if (padding_bits) {
|
||||||
padding_bits = 7 - padding_bits;
|
padding_bits = 7 - padding_bits;
|
||||||
} else {
|
} else {
|
||||||
|
@ -966,9 +967,8 @@ int AT_CellularSMS::read_udh_from_pdu(const char* pdu, sms_info_t *info, int &pa
|
||||||
index +=4;
|
index +=4;
|
||||||
}
|
}
|
||||||
|
|
||||||
parts = hex_str_to_int(pdu+index, 2);
|
|
||||||
if (info) {
|
if (info) {
|
||||||
info->parts = parts;
|
info->parts = hex_str_to_int(pdu+index, 2);
|
||||||
}
|
}
|
||||||
index +=2;
|
index +=2;
|
||||||
|
|
||||||
|
@ -978,13 +978,11 @@ int AT_CellularSMS::read_udh_from_pdu(const char* pdu, sms_info_t *info, int &pa
|
||||||
return (udhLength*2 + 2); // udh in hex and udhl
|
return (udhLength*2 + 2); // udh in hex and udhl
|
||||||
}
|
}
|
||||||
|
|
||||||
nsapi_size_or_error_t AT_CellularSMS::read_pdu_payload(const char* pdu, int scheme, char *msg, int padding_bits,
|
nsapi_size_or_error_t AT_CellularSMS::read_pdu_payload(const char* pdu, int msg_len, int scheme, char *msg, int padding_bits)
|
||||||
bool last_part)
|
|
||||||
{
|
{
|
||||||
if (scheme == 0x00) {
|
if (scheme == 0x00) {
|
||||||
// 7 bit gsm encoding, must do the conversions from hex to 7-bit encoding and to ascii
|
// 7 bit gsm encoding, must do the conversions from hex to 7-bit encoding and to ascii
|
||||||
return unpack_7_bit_gsm_to_str(pdu, strlen(pdu)/2, msg, padding_bits, last_part);
|
return unpack_7_bit_gsm_to_str(pdu, strlen(pdu)/2, msg, padding_bits, msg_len);
|
||||||
|
|
||||||
} else if (scheme == 0x04) {
|
} else if (scheme == 0x04) {
|
||||||
// 8bit scheme so just convert hexstring to charstring
|
// 8bit scheme so just convert hexstring to charstring
|
||||||
return hex_str_to_char_str(pdu, strlen(pdu), msg);
|
return hex_str_to_char_str(pdu, strlen(pdu), msg);
|
||||||
|
@ -1261,7 +1259,7 @@ uint16_t AT_CellularSMS::pack_7_bit_gsm_and_hex(const char* str, uint16_t len, c
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t AT_CellularSMS::unpack_7_bit_gsm_to_str(const char* str, int len, char *buf, int padding_bits,
|
uint16_t AT_CellularSMS::unpack_7_bit_gsm_to_str(const char* str, int len, char *buf, int padding_bits,
|
||||||
bool last_part)
|
int msg_len)
|
||||||
{
|
{
|
||||||
int strCount = 0;
|
int strCount = 0;
|
||||||
uint16_t decodedCount = 0;
|
uint16_t decodedCount = 0;
|
||||||
|
@ -1284,9 +1282,7 @@ uint16_t AT_CellularSMS::pack_7_bit_gsm_and_hex(const char* str, uint16_t len, c
|
||||||
} else if (shift == 6) {
|
} else if (shift == 6) {
|
||||||
hex_str_to_char_str(str + (strCount-1)*2, 2, &tmp1);
|
hex_str_to_char_str(str + (strCount-1)*2, 2, &tmp1);
|
||||||
buf[decodedCount] = gsm_to_ascii[(((tmp1>>2)) | (tmp << 6)) & 0x7F];
|
buf[decodedCount] = gsm_to_ascii[(((tmp1>>2)) | (tmp << 6)) & 0x7F];
|
||||||
// we are unpacking the last byte and so tmp is not complete as it's not completed by the next byte.
|
if (decodedCount+1 < msg_len) {
|
||||||
// unless this is a multipart message and not the last part.
|
|
||||||
if (!((strCount+1 == len) && last_part)) {
|
|
||||||
hex_str_to_char_str(str + strCount*2, 2, &tmp);
|
hex_str_to_char_str(str + strCount*2, 2, &tmp);
|
||||||
decodedCount++;
|
decodedCount++;
|
||||||
buf[decodedCount] = gsm_to_ascii[(tmp>>1) & 0x7F];
|
buf[decodedCount] = gsm_to_ascii[(tmp>>1) & 0x7F];
|
||||||
|
|
|
@ -200,10 +200,10 @@ private:
|
||||||
int read_sms_params(char *, char *);
|
int read_sms_params(char *, char *);
|
||||||
void free_linked_list();
|
void free_linked_list();
|
||||||
void add_info(sms_info_t* info, int index, int part_number);
|
void add_info(sms_info_t* info, int index, int part_number);
|
||||||
int read_udh_from_pdu(const char* pdu, sms_info_t *info, int &part_number, int &parts, int &padding_bits);
|
int read_udh_from_pdu(const char* pdu, sms_info_t *info, int &part_number, int &padding_bits);
|
||||||
nsapi_size_or_error_t get_data_from_pdu(const char* pdu, sms_info_t *info, int *part_number,
|
nsapi_size_or_error_t get_data_from_pdu(const char* pdu, sms_info_t *info, int *part_number,
|
||||||
char *phone_number = NULL, char *msg = NULL);
|
char *phone_number = NULL, char *msg = NULL);
|
||||||
nsapi_size_or_error_t read_pdu_payload(const char* pdu, int scheme, char *msg, int padding_bits, bool last_part);
|
nsapi_size_or_error_t read_pdu_payload(const char* pdu, int msg_len, int scheme, char *msg, int padding_bits);
|
||||||
sms_info_t* get_oldest_sms_index();
|
sms_info_t* get_oldest_sms_index();
|
||||||
bool create_time(const char* time_string, time_t* time);
|
bool create_time(const char* time_string, time_t* time);
|
||||||
int compare_time_strings(const char* time_string_1, const char* time_string_2);
|
int compare_time_strings(const char* time_string_1, const char* time_string_2);
|
||||||
|
@ -229,12 +229,12 @@ private:
|
||||||
* @param len length of the str divided by two as str is hexencoded
|
* @param len length of the str divided by two as str is hexencoded
|
||||||
* @param buf preallocated destination buffer
|
* @param buf preallocated destination buffer
|
||||||
* @param padding_bits number of padding bits which were needed to hold the octet boundary
|
* @param padding_bits number of padding bits which were needed to hold the octet boundary
|
||||||
* @param last_part true is last part of the encoded message
|
* @param msg_len Length of the received message which is coded in str
|
||||||
* @return length of the destination buffer buf
|
* @return length of the destination buffer buf
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
uint16_t unpack_7_bit_gsm_to_str(const char* str, int len, char *buf, int padding_bits,
|
uint16_t unpack_7_bit_gsm_to_str(const char* str, int len, char *buf, int padding_bits,
|
||||||
bool last_part);
|
int msg_len);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mbed
|
} // namespace mbed
|
||||||
|
|
Loading…
Reference in New Issue