本文來(lái)源電子發(fā)燒友社區(qū),作者:ouxiaolong, 帖子地址:https://bbs.elecfans.com/jishu_2287628_1_1.html
開發(fā)環(huán)境:
開發(fā)環(huán)境:
開發(fā)系統(tǒng):Ubuntu 20.04
開發(fā)板:Pegasus物聯(lián)網(wǎng)開發(fā)板
MCU:Hi3861
OpenHarmony版本:3.0.1-LTS
HI3861默認(rèn)已經(jīng)初始化了WiFi,因此這里講解如何使用WiFi聯(lián)網(wǎng)。
串口終端上執(zhí)行相應(yīng)的AT命令,即可使Hi3861 WLAN模組聯(lián)網(wǎng),依次執(zhí)行如下AT命令,啟動(dòng)STA模式,連接指定路由器,并開啟DHCP功能配置IP地址。
AT+STARTSTA # 啟動(dòng)STA模式
AT+SCAN # 掃描周邊AP
AT+SCANRESULT # 顯示掃描結(jié)果
AT+CONN="SSID",,2,"PASSWORD" # 連接指定AP,其中SSID/PASSWORD為待連接的熱點(diǎn)名稱和密碼
AT+STASTAT # 查看連接結(jié)果
AT+DHCP=wlan0,1 # 通過(guò)DHCP向AP請(qǐng)求wlan0的IP地址
查看Hi3861 WLAN模組與網(wǎng)關(guān)聯(lián)通是否正常,如下所示。
AT+IFCFG # 查看模組接口IP
AT+PING=X.X.X.X # 檢查模組與網(wǎng)關(guān)的聯(lián)通性,其中X.X.X.X需替換為實(shí)際的網(wǎng)關(guān)地址
下面具體演示:



有上圖可知Hi3861 WLAN模組聯(lián)網(wǎng)成功。
當(dāng)然也可在同一個(gè)局域網(wǎng)中ping HI3861。

說(shuō)明網(wǎng)絡(luò)是連通的。
關(guān)于Wifi聯(lián)網(wǎng)的AT命令有很多,所有的AT指令都是通過(guò)函數(shù)hi_at_sys_cmd_register()函數(shù)注冊(cè)的,其中調(diào)用了hi_at_register_cmd()函數(shù)注冊(cè)AT。
重點(diǎn)介紹三個(gè)函數(shù)。
1.啟動(dòng)WiFi STA模式, AT+STARTSTA
hi_u32 cmd_sta_start_adv(hi_s32argc, const hi_char *argv[])
{
hi_s32 ret;
hi_wifi_bw bw = HI_WIFI_BW_LEGACY_20M;
return HI_ERR_FAILURE;
}
ret = (hi_s32)sta_start_adv_param(argc,argv, &bw);
if (ret != HI_ERR_SUCCESS) {
return HI_ERR_FAILURE;
}
#ifndef CONFIG_FACTORY_TEST_MODE
hi_char ifname[WIFI_IFNAME_MAX_SIZE + 1] ={0};
hi_s32 len = sizeof(ifname);
ret = hi_wifi_sta_start(ifname, &len);
if (ret != HISI_OK) {
return HI_ERR_FAILURE;
}
#endif
ret =hi_wifi_set_bandwidth(DEFAULT_IFNAME_STA, strlen(DEFAULT_IFNAME_STA) + 1, bw);
if (ret != HI_ERR_SUCCESS) {
#ifndef CONFIG_FACTORY_TEST_MODE
hi_wifi_sta_stop();
#endif
return HI_ERR_FAILURE;
}
hi_at_printf("OKrn");
return HI_ERR_SUCCESS;
}
該函數(shù)的核心就是hi_wifi_sta_start()函數(shù)。
2.連接WiFi ,AT+CONN
/*****************************************************************************
* Func description: stationconnect network
* example:AT+CONN="hisilicon",,3,"123456789"
*****************************************************************************/
hi_u32 cmd_sta_connect(hi_s32argc, const hi_char *argv[])
{
hi_wifi_assoc_request assoc_req = {0};
if ((argc < 3) || (argc > 4)) { /* argc 3/4 */
return HI_ERR_FAILURE;
}
/* get ssid */
if ((argv[0] != HI_NULL) &&(cmd_sta_connect_get_ssid(argv, &assoc_req, HI_NULL, 0) != HI_ERR_SUCCESS)){
return HI_ERR_FAILURE;
}
/* get bssid */
if (argv[1] == HI_NULL) {
memset_s(assoc_req.bssid,sizeof(assoc_req.bssid), 0, sizeof(assoc_req.bssid));
} else if (strlen(argv[1]) ==HI_WIFI_TXT_ADDR_LEN) {
if (cmd_strtoaddr(argv[1],assoc_req.bssid, HI_WIFI_MAC_LEN) != HISI_OK) {
return HI_ERR_FAILURE;
}
} else {
return HI_ERR_FAILURE;
}
/* get auth_type */
if ((integer_check(argv[2]) !=HI_ERR_SUCCESS) || (atoi(argv[2]) < HI_WIFI_SECURITY_OPEN) ||? ? /* argc 2 */
(atoi(argv[2]) == HI_WIFI_SECURITY_WPA)|| (atoi(argv[2]) == HI_WIFI_SECURITY_WPA2) || /* argc 2 */
(atoi(argv[2]) ==HI_WIFI_SECURITY_WPAPSK) || (atoi(argv[2]) >= HI_WIFI_SECURITY_UNKNOWN) ||/* argc 2 */
((atoi(argv[2]) ==HI_WIFI_SECURITY_OPEN) && (argc != 3)) || /* argc 2/3/4 */
((atoi(argv[2]) !=HI_WIFI_SECURITY_OPEN) && (argc != 4))) { /* argc 2/3/4 */
return HI_ERR_FAILURE;
}
assoc_req.auth = (hi_wifi_auth_mode)atoi(argv[2]);/* 2 */
assoc_req.pairwise =HI_WIFI_PARIWISE_UNKNOWN;
/* get key */
if (argc == 4) { /* argc 4 */
const hi_char *buf = argv[3]; /* argc 3 */
if (buf == HI_NULL) {
return HI_ERR_FAILURE;
}
size_t len = strlen(argv[3]); /* 3:key*/
if ((atoi(argv[2]) ==HI_WIFI_SECURITY_WEP) && (len != 9) && (len != 17) &&/* argc 2, len 9/17 */
(len != 12) && (len !=28)){ /* 12 28: password len */
return HI_ERR_FAILURE;
} else if ((atoi(argv[2]) !=HI_WIFI_SECURITY_WEP) && ((len > HI_WIFI_AP_KEY_LEN_MAX + 2) || /* argc 2 */
(len < HI_WIFI_AP_KEY_LEN_MIN +2))) {??/* len plus 2 */
return HI_ERR_FAILURE;
}
if ((*buf != '"') || (*(buf +strlen(argv[3]) - 1) != '"') || /* argc 3 */
(memcpy_s(assoc_req.key,HI_WIFI_MAX_KEY_LEN + 1, buf + 1, strlen(argv[3]) - 2) != EOK)) { /* 3 2 */
return HI_ERR_FAILURE;
}
}
if (hi_wifi_sta_connect(&assoc_req) !=HISI_OK) {
return HI_ERR_FAILURE;
}
hi_at_printf("OKrn");
return HI_ERR_SUCCESS;
}
該函數(shù)主要用于解析AT+CONN指令,核心是hi_wifi_sta_connect()函數(shù)。
3.獲取IP地址, AT+DHCP
hi_u32 at_setup_dhcp(hi_s32argc, const hi_char **argv)
{
hi_s32 ret = 0;
if (at_param_null_check(argc, argv) ==HI_ERR_FAILURE) {
return HI_ERR_FAILURE;
}
if (argc != 2) { /* at+dhcp cmd length equl2 */
return HI_ERR_FAILURE;
}
#ifndef CONFIG_FACTORY_TEST_MODE
struct netif *netif_p = netifapi_netif_find(argv[0]);
if (netif_p == NULL) {
return HI_ERR_FAILURE;
}
if (strcmp(argv[1], "1") == 0) {
ret = netifapi_dhcp_start(netif_p);
} else if (strcmp(argv[1], "0")== 0) {
ret = netifapi_dhcp_stop(netif_p);
} else if (strcmp(argv[1], "2")== 0) {
ret = netifapi_netif_common(netif_p,dhcp_clients_info_show, NULL);
} else {
return HI_ERR_FAILURE;
}
#endif
if (ret == LOS_OK) {
hi_at_printf("OKrn");
}
return ret;
}
其中netifapi_netif_find()函數(shù)通過(guò)DHCP向AP請(qǐng)求wlan0的IP地址,然后就調(diào)用netifapi_dhcp_start()函數(shù)獲取IP。
使用AT比較麻煩,接下來(lái)筆者將通過(guò)程序來(lái)聯(lián)網(wǎng)。
編程自動(dòng)聯(lián)網(wǎng),其本質(zhì)和使用AT指令一樣,最終都是調(diào)用了相同的API,只是通過(guò)加載應(yīng)用的方式去實(shí)現(xiàn)了,聯(lián)網(wǎng)流程和使用AP一樣的,編寫應(yīng)用的方式參看上一章內(nèi)容,本文將在wifi-iot目錄下新建應(yīng)用,這樣可以簡(jiǎn)化步驟。
1.新建目錄
在./applications/sample/wifi-iot/app路徑下新建一個(gè)目錄,用于存放WiFi應(yīng)用的源碼文件。
在app下新增業(yè)務(wù)wifi_connect,其中wifi_app.c為應(yīng)用代碼,BUILD.gn為編譯腳本,目錄結(jié)構(gòu)如下:

2.編寫應(yīng)用代碼
新建./applications/sample/wifi-iot/app/wifi_app下的wifi_app.c文件,在wifi_app.c中新建映月宮入口函數(shù)wifi_task,并實(shí)現(xiàn)業(yè)務(wù)邏輯。并在代碼最下方,使用OpenHarmony啟動(dòng)模塊接口SYS_RUN()啟動(dòng)業(yè)務(wù)。
從上一節(jié)內(nèi)容得到,連接WiFi核心就三個(gè):?jiǎn)?dòng)STA模式,連接WiFi,設(shè)置IP。
因此,最終的wifi_app.c的函數(shù)代碼如下:
/**
******************************************************************************
*@file wifi_app.c
*@author BruceOu
*@version V1.0
* @date 2022-06-18
*@blog https://blog.bruceou.cn/
******************************************************************************
*/
#include
#include
#include "ohos_init.h"
#include "cmsis_os2.h"
#include
#include"hi_wifi_api.h"
#include"lwip/ip_addr.h"
#include "lwip/netifapi.h"
#define SSID "media"
#define PASSWORD"12345678"
static struct netif*g_lwip_netif = NULL;
/**
* @briefSet netif's ip, gatewayand netmask
*@parampst_lwip_netif
* @retval None
*/
void hi_sta_set_addr(structnetif *pst_lwip_netif)
{
ip4_addr_t st_gw;
ip4_addr_t st_ipaddr;
ip4_addr_t st_netmask;
if (pst_lwip_netif == NULL)
{
printf("hisi_reset_addr::Nullparam of netdevrn");
return;
}
IP4_ADDR(&st_gw, 192, 168, 101, 1);
IP4_ADDR(&st_ipaddr, 192, 168, 101,100);
IP4_ADDR(&st_netmask, 255, 255, 255,0);
netifapi_netif_set_addr(pst_lwip_netif,&st_ipaddr, &st_netmask, &st_gw);
}
/**
* @briefWifi connect
* @paramNone
* @retval None
*/
int hi_wifi_start_connect(void)
{
int ret;
errno_t rc;
hi_wifi_assoc_request assoc_req = {0};
// Copy SSID to assoc_req
rc = memcpy_s(assoc_req.ssid,HI_WIFI_MAX_SSID_LEN + 1, SSID, strlen(PASSWORD));
if (rc != EOK)
{
printf("[Wifi Connnect]hi_wifi_sta_connect fail");
printf("%s %d rn",__FILE__, __LINE__);
return -1;
}
//Set encryption method
assoc_req.auth = HI_WIFI_SECURITY_WPA2PSK;
// Wifi password
memcpy(assoc_req.key, PASSWORD,strlen(PASSWORD));
ret = hi_wifi_sta_connect(&assoc_req);
if (ret != HISI_OK)
{
printf("[WifiConnnect] hi_wifi_sta_connect fail");
printf("%s %d rn",__FILE__, __LINE__);
return -1;
}
return0;
}
/**
* @briefwifi task
* @paramNone
* @retval None
*/
void wifi_task(void)
{
int ret;
char ifname[WIFI_IFNAME_MAX_SIZE + 1] ={0};
int len = sizeof(ifname);
unsigned intnum = WIFI_SCAN_AP_LIMIT;
//Step 1: Start STA mode, AT+STARTSTA
ret = hi_wifi_sta_start(ifname, &len);
if (ret != HISI_OK)
{
printf("[Wifi Connnect]hi_wifi_sta_start fail");
printf("%s %d rn",__FILE__, __LINE__);
return;
}
// Step 2: Connect to the specified AP:,AT+CONN="SSID", ,2,"PASSWORD"
ret = hi_wifi_start_connect();
if (ret != 0)
{
printf("[Wifi Connnect]hi_wifi_start_connect fail");
printf("%s %d rn",__FILE__, __LINE__);
return ;
}
// Step 3: DHCP requests the IP address ofwlan0 from the AP, AT+DHCP=wlan0,1
g_lwip_netif = netifapi_netif_find(ifname);
if(NULL == g_lwip_netif)
{
printf("[Wifi Connnect]netifapi_netif_find fail");
printf("%s %d rn",__FILE__, __LINE__);
return;
}
//DHCP automatically assigns IP
if(ret !=netifapi_dhcp_start(g_lwip_netif))
{
printf("[Wifi Connnect]netifapi_dhcp_start fail");
return;
}
printf("[Wifi Connnect] Connect towifi successfullyn");
}
SYS_RUN(wifi_task);
3.新建編譯組織文件
新建./applications/sample/wifi-iot/app/wifi_connect/BUILD.gn文件,內(nèi)容如下所示:
static_library(wifiapp") {
sources = [
"wifi_app.c"
include_dirs = [
"http://utils/native/lite/include"
}
static_library中指定業(yè)務(wù)模塊的編譯結(jié)果,為靜態(tài)庫(kù)文件libwifiapp.a,開發(fā)者根據(jù)實(shí)際情況完成填寫。
sources中指定靜態(tài)庫(kù).a所依賴的.c文件及其路徑,若路徑中包含"http://"則表示絕對(duì)路徑(此處為代碼根路徑),若不包含"http://"則表示相對(duì)路徑。
include_dirs中指定source所需要依賴的.h文件路徑。
最后,編譯下載固件,我們就可以自動(dòng)連接Wifi了。

接下來(lái)ping下網(wǎng)絡(luò):

說(shuō)明自動(dòng)連接網(wǎng)絡(luò)成功。
官網(wǎng)手冊(cè):
https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-ide-lite-steps-hi3861-netconfig.md
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
wi-fi
+關(guān)注
關(guān)注
15文章
2399瀏覽量
129126 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2151瀏覽量
35847 -
HiSpark
+關(guān)注
關(guān)注
1文章
156瀏覽量
7713
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
Wi-Fi:無(wú)線連接的全球通用語(yǔ)
一、什么是Wi-Fi?Wi-Fi是Wi-Fi聯(lián)盟制造商的商標(biāo)認(rèn)證,是基于IEEE 802.11標(biāo)準(zhǔn)的無(wú)線局域網(wǎng)技術(shù)。它允許電子設(shè)備在特定范圍內(nèi)無(wú)線接入網(wǎng)絡(luò),實(shí)現(xiàn)高速數(shù)據(jù)交換與互聯(lián)網(wǎng)訪問(wèn)
發(fā)表于 01-07 09:49
Nordic發(fā)布nRF7002 EBII 開發(fā)板, 支持Wi-Fi 6, 解鎖nRF54L新玩法
穩(wěn)定的連接。板載 nRF7002 協(xié)同 IC 兼容 Wi-Fi 6 標(biāo)準(zhǔn),同時(shí)向下兼容 802.11a/b/g/n/ac Wi-Fi 標(biāo)準(zhǔn)。它支持 STA 和 SoftAP 兩種工作模式
發(fā)表于 12-10 11:58
Wi-Fi模塊選型指南 | 低功耗藍(lán)牙/Wi-Fi 6模塊推薦 | 物聯(lián)網(wǎng)設(shè)備集成攻略
物聯(lián)網(wǎng)的快速發(fā)展,Wi-Fi技術(shù)的成熟的情況下,越來(lái)越多的場(chǎng)景需要用到Wi-Fi來(lái)無(wú)線傳輸數(shù)據(jù),尤其是移動(dòng)設(shè)備中,怎么再設(shè)備中選擇合適的Wi-Fi模塊呢?下面我們來(lái)介紹下
淺談Wi-Fi 6E與Wi-Fi 7的關(guān)鍵器件——BAW濾波器新技術(shù)
,美國(guó)聯(lián)邦通信委員會(huì)(FCC)投票通過(guò)將6GHz頻譜劃為免許可頻段供Wi-Fi使用,這標(biāo)志著Wi-Fi正式進(jìn)入“三頻”時(shí)代——除Wi-Fi 6及前代技術(shù)使用的2.4GHz和5GHz頻段
發(fā)表于 09-19 18:29
?1537次閱讀
基于 SSID 的 Wi-Fi 定位:與其他定位服務(wù)的性能比較
隨著 nRF7000 Wi-Fi 協(xié)同 IC 的推出,我們現(xiàn)在可以提供具有 Wi-Fi、蜂窩物聯(lián)網(wǎng)和 GNSS 功能的完整硅到云定位解決方案。nRF7000 針對(duì) Wi-Fi 網(wǎng)絡(luò)掃描
發(fā)表于 08-31 21:01
Texas Instruments CC335x SimpleLink?雙頻Wi-Fi? 6配套IC數(shù)據(jù)手冊(cè)
) 和Wi-Fi 5 (802.11ac)。這些CC335x是Texas Instruments的第10代連接組合芯片。因此,CC335x基于成熟的技術(shù)設(shè)計(jì)而成。這些器件非常適合配備運(yùn)行TCP/IP的Linux或
有沒有什么修復(fù)方法可以確保 AP 模式下的 Wi-Fi 和 BLE 連接同時(shí)正常工作?
我正在使用 CYBSYSKIT DEV 01 套件。我嘗試在 AP 模式下打開 Wi-Fi 并宣傳 BLE。我可以宣傳 SoftAP 和 BLE。但是,我無(wú)法從中央設(shè)備連接到 BLE。它可以立即連接并斷開連接。有沒有什么修復(fù)方法
發(fā)表于 07-17 06:13
[CYW4373] BT device_id正常,Wi-Fi device_id失敗的原因?
這是 Liam,在 WPG(IFX、KR disty)擔(dān)任 FAE。我們的客戶對(duì) CYW4373 BT/Wi-Fi 檢測(cè)問(wèn)題有疑問(wèn)。
1)問(wèn)題
我們客戶的系統(tǒng)通過(guò) USB 集線器連接
發(fā)表于 06-05 06:07
國(guó)產(chǎn)Wi-Fi 6新一代通信技術(shù)的推廣,WIFI模塊行業(yè)將迎來(lái)更多發(fā)展機(jī)遇.
聯(lián)網(wǎng)設(shè)備對(duì)高速、低延遲連接的需求。隨著技術(shù)的不斷進(jìn)步,WIFI 6模塊的功能和性能也在不斷提升,如低功耗、高集成度、高安全性等特性的研發(fā)和應(yīng)用,進(jìn)一步加快了WIFI模塊更新迭代。 希微科技 是國(guó)內(nèi)高性能
基于 Wi-Fi 的定位服務(wù)
以下捕獲使用 location_wifi_get 函數(shù)請(qǐng)求 Wi-Fi 定位服務(wù)。該事件的總功耗為 125.85mC,日志顯示精確度為 30.0m。
Got location:
method
發(fā)表于 04-17 15:16
Wi-Fi 定位服務(wù)流程
變化。
Cellular: Location 示例中最初的 location_wifi_get() 函數(shù)可用于請(qǐng)求 Wi-Fi 定位服務(wù)。啟用附加日志配置有助于了解請(qǐng)求過(guò)程。
Add
發(fā)表于 04-17 15:09
nRF Cloud Wi-Fi 定位服務(wù)
Wi-Fi 定位目的。結(jié)合我們的 nRF9160 蜂窩物聯(lián)網(wǎng)模組和 nRF Cloud服務(wù),nRF7000 可通過(guò)嗅探本地 Wi-Fi 接入點(diǎn)的 SSID 實(shí)現(xiàn)基于 Wi-Fi 的定
發(fā)表于 04-17 15:07
Wi-Fi 定位服務(wù)
Wi-Fi 是一種著名的無(wú)線網(wǎng)絡(luò)技術(shù),用于設(shè)備的局域網(wǎng)和互聯(lián)網(wǎng)接入。Wi-Fi 通過(guò) Wi-Fi 網(wǎng)絡(luò)為家庭、辦公室和學(xué)校等環(huán)境提供便捷的無(wú)線互聯(lián)
發(fā)表于 04-17 15:01
推出了期待已久的 nRF7002 低功耗Wi-Fi 6
系統(tǒng)級(jí)芯片(SoC)以及nRF91?系列蜂窩物聯(lián)網(wǎng)系統(tǒng)級(jí)封裝(SiP)一起使用。nRF7002 還可以與非Nordic主機(jī)設(shè)備結(jié)合使用。
nRF7002是我們獨(dú)特的Wi-Fi產(chǎn)品組合中的第一款設(shè)備,它將
發(fā)表于 03-26 11:00
【HarmonyOS HiSpark Wi-Fi IoT 套件試用連載】第5章 WiFi聯(lián)網(wǎng)(STA模式)
評(píng)論