Hi3861_WiFi IoT工程:WiFi自动连接

这些天在研究软总线组件,因为要连接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 模块去看一下:

hi_void app_main(hi_void)

{

#if defined(CONFIG_AT_COMMAND) || defined(CONFIG_FACTORY_TEST_MODE) //AT指令模块的初始化。如果初始化成功,则开始注册各类AT指令。

ret = hi_at_init(); // @//vendor/hisi/hi3861/hi3861/components/at/src/hi_at.c

if (ret == HI_ERR_SUCCESS) {

hi_at_sys_cmd_register(); // 同上 hi_at.c

}

#endif

}

hi_void hi_at_sys_cmd_register(hi_void)

{

//vendor/hisi/hi3861/hi3861/components/at/src/at_general.c

hi_at_general_cmd_register();

#ifndef CONFIG_FACTORY_TEST_MODE

//vendor/hisi/hi3861/hi3861/components/at/src/at_wifi.c

hi_at_sta_cmd_register();

hi_at_softap_cmd_register(); //同上 at_wifi.c

#endif

//vendor/hisi/hi3861/hi3861/components/at/src/at_hipriv.c

hi_at_hipriv_cmd_register();

#ifndef CONFIG_FACTORY_TEST_MODE

#ifdef LOSCFG_APP_MESH

hi_at_mesh_cmd_register(); //同上 at_wifi.c

#endif

//vendor/hisi/hi3861/hi3861/components/at/src/at_lowpower.c

hi_at_lowpower_cmd_register();

#endif

hi_at_general_factory_test_cmd_register(); //同上 at_general.c

hi_at_sta_factory_test_cmd_register(); //同上 at_wifi.c

hi_at_hipriv_factory_test_cmd_register(); //同上 at_hipriv.c

//vendor/hisi/hi3861/hi3861/components/at/src/at_io.c

hi_at_io_cmd_register();

}

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(),实现如下:

#include "hi_wifi_api.h"

#include "lwip/netifapi.h"

void WifiLink(void)

{

static BOOL fgWifiConnected = FALSE;

if(fgWifiConnected) //防止重复连接WiFi

return;

printf("[WifiLink] Begin: fgWifiConnected[F]\n");

//step 1: AT+STARTSTA

// #启动STA模式

char ifname[WIFI_IFNAME_MAX_SIZE] = {0}; //“wlan0”

int len = WIFI_IFNAME_MAX_SIZE;

if (HISI_OK != hi_wifi_sta_start(ifname, &len))

{

printf("[WifiLink] hi_wifi_sta_start fail\n");

return;

}

//step 2: AT+CONN="SSID", ,2,"PASSWORD"

//# 连接指定AP,其中SSID/PASSWORD为待连接的热点名称和密码

hi_wifi_assoc_request request = {0};

request.auth = HI_WIFI_SECURITY_WPA2PSK; //2

char* ssid = "SSID"; //Your SSID, HI_WIFI_MAX_SSID_LEN 32 Byte

char* pswd = "PASSWORD"; //Your PSWD, HI_WIFI_MAX_KEY_LEN 64 Byte

memcpy(request.ssid, ssid, strlen(ssid));

memcpy(request.key, pswd, strlen(pswd));

if (HISI_OK != hi_wifi_sta_connect(&request))

{

printf("[wifilink] hi_wifi_sta_connect fail\n");

return;

}

//step 3: AT+DHCP=wlan0,1

//# 通过DHCP向AP请求wlan0的IP地址

struct netif* p_netif = netifapi_netif_find(ifname);

if(NULL == p_netif)

{

printf("[WifiLink] netifapi_netif_find fail\n");

return;

}

#if 1 //DHCP 自动分配IP

if(HISI_OK != netifapi_dhcp_start(p_netif))

{

printf("[WifiLink] netifapi_dhcp_start fail\n");

return;

}

#else //设置固定 IP

ip4_addr_t gw;

ip4_addr_t ipaddr;

ip4_addr_t netmask;

IP4_ADDR(&gw, 192, 168, 1, 1);

IP4_ADDR(&ipaddr, 192, 168, 1, 200); //固定到这个 IP

IP4_ADDR(&netmask, 255, 255, 255, 0);

if (HISI_OK != netifapi_netif_set_addr(p_netif, &ipaddr, &netmask, &gw))

{

printf("[WifiLink] netifapi_netif_set_addr fail\n");

return;

}

if (HISI_OK != hi_wifi_start_connect())

{

printf("[WifiLink] hi_wifi_start_connect fail\n");

return;

}

#endif

fgWifiConnected = TRUE;

printf("[WifiLink] End. fgWifiConnected[T]\n");

return;

}

注意在 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。

鸿蒙系统不能自动连wifi,Hi3861_WiFi IoT工程:WiFi自动连接相关推荐

  1. 《嵌入式系统 – NUC980 IoT应用开发实战指南(基于RT-Thread系统)》第4章 NUC980 IoT 使用WiFi联网

    开发环境: IDE:RT-Thread Studio 开发板:NUC980 IoT WiFi:ESP8266 4.1 ESP8266简介 ESP8266 是乐鑫推出的 WIFI SOC,市场上可以找到 ...

  2. 鸿蒙系统会中毒吗,手机中毒会感染wifi吗

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 理论上是存在有这种可能性的,但是比较低,手机是ios或者andriod系统,wifi没系统也不能写入,wifi只有64m-256m ...

  3. 鸿蒙系统是噱头和谈判策略?华为梁华:是针对IoT的操作系统

    7月30日,华为公司今天下午举行2019年上半年业绩发布会,2019年上半年,华为实现销售收入4013亿元人民币,同比增23.2%.随后华为高管回答了现场记者提问. 华为董事长梁华在回答鸿蒙系统相关提 ...

  4. 华为梁华:鸿蒙系统不是谈判策略 是针对IoT的操作系统

    [TechWeb]7月30日,华为公司今天下午举行2019年上半年业绩发布会,2019年上半年,华为实现销售收入4013亿元人民币,同比增23.2%.随后华为高管回答了现场记者提问. 华为董事长梁华在 ...

  5. 华为鸿蒙系统做得怎么样了,华为鸿蒙正式发布:迈向万物互联,体验如何、升级名单这里都有!...

    2019年5月,华为被列入"黑名单",自那以后华为的发展和未来受到全国人民的关注.随着打压形势越发严峻,华为手机在海外市场无法预装谷歌GMS服务生态,2019年8月华为首次公布了自 ...

  6. 华为正式发布鸿蒙罗,华为正式发布鸿蒙系统,未来将适配全场景

    鸿蒙,中国神话传说的远古时代,传说在盘古昆仑山开天辟地之前,世界是一团混沌的元气,这种自然的元气叫做鸿蒙. 此前被传的沸沸扬扬的华为要自己做的系统就是以此命名,可见该系统承载期望有多大. 虽说此前早已 ...

  7. 鸿蒙系统推广时间,鸿蒙系统将全面推广,目标覆盖3亿台设备,第三方IoT可达1亿台...

    华为鸿蒙系统现在到底进展到哪一步了呢?今年2月份华为发布Mate X2折叠屏高端旗舰的时候,余承东明确表示鸿蒙手机系统将在4月份亮相,这4月份已经过完,他的承诺似乎没有实现! 事实上,已有部分华为用户 ...

  8. wifi连接一段时间才能上网_Win7系统下连接wifi一段时间就自动断线怎么办【图文】...

    使用笔记本电脑.手机.平板的人们越来越多,而想要让这些设备都能够方便上网,就需要用到Wifi无线网络,所以很多家庭都会安装无线路由器,但是无线网络的掉线问题一直是不好解决,特别是在Win7系统下,最近 ...

  9. 12-20210225华为海思Hi3518EV300在鸿蒙系统下测试WIFI(AP+STATION模式)

    12-20210225华为海思Hi3518EV300在鸿蒙系统下测试WIFI(AP+STATION模式) 2021/2/25 10:45 [HarmonyOS HiSpark_IPC_DIY开发套件] ...

最新文章

  1. 读农民工兄弟学C#文章后的感觉
  2. docker mysql容器 修改时区
  3. 13、logging模块
  4. python获取中文字体点阵坐标_Python实现点阵字体读取与转换的方法
  5. java实现poi导入excel_Java POI实现将导入Excel文件的示例代码
  6. 【POJ - 2337】Catenyms(欧拉图相关,欧拉通路输出路径,tricks)
  7. mongoDB 3.0以前版本 - 入门指南、示例
  8. android kl文件
  9. 奇异值分解SVD与在降维中的应用
  10. 【牛腩新闻发布系统】开始
  11. IDEA 格式化代码快捷键冲突解决
  12. 福师计算机应用基础离线作业一答案,20年秋福师《计算机应用基础》在线作业一【标准答案】...
  13. macOS Safari使用EasyConnect插件的坑
  14. Proguard混淆与Maven集成
  15. SLAM【十一】建图
  16. enumerate()函数详解
  17. SpringBoot发送QQ邮件图片显示不出来
  18. 2020 - 2021 年 Web 前端最新导航 - 前端学习资源分享前端面试资源汇总
  19. Android 应用界面设计
  20. 1031. 两个非重叠子数组的最大和-构造子数组和数组遍历数组

热门文章

  1. 三.数 据 链 路 层
  2. 蓝桥杯 算法提高 快乐司机
  3. 开源软件和开源社区的反思
  4. 温度换算(C/C++/Java)
  5. 动态代理 ---- 框架基础技术
  6. 闲人闲谈PS之三十二——业务工程预算和PS成本计划
  7. 金属射流、门罗效应和密室杀人
  8. Symantec Backup Exec Agent For Linux防火墙问题
  9. 均值滤波器类型_滤波电路的作用及四种基本类型
  10. Automatic Software Repair: a Bibliography 自动软件修复概览(三)