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