鸿蒙之WiFi联网

Posted 跋扈洋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了鸿蒙之WiFi联网相关的知识,希望对你有一定的参考价值。

介绍

Station模式

从理论上来说,任何一个WiFi设备都可以称位STA。STA是支持IEEE802.11协议的设备。

在大多数情况下,当大家说到STA模式时,一般是指具有WiFi client行为的设备,可以连接到接入点。

STA会扫描可连接的接入点,选择一个想要连接的接入点,经过认证、关联等步骤后,将与接入点进行连接。

WiFi连接过程介绍

WiFi扫描有两种不同的方式,一种是主动扫描,另一种是被动扫描。

  1. 主动扫描。由WiFi client 在每个信道上发送探测请求帧,接入点收到探测请求之后,返回探测响应。主动扫描需要指定一定的条件。例如:
    SSID,根据指定的AP SSID扫描。
    频段,根据特定的频带扫描,单位是MHz。
    频带,根据特定的频带扫描。
    如果没有指定任何参数,那么会认为这是一个被动扫描请求。

  2. 被动扫描。被动扫描即WiFi Client在每个信道上监听接入点发出的Beacon Frame。

具体设计

  1. 扫描WiFi接入点
    WifiErrorCode Scan(void)
    该函数触发WiFi接入点的扫描。若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。

  2. 初始化wifi

static void WiFiInit(void)

printf("<--Wifi Init-->\\r\\n");
g_wifiEventHandler.OnWifiScanStateChanged = OnWifiScanStateChangedHandler;
g_wifiEventHandler.OnWifiConnectionChanged = OnWifiConnectionChangedHandler;
g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
error = RegisterWifiEvent(&g_wifiEventHandler);
if (error != WIFI_SUCCESS)

printf("register wifi event fail!\\r\\n");

else

printf("register wifi event succeed!\\r\\n");

  1. 使能WIFI
if (EnableWifi() != WIFI_SUCCESS)

printf("EnableWifi failed, error = %d\\n", error);
return -1;
  1. 判断WIFI是否激活
if (IsWifiActive() == 0)

printf("Wifi station is not actived.\\n");
return -1;
  1. 分配空间,保存WiFi信息
info = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT);
if (info == NULL)

return -1;


  1. 轮询查找WiFi列表
do
//重置标志位
ssid_count = 0;
g_staScanSuccess = 0;

//开始扫描
Scan();

//等待扫描结果
WaitSacnResult();

//获取扫描列表
error = GetScanInfoList(info, &size);

while(g_staScanSuccess != 1);
  1. 打印WiFi列表
printf("********************\\r\\n");
for(uint8_t i = 0; i < ssid_count; i++)

printf("no:%03d, ssid:%-30s, rssi:%5d\\r\\n", i+1, info[i].ssid, info[i].rssi/100);

printf("********************\\r\\n");


  1. 连接指定的WiFi热点
for(uint8_t i = 0; i < ssid_count; i++)

if (strcmp(SELECT_WIFI_SSID, info[i].ssid) == 0)

int result;

printf("Select:%3d wireless, Waiting...\\r\\n", i+1);

//拷贝要连接的热点信息
strcpy(select_ap_config.ssid, info[i].ssid);
strcpy(select_ap_config.preSharedKey, SELECT_WIFI_PASSWORD);
select_ap_config.securityType = SELECT_WIFI_SECURITYTYPE;

if (AddDeviceConfig(&select_ap_config, &result) == WIFI_SUCCESS)

if (ConnectTo(result) == WIFI_SUCCESS && WaitConnectResult() == 1)

printf("WiFi connect succeed!\\r\\n");
g_lwip_netif = netifapi_netif_find(SELECT_WLAN_PORT);
break;




if(i == ssid_count-1)

printf("ERROR: No wifi as expected\\r\\n");
while(1) osDelay(100);


  1. 启动DHCP
if (g_lwip_netif)

dhcp_start(g_lwip_netif);
printf("begain to dhcp");
  1. 等待DHCP
for(;;)

if(dhcp_is_bound(g_lwip_netif) == ERR_OK)

printf("<-- DHCP state:OK -->\\r\\n");

//打印获取到的IP信息
netifapi_netif_common(g_lwip_netif, dhcp_clients_info_show, NULL);
break;


printf("<-- DHCP state:Inprogress -->\\r\\n");
osDelay(100);
  1. 执行其他操作
for(;; )

osDelay(100);

后续

欢迎关注#公众号:物联网知识



以上是关于鸿蒙之WiFi联网的主要内容,如果未能解决你的问题,请参考以下文章

鸿蒙之OLED显示

鸿蒙HarMonyOS的UI组件学习六之订单列表

没有Bug的OS内核? 鸿蒙黑科技之操作系统形式验证与安全认证

鸿蒙之接收UDP消息

WiFi-IoT 鸿蒙开发套件样例开发

(十七)物联网之 WIFI 一键配网 smartConfig 浅析