日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
OpenHarmony設(shè)備開(kāi)發(fā)(四)-WIFI_AP開(kāi)發(fā)

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

10年積累的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有玄武免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

?? 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.??

前言

本文章主要講輕量化系統(tǒng)的WIFI的AP連接,即是打開(kāi)WIFI的熱點(diǎn)。本文適用于OpenHarmony3.1的輕量化系統(tǒng)設(shè)備。

設(shè)計(jì)流程

wifiAPTask主線程函數(shù)

  1. 注冊(cè)wifi事件的回調(diào)函數(shù)RegisterWifiEvent(WifiEvent* event)。
  2. 初始化wifi熱點(diǎn)相關(guān)配置SetHotspotConfig(const HotspotConfig* config)。
  3. 啟動(dòng)wifi熱點(diǎn)模式EnableHotspot()。
  4. 檢查熱點(diǎn)是否正確地啟用IsHotspotActive()。
  5. 啟動(dòng)DHCP。
  • 查找接口:netifapi_netif_find()。
  • 改變IP_add的配置:netifapi_netif_set_addr()。
  • 啟動(dòng)dhcp服務(wù):netifapi_dhcps_start()。

線程創(chuàng)建

static void Wifi_AP_Demo(void)
{
osThreadAttr_t attr;
attr.name = "WifiAPTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 10240;
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)WifiAPTask, NULL, &attr) == NULL)
{
printf("Falied to create WifiAPTask!\r\n");
}
}
SYS_RUN(Wifi_AP_Demo);

代碼分析

1、注冊(cè)wifi事件的回調(diào)函數(shù)

首先要?jiǎng)?chuàng)建一個(gè)指向wifi事件回調(diào)的指針,用于熱點(diǎn)連接、斷開(kāi)或掃描時(shí)調(diào)用回調(diào)函數(shù),便于相對(duì)應(yīng)時(shí)刻的操作。(若不需要回調(diào)函數(shù),設(shè)置該指針為NULL)。

WifiEvent g_wifiEventHandler = {0};

再來(lái)介紹一下wifEvent結(jié)構(gòu)體對(duì)象,.OnHotspotStaJoin是綁定STA站點(diǎn)加入時(shí)的回調(diào)函數(shù),.OnHotspotStaLeave是STA退出時(shí)的回調(diào)函數(shù),.OnHotspotStateChanged是狀態(tài)改變回調(diào)函數(shù),我們通常設(shè)置這三個(gè)回調(diào)函數(shù)即可。

typedef struct {
/** Connection state change */
void (*OnWifiConnectionChanged)(int state, WifiLinkedInfo *info);
/** Scan state change */
void (*OnWifiScanStateChanged)(int state, int size);
/** Hotspot state change */
void (*OnHotspotStateChanged)(int state);
/** Station connected */
void (*OnHotspotStaJoin)(StationInfo *info);
/** Station disconnected */
void (*OnHotspotStaLeave)(StationInfo *info);
} WifiEvent;

最后使用RegisterWifiEvent函數(shù)調(diào)用g_wifiEventHandler指針的數(shù)據(jù),指定wifi回調(diào)函數(shù),該函數(shù)返回值為0即是成功。

//注冊(cè)wifi事件的回調(diào)函數(shù)
g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
//指定WiFi回調(diào)函數(shù)
RegisterWifiEvent(&g_wifiEventHandler);

具體的回調(diào)函數(shù)在文章后面細(xì)述。

2、初始化wifi熱點(diǎn)相關(guān)配置

首先創(chuàng)建一個(gè)配置熱點(diǎn)的config指針,并初始化該指針。

//設(shè)置指定的熱點(diǎn)配置
HotspotConfig config = {0};
//初始化熱點(diǎn)相關(guān)配置
strcpy(config.ssid, "FSR_hispark"); //設(shè)置熱點(diǎn)的SSID
strcpy(config.preSharedKey, "12345678"); //設(shè)置熱點(diǎn)的密鑰
config.securityType = WIFI_SEC_TYPE_PSK; //加密模式為PSK
config.band = HOTSPOT_BAND_TYPE_2G; //設(shè)置頻段為2.4GHz
config.channelNum = 7; //熱點(diǎn)的信道數(shù)

隨后使用 SetHotspotConfig函數(shù)配置wifi熱點(diǎn),該函數(shù)返回值為0即是成功。

//配置wifi熱點(diǎn)
SetHotspotConfig(&config);

3、啟動(dòng)和檢查wifi

啟動(dòng)wifi:

error = EnableHotspot();
if (error != WIFI_SUCCESS) //返回值為0即是開(kāi)啟成功
{
printf("EnableHotspot failed, error = %d.\r\n", error);
return -1;
}

使用IsHotspotActive();函數(shù),確認(rèn)熱點(diǎn)模式是否使能成功。

if (IsHotspotActive() == WIFI_HOTSPOT_NOT_ACTIVE)   //若不成功
{
printf("Wifi station is not actived.\r\n");
return -1;
}
printf("Wifi station is actived!\r\n");

4、啟動(dòng)DHCP

第一步先創(chuàng)建dhcp對(duì)象。

static struct netif *g_lwip_netif = NULL;
g_lwip_netif = netifapi_netif_find("ap0"); //查找網(wǎng)絡(luò)接口

第二步是初始化dhcp相關(guān)配置,然后使用netifapi_netif_set_addr函數(shù)配置dhcp。

ip4_addr_t bp_gw;
ip4_addr_t bp_ipaddr;
ip4_addr_t bp_netmask;
IP4_ADDR(&bp_gw, 192, 168, 1, 1); /* 網(wǎng)關(guān) */
IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1); /* IP */
IP4_ADDR(&bp_netmask, 255, 255, 255, 0); /* 網(wǎng)絡(luò)掩碼 */
err_t ret = netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw);
//ret為0即成功

第三步需要先將dhcp關(guān)閉!!!否則直接進(jìn)行第四步開(kāi)啟dhcp會(huì)產(chǎn)生內(nèi)存報(bào)錯(cuò)。

??netifapi_dhcps_stop(g_lwip_netif);??

第四步是開(kāi)啟dhcp

??netifapi_dhcps_start(g_lwip_netif, 0, 0);??
  • 參數(shù)一:dhcp對(duì)象。
  • 參數(shù)二:地址池的起始IP地址。
  • 參數(shù)三:需要加入IP地址池的IP地址數(shù)量。

回調(diào)函數(shù)

下面將介紹三個(gè)類型的回調(diào)函數(shù)。

狀態(tài)改變回調(diào)函數(shù)

終端輸出WIFI AP模式狀態(tài)。

static void OnHotspotStateChangedHandler(int state)
{
printf("HotspotStateChanged:state is %d.\r\n", state);
if (state == WIFI_HOTSPOT_ACTIVE) // state=1表示已啟用WIFI AP模式
{
printf("wifi hotspot active.\r\n");
}
else // state=0表示W(wǎng)IFI AP模式已禁用
{
printf("wifi hotspot noactive.\r\n");
}
}

STA退出回調(diào)函數(shù)

STA退出時(shí)打印mac地址。

static void OnHotspotStaLeaveHandler(StationInfo *info)
{
if (info == NULL)
{
printf("HotspotStaLeave:info is null.\r\n");
}
else
{
static char macAddress[32] = {0};
unsigned char *mac = info->macAddress;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("HotspotStaLeave: macAddress=%s, reason=%d.\r\n", macAddress, info->disconnectedReason);
//設(shè)備-1
g_apEnableSuccess--;
}
return;
}
綁定STA站點(diǎn)加入回調(diào)函數(shù)

打印出每個(gè)STA站點(diǎn)的MAC地址。

static void HotspotStaJoinTask(void)
{
static char macAddress[32] = {0};
StationInfo stainfo[WIFI_MAX_STA_NUM] = {0};
StationInfo *sta_list_node = NULL;
unsigned int size = WIFI_MAX_STA_NUM;

//獲取當(dāng)前接入到該AP的所有STA站點(diǎn)信息
error = GetStationList(stainfo, &size);
if (error != WIFI_SUCCESS)
{
printf("HotspotStaJoin:get list fail, error is %d.\r\n", error);
return;
}
sta_list_node = stainfo;
//打印出每個(gè)STA站點(diǎn)的MAC地址
for (uint32_t i = 0; i < size; i++, sta_list_node++)
{
unsigned char *mac = sta_list_node->macAddress;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("HotspotSta[%d]: macAddress=%s.\r\n", i, macAddress);
}
//記錄設(shè)備+1
g_apEnableSuccess++;
}

//STA加入回調(diào)函數(shù)
static void OnHotspotStaJoinHandler(StationInfo *info)
{
if (info == NULL)
{
printf("HotspotStaJoin:info is null.\r\n");
}
else
{
//創(chuàng)建連接線程
printf("New Sta Join\n");
osThreadAttr_t attr;
attr.name = "HotspotStaJoinTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 2048;
attr.priority = 24;
if (osThreadNew((osThreadFunc_t)HotspotStaJoinTask, NULL, &attr) == NULL)
{
printf("HotspotStaJoin:create task fail!\r\n");
}
}
return;
}

效果圖

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

?? 開(kāi)源基礎(chǔ)軟件社區(qū)??

??https://ost.??。


新聞標(biāo)題:OpenHarmony設(shè)備開(kāi)發(fā)(四)-WIFI_AP開(kāi)發(fā)
網(wǎng)站地址:http://m.5511xx.com/article/coopcce.html