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

10年積累的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有玄武免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
?? 開源基礎(chǔ)軟件社區(qū)??
??https://ost.??
前言
本文章主要講輕量化系統(tǒng)的WIFI的AP連接,即是打開WIFI的熱點(diǎn)。本文適用于OpenHarmony3.1的輕量化系統(tǒng)設(shè)備。
設(shè)計(jì)流程
wifiAPTask主線程函數(shù)
- 注冊(cè)wifi事件的回調(diào)函數(shù)RegisterWifiEvent(WifiEvent* event)。
- 初始化wifi熱點(diǎn)相關(guān)配置SetHotspotConfig(const HotspotConfig* config)。
- 啟動(dòng)wifi熱點(diǎn)模式EnableHotspot()。
- 檢查熱點(diǎn)是否正確地啟用IsHotspotActive()。
- 啟動(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)連接、斷開或掃描時(shí)調(diào)用回調(diào)函數(shù),便于相對(duì)應(yīng)時(shí)刻的操作。(若不需要回調(diào)函數(shù),設(shè)置該指針為NULL)。
WifiEvent g_wifiEventHandler = {0};再來介紹一下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即是開啟成功
{
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)行第四步開啟dhcp會(huì)產(chǎn)生內(nèi)存報(bào)錯(cuò)。
??netifapi_dhcps_stop(g_lwip_netif);??
第四步是開啟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)于開源的內(nèi)容,請(qǐng)?jiān)L問:??
?? 開源基礎(chǔ)軟件社區(qū)??
??https://ost.??。
本文標(biāo)題:OpenHarmony設(shè)備開發(fā)(四)-WIFI_AP開發(fā)
本文地址:http://m.fisionsoft.com.cn/article/coopcce.html


咨詢
建站咨詢
