硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1791|回复: 5
收起左侧

[NetX] NetX 网页服务器例程的补充

[复制链接]

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2024-6-8 18:49:07 | 显示全部楼层 |阅读模式
NetX 网页服务器例程的补充
在STM32的X-CUBE-AZRTOS Packs里可以找到NetXDuo搭建网页服务器的例程: "Nx_WebServer"。
下面这个官方博客也给出了详细的使用步骤。
我这里对于此例程做一些补充。

一、网页文件所在的磁盘
官方是通过脚本生成一个存有网页内容的文件系统镜像web_demo.bin(使用levelx混淆了的),然后把镜像文件烧录到内部flash里。随后在程序里通过lx_nor_driver直接挂载flash_disk。
其实如果自己的板子上有已经调通的filex disk, 如sd_disk,就不用这么麻烦了,直接把Web_Content里的网页文件拷贝到SD卡根目录后,关联和挂载sd_disk即可。例如我之前利用USBX+FileX+w25q实现了U盘功能,所以直接通过USB复制到w25q_disk里了(受限于spi读写w25q的速度,网页打开缓慢,之后做了优化)。
二、设置默认主页
例程里,需要输入IP+后缀,例如 http://192.168.1.x/about.html 或 /dashboard.html 等才能访问到页面。
仅输入了IP会显示文件未找到。
因为它是把后缀当作文件名来找的网页文件的。
我们可以在回调里手动处理仅输入IP时的情况:仅需将“/”替换成“index.html”或其他文件名即可。
如下图,在webserver_request_notify_callback里添加几步处理。
[C] 纯文本查看 复制代码
if (0 == strcmp(resource, "/"))
{
        // 若浏览器中仅输入了IP,则resource实际内容为/。将resource修改为主页文件名即可
        // resource指向NX_WEB_HTTP_SERVER的一个(NX_WEB_HTTP_MAX_RESOURCE+1)大小的数组,请注意不要过长导致越界
        sprintf(resource, "/index.html");
        return NX_SUCCESS;  // 提前中止
} 
注意因为不需要发送自定义响应,所以需要提前return中止。
image-20240608180134251.png
三、数据接口
在拜托前端的同学制作自己的网页时,需要给他们提供一个数据交互接口,可以自己拟定一个url。
让他们往接口里发送不同的请求,自己在回调函数里通过nx_web_http_server_content_get提取,最后解析并生成响应。
一般可以拟定json格式的协议。
[C] 纯文本查看 复制代码
if (strcmp(resource, "/my_data_if") == 0)
{
    data_if_buff[0] = '\0';    // clear

    // 提取网页发来的请求到 data_if_buff 
    nx_web_http_server_content_get(server_ptr, packet_ptr, 0, data_if_buff, 2048, &actual_size);

    // 解析并生成响应到rsp_data中
    status = json_request_handle(data_if_buff, rsp_data);
    if (0 != status)
        return NX_SUCCESS;  // 错误的请求
}
这个图仅为指明代码位置。
image-20240608181923060.png

四、拓展响应标头
如果有需要的话,可以添加拓展响应标头,如下给出了一个参考
[C] 纯文本查看 复制代码
static const CHAR http_header[] = "application/json;charset=utf-8;";
static const CHAR additional_header[] = 
    "Access-Control-Allow-Origin:*\r\n"
    "Access-Control-Allow-Headers:Content-Type, Authorization, Content-Length, X-Requested-With\r\n"
    "Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS\r\n";

UINT webserver_request_notify_callback(NX_WEB_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr)
{
    /*******省略其他代码*********/
    /* Now build a response header with server status is OK and no additional header info. */
    status = nx_web_http_server_callback_generate_response_header_extended(server_ptr, 
                                            &resp_packet_ptr, 
                                            NX_WEB_HTTP_STATUS_OK, sizeof(NX_WEB_HTTP_STATUS_OK)-1,
                                            strlen(rsp_data), 
                                            (CHAR*)http_header, strlen(http_header), 
                                            (CHAR*)additional_header, strlen(additional_header));
    /*******省略其他代码*********/
}




评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-6-9 01:11:39 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

13

主题

196

回帖

235

积分

高级会员

积分
235
发表于 2024-6-11 09:40:47 | 显示全部楼层
请问 rl-tcpnet 下基于cgi实现的webserver 怎么能快速转到 nex呢?谢谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-6-11 09:50:31 | 显示全部楼层
gallop020142 发表于 2024-6-11 09:40
请问 rl-tcpnet 下基于cgi实现的webserver 怎么能快速转到 nex呢?谢谢

得重新做,接口不一样。
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
 楼主| 发表于 2024-6-11 10:33:41 | 显示全部楼层
gallop020142 发表于 2024-6-11 09:40
请问 rl-tcpnet 下基于cgi实现的webserver 怎么能快速转到 nex呢?谢谢

不晓得,我没接触过rl-tcpnet
回复

使用道具 举报

13

主题

196

回帖

235

积分

高级会员

积分
235
发表于 2024-6-11 14:17:47 | 显示全部楼层
eric2013 发表于 2024-6-11 09:50
得重新做,接口不一样。

哦 谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 14:37 , Processed in 0.307649 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表