[文章]Hi3861_WiFi IoT工程:WiFi自动连接

阅读量0
0
1
文章转载自:liangkz

这些天在研究软总线组件,因为要连接WiFi进行调试,如果按照官方文档的如下步骤进行操作,肯定不合适:

在社区上找到连志安老师的《Hi3861 WiFi操作,热点连接》以及网友double__整理的《Hi3861 WiFi连接》,参考代码可以运行和连接WiFi,但个人感觉仍稍显复杂/繁杂,于是我自己就研究了一下。

首先,上面官方的步骤,我们可以简化为:
step 1: AT+STARTSTA                                         # 启动STA模式

step 2: AT+CONN="SSID", ,2,"PASSWORD"   # 连接指定AP,其中SSID/PASSWORD为待连接的热点名称和密码

step 3: AT+DHCP=wlan0,1                                # 通过DHCP向AP请求wlan0的IP地址

中间的其他步骤,完全可以省略。

我们到 at 模块去看一下:
  1. hi_void app_main(hi_void)
  2. {
  3. #if defined(CONFIG_AT_COMMAND) || defined(CONFIG_FACTORY_TEST_MODE)     //AT指令模块的初始化。如果初始化成功,则开始注册各类AT指令。
  4.     ret = hi_at_init();       // @//vendor/hisi/hi3861/hi3861/components/at/src/hi_at.c
  5.     if (ret == HI_ERR_SUCCESS) {
  6.         hi_at_sys_cmd_register();      // 同上 hi_at.c
  7.     }
  8. #endif
  9. }
复制代码
  1. hi_void hi_at_sys_cmd_register(hi_void)
  2. {
  3.     //vendor/hisi/hi3861/hi3861/components/at/src/at_general.c
  4.     hi_at_general_cmd_register();
  5.         
  6. #ifndef CONFIG_FACTORY_TEST_MODE
  7.     //vendor/hisi/hi3861/hi3861/components/at/src/at_wifi.c
  8.     hi_at_sta_cmd_register();
  9.     hi_at_softap_cmd_register();  //同上 at_wifi.c
  10. #endif
  11.     //vendor/hisi/hi3861/hi3861/components/at/src/at_hipriv.c
  12.     hi_at_hipriv_cmd_register();

  13. #ifndef CONFIG_FACTORY_TEST_MODE
  14. #ifdef LOSCFG_APP_MESH
  15.     hi_at_mesh_cmd_register();     //同上 at_wifi.c
  16. #endif
  17.     //vendor/hisi/hi3861/hi3861/components/at/src/at_lowpower.c
  18.     hi_at_lowpower_cmd_register();
  19. #endif

  20.     hi_at_general_factory_test_cmd_register();      //同上 at_general.c
  21.     hi_at_sta_factory_test_cmd_register();          //同上 at_wifi.c
  22.     hi_at_hipriv_factory_test_cmd_register();       //同上 at_hipriv.c
  23.     //vendor/hisi/hi3861/hi3861/components/at/src/at_io.c
  24.     hi_at_io_cmd_register();
  25. }
复制代码


hi_at_sys_cmd_register() 注册了Hi3861工程所支持的所有 AT 指令,详情请各位可以自己去查阅代码,我们只看上面三条指令:
step 1: AT+STARTSTA:位于 at_wifi.c,调用 hi_wifi_sta_start(ifname, &len) 实现功能
{"+STARTSTA", 9, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_start_adv, (at_call_back_func)cmd_sta_start}

step 2: AT+CONN="SSID", ,2,"PASSWORD"      位于 at_wifi.c ,调用 hi_wifi_sta_connect(&assoc_req) 实现功能
{"+CONN", 5, HI_NULL, HI_NULL, (at_call_back_func)cmd_sta_connect, HI_NULL}

step 3: AT+DHCP=wlan0,1  位于 at_general.c,调用 netifapi_netif_find(argv[0]) 和 netifapi_dhcp_start(netif_p) 实现功能
{"+DHCP", 5, HI_NULL, HI_NULL, (at_call_back_func)at_setup_dhcp, HI_NULL}

把上面三步封装到 API: WifiLink(),实现如下:
  1. #include "hi_wifi_api.h"
  2. #include "lwip/netifapi.h"

  3. void WifiLink(void)  
  4. {
  5.     static BOOL fgWifiConnected = FALSE;
  6.                         
  7.     if(fgWifiConnected)   //防止重复连接WiFi
  8.         return;

  9.     printf("[WifiLink] Begin: fgWifiConnected[F]
  10. ");
  11.         
  12.     //step 1: AT+STARTSTA   
  13.     // #启动STA模式
  14.     char ifname[WIFI_IFNAME_MAX_SIZE] = {0};  //“wlan0”
  15.     int len = WIFI_IFNAME_MAX_SIZE;        

  16.     if (HISI_OK != hi_wifi_sta_start(ifname, &len))
  17.     {
  18.         printf("[WifiLink] hi_wifi_sta_start fail
  19. ");
  20.         return;
  21.     }

  22.     //step 2: AT+CONN="SSID", ,2,"PASSWORD"
  23.     //# 连接指定AP,其中SSID/PASSWORD为待连接的热点名称和密码
  24.     hi_wifi_assoc_request request = {0};
  25.     request.auth = HI_WIFI_SECURITY_WPA2PSK; //2

  26.     char* ssid = "SSID";          //Your SSID, HI_WIFI_MAX_SSID_LEN 32 Byte
  27.     char* pswd = "PASSWORD";      //Your PSWD, HI_WIFI_MAX_KEY_LEN  64 Byte

  28.     memcpy(request.ssid, ssid, strlen(ssid));
  29.     memcpy(request.key, pswd, strlen(pswd));
  30.    
  31.     if (HISI_OK != hi_wifi_sta_connect(&request))
  32.     {
  33.         printf("[wifilink] hi_wifi_sta_connect fail
  34. ");
  35.         return;
  36.     }

  37.     //step 3: AT+DHCP=wlan0,1  
  38.     //# 通过DHCP向AP请求wlan0的IP地址
  39.     struct netif* p_netif = netifapi_netif_find(ifname);
  40.     if(NULL == p_netif)
  41.     {
  42.         printf("[WifiLink] netifapi_netif_find fail
  43. ");
  44.         return;
  45.     }        
  46.         
  47. #if 1  //DHCP 自动分配IP
  48.     if(HISI_OK != netifapi_dhcp_start(p_netif))
  49.     {
  50.         printf("[WifiLink] netifapi_dhcp_start fail
  51. ");
  52.         return;
  53.     }        
  54. #else  //设置固定 IP
  55.     ip4_addr_t gw;
  56.     ip4_addr_t ipaddr;
  57.     ip4_addr_t netmask;
  58.     IP4_ADDR(&gw,      192, 168,  1, 1);
  59.     IP4_ADDR(&ipaddr,  192, 168,  1, 200);   //固定到这个 IP
  60.     IP4_ADDR(&netmask, 255, 255, 255, 0);

  61.     if (HISI_OK != netifapi_netif_set_addr(p_netif, &ipaddr, &netmask, &gw))
  62.     {
  63.         printf("[WifiLink] netifapi_netif_set_addr fail
  64. ");
  65.         return;
  66.     }

  67.     if (HISI_OK != hi_wifi_start_connect())
  68.     {
  69.         printf("[WifiLink] hi_wifi_start_connect fail
  70. ");
  71.         return;
  72.     }
  73. #endif
  74.         
  75.     fgWifiConnected = TRUE;
  76.     printf("[WifiLink] End.   fgWifiConnected[T]
  77. ");

  78.     return;
  79. }
复制代码

注意在 BUILD.gn 的include_dirs要添加:

"//vendor/hisi/hi3861/hi3861/include",
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include",

上面这个函数你可以把它做成 SYS_RUN(WifiLink), 也可以放到你的代码中合适的地方去调用,就可以实现WiFi的自动连接了。

我本地log:

[WifiLink] Begin: fgWifiConnected[F]
[WifiLink] End.   fgWifiConnected[T]
+NOTICE:SCANFINISH
+NOTICE:CONNECTED

然后可以通过AT+STASTAT、AT+IFCFG、AT+PING=www.baidu.com等指令去确认连接状态,完全OK。

回帖

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