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会显示文件未找到。 因为它是把后缀当作文件名来找的网页文件的。 我们可以在回调里手动处理仅输入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中止。 三、数据接口在拜托前端的同学制作自己的网页时,需要给他们提供一个数据交互接口,可以自己拟定一个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; // 错误的请求
} 这个图仅为指明代码位置。
四、拓展响应标头如果有需要的话,可以添加拓展响应标头,如下给出了一个参考 [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));
/*******省略其他代码*********/
}
|