《ARM Linux开发-warewin 2G/3G无线传输(DTU)和路由器—笔记》
4.1、参数的整体设计
总参数是设备参数,存放在flash中,掉电不丢失。进程参数是在每次系统初始化时由主程序生成到参数配置文件中,存在内存中,掉电丢失。
设备参数第一次由默认列表参数生成参数文件,保存参数文件的同时备份参数文件,当读取参数文件出问题时可读取备份文件,避免参数文件丢失后读不出参数变成出厂默认值。
设置参数通过WEB页面进行设置,设置后需重启系统新参数才生效。
4.2、参数按照功能分类
1、系统基本参数:登录系统用户名和密码、系统重启时间、工作模式、本地IP等。
2、PPP拨号:连接广域网拨号用的用户名、密码、APN、拨号号码等。
3、DTU功能:使用无线数据传输包括串口相关、协议相关、远程通信相关的参数等。
4、条件触发:电话触发包括5个电话号码参数,定时上下线触发包括5个时间段参数,及下线间隔参数。
5、网络检测:ICMP检测包括5个IP地址参数,DNS检测包括5个域名参数,及检测间隔参数。
6、DDNS:登录花生壳DDNS的用户名和密码2个参数。
7、防火墙:MAC地址过滤包括5个MAC地址参数,客户端过滤用的一个包含10组IP和端口范围的列表参数。
8、虚拟服务器:端口转发用的一个包含10组IP和端口范围的列表参数、DMA主机功能用的IP地址参数。
9、NTP网络校时:设置时区用的时区参数、包含3组NTP时间服务器IP地址的参数。
10、DHCP服务:给主机动态分配置IP的范围,包括起始地址、结束地址及过期时间3个参数。
4.3、参数按照范围分类
1、设备参数,设备所用的全部参数,包括设备本身用的基本参数、进程参数、某些功能所用参数等。
2、进程参数,设备启动很多个进程,每个进程需要用到自己相关的参数,这些参数是从设备参数中生成到各个进程的配置文件里。
4.4、设备参数文件的格式及存放
设备参数文件格式为文本格式。
参数文件para和其备份文件para_back存放在flash的/dev/mtdblock3分区。系统初始化时在根文件系统的/usr目录下建立了para和para_back链接,分别指向/mnt/jffs2目录下的para和para_back文件。在参数初始化中直接访问/usr/para或/usr/para_back链接文件读取参数。
4.5、设备参数的读取及设置
参数进行初始化时读取/usr/para设备参数文件,如果参数文件丢失再读取参数备份文件/usr/para_back,以回车为分隔符按行读取,每行再以“=”为分隔符读取出参数名和参数值。
设备参数通过WEB页面设置,提交给后台进行验证,验证通过再设置到参数中,提交参数并返回给WEB页面成功提示,验证不通过直接返回错误提示给WEB页面。提交函数先打开参数文件/usr/para和参数备份文件/usr/para_back,把所有参数写入这两个文件中。
参数文件部分内容格式如下图所示:
4.1 参数配置文件内容图
4.6、设备参数的整体读取和整体设置
因所有参数都存在/etc/para文件中,所以只需拷贝或读取此文件可获取所有参数。
整体设置只需将所有的参数写入/etc/para文件,覆盖原有内容即可。
4.7、设备参数恢复出厂设置处理
路由器进入系统后读取restore_defaults参数的值,如果为1则从默认参数列表中读出默认值设置到参数中,非默认列表中的参数值不改变,否则按照原有的参数值初始化参数。实现方法有硬件恢复和软件恢复两种。
4.7.1、硬件恢复
使用路由器上“恢复出厂设置”按键,按下按键约4秒左右待指示灯亮起松开。应用程序中会每隔4秒钟使用GPIO读取PC0(连接“恢复出厂设置”按键)的IO状态,当状态为1(按键按下状态)时做恢复出厂设置的相关处理,把restore_defaults参数设为1,并点亮指示灯提示,然后关闭看门狗进程使系统重启,系统重启后开始恢复其出厂默认的设置。
4.7.2、软件恢复
点击WEB页面上的“恢复出厂设置”按钮,提交给后台处理,后台把恢复出厂默认值标志restore_defaults参数设为1,然后关闭看门狗进程使系统重启,系统重启后开始恢复其出厂默认的设置。
4.8、进程参数的保存格式和存放
进程使用的参数由主程序在参数初始化后将相关参数读出,写到该进程的参数配置文件中,并存放在系统的/etc目录下。写入文件的参数格式为参数名+空格+参数值+回车。
进程参数文件格式为*.conf文本文件。
例如:DTU相关进程参数内空格式如下图所示:
4.2 DTU参数配置文件内容图
4.9、进程参数的读取和设置
因进程编译到Buysobox中,可使用busybox中函数读取参数。例如:在应用程序中要读取/etc/telephone.conf中的tel_num0~4的5个参数,如以下步骤:
参数内容如下:
4.3 电话列表参数内容图
1、定义参数结构:
struct config_t {
u8_t *tel_num[5];
};
struct config_t telephone_config;
2、使用busybox里的结构config_keyword定义参数关键字:
static const struct config_keyword keywords[] = {
//keyword handler variable address default
{"tel_num0", read_str, &(telephone_config.tel_num[0]), ""},
{"tel_num1", read_str, &(telephone_config.tel_num[1]), ""},
{"tel_num2", read_str, &(telephone_config.tel_num[2]), ""},
{"tel_num3", read_str, &(telephone_config.tel_num[3]), ""},
{"tel_num4", read_str, &(telephone_config.tel_num[4]), ""},
};
enum { KWS_WITH_DEFAULTS = ARRAY_SIZE(keywords)};// - 6
int read_str()函数将参数转换为字符串。
3、将参数配置参数读取出来,处理过程如以下函数:
void dtu_read_config(const char *file,struct config_keyword *keywords,int size)
{
parser_t *parser;
const struct config_keyword *k;
unsigned i;
char *token[2];
int KWS_WITH_DEFAULTS= size;
for (i = 0; i < KWS_WITH_DEFAULTS; i++)
keywords[i].handler(keywords[i].def, keywords[i].var);
parser = config_open(file);
while (config_read(parser, token, 2, 2, "# \t", PARSE_NORMAL)) {
for (k = keywords, i = 0; i < size; k++, i++) {
if (!strcasecmp(token[0], k->keyword)) {
if (!k->handler(token[1], k->var)) {
bb_error_msg("can't parse line %u in %s",
parser->lineno, file);
k->handler(k->def, k->var);
}
break;
}
}
}
config_close(parser);
}
因进程参数是主程序从设备参数中生成,所以只需在WEB页面设置相关参数,保存后重启系统,即可重新将新的参数生成到配置文件中。