netdrv_wifi_multiple.lua 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. --[[
  2. @module netdrv_wifi_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连接外部网络,支持以太网lan模式为其他以太网设备提供接入,支持生成WiFi热点为WiFi终端设备提供接入;
  10. 直接使用Air8000开发板硬件测试即可;
  11. 本文件没有对外接口,直接在其他功能模块中require "netdrv_wifi_multiple"就可以加载运行;
  12. ]]
  13. dhcpsrv = require "dhcpsrv"
  14. dnsproxy = require "dnsproxy"
  15. local function wifi_eth_setup()
  16. log.info("ch390", "打开LDO供电")
  17. gpio.setup(140, 1, gpio.PULLUP) -- 打开ch390供电
  18. local result = spi.setup(1, -- spi_id
  19. nil, 0, -- CPHA
  20. 0, -- CPOL
  21. 8, -- 数据宽度
  22. 25600000 -- ,--频率
  23. )
  24. log.info("main", "open", result)
  25. if result ~= 0 then -- 返回值为0,表示打开成功
  26. log.info("main", "spi open error", result)
  27. return
  28. end
  29. -- 初始化指定netdrv设备,
  30. -- socket.LWIP_ETH 网络适配器编号
  31. -- netdrv.CH390外挂CH390
  32. -- SPI ID 1, 片选 GPIO12
  33. netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {
  34. spi = 1,
  35. cs = 12
  36. })
  37. -- 确保ch390初始化完成,否则会出现netdrv.ipv4设置失败的情况
  38. sys.wait(1000)
  39. -- 设置ip, 子网掩码,网关
  40. local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")
  41. log.info("LWIP_ETH", ipv4, mark, gw)
  42. -- 开启dhcp服务器
  43. dhcpsrv.create({
  44. adapter = socket.LWIP_ETH
  45. })
  46. -- 设置dns转发
  47. dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_STA)
  48. end
  49. local function wifi_sta_ap_setup()
  50. log.info("执行AP创建操作")
  51. wlan.createAP("test2", "HZ88888888")
  52. -- 设置ip, 子网掩码,网关
  53. local ipv4, mark, gw = netdrv.ipv4(socket.LWIP_AP, "192.168.5.1", "255.255.255.0", "0.0.0.0")
  54. log.info("LWIP_AP", ipv4, mark, gw)
  55. -- 详细的版本
  56. -- 创建一个dhcp服务器
  57. local dhcpsrv_opts = {
  58. adapter = socket.LWIP_AP, -- 监听哪个网卡, 必须填写
  59. mark = {255, 255, 255, 0}, -- 网络掩码, 默认 255.255.255.0
  60. gw = {192, 168, 5, 1}, -- 网关, 默认自动获取网卡IP,如果获取失败则使用 192.168.4.1
  61. ip_start = 100, -- ip起始地址, 默认100
  62. ip_end = 200, -- ip结束地址, 默认200
  63. ack_cb = function(ip, mac)
  64. log.info("ack_cb", "new client", ip, mac)
  65. end -- ack回调, 有客户端连接上来时触发, ip和mac地址会传进来
  66. }
  67. -- 开启dhcp服务器
  68. dhcpsrv.create(dhcpsrv_opts)
  69. -- 设置dns转发
  70. dnsproxy.setup(socket.LWIP_AP, socket.LWIP_STA)
  71. end
  72. local function netdrv_multiple_task_func()
  73. -- 设置wifi工作模式为STA+AP模式
  74. wlan.setMode(wlan.STATIONAP)
  75. -- 连接wifi
  76. wlan.connect("茶室-降功耗,找合宙!", "Air123456")
  77. -- 等待wifi_sta网络连接成功
  78. while not socket.adapter(socket.LWIP_STA) do
  79. -- 在此处阻塞等待wifi连接成功的消息"IP_READY"
  80. -- 或者等待1秒超时退出阻塞等待状态;
  81. -- 注意:此处的1000毫秒超时不要修改的更长;
  82. sys.waitUntil("IP_READY", 1000)
  83. end
  84. -- 开启wifi->以太网的多网融合
  85. wifi_eth_setup()
  86. -- 开启wifi sta->ap的多网融合
  87. wifi_sta_ap_setup()
  88. -- 设置wifi_sta为数据出口
  89. netdrv.napt(socket.LWIP_STA)
  90. end
  91. -- 启动一个task,task的处理函数为netdrv_multiple_task_func
  92. sys.taskInit(netdrv_multiple_task_func)