netdrv_eth_multiple.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. --[[
  2. @module netdrv_eth_multiple
  3. @summary 多网卡(4G网卡、WIFI STA网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块
  4. @version 1.0
  5. @date 2025.10.20
  6. @author 魏健强
  7. @usage
  8. 本文件为多网卡驱动模块 ,核心业务逻辑为:
  9. 1、以太网连接外部网络,生成WiFi热点为WiFi终端设备提供接入 ;
  10. 直接使用Air8000开发板硬件测试即可;
  11. 本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_multiple"就可以加载运行;
  12. ]]
  13. dhcpsrv = require "dhcpsrv"
  14. dnsproxy = require "dnsproxy"
  15. local static_ip = false
  16. local function netdrv_multiple_task_func()
  17. -- 配置SPI外接以太网芯片CH390H的单网卡,exnetif.set_priority_order使用的网卡编号为socket.LWIP_ETH
  18. -- 本demo使用Air8000开发板测试,开发板上的硬件配置为:
  19. -- GPIO140为CH390H以太网芯片的供电使能控制引脚
  20. -- 使用spi1,片选引脚使用GPIO12
  21. -- 如果使用的硬件不是Air8000开发板,根据自己的硬件配置修改以下参数
  22. log.info("ch390", "打开LDO供电")
  23. gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
  24. local result = spi.setup(1, -- spi_id
  25. nil, 0, -- CPHA
  26. 0, -- CPOL
  27. 8, -- 数据宽度
  28. 25600000 -- ,--频率
  29. -- spi.MSB,--高低位顺序 可选,默认高位在前
  30. -- spi.master,--主模式 可选,默认主
  31. -- spi.full--全双工 可选,默认全双工
  32. )
  33. log.info("main", "open", result)
  34. if result ~= 0 then -- 返回值为0,表示打开成功
  35. log.info("main", "spi open error", result)
  36. return
  37. end
  38. -- 初始化指定netdrv设备,
  39. -- socket.LWIP_ETH 网络适配器编号
  40. -- netdrv.CH390外挂CH390
  41. -- SPI ID 1, 片选 GPIO12
  42. netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {
  43. spi = 1,
  44. cs = 12
  45. })
  46. sys.wait(1000) -- 等待以太网模块初始化完成,去掉会导致以太网初始化失败
  47. if static_ip then
  48. -- 手动静态ip配置
  49. log.info("静态ip", netdrv.ipv4(socket.LWIP_ETH, "192.168.4.100", "255.255.255.0", "192.168.4.1"))
  50. else
  51. -- 使用dhcp动态获取ip地址
  52. netdrv.dhcp(socket.LWIP_ETH, true)
  53. end
  54. -- 等待eth_wan网络连接成功
  55. while not socket.adapter(socket.LWIP_ETH) do
  56. -- 在此处阻塞等待wifi连接成功的消息"IP_READY"
  57. -- 或者等待1秒超时退出阻塞等待状态;
  58. -- 注意:此处的1000毫秒超时不要修改的更长;
  59. sys.waitUntil("IP_READY", 1000)
  60. end
  61. -- eth_wan -> wifi_ap
  62. log.info("执行AP创建操作")
  63. -- 开启wifi_ap热点
  64. wlan.createAP("test2", "HZ88888888")
  65. -- 设置ip, 子网掩码,网关
  66. local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_AP, "192.168.5.1", "255.255.255.0", "192.168.5.1")
  67. log.info("LWIP_AP", ipv4, mark, gw)
  68. while netdrv.ready(socket.LWIP_AP) ~= true do
  69. sys.wait(100)
  70. end
  71. -- 设置dns转发
  72. dnsproxy.setup(socket.LWIP_AP, socket.LWIP_ETH)
  73. -- 详细的版本
  74. -- 创建一个dhcp服务器
  75. local dhcpsrv_opts = {
  76. adapter = socket.LWIP_AP, -- 监听哪个网卡, 必须填写
  77. mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
  78. gw = {192, 168, 5, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
  79. ip_start = 100, -- ip起始地址, 默认100
  80. ip_end = 200, -- ip结束地址, 默认200
  81. ack_cb = function(ip, mac)
  82. log.info("ack_cb", "new client", ip, mac)
  83. end -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
  84. }
  85. dhcpsrv.create(dhcpsrv_opts)
  86. -- 设置以太网为数据出口
  87. netdrv.napt(socket.LWIP_ETH)
  88. end
  89. -- 启动一个task,task的处理函数为netdrv_multiple_task_func
  90. sys.taskInit(netdrv_multiple_task_func)