短信网关设计报告.docx

上传人:b****3 文档编号:10279968 上传时间:2023-05-24 格式:DOCX 页数:53 大小:780.68KB
下载 相关 举报
短信网关设计报告.docx_第1页
第1页 / 共53页
短信网关设计报告.docx_第2页
第2页 / 共53页
短信网关设计报告.docx_第3页
第3页 / 共53页
短信网关设计报告.docx_第4页
第4页 / 共53页
短信网关设计报告.docx_第5页
第5页 / 共53页
短信网关设计报告.docx_第6页
第6页 / 共53页
短信网关设计报告.docx_第7页
第7页 / 共53页
短信网关设计报告.docx_第8页
第8页 / 共53页
短信网关设计报告.docx_第9页
第9页 / 共53页
短信网关设计报告.docx_第10页
第10页 / 共53页
短信网关设计报告.docx_第11页
第11页 / 共53页
短信网关设计报告.docx_第12页
第12页 / 共53页
短信网关设计报告.docx_第13页
第13页 / 共53页
短信网关设计报告.docx_第14页
第14页 / 共53页
短信网关设计报告.docx_第15页
第15页 / 共53页
短信网关设计报告.docx_第16页
第16页 / 共53页
短信网关设计报告.docx_第17页
第17页 / 共53页
短信网关设计报告.docx_第18页
第18页 / 共53页
短信网关设计报告.docx_第19页
第19页 / 共53页
短信网关设计报告.docx_第20页
第20页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

短信网关设计报告.docx

《短信网关设计报告.docx》由会员分享,可在线阅读,更多相关《短信网关设计报告.docx(53页珍藏版)》请在冰点文库上搜索。

短信网关设计报告.docx

短信网关设计报告

项目设计报告

上海易嵌

项目名称:

短信收发系统设计

项目负责人:

汤汝

项目时间:

组员:

邵林、陈阳、余刚

概要设计部分

一、设计需求

使用TCP/IP协议模拟GSM协议设计短信收发系统。

客户端要求

1.客户端第一界面为写短信,收件箱,发件箱,已发件箱,草稿箱,短信设置。

用户可自定义文件夹。

2.写短信界面进入后需要输入收件人和短信内容,收件人可以从电话本模块中选择,也可以直接输入号码,如输入号码和电话本中存在记录匹配,需直接显示为电话本中姓名,输入完成后可进行发送操作或存入草稿箱。

3.收件箱中存储从网络端收到的短信,收件箱中的短信按照接受时间排序,未读短信需要被标识。

对收件箱的操作包括删除短信(包括单条删除,多条删除和全部删除),显示短信数量,按发件人排序。

单独对每个短信条目的操作包括删除,回复,转发,查看信息详情,将发件人保存至电话本,将短信内容中号码保存至电话本,将短信条目移至自定义文件夹。

4.发件箱中保存正在发送中的短信,如发送成功,则短信转存至已发件箱中。

如发送失败,则短信仍保存在发件箱中。

对发件箱的操作包括删除短信(包括单条删除,多条删除和全部删除),显示短信数量。

单独对每个短信条目的操作包括删除,转发,发送。

5.已发件箱中保存发送成功的短信,对已发件箱的操作包括删除短信(包括单条删除,多条删除和全部删除),显示短信数量,按收件人排序。

单独对每个短信条目的操作包括删除,转发,查看信息详情,将收件人保存至电话本。

6.草稿箱存储短信编辑的草稿,对草稿箱的操作包括删除短信(包括单条删除,多条删除和全部删除),显示短信数量。

单独对每个短信条目的操作包括删除,发送。

7.自定义文件夹由用户定义,用户可定义自定义文件夹名称。

对自定义文件夹的操作包括删除文件夹,删除短信(包括单条删除,多条删除和全部删除),显示短信数量。

对单条短信的操作同收件箱。

用户可定义多个自定义文件夹。

8.短信设置中条目项为是否匿名发送,当前容量显示,自定义文件夹管理,是否开启发送报告,短消息服务中心设置,信息有效期,短信黑名单功能。

自定义文件夹管理包括创建自定义文件夹,重命名自定义文件夹,删除自定义文件夹。

服务端要求

服务器端需实现接收,存储和转发三种基本功能。

另需根据SMS协议标准实现延时发送,定时发送,匿名发送,短信屏蔽功能。

服务器端需启动守护进程。

短信服务器:

A、提供用户管理表

B、提供短信发送日志并通知是否到达客户手机

C、提供短信接收日志并响应客户端程序连接请求

D、短信内容服务可主要分为点播和订阅两张,点播类型随机发生,用户需要该信息临时点播,为一次性服务,订阅信息由用户定制订阅关系,服务方按时向全部订阅者发送同样的信息

E、手机用户在申请使用服务方所提供的信息服务前,需要注册。

注册中要对手机用户进行验证,验证通过后注册成功

限制性需求

1短信字符编码要求根据SMS协议实现。

2客户端电话本条数最大200条。

客户端短信最大条目数为300条。

最大条目数指所有短信文件夹内包括的条目数总量。

服务器端存储容量不做限制。

四安全性及可靠性需求

1要求网络传输非明码传输,并保证网络传输数据之可靠性。

2要求服务器端稳定安全。

3要求客户端存储安全。

项目分配情况

责任人

任务

备注

汤汝

总体设计报告,协议层的设计报告,以及实现与调试,应用层电话簿功能实现。

确保协议层的实现,负责审核各个模块的设计,提供参考性意见。

余刚

服务器设计报告,服务器的实现与调试。

确保服务器的稳定安全。

陈阳、邵林

应用层设计报告,应用层的实现与调试。

良好的界面控制,程序的稳定与安全。

全体成员

对项目进行综合性调试与测试。

确保实现基本功能的前提下进行版本的升级。

二、体统总体结构图

三、模块介绍

1.服务器

负责人:

余刚

服务器设计为多线程程序,每次用户注册后创建线程为其提供服务。

每次用户退出结束结束服务线程。

服务器运行开启守护进程,负责写日志以及清理到期的发送失败短信。

其响应流程图如下:

每次用户开机时都与服务端建立连接,检查服器失败队列中是否有自己的消息。

服务器收到后保存该用户的id号到数组中,并记录总个数。

当用户关机后,服务器与他断开连接,删除数组中的id号,并个数减一。

线程接收短信包后提取目的地址,分析目的地址,设置源地址,转发;线程处理流程如下:

接收模块:

当用户发送信息报时,服务器接收并保存。

解析模块:

将信息报的信息解析出来(包括目的地址,源地址,大小,内容)存入结构体中。

发送模块:

将结构体发送到目的地址。

提供短信发送日志并通知是否到达客户手机

发送失败分析:

1.若对方手机未开机,则服务器保存消息,等待用户开机后再发送。

2.若是网络问题则重新发送,并确认是否接受成功。

服务器数据结构:

Structlist_fail_pack*head//失败队列头节点(全局)

#definetotal100//服务器能接受客户端的个数

intcount记录当前连接客户的个数

Structclient{

Intclient_fd;//套接字描述符

Charnumber[12];//电话号码

Pthread_tthread_id;//线程ID

Structclient*next;

};//用户连接时发送给服务器的结构体,记录用户信息

Structlist_head{

Structlist_head*prev;

Structlist_head*next;

};

Structfail_pack{

Structclient_send_packtmp;

Structtimetimestamp;

};//发送失败后保存的结构体

Structlist_fail_pack{

  StructList_headlist_h;

  Structfail_packf_pack;

};//建立失败内容链表

2.协议层

协议层分为客户端和服务器两种;总共有两个线程,其中接收线程一直存在系统中阻塞读取端口信息,接收到信息后解压解密后发送给应用层。

发送线程由用户调用接口函数后开启发送线程,获得发送内容后压缩加密后再打包,发送至服务端。

Structclient_send_pdu_head{//客户发送数据包头部

Unsignedcharsca[13];

Unsignedcharpdu_type;

Unsignedcharmr;

Unsignedcharda_len;//目的地址长度

Unsignedcharda_type;

Unsignedcharda[11];//目的地址

Unsignedcharpid;

Unsignedchardcs;

Unsignedcharvp;

Unsignedcharudl;//用户数据长度

};

Structclient_recv_pdu_head{//客户接收数据包头部

Unsignedcharsca[13];

Unsignedcharpdu_type;

Unsignedcharoa_len;//源地址长度

Unsignedcharoa_type

Unsignedcharoa[11];//源地址

Unsignedcharpid;

Unsignedchardcs;

Unsignedcharscts[7];

Unsignedcharudl;//用户数据长度

};

Structclient_send_pdu{//客户端发送数据包

Structclient_send_pdu_headhead;

Charbuffer[140];

};

Structclient_recv_pdu{//客户端接收数据包

Sturctclient_recv_pdu_headhead;

Charbuffer[140];

};

协议层模块图:

客户端协议层:

服务端协议层:

服务器协议需要修改数据包头部信息,在将发送用户填充到源地址里去;

客户端协议层接口:

/*应用层发送接口*/

Unsignedintapp_send(constchar*app_buf,\

size_tbuf_len,constchar*number);

/*应用层接收接口*/

Unsignedintapp_recv(char*app_buf,size_tbuf_len,char*number);

服务器协议层接口:

/*服务器发送接口*/

Unsignedintser_send(intdest_sockfd,\

structclient_recv_pdu*temp,\

size_ttemp_size,\

constchar*src_number);

/*服务器接收接口*/

Unsignedintser_recv(intsrc_sockfd,\

structclient_send_pdu*temp,\

size_ttemp_size);

3.应用层模块

短信系统设计

短信应用层概要流程图。

应用层包括收件箱、写短信、发件箱、草稿箱、已发件箱、短信设置和私密信箱(自定义文件夹)七大功能,每个功能有各自的子功能。

应用层通过两个进程进行短信收发及其它信息的传递。

应用层将短信信息及各种标志传递给协议层,协议层经过处理发送给服务器,服务器通过处理后发送到指定客户端,经协议解析后发送给应用层。

应用层读取信息并显示给用户。

应用层运行设计:

应用程序由系统开机时启动协议层进程,短信进程和电话簿进程;其中启动协议层进程时注册用户到服务器;与服务器建立连接;短信进程中建立接收线程,阻塞接收服务器短信服务信息。

在调用发送函数时,启动发送线程,发送完毕结束发送线程。

电话簿进程提供联系人信息。

应用层运行流程图:

应用层数据结构:

typedefstructmsm{//短信结构体

charphnoenum[11];//存放电话号码

chartime[15];//存放时间字符串,将时间命名为文件名

char*message;//存放短信内容

}MSM;

详细设计部分

1、服务器设计与分析(负责人:

余刚)

服务器应用层输入输出

服务器输入项:

协议层向服务器输入短信内容与目的号码以及服务器名字。

协议层向服务器输入传输过来的短信包。

服务器输出项:

服务器向协议层输出短信内容和来信人地址,并向源客户端输出发送信息情况提示。

模块功能函数

/*功能:

该线程获取当时时间,并检查失败队列每个节点的的时间戳,*若时间戳失效则删除该节点.

*Structlist_fail_pack*head:

失败队列的头节点。

*成功:

1;失败:

-1

*/

IntOver_time(Structlist_fail_pack*head);

流程图:

/*功能:

删除失败队列中的某个节点。

*Structlist_fail_pack*head:

失败队列的头节点。

*Structlist_fail_packtemp:

要删除的节点。

*返回值:

成功返回1,失败返回-1

*/

Intdel_failpack(Structlist_fail_pack*head,Structlist_fail_pack*temp);

流程图:

/*函数功能:

用户退出时删除注册表的记录。

*structclienthead注册表数组头地址;

*pthread_id:

要退出的用户线程号。

*成功:

返回1;失败:

-1

*/

Intdel_login(structclienthead,thread_tpthread_id)

流程图:

/*函数功能:

获取源地址。

形参列表:

structclient*head注册表数组头地址。

UnsignedChar*number:

得到的号码。

IntClient_fd:

客户的套接字。

返回值:

成功:

1;失败:

-1*/

Intget_src_addr(structclient*head,\

UnsignedChar*number,intclient_fd);

/*函数功能:

获取目的地址。

因为包内的地址是用数组存放的,所以*要先获得号码的长度len,在获取号码并将号码以字符串的形式存放。

*structclient_send_pdutemp:

用户发送过来的包节点。

*UnsignedChar*dest_addr:

获得的目的地址。

*成功为1;失败:

-1

*/

Intget_dest_addr(structclient_send_pdu*temp,\

UnsignedChar*dest_addr);

流程图:

/*函数功能:

获取消息内容

*形参列表:

structclient_send_pdutemp//用户发送过来的包节点。

*char*message:

获取的消息;

*返回值:

成功:

0;失败:

-1

*/

Intget_message(structclient_send_pdu*temp,char*message);

/*功能:

将用户的地址,线程号,sock_fd放入structclient结构体中。

*形参列表:

head:

注册表数组的头地址,将新产生的节点插入链表;

*返回值flag:

用来判断注册是否成功:

1:

成功,-1:

失败

*/

Intlogin_user_list(structclient*head);

流程图:

/*函数功能:

发送信息后返回给用户的信息.

参数:

structclient_send_pdu*tmp要返回的包。

intflag=login_user_list().flag=1,将原包的buffer改为success返回;

flag=-1,将包的buffer改为fail并将包发回对方*/

VoidReturn_to_srcuser(structclient_send_pdu*tmp,intflag)

流程图:

/*函数功能:

ser_recv()接受到包后,通过get_dest_addr获得目的地址*查看是否是发给服务器的信息,还是发送给其他人的.若是发送给服

*务器的,解析信息内容(a.点播;b.注册)。

否则直接发出去。

*参数:

structclient_send_pdu*tmp:

协议发来的包。

*返回值:

1:

成功;-1:

失败

*/

Intisfirst_login(structclient_send_pdu*tmp);

流程图:

/*函数功能:

将获得的包发送给目的地址.解析包获得目的地址,与

*注册表里的地址匹配,若有,获得fd并发送出去;若无,将包放入*Structlist_fail_pack失败链表中.

*将要发送出去的包结构体structclient_send_pdu*tmp。

*目的地址:

unsignedchar*dest_addr

*返回值:

成功:

1;失败:

-1*/

Intsend_out(structclient_send_pdu*tmp,unsignedchar*dest_addr);

流程图:

/*函数功能:

查找在注册表内是否有目的地址。

*参数:

unsingedchar*dest:

目的地址.

*structclient*head:

注册表头节点。

*返回:

成功:

返回structclient*tmp;失败:

-1

*/

IntFind_dest_addr(unsingedchar*dest,structclient*head);

流程图:

/*函数功能:

提供给注册函数调用。

用户开机与服务器连接时查询服*务器失败队列中是否有自己的消息。

有就发送。

*参数:

unsignedchar*src:

客户的地址.

*List_head*head:

失败队列的头节点

*返回值:

1:

成功;-1:

失败*/

Intinquire_message(unsignedchar*src,structclient_send_pdu*head);

流程图:

/*功能:

遍历失败队列,取得时间戳。

*参数:

structclient_send_pdu*head.:

失败队列的头;

*unsignedchar*time:

获得的时间戳

*返回值:

1:

成功;-1:

失败。

*/

Intinquire_failpack_time(structclient_send_pdu*head,unsignedchar*time)

流程图:

/*函数功能:

客户连接时判断服务器是否接受

*参数:

count:

当前连接的个数。

*Total:

总共可以接受的队列

*返回值:

1:

成功;-1:

失败

*/

IntIseccept_client(intcount,inttotal)

流程图:

二、协议层设计与分析(负责人:

汤汝)

协议层功能描述:

协议层分为客户端协议与服务端协议,客户端协议主要负责对客户应用程序所需要发送的数据进行处理,处理模式符合标准的短信协议。

并且与网络层进行通信,与服务器建立连接。

具有极佳通用性和可移植性。

通过接口与其他层进行通信。

服务器协议层主要工作在于与网络层进行通信,以及修改包头部信息。

协议层输入项:

应用层向协议层输入短信内容与目的号码以及服务器名字。

网络层向协议层输入传输过来的短信包。

协议层输出项:

协议层向应用层输出短信内容和来信人地址。

协议层向网络层输入需要发送的短信包。

协议层接口和各个功能函数如下:

1.客户端注册模块

/*

*user_register实现用户在服务器注册功能

*constchar*servicer_name是服务器名字;

*constchar*number是用户的电话号码,作为服务器查找用户的唯一凭证

*电话号码最长11个字符;

*constchar*usrname是用户用于实名注册用的用户名;

*函数连接成功返回0(SUCCED);

*连接失败,返回3(FAIL);

*服务器已满,返回1(FULL);

*服务器拒绝,返回2(REFUSE);

*/

intuser_register(constchar*servicer_name,\

constchar*number,\

constchar*usrname);

实现流程图:

/*

*test_number用于检测号码是否合法;

*constchar*number是用户提供的号码;

*号码长度不合法,返回1(ERR_LEN);

*非法字符,返回-1(ERR_CHAR);

*合法返回0(NOERROR);

*/

inttest_number(constchar*number);

实现流程图

/*

*register_pack_set设置注册用的数据包,目的地址为服务器号码00000,

*内容为号码和用户名;

*structclient_send_pdu*send_pack是客户发送数据包;

*constchar*number是用户号码,

*constchar*usrname是用户名,暂时不提供实名注册;

*成功返回0;

*失败返回1;

*/

intregister_pack_set(structclient_send_pdu*send_pack,\

constchar*number,constchar*usrname);

实现流程图:

/*

*reply_pack_analysis用于解析客户端回复使用的数据包;

*structclient_recv_pdu*send_pack是客户接收数据包;

*成功注册:

返回0(SUCCED);

*拒绝注册:

返回1(REFUSE);

*服务器已满:

返回2(FULL);

*/

intreply_pack_analysis(structclient_recv_pdu*recv_pack);

实现流程图:

2.客户端数据处理模块:

/*

*app_send给应用层提供发送接口;

*constchar*app_buf是应用层数据指针;

*size_tbuf_len应用层数据大小;

*constchar*dest_number目的地号码;

*成功返回发送字节数;

*失败返回-1;

*/

intapp_send(constchar*app_buf,\

size_tbuf_len,constchar*dest_number);

实现流程图:

/*

*encrypt_app_data对应用层要发送的数据进行加密处理;

*char*send_buf是应用层需要发送的数据

*size_tbuf_len是用户数据大小;

*该函数加密成功返回加密后数据大小;

*失败返回-1;

*/

intencrypt_app_data(char*send_buf,size_tbuf_len);

实现流程图:

/*

*compress_app_data实现对应用层数据进行压缩;

*即去掉每个字节的第八位

*char*send_buf是已加密的应用层数据

*size_tbuf_len是buf的大小

*成功返回压缩后数据大小

*失败返回-1;

*/

intcompress_app_data(char*send_buf,size_tbuf_len);

/*

*app_recv给应用层提供接收接口

*char*app_buf是应用层用于保存短信内容的buffer

*size_tbuf_len应用层buffer大小

*char*src_number是用于保存源地址号码

*成功返回接收字节数;

*失败返回-1;

*/

unsignedintapp_recv(char*app_buf,\

size_tbuf_len,char*src_number);

实现流程图:

/*

*decompress_prol_data用于解压协议层接收到的数据;

*char*recv_buf待解压数据

*size_tbuf_len待解压数据的的大小

*char**dest_data_p用于保存解压后数据的地址;

*函数执行成功返回解压后数据大小;

*函数执行失败返回-1;

*/

intdecompress_prol_data(char*recv_buf,\

size_tbuf_len,char**dest_data_p);

/*

*decrypt_prol_data用于解密短信内容;

*char*recv_buf是接收到数据的内容地址

*size_tbuf_len内容的大小;

*函数执行成功返回解密后数据大小

*函数执行失

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2