1. 功能概述
LogPrintf工具为用户提供了在本地计算机上监视远程设备调试信息的能力。通常情况下,可以在本地计算机上使用telnet程序,用它连接到服务器;但是在卫星网络的条件下,TCP连接质量较低,telnet连接很容易断开,影响调试体验。当服务器程序启动之后,各个待调试的网络设备的调试信息都会被收集到服务器。客户端程序启动时自动地在服务器上尝试注册,注册成功后调试信息会通过UDP协议传回本地,就像直接在服务器观察打印信息一样。本工具使用者可以在本地程序中修改配置文件来改变端口参数。
2. 程序结构框图
1) 待调试设备上嵌入LogPrintf()函数
待调试设备每次调用LogPrintf()时,都会把打印信息通过UDP协议向服务器端发送。而且可以设置调试信息的type和level
2) 服务器端程序分为device&client监听模块、发送模块:
Source监听模块监听在固定的端口13013,监听两类信息,其中A来自device,B来自Client:
A. 等待调试设备发送的调试信息,这些信息会被打上type和level标签。根据标签信息,以及Client注册情况,服务器会调用发送模块,选择性转发调试信息给各个客户端。
B.接收来自客户端的控制信息。包括注册、查询、删除操作
a. 客户端注册时,会带有两个参数numObj、ObjList,分别是客户端监听对象的个数和客户端监听对象。其中客户端监听对象是一个三元结构:<监听type,监听level,监听IP>。控制模块接受了这次注册后,会维护一个Client信息列表,作为服务器过滤、转发的依据。这个列表中每个客户端也包含一个定时器,定时器结束时则从列表中删除该客户端。最后调用发送模块返回注册操作结果。
b. 客户端查询时,监听模块从客户端信息列表中查询,并返回结果。
c. 客户端删除时,监听模块更新客户端信息列表,并返回结果
发送模块负责向客户端发送控制信息和普通调试信息,通过字段的不同取值来区分控制信息和普通调试信息。服务器端在内存维护一个客户端信息列表,每项包括1.监听主体、2.定时器、3.监听目标列表(包括目标IP、目标type、目标level)。监听目标列表是过滤普通调试信息的依据。
3) 客户端程序分为监听模块、server请求模块、本地输出模块
监听模块监听用户的键盘输入,以及服务器端的控制信息输入:
a. 程序启动或者用户输入注册命令时,监听模块尝试出一个可行的端口,并且通过server请求模块向服务器端申请,成功后可以得到返回结果,在本地打印结果。如果注册成功,则开始监听申请成功的端口,并创建一个定时器,定时器结束后再次向服务器注册。
b. 用户输入查询命令时,通过server请求模块向服务器查询。
c. 用户输入关闭命令时,通过server请求模块向服务器申请注销。
d. 当监听的socket收到来自server的控制信息或者普通调试信息时,在本地打印。
Server请求模块根据不同的请求,向server发送不同格式的信令。
本地打印模块负责把收到的控制信息和普通调试信息打印。
3. 主要过程流程图
1) 初始化过程
初始化过程中,客户端首先尝试一个可行的端口,然后向服务器端申请,服务器端更新后,设置定时器,向客户端返回本次初始化的结果。客户端收到结果后,也启动一个定时器。服务器端在内存维护一个客户端信息列表,每项包括1.监听主体、2.定时器、3.监听目标列表(包括目标IP、目标type、目标level)
2) 客户端关闭过程
客户端关闭时,先通过端口通知服务器端注销这个地址,服务器端注销成功后,会更新地址列表,并返回操作结果。最后客户端再关闭socket,完成整个关闭过程。
1. 外部通信接口
1) Devices => Server
MSG |
TYPE |
LEVEL |
STRING |
1B |
1B |
1B |
LENGTH |
MSG=0代表这段消息是普通的调试信息,待调试设备向服务器发送打标后的调试信息,标志包括类型TYPE和级别LEVEL。
2) Client => Server
MSG=1代表这段消息是控制信息,控制信息又分为以下三类:
a. 申请(OP=0x00)
MSG |
OP |
PORT |
NUM |
TYPE0 |
LEVEL0 |
IP0 |
TYPE1 |
LEVEL1 |
IP1 |
…… |
|
1B |
1B |
2B |
2B |
1B |
1B |
4B |
1B |
1B |
4B |
|
|
申请时OP=0x00,num表示客户端的监听目标的个数,每个监听目标都包含三项:监听类型、监听级别、监听IP地址。其中监听类型以独热方式编码,可以通过掩码选择多个类型;其中的监听级别,表示需要监听的