当前位置: 首页 > 科技观察

OpenHarmony轻量级系统开发WiFiSTA模式连接热点

时间:2023-03-12 13:08:25 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com摘要:本文简单介绍Hi3861WiFi的操作,如何连接热点,查看IP,ping服务器等适用人群:适用于润和Hi3861开发板所有代码库:https://gitee.com/qidiyun/hihope-3861-smart-home-kit9.1AT指令操作WiFi我们可以通过AT指令操作Hi3861WiFi,连接热点,ping服务器等,但是很多时候需要开机自动连接某个热点,和AT命令是不够的。Hi3861为我们提供了WiFi操作的相关API,方便我们编写代码,实现热点连接。9.2代码实现先直接上传代码和运行演示。和我们最早的helloworld代码一样,我们在app下新增了一个业务demo_wifi_sta,其中demo_wifi_sta.c为业务代码,BUILD.gn为编译脚本。具体规划目录结构如下:BUILD.gn文件内容如下:","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/peripheral/interfaces/kits","//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/communication/wifi_lite/wifiservice","//device/soc/hisilicon/hi3861v100/hi3861_adapter/kal","//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/lwip_sack/include",]}hi_wifi_start_sta功能:设置WiFi参数,扫描热点inthi_wifi_start_sta(void){intret;charifname[WIFI_IFNAME_MAX_SIZE+1]={0};intlen=sizeof(ifname);constunsignedcharwifi_vap_res_num=APP_INIT_VAP_NUM;constunsignedcharwifi_user_res_num=APP_INIT_USR_NUM;无符号整数=WIFI_SCAN_AP_LIMIT;//这里不用重复wifiinit,因为系统会做wifiinit#if0printf("_______>>>>>>>>%s%d\r\n",__FILE__,__LINE__);ret=hi_wifi_init(wifi_vap_res_num,wifi_user_res_num);if(ret!=HISI_OK){返回-1;}#endifret=hi_wifi_sta_start(ifname,&len);if(ret!=HISI_OK){返回-1;}/*注册回调函数以接收wifi事件等扫描结果事件,*连接事件,断开连接事件。*/ret=hi_wifi_register_event_callback(wifi_wpa_event_cb);if(ret!=HISI_OK){printf("注册wifi事件回调失败\n");}/*为IP操作获取netif*/g_lwip_netif=netifapi_netif_find(ifname);if(g_lwip_netif==NULL){printf("%s:getnetiffailed\n",__FUNCTION__);返回-1;}/*开始扫描附件的WiFi热点*/ret=hi_wifi_sta_scan();if(ret!=HISI_OK){返回-1;}睡眠(5);/*sleep5s,等待扫描结果。*/hi_wifi_ap_info*pst_results=malloc(sizeof(hi_wifi_ap_info)*WIFI_SCAN_AP_LIMIT);如果(pst_results==NULL){返回-1;}//存储扫描的热点结果ret=hi_wifi_sta_scan_results(pst_results,&num);如果(ret!=HISI_OK){免费(pst_results);返回-1;}//打印所有扫描到的热点for(unsignedintloop=0;(loopevent){caseHI_WIFI_EVT_SCAN_DONE:printf("WiFi:扫描结果可用\n");break;caseHI_WIFI_EVT_CONNECTED:printf("WiFi:Connected\n");netifapi_dhcp_start(g_lwip_netif);break;caseHI_WIFI_EVT_DISCONNECTED:printf("WiFi:Disconnected\n");netifapi_dhcp_stop(g_lwip_netif);hi_sta_reset_addr(g_lwip_netif);break;caseHI_WIFI_EVT_WPS_TIMEOUT:printf("WiFi:wpsistimeout\n");hi_sta_reset_addr:重置sta地址,网关和其他参数/*清除netif的ip、网关和网络掩码*/voidhi_sta_reset_addr(structnetif*pst_lwip_netif){ip4_addr_tst_gw;ip4_addr_tst_ipaddr;ip4_addr_tst_netmask;如果(pst_lwip_netif==NULL){printf(“hisi_resetn”);返回;}IP4_ADDR(&st_gw,0,0,0,0);IP4_ADDR(&st_ipaddr,0,0,0,0);IP4_ADDR(&st_netmask,0,0,0,0);netifapi_netif_set_addr(pst_lwip_netif,&st_ipaddr,&st_netmask,&st_gw);}9.3WiFi相关的APIHi3861提供了很多wifi相关的API,主文件是hi_wifi_api.h我们这里只列出最重要的API(1)打开STAinthi_wifi_sta_start(char*ifname,int*len);(2)停止STAinthi_wifi_sta_stop(void);(3)扫描附件热点inthi_wifi_sta_scan(void);(4)连接热点inthi_wifi_sta_connect(hi_wifi_assoc_request*req);其中hi_wifi_assoc_request*req结构定义如下:typedefstruct{charssid[HI_WIFI_MAX_SSID_LEN+1];/**<网络标识符。CNcomment:SSID只支持ASCII字符。CNend*/hi_wifi_auth_modeauth;/**<认证模式。CNcomment:authenticationtype.CNend*/charkey[HI_WIFI_MAX_KEY_LEN+1];/**<密钥。CNcomment:secretkey.CNend*/unsignedcharbssid[HI_WIFI_MAC_LEN];/**