[文章]Niobe开发板WiFi-STA联网演示

阅读量0
0
0

Niobe
开发板WiFi-STA联网演示
本案例程序将演示怎么在拓维Niobe WiFiIoT Core开发板上编写一个连接Wifi热点的业务程序,实现开发板联网效果。
  
WifiAPI分析
本案例主要使用了以下几个API完成Wifi联网
  1. RegisterWifiEvent()
  2. WifiErrorCode RegisterWifiEvent (WifiEvent * event)
复制代码

描述: 为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数
参数:
        
名字
         
描述
     
      
event
      表示要注册回调的事件.
   
  1. UnRegisterWifiEvent()
  2. WifiErrorCode UnRegisterWifiEvent (WifiEvent * event)
复制代码

描述: 为指定的Wi-Fi事件取消已经注册的回调函数。
参数:
        
名字
         
描述
     
      
event
      表示已经注册的回调的事件.
   
  1. EnableWifi()
  2. WifiErrorCode EnableWifi (void )
复制代码

描述:
启用STA模式
  1. DisableWifi()
  2. WifiErrorCode DisableWifi (void )
复制代码

描述:
禁用STA模式
  1. AddDeviceConfig()
  2. WifiErrorCode AddDeviceConfig (const WifiDeviceConfig * config, int * result )
复制代码

描述:
添加用于配置连接到热点信息,此函数生成一个networkId
参数:
        
名字
         
描述
     
      
config
      表示要连接的热点信息.
   
     result
      表示生成的networkId。每个networkId匹配一个热点配置
   
  1. ConnectTo()
  2. WifiErrorCode ConnectTo (int networkId)
复制代码

描述:
连接到指定networkId的热点
参数:
        
名字
         
描述
     
      
networkId
      表示与目标热点匹配的网络id.
   
  1. Disconnect()
复制代码
描述:
断开已连接到的热点
  1. netifapi_netif_find()
  2. struct netif *netifapi_netif_find(const char *name);
复制代码

描述:
获取netif用于IP操作
  1. netifapi_dhcp_start()
  2. err_t netifapi_dhcp_start(struct netif *netif);
复制代码

描述:
启动DHCP, 获取IP
  1. dhcp_clients_info_show()
  2. void dhcp_clients_info_show(struct netif *netif_p);
复制代码

描述:
格式化DHCP信息到控制台
  1. netifapi_netif_common()
  2. err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc);
复制代码

描述:
此函数主要是保证voidfuncerrtfunc在安全线程中执行。
软件设计
主要代码分析
完成Wifi热点的连接需要以下几步
1.    通过 RegisterWifiEvent 接口向系统注册扫描状态监听函数,用于接收扫描状态通知,如扫描动作是否完成等。 OnWifiConnectionChanged 用于绑定连接状态监听函数,该回调函数有两个参数 state info state表示扫描状态,取值为011表示热点连接成功; info表示Wi-Fi连接信息,包含以下参数;
        
名字
         
描述
     
      
ssid [WIFI_MAX_SSID_LEN]
      连接的热点名称.
   
     bssid  [WIFI_MAC_LEN]
      MAC地址.
   
     rssi
      接收信号强度(RSSI).
   
     connState
      Wifi连接状态.
   
     disconnectedReason
      Wi-Fi断开的原因.
   
     ipAddress
      连接的特点IP地址
   2.    调用 EnableWifi 接口,启动 Wifi STA模式。
3.    调用 AddDeviceConfig 接口,配置连接的热点信息。
4.    调用 ConnectTo 接口,连接到指定networkId的热点。
5.    while循环等待,该过程中会有几秒钟的时间去轮询WiFi连接成功标志位 g_wifiState,当g_wifiState 1 时退出等待。
6.    调用 netifapi_netif_find 接口,获取 netif 用于 IP 操作。
7.    调用 netifapi_dhcp_start 接口,启动 DHCP, 获取 IP
8.    调用 netifapi_netif_common接口,打印HDCP信息。
9.    如果DHCP IP获取失败,断开WiFi连接,重新启动。
  1. static void IotWifiConnectTask(void *arg)
  2. {
  3.     (void)arg;

  4.     WifiErrorCode errCode;

  5.     WifiEvent eventListener = {
  6.         .OnWifiConnectionChanged = OnWifiConnectionChanged,
  7.         .OnWifiScanStateChanged = OnWifiScanStateChanged};

  8.     WifiDeviceConfig apConfig = {
  9.         .ssid = DEFAILT_WIFI_SSID,
  10.         .preSharedKey = DEFAILT_WIFI_PASSWORD,
  11.         .securityType = WIFI_SEC_TYPE_PSK};

  12.     Delay(10);

  13.     errCode = RegisterWifiEvent(&eventListener);
  14.     printf("RegisterWifiEvent errCode: %drn", errCode);

  15.     while (1)
  16.     {
  17.         int networkId = -1;
  18.         //启动WiFi STA模式
  19.         errCode = EnableWifi();
  20.         printf("EnableWifi errCode: %drn", errCode);
  21.         Delay(100);

  22.         errCode = AddDeviceConfig(&apConfig, &networkId);
  23.         printf("AddDeviceConfig errCode: %drn", errCode);

  24.         g_wifiState = 0;
  25.         errCode = ConnectTo(networkId);
  26.         printf("ConnectTo(%d) errCode: %drn", networkId, errCode);

  27.         while (!g_wifiState)
  28.         {
  29.             Delay(10);
  30.         }
  31.         printf("g_wifiState: %drn", g_wifiState);
  32.         Delay(3000);

  33.         // 联网业务开始
  34.         // 这里是网络业务代码...
  35.         struct netif *iface = netifapi_netif_find("wlan0");
  36.         if (iface)
  37.         {
  38.             err_t ret = netifapi_dhcp_start(iface);
  39.             printf("netifapi_dhcp_start: %drn", ret);

  40.             Delay(2000); // 等待DHCP服务分配IP地址

  41.             ret = netifapi_netif_common(iface, dhcp_clients_info_show, NULL);
  42.             printf("netifapi_netif_common: %drn", ret);

  43.             g_wifiState = WIFI_STATE_AVALIABLE;

  44.             break;    //联网成功,退出循环
  45.         }
  46.         else
  47.         {
  48.             // 联网业务结束,断开和AP的连接
  49.             Disconnect();
  50.             RemoveDevice(networkId);

  51.             //关闭WiFi STA模式
  52.             errCode = DisableWifi();
  53.             printf("DisableWifi errCode: %drn", errCode);
  54.             Delay(500);
  55.         }
  56.     }

  57.     errCode = UnRegisterWifiEvent(&eventListener);
  58.     printf("UnRegisterWifiEvent errCode: %drn", errCode);
  59. }
复制代码

编译调试
修改对接热点的账号密码
修改wifi_connect_demo.h20行和21行的WiFi热点SSID和密码,改成自己环境中的WiFi热点。
  1. //此处是默认测试WiFi连接热点,具体使用时,请修改WiFi的ssid和password
  2. #define DEFAILT_WIFI_SSID "DESKTOP-TALKWEB"
  3. #define DEFAILT_WIFI_PASSWORD "ai123456789"
复制代码

修改 BUILD.gn 文件
修改 applications/app/BUILD.gn 路径中的 BUILD.gn 文件,指定 network_wifista_example 参与编译。
  1. # "TW208_Module_ds1307:module_ds1307_example",
  2. # "TW209_Module_gps:module_gps_example",
  3. "TW301_Network_wifista:network_wifista_example",
  4. # "TW302_Network_wifiap:network_wifiap_example",
  5. # "TW303_Network_mqttclient:network_mqttclient_example",
  6. # "TW304_Network_httpclient:network_httpclient_example",
  7. # "TW305_Network_ntpclient:network_ntpclient_example",
复制代码
运行结果
示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,会打印连接到的Wifi热点信息。
  1. entry wifi connect demo.

  2. RegisterWifiEvent errCode: 0

  3. EnableWifi errCode: 0

  4. AddDeviceConfig errCode: 0

  5. ConnectTo(1) errCode: 0

  6. No crash dump found!

  7. +NOTICE:SCANFINISH
  8. +NOTICE:CONNECTED
  9. OnWifiConnectionChanged 50, state = 1

  10. info: bssid: BA:81:98:01:A9:A5, rssi: 0, connState: 0, reason: 0, ssid: DESKTOP-TALKWEB

  11. g_wifiState: 1

  12. netifapi_dhcp_start: 0

  13. server :
  14.         server_id : 192.168.137.1
  15.         mask : 255.255.255.0, 1
  16.         gw : 192.168.137.1
  17.         T0 : 604800
  18.         T1 : 302400
  19.         T2 : 453600
  20. clients <1> :
  21.         mac_idx mac             addr            state   lease   tries   rto     
  22.         0       20579e6185a4    192.168.137.176 10      0       1       2      
  23. netifapi_netif_common: 0

  24. UnRegisterWifiEvent errCode: 0
复制代码


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友