文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

OpenHarmony设备开发(四)-WIFI_AP开发

2024-12-01 14:32

关注

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

前言

本文章主要讲轻量化系统的WIFI的AP连接,即是打开WIFI的热点。本文适用于OpenHarmony3.1的轻量化系统设备。

设计流程

wifiAPTask主线程函数

  1. 注册wifi事件的回调函数RegisterWifiEvent(WifiEvent* event)。
  2. 初始化wifi热点相关配置SetHotspotConfig(const HotspotConfig* config)。
  3. 启动wifi热点模式EnableHotspot()。
  4. 检查热点是否正确地启用IsHotspotActive()。
  5. 启动DHCP。

线程创建

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、注册wifi事件的回调函数

首先要创建一个指向wifi事件回调的指针,用于热点连接、断开或扫描时调用回调函数,便于相对应时刻的操作。(若不需要回调函数,设置该指针为NULL)。

WifiEvent g_wifiEventHandler = {0};

再来介绍一下wifEvent结构体对象,.OnHotspotStaJoin是绑定STA站点加入时的回调函数,.OnHotspotStaLeave是STA退出时的回调函数,.OnHotspotStateChanged是状态改变回调函数,我们通常设置这三个回调函数即可。

typedef struct {

void (*OnWifiConnectionChanged)(int state, WifiLinkedInfo *info);

void (*OnWifiScanStateChanged)(int state, int size);

void (*OnHotspotStateChanged)(int state);

void (*OnHotspotStaJoin)(StationInfo *info);

void (*OnHotspotStaLeave)(StationInfo *info);
} WifiEvent;

最后使用RegisterWifiEvent函数调用g_wifiEventHandler指针的数据,指定wifi回调函数,该函数返回值为0即是成功。

//注册wifi事件的回调函数
g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
//指定WiFi回调函数
RegisterWifiEvent(&g_wifiEventHandler);

具体的回调函数在文章后面细述。

2、初始化wifi热点相关配置

首先创建一个配置热点的config指针,并初始化该指针。

//设置指定的热点配置
HotspotConfig config = {0};
//初始化热点相关配置
strcpy(config.ssid, "FSR_hispark"); //设置热点的SSID
strcpy(config.preSharedKey, "12345678"); //设置热点的密钥
config.securityType = WIFI_SEC_TYPE_PSK; //加密模式为PSK
config.band = HOTSPOT_BAND_TYPE_2G; //设置频段为2.4GHz
config.channelNum = 7; //热点的信道数

随后使用 SetHotspotConfig函数配置wifi热点,该函数返回值为0即是成功。

//配置wifi热点
SetHotspotConfig(&config);

3、启动和检查wifi

启动wifi:

error = EnableHotspot();
if (error != WIFI_SUCCESS) //返回值为0即是开启成功
{
printf("EnableHotspot failed, error = %d.\r\n", error);
return -1;
}

使用IsHotspotActive();函数,确认热点模式是否使能成功。

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

4、启动DHCP

第一步先创建dhcp对象。

static struct netif *g_lwip_netif = NULL;
g_lwip_netif = netifapi_netif_find("ap0"); //查找网络接口

第二步是初始化dhcp相关配置,然后使用netifapi_netif_set_addr函数配置dhcp。

ip4_addr_t bp_gw;
ip4_addr_t bp_ipaddr;
ip4_addr_t bp_netmask;
IP4_ADDR(&bp_gw, 192, 168, 1, 1);
IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1);
IP4_ADDR(&bp_netmask, 255, 255, 255, 0);
err_t ret = netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw);
//ret为0即成功

第三步需要先将dhcp关闭!!!否则直接进行第四步开启dhcp会产生内存报错。

​​netifapi_dhcps_stop(g_lwip_netif);​​

第四步是开启dhcp

​​netifapi_dhcps_start(g_lwip_netif, 0, 0);​​

回调函数

下面将介绍三个类型的回调函数。

状态改变回调函数

终端输出WIFI AP模式状态。

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表示WIFI AP模式已禁用
{
printf("wifi hotspot noactive.\r\n");
}
}

STA退出回调函数

STA退出时打印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);
//设备-1
g_apEnableSuccess--;
}
return;
}
绑定STA站点加入回调函数

打印出每个STA站点的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;

//获取当前接入到该AP的所有STA站点信息
error = GetStationList(stainfo, &size);
if (error != WIFI_SUCCESS)
{
printf("HotspotStaJoin:get list fail, error is %d.\r\n", error);
return;
}
sta_list_node = stainfo;
//打印出每个STA站点的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);
}
//记录设备+1
g_apEnableSuccess++;
}

//STA加入回调函数
static void OnHotspotStaJoinHandler(StationInfo *info)
{
if (info == NULL)
{
printf("HotspotStaJoin:info is null.\r\n");
}
else
{
//创建连接线程
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;
}

效果图

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

来源:51CTO开源基础软件社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯