代码之家  ›  专栏  ›  技术社区  ›  Konrad Klimczak

无法从NodeMCU板连接到wi-fi网络

  •  2
  • Konrad Klimczak  · 技术社区  · 7 年前

    我正在尝试连接到NodeMCU板上的wifi网络。不确定这是硬件还是软件问题,但我在这个问题上找不到任何帮助。

    我正在尝试使用此代码连接到WiFi:

    wifi.setmode(wifi.STATION)
    
    station_cfg={};
    station_cfg.ssid="netia9000";
    station_cfg.pwd="mywifipassword";
    wifi.sta.config(station_cfg)
    wifi.sta.connect()
    status_of_wifi = wifi.sta.status()
    
    if status_of_wifi == wifi.STA_IDLE then print("IDLE") end;
    if status_of_wifi == wifi.STA_CONNECTING then print("CONNECTING") end;
    if status_of_wifi == wifi.STA_WRONGPWD then print("WRONG PS") end;
    if status_of_wifi == wifi.STA_APNOTFOUND then print("404") end;
    if status_of_wifi == wifi.STA_FAIL then print("500") end;
    if status_of_wifi == wifi.STA_GOTIP then print("IP GOT") end;
    
    print(wifi.sta.getip())
    

    但在控制台上,我可以看到以下内容:

    CONNECTING
    nil
    

    我试图输入错误的数据-一个不存在的WiFi SSID,一个错误的`密码,但不管怎样,我仍然得到相同的输出:“连接”和“无”。

    我使用此代码检查可用网络:

    wifi.setmode(wifi.STATION)
    
    -- print ap list
    function listap(t)
          for ssid,v in pairs(t) do
            authmode, rssi, bssid, channel = 
              string.match(v, "(%d),(-?%d+),(%x%x:%x%x:%x%x:%x%x:%x%x:%x%x),(%d+)")
            print(ssid,authmode,rssi,bssid,channel)
          end
    end
    
    wifi.sta.getap(listap)
    

    这一切都很好。我上了控制台:

    netia9000       3       -52         e8:11:23:43:bf:a2:8f        10
    -- other wi fi networks available nearby --
    

    所以看起来wifi模块很好,这是一个软件问题。我根据 the documentation . 现在我不知道出了什么问题。有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   BJ Black    7 年前

    wifi.sta.connect() 是不同步的,因此无法保证AP在您的时间之前完成连接。status()代码运行。事实上,医生们表示,除非另有规定,否则这应该是没有必要的。config()的自动值设置为false。

    但是,您可以向添加回调。config()如下所示:

    function showip(params)
        print("Connected to Wifi.  Got IP: " .. params.IP)
    end
    
    ...
    station_cfg.got_ip_cb = showip
    wifi.sta.config(station_cfg)
    

    请记住,wifi可以随时上下移动。如果您需要突袭connect(一次性或每次连接),那么您确实希望注册回调,而不是假设将有一个固定连接。

    回调将访问您的所有全局变量,因此您可以将软件状态存储在那里,只需确保您对可能出现的任何可能的竞争条件都没有问题(锁定/同步是另一个线程的讨论)。