Files
TAIXIN/project/network.c

227 lines
10 KiB
C
Raw Permalink Normal View History

/**
* @file network.c
* @brief DHCP
*
* TXW82x FPV SDK
* - LwIP TCP/IP
* - WiFi /
* - DHCP AP IP
* - DHCP
*/
/* ========================= 头文件包含 ========================= */
/* 系统配置与平台基础头文件 */
#include "sys_config.h" // 系统总体配置宏定义(外设使能、功能开关等)
#include "basic_include.h" // 基础类型和宏定义uint8 等)
#include "hal/adc.h" // ADC 硬件抽象层(可能用于电源监测等)
#include "lib/rpc/cpurpc.h" // CPU 间 RPC 通信库(多核通信)
#include "lib/atcmd/libatcmd.h" // AT 指令解析库
#include "lib/common/atcmd.h" // AT 指令公共定义
#include "lib/umac/ieee80211.h" // IEEE 802.11 协议定义WiFi 上层 MAC
#include "lib/lmac/lmac.h" // 低层 MAC 驱动WiFi 下层 MAC
#include "lib/bluetooth/uble/ble_demo.h" // BLE 蓝牙低功耗演示接口
/* LwIP 协议栈相关头文件 */
#include "lwip/err.h" // LwIP 错误码定义
#include "lwip/sockets.h" // LwIP POSIX socket 兼容层
#include "lwip/netdb.h" // LwIP 网络主机数据库DNS 解析等)
#include "lwip/sys.h" // LwIP 系统抽象层OS 适配)
#include "lwip/ip_addr.h" // LwIP IP 地址操作工具
#include "lwip/tcpip.h" // LwIP TCP/IP 核心初始化接口
#include "netif/ethernetif.h" // 以太网网络接口适配层
/* 自定义网络工具与服务 */
#include "lib/net/dhcpd/dhcpd.h" // DHCP 服务器实现
#include "lib/net/utils.h" // 网络通用工具函数
#include "lib/net/skmonitor/skmonitor.h" // Socket 监控器(检测 socket 状态/异常)
#include "syscfg.h" // 用户可配置参数结构体sys_cfgs
#include "app/user_app.h" // 用户应用层接口sys_status 等)
/* ========================= 函数实现 ========================= */
/**
* @brief LwIP
*
* devid IP DHCP
* LwIP 使 IP
*
* @param devid ID HG_WIFI0_DEVIDWiFi HG_GMAC_DEVID
* @param name "w0"WiFi"e0"
* @param dhcpc DHCP 1 = 0 = 使 IP
* @param setip 使 IP 1 = 使0 = 使0.0.0.0
*
* @note __init
* RAM
*/
__init static void sys_network_add_netif(uint8 devid, char *name, uint8 dhcpc, uint8 setip)
{
/* 定义 IP 地址、子网掩码、默认网关三个地址变量 */
ip_addr_t ipaddr, netmask, gw;
/* 根据 devid 从设备管理器中获取对应的 netdev 结构体指针 */
struct netdev *ndev = (struct netdev *)dev_get(devid);
if (ndev) {
/* 从全局配置 sys_cfgs 中读取预设的静态 IP 地址参数 */
ipaddr.addr = sys_cfgs.ipaddr; // 本机 IP 地址
netmask.addr = sys_cfgs.netmask; // 子网掩码
gw.addr = sys_cfgs.gw_ip; // 默认网关地址
/* 打印接口名称和配置的 IP/掩码/网关信息,方便调试 */
os_printf(KERN_INFO"netif %s setttings: "IPSTR"/"IPSTR"/"IPSTR"!\r\n", name, IP2STR_N(ipaddr.addr), IP2STR_N(netmask.addr), IP2STR_N(gw.addr));
/**
* LwIP
* - setip=1 IP//使
* - setip=0 NULL 0.0.0.0
* DHCP
*/
lwip_netif_add(ndev, name, (setip ? &ipaddr : NULL), (setip ? &netmask : NULL), (setip ? &gw : NULL));
if (dhcpc) {
/* 标记 DHCP 客户端尚未完成,供 sys_dhcpc_check() 使用 */
sys_status.dhcpc_done = 0; // 0 表示 DHCP 还未获取到地址
/* 启动该接口的 DHCP 客户端,向 DHCP 服务器请求 IP 地址 */
lwip_netif_set_dhcp(ndev, 1); // 参数 1 表示开启 DHCP
/* 打印日志提示 DHCP 客户端已启动 */
os_printf(KERN_INFO"netif %s start dhcp client!\r\n", name);
}
} else {
/* 设备 ID 无效或对应设备未注册,打印错误信息 */
os_printf(KERN_ERR"No Netdev: %d\r\n", devid);
}
}
/**
* @brief
*
*
* 1. LwIP TCP/IP
* 2. socket
* 3. WiFi (w0) DHCP
* 4. (GMAC) 使 (e0)
* 5. DHCP DHCP 退
*
* @note main.c __init
*/
__init void sys_network_init(void)
{
/* 初始化 LwIP TCP/IP 协议栈核心,传入 NULL 表示不使用回调通知 */
tcpip_init(NULL, NULL);
/* 初始化 socket 监控器,用于检测和管理 socket 连接状态 */
sock_monitor_init();
/* 注册 WiFi 接口 "w0",根据 sys_cfgs.dhcpc_en 决定是否启用 DHCP 客户端,
setip=1 IP 退 */
sys_network_add_netif(HG_WIFI0_DEVID, "w0", sys_cfgs.dhcpc_en, 1);
/* 将 "w0" 设为 LwIP 的默认网络接口(用于路由选择) */
lwip_netif_set_default2("w0");
#if GMAC_EN // 如果以太网 GMAC 功能在编译配置中启用
/* 定义 6 字节数组用于存储 MAC 地址 */
uint8_t mac[6];
/* 从 eFuse 中读取并计算 MAC 地址(每个芯片有唯一值) */
sysctrl_efuse_mac_addr_calc(mac);
/**
* MAC 1
* - bit0 = 1 locally administered
* - bit1 = 1 使 WiFi MAC
*/
mac[5] |= 3;
/* 为以太网设备设置修改后的 MAC 地址 */
netdev_set_macaddr((struct netdev *)dev_get(HG_GMAC_DEVID), mac);
/* 注册以太网接口 "e0"DHCP 设置与 WiFi 接口一致 */
sys_network_add_netif(HG_GMAC_DEVID, "e0", sys_cfgs.dhcpc_en, 1);
/**
* "e0" "w0"
* 线 WiFi
* 使
*/
lwip_netif_set_default2("e0");
#endif
/**
* DHCP IP
* DHCP sys_status IP
*/
sys_status.dhcpc_result.ipaddr = sys_cfgs.ipaddr; // 默认 IP = 静态配置
sys_status.dhcpc_result.netmask = sys_cfgs.netmask; // 默认掩码 = 静态配置
sys_status.dhcpc_result.router = sys_cfgs.gw_ip; // 默认网关 = 静态配置
}
/**
* @brief DHCP
*
* WiFi AP DHCP
* IP
*
* @note dhcpd_en=1 wifi_mode=AP
* "w0"WiFi
*/
//启动DHCP服务器 // Start DHCP server中文启动 DHCP 服务器)
void sys_dhcpd_start()
{
/* DHCP 服务器参数结构体 */
struct dhcpd_param param;
/* 仅在 DHCP 服务器已启用 且 WiFi 工作在 AP 模式时才执行 */
if (sys_cfgs.dhcpd_en && sys_cfgs.wifi_mode == WIFI_MODE_AP) {
/* 清零参数结构体,确保所有字段有确定的初始值 */
os_memset(&param, 0, sizeof(param));
/* 从全局配置中逐一读取 DHCP 服务器参数 */
param.start_ip = sys_cfgs.dhcpd_startip; // DHCP 分配的起始 IP 地址
param.end_ip = sys_cfgs.dhcpd_endip; // DHCP 分配的结束 IP 地址
param.netmask = sys_cfgs.netmask; // 子网掩码
param.lease_time = sys_cfgs.dhcpd_lease_time; // IP 租约时间(秒)
param.dns1 = sys_cfgs.dhcpd_dns1; // 主 DNS 服务器地址
param.dns2 = sys_cfgs.dhcpd_dns2; // 备用 DNS 服务器地址
param.router = sys_cfgs.dhcpd_router; // 下发給客户端的默认网关地址
/* 在 "w0"WiFi AP接口上启动 DHCP 服务器,失败则打印错误 */
if (dhcpd_start("w0", &param)) {
os_printf("dhcpd start error\r\n"); // DHCP 服务器启动失败
}
}
}
/**
* @brief DHCP
*
*
* DHCP IP 7
* 7 DHCP
* DHCP
*
* @note 使 static __loop
*/
void sys_dhcpc_check(void)
{
/* 静态计数器,记录连续检查到 DHCP 未完成的次数 */
static uint8 __loop;
/* 仅在 DHCP 客户端已启用 且 尚未成功获取 IP 时进入检查逻辑 */
if (sys_cfgs.dhcpc_en && !sys_status.dhcpc_done) {
if (__loop++ > 6) {
/**
* 6 DHCP DHCP
* "w0" DHCP
*/
lwip_netif_set_dhcp2("w0", 1); // 重新触发 DHCP 发现流程
/* 重置计数器,开始下一轮超时检测 */
__loop = 0;
}
}
}