1、Mongoose简介
Mongoose是一个广受欢迎的嵌入式网络库,它为TCP、UDP、HTTP、WebSocket、MQTT等协议实现了基于事件驱动的非阻塞API,非常适合在资源受限的嵌入式系统中使用。以下是关于Mongoose的一些详细介绍:
1.1、核心特性:
事件驱动: Mongoose采用事件驱动模型,使得网络操作非阻塞,这对于实时系统来说至关重要,因为它可以在等待网络事件时执行其他任务。
轻量级: 整个Mongoose库主要由两个文件组成:mongoose.c和mongoose.h,使得集成和使用非常方便。
依赖少: Mongoose仅涉及纯粹的Socket编程,没有依赖任何第三方库,这降低了集成复杂度并减少了潜在的兼容性问题。
丰富的文档和示例: Mongoose提供了详细的文档和丰富的示例代码,帮助开发者快速上手和使用。
1.2、使用场景:
Web UI界面: 在设备上实现基于Web的用户界面。
RESTful API服务: 提供Web服务接口,进行数据的增删改查等操作。
遥测数据交换: 设备与服务器之间进行数据的远程交换。
产品远程控制: 通过网络对设备进行远程控制。
远程软件更新: 通过网络实现设备的远程固件更新。
远程监控: 实现对设备状态的远程监控。
2、器材准备、编程环境
NUCLEO-F429ZI开发板;
路由器一台;
网线一根;
编程环境为CubeIDE。
cubemx配置参考如下:
勾选ETH外设,接口选择RMII,其他选项保持默认
NUCLEO-F429ZI的ETH外设没有集成物理层的数据转换芯片,板载外部PHY模块为LAN8742。
取消ETH中断回调函数声明,这个回调函数后边需要自行声明并实现。
3、移植mongoose
https://github.com/cesanta/mongoose/tree/master
下载以上源码包,只需要使用以下两个源码文件
cubeide工程导入以上两个文件,并添加相应头文件路径
新建配置文件,用于配置mongoose的各项工作参数
4、软件实现
mongoose_config.h文件
#ifndef __MONGOOSE_CONFIG_H #define __MONGOOSE_CONFIG_H #defineMG_ARCH MG_ARCH_NEWLIB #defineMG_ENABLE_TCPIP 1 #defineMG_ENABLE_CUSTOM_MILLIS 1 #define MG_ENABLE_DRIVER_STM32F 1 #endif
main.c文件
/* USER CODE BEGIN 2 */ struct mg_mgr mgr; mg_mgr_init(&mgr); struct mg_tcpip_if mif = { .mac = {2, 0, 1, 2, 3, 4}, .driver = &mg_tcpip_driver_stm32f, }; mg_tcpip_init(&mgr, &mif); for (;;) mg_mgr_poll(&mgr, 100);//运行mongoose应用 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //HAL_Delay(500); //HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_7); } /* USER CODE END 3 */ }
别忘了添加mong头文件
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "mongoose.h" #include "mongoose_config.h" /* USER CODE END Includes */
5、测试结果
程序编译无误后烧录固件到开发板,将开发板网口连接到路由器。
同时观察串口输出的调试信息,稍等片刻可以看到mongoose应用从DHCP服务器获得的IP地址
由上图知IP地址为192.168.0.115,还有网关、MAC信息。
ping测试如下:
这个ping延迟很低,mongoose的以太网通信效率做得很不错。
至此mongoose库移植完成,该库的运行依赖于以太网通信接口,这个cubemx可以完全图形化配置和无代码驱动,也可以是基于WIFI通信接口、甚至USB通信接口来实现。mongoose库的初衷是帮助客户构建更轻量高效的嵌入式Web站应用。基于moogoose库,以下是一个小型web网站的应用示例: