diff --git a/APP_Framework/Applications/app_test/test_webserver/README.md b/APP_Framework/Applications/app_test/test_webserver/README.md index e6b0358f3..3810d3181 100755 --- a/APP_Framework/Applications/app_test/test_webserver/README.md +++ b/APP_Framework/Applications/app_test/test_webserver/README.md @@ -1,101 +1,102 @@ -# 基于矽璓已实现的Lwip,在ARM基础上实现基本的Web服务 - -## 1. 简介 - -本赛题基于矽璓已实现的Lwip网络栈,在ARM上移植了Mongoose嵌入式Web服务框架,通过netdev功能进行终端的网络参数获取与配置,实现了通过外部网页对IP、Gate Way、子网掩码等网络参数的设置。 - -## 2. 数据结构设计说明 - -解决方案使用到了矽璓的netdev模块,并通过一个缓存结构保存从netdev处获得的网络参数,其中缓存结构如下所示: -```C -static struct netdev* p_netdev; - -static struct config { - char *ip, *mask, *gw, *dns; -} s_config; -``` - -Web服务基于Mongoose框架,使用事件驱动模型,事件响应函数实现如下: -```C -static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data) -{ - if (ev == MG_EV_OPEN && c->is_listening) { - strcpy(s_config.ip, inet_ntoa(p_netdev->ip_addr)); - strcpy(s_config.mask, inet_ntoa(p_netdev->netmask)); - strcpy(s_config.gw, inet_ntoa(p_netdev->gw)); - strcpy(s_config.dns, inet_ntoa(p_netdev->dns_servers[0])); - } else if (ev == MG_EV_HTTP_MSG) { - struct mg_http_message* hm = (struct mg_http_message*)ev_data; - if (mg_http_match_uri(hm, "/api/config/get")) { - mg_http_reply(c, 200, "Content-Type: application/json\r\n", - "{%m:%m,%m:%m,%m:%m,%m:%m}\n", - MG_ESC("ip"), MG_ESC(s_config.ip), - MG_ESC("mask"), MG_ESC(s_config.mask), - MG_ESC("gw"), MG_ESC(s_config.gw), - MG_ESC("dns"), MG_ESC(s_config.dns)); - } else if (mg_http_match_uri(hm, "/api/config/set")) { - struct mg_str json = hm->body; - update_config(json, "$.ip", (char**)&s_config.ip); - update_config(json, "$.mask", (char**)&s_config.mask); - update_config(json, "$.gw", (char**)&s_config.gw); - update_config(json, "$.dns", (char**)&s_config.dns); - mg_http_reply(c, 200, "", "ok\n"); - - ip_addr_t ipaddr, maskaddr, gwaddr; - inet_aton(s_config.ip, &ipaddr); - inet_aton(s_config.mask, &maskaddr); - inet_aton(s_config.gw, &gwaddr); - p_netdev->ops->set_addr_info(p_netdev, &ipaddr, &maskaddr, &gwaddr); - } else { - struct mg_http_serve_opts opts = { .root_dir = s_root_dir }; - mg_http_serve_dir(c, ev_data, &opts); - } - } - (void)fn_data; -} -``` - -## 3. 测试程序说明 - -1. 通过数据线将开发板连接到电脑,并通过网线将开发板连接到与电脑相同的局域子网中。 -2. 选择Menuconfig中的Lwip和SD Card选项而后编译,将编译得到的程度文件烧录到开发板中,程序中将测试程序注册为NetSettingDemo命令。 -3. 将对应的netsetting文件夹存放到插入开发板的SD卡中。 -4. 进入XiUOS,首先执行setip命令初始化开发板网络设置,通过ping命令确定开发板与电脑处于同一局域网中。通过ls命令确认开发板成功识别SD卡,并且其中存在netsetting文件夹。 -5. 执行NetSettingDemo命令,并在电脑中访问192.168.130.77:8000(其中192.168.130.77为setip默认的开发板IP地址)验证程序。 - - -## 4. 运行结果(##需结合运行测试截图按步骤说明##) - -1. 正确连接开发板: - - - -2. 选择Menuconfig中的Lwip和SD Card选项 - - - - -3. 编译成果如下,编译无误,在xiuos/Ubiquitous/XiZi_IIoT/build路径下得到编译成果XiZi-edu-arm32.elf和XiZi-edu-arm32.bin - - - - -4. 进入开发板内XiUOS界面,如图为其中的命令: - - - -5. 执行setip和NetSettingDemo: - - - -6. 在电脑上访问192.168.130.77:8000: - - - -7. 修改其中的IP,并在新IP中访问网页,此次将IP修改为192.168.130.80: - - - -8. 在访问过程中开发板上也会有对应打印,部分打印如下图所示。在IP被修改后原有的Socket连接将产生错误,网页与192.168.130.77的连接随之关闭。网页访问192.168.130.80后将重新建议正确连接。 - - +# 基于矽璓已实现的Lwip,在ARM基础上实现基本的Web服务 + +## 1. 简介 + +本赛题基于矽璓已实现的Lwip网络栈,在ARM上移植了Mongoose嵌入式Web服务框架,通过netdev功能进行终端的网络参数获取与配置,实现了通过外部网页对IP、Gate Way、子网掩码等网络参数的设置。 + +## 2. 数据结构设计说明 + +解决方案使用到了矽璓的netdev模块,并通过一个缓存结构保存从netdev处获得的网络参数,其中缓存结构如下所示: +```C +static struct netdev* p_netdev; + +static struct config { + char *ip, *mask, *gw, *dns; +} s_config; +``` + +Web服务基于Mongoose框架,使用事件驱动模型,事件响应函数实现如下: +```C +static void fn(struct mg_connection* c, int ev, void* ev_data, void* fn_data) +{ + if (ev == MG_EV_OPEN && c->is_listening) { + strcpy(s_config.ip, inet_ntoa(p_netdev->ip_addr)); + strcpy(s_config.mask, inet_ntoa(p_netdev->netmask)); + strcpy(s_config.gw, inet_ntoa(p_netdev->gw)); + strcpy(s_config.dns, inet_ntoa(p_netdev->dns_servers[0])); + } else if (ev == MG_EV_HTTP_MSG) { + struct mg_http_message* hm = (struct mg_http_message*)ev_data; + if (mg_http_match_uri(hm, "/api/config/get")) { + mg_http_reply(c, 200, "Content-Type: application/json\r\n", + "{%m:%m,%m:%m,%m:%m,%m:%m}\n", + MG_ESC("ip"), MG_ESC(s_config.ip), + MG_ESC("mask"), MG_ESC(s_config.mask), + MG_ESC("gw"), MG_ESC(s_config.gw), + MG_ESC("dns"), MG_ESC(s_config.dns)); + } else if (mg_http_match_uri(hm, "/api/config/set")) { + struct mg_str json = hm->body; + update_config(json, "$.ip", (char**)&s_config.ip); + update_config(json, "$.mask", (char**)&s_config.mask); + update_config(json, "$.gw", (char**)&s_config.gw); + update_config(json, "$.dns", (char**)&s_config.dns); + mg_http_reply(c, 200, "", "ok\n"); + + ip_addr_t ipaddr, maskaddr, gwaddr; + inet_aton(s_config.ip, &ipaddr); + inet_aton(s_config.mask, &maskaddr); + inet_aton(s_config.gw, &gwaddr); + p_netdev->ops->set_addr_info(p_netdev, &ipaddr, &maskaddr, &gwaddr); + } else { + struct mg_http_serve_opts opts = { .root_dir = s_root_dir }; + mg_http_serve_dir(c, ev_data, &opts); + } + } + (void)fn_data; +} +``` + +## 3. 测试程序说明 + +1. 通过数据线将开发板连接到电脑,并通过网线将开发板连接到与电脑相同的局域子网中。 +2. 选择Menuconfig中的Lwip和SD Card选项而后编译,将编译得到的程度文件烧录到开发板中,程序中将测试程序注册为NetSettingDemo命令。 +3. 将对应的netsetting文件夹存放到插入开发板的SD卡中。 +4. 进入XiUOS,首先执行setip命令初始化开发板网络设置,通过ping命令确定开发板与电脑处于同一局域网中。通过ls命令确认开发板成功识别SD卡,并且其中存在netsetting文件夹。 +5. 执行NetSettingDemo命令,并在电脑中访问192.168.130.77:8000(其中192.168.130.77为setip默认的开发板IP地址)验证程序。 + + +## 4. 运行结果(##需结合运行测试截图按步骤说明##) + +1. 正确连接开发板: + + + +2. 选择Menuconfig中的Lwip和SD Card选项 + + + + + +3. 编译成果如下,编译无误,在xiuos/Ubiquitous/XiZi_IIoT/build路径下得到编译成果XiZi-edu-arm32.elf和XiZi-edu-arm32.bin + + + + +4. 进入开发板内XiUOS界面,如图为其中的命令: + + + +5. 执行setip和NetSettingDemo: + + + +6. 在电脑上访问192.168.130.77:8000: + + + +7. 修改其中的IP,并在新IP中访问网页,此次将IP修改为192.168.130.80: + + + +8. 在访问过程中开发板上也会有对应打印,部分打印如下图所示。在IP被修改后原有的Socket连接将产生错误,网页与192.168.130.77的连接随之关闭。网页访问192.168.130.80后将重新建议正确连接。 + +