论文首页哲学论文经济论文法学论文教育论文文学论文历史论文理学论文工学论文医学论文管理论文艺术论文 |
在该类中,关键的函数为gsmDecodePdu函数与gsmEncodePdu函数,它们将在智能家居中的对话框类CSmartHomeDlg中被调用。调用方法将在下文给予介绍。gsmDecodePdu函数与gsmEncodePdu函数分别用来在发短信时根据PDU规范进行编码,以及对串口收到的PDU编码进行解码。编码与解码根据在头文件中定义的短消息结构体进行取值或填充。以下是定义的关于编码方式的常量和填充短消息的数据结构。这些在接收与发送短信时是共用的。
#define GSM_7BIT 0 //7Bit编码方式
#define GSM_8BIT 4 //8Bit编码方式
#define GSM_UCS2 8 //UCS2编码方式
typedef struct {
char SCA[16]; // 短消息服务中心号码(SMSC地址)
char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID; // 用户信息协议标识(TP-PID)
char TP_DCS; // 用户信息编码方式(TP-DCS)
char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
char index; // 短消息序号,在读取时用到
} SM_PARAM;
4.4.2.2 CEncode类各成员函数的作用和工作流程:
gsmDecodePdu()函数用于接收、阅读短消息。输入源PDU串的指针,目标PDU参数指针,并返回用户信息长度。源PDU串是可打印字符串,如“C8329BFD0E01”,目标PDU参数是字节数据,如“{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}”,在这个函数中,较多的采用了同在一个类中的可打印字符串转换为字节数据的函数gsmString2Bytes;在短消息服务中心(SMSC)和回复号码的字符处理过程中,根据PDU串的编码规范,需要对描述SMSC的字符串段进行两两颠倒,并且去掉经颠倒后的字符串后的最后一个字符——“F”,那就采用了同在一个类中的gsmSerializeNumbers函数;经过数据分离,将PDU串中的描述短信编码位TP-DCS跟规定的数值进行对比,如表示7位码的数值为0,8位码为4,UCS2编码为8等。对比完成后,将用户信息进行对应方式的解码——如7位解码。它的工作流程如图4-13所示。
SHAPE \* MERGEFORMAT
图4-13 CEncode类gsmDecodePdu函数工作流程
gsmEncodePdu()函数用于编制、发送短消息,输入源PDU参数指针,输出目标PDU串指针,并返回目标PDU串长度。源PDU参数是字节信息,如“{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01},目标PDU参数是字节数据,如“C8329BFD0E01”,在这个函数中,较多的采用了同在一个类中的字节数据转换为可打印字符串的函数gsmBytes2String;在短消息服务中心(SMSC)和回复号码的字符处理过程中,根据PDU串的编码规范,需要对描述SMSC号码进行两两颠倒,并且在经颠倒后的字符串后加上一个字符——“F”,那就采用了同在一个类中的gsmInvertNumbers函数;根据描述短信编码的TP-DCS跟规定的数值进行对比,如表示7位码的数值为0,8位码为4,UCS2编码为8等。对比完成后,将用户信息进行对应方式的编码——如7位编码。它的工作流程如图4-14所示。
SHAPE \* MERGEFORMAT
图4-14 CEncode类gsmEncodePdu函数工作流程
gsmString2Bytes函数的作用是将可打印字符串转换为字节数据,如"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01},输入源字符串指针和输出的源字符串长度,输出目标数据指针,返回目标数据的长度。流程图如图4-15所示:
SHAPE \* MERGEFORMAT
图4-15 gsmString2Bytes函数工作流程
其中每两个字符串要整合成一个字节数据,如“C8”要转化为“0xC8”,故第一个字符“C”经字符转化为十六进制后要左移四位,使其成为“0xC0”,再与经过转换的低四位进行相或;然后计数器加2,源字符串和目标数据的指针往后移一个单位,继续处理下面的字符,直到计数器值的大小等于要处理的源字符串长度,则将处理好的数据输出。字符转化为十六进制的原理是:数字字符与0字符相减,得到它们的ASCII码之差,这个差就是这个字符所要表达的数字大小,如字符‘8’就转换成了数字类型的8,用二进制表示就是1000。而A、B、C、D、E、F等字符是与‘A’的ASCII码值相减,再加上10,就可以得到其表达的十六进制数值。如‘F’减去‘A’得到5,再加10,得到15,实质上就是十六进制中F所对应的十进制数15。
gsmBytes2String函数的功能与gsmString2Bytes函数相反,工作流程如图4-16所示。
SHAPE \* MERGEFORMAT
图4-16 gsmBytes2String函数工作流程
其中低四位是每个字节数据与0x0f位与得到。每四位表达的数值为0~15,而在tab数组中,从tab[0]到tab[15],对应的字符为‘0’到‘9’和‘A’到‘F’,通过此算法可以达到由数值型到字符型的转换,最后完成整条字节数据到字符串的转换。
gsmEncode7bit函数的作用是7bit编码。输入源字符串指针和源字符串的长度,输出目标字符串指针和目标编码串长度。工作流程图如图4-17所示。
SHAPE \* MERGEFORMAT
图4-17 gsmEncode7bit函数流程
gsmDecode7bit函数用于7位码的解码,输入源编码串指针和源编码串长度,输出目标字符