Bearpi开发板HarmonyOS之 WiFi AP热点

wifi_hotspot.h接口简介

  • 启用AP热点模式
    WifiErrorCode EnableHotspot(void);
  • 禁用AP热点模式
    WifiErrorCode DisableHotspot(void);
  • 设置指定的热点配置
    WifiErrorCode SetHotspotConfig(const HotspotConfig* config);
  • 获取指定的热点配置
    WifiErrorCode GetHotspotConfig(HotspotConfig* result);
  • 检查AP热点模式是否启用
    int IsHotspotActive(void);
  • 获取连接到该热点的一系列STA
    WifiErrorCode GetStationList(StationInfo* result, unsigned int* size);
  • 获取接收信号强度和频
    int GetSignalLevel(int rssi, int band);

wifi热点代码

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include <string.h>
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_adc.h"
#include "wifiiot_errno.h"
#include "wifiiot_uart.h"
#include "lwip/netifapi.h"
#include "wifi_hotspot.h"
#include "wifi_device.h"
#include "wifi_error_code.h"


#define AP_SSID "BearPi"
#define AP_PSK  "12345678"


static void OnHotspotStaJoinHandler(StationInfo *info);
static void OnHotspotStateChangedHandler(int state);
static void OnHotspotStaLeaveHandler(StationInfo *info);

static struct netif *pNetif = NULL;
static int g_ap_enabled = 0;
static WifiEvent wifi_event = {0};
static WifiErrorCode error_code = 0;

static BOOL WifiAPTask(void)
{

  osDelay(200);

 // 注册wifi回调函数
  wifi_event.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
  wifi_event.OnHotspotStateChanged = OnHotspotStateChangedHandler;
  wifi_event.OnHotspotStaJoin = OnHotspotStaJoinHandler;
  error_code = RegisterWifiEvent(&wifi_event);
  if(error_code != WIFI_SUCCESS)
  {
     printf("RegisterWifiEvent failed, error = %d.\r\n",error_code);
     return -1;
  }

  // 设置指定热点
  HotspotConfig config = {0};
  strcpy(config.ssid,AP_SSID);
  strcpy(config.preSharedKey,AP_PSK);
  config.band = HOTSPOT_BAND_TYPE_2G;
  config.channelNum = 7;
  config.securityType = WIFI_SEC_TYPE_PSK;
  error_code = SetHotspotConfig(&config);
  if (error_code != WIFI_SUCCESS)
  {
      printf("SetHotspotConfig failed, error = %d.\r\n", error_code);
      return -1;
  }

 // 启动热点
   error_code = EnableHotspot();
   if (error_code != WIFI_SUCCESS)
    {
        printf("EnableHotspot failed, error = %d.\r\n", error_code);
        return -1;
    }

    // 检查热点是否打开
    if(IsHotspotActive() == WIFI_HOTSPOT_NOT_ACTIVE)
    {
        printf("Wifi station is not actived.\r\n");
        return -1;
    }

    //启动DHCP
    pNetif = netifapi_netif_find("ap0");
    if(pNetif != NULL)
    {
        ip4_addr_t bp_gw;
        ip4_addr_t bp_ipaddr;
        ip4_addr_t bp_netmask;

        IP4_ADDR(&bp_gw, 192, 168, 1, 1);           /* input your gateway for example: 192.168.1.1 */
        IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1);       /* input your IP for example: 192.168.1.1 */
        IP4_ADDR(&bp_netmask, 255, 255, 255, 0);    /* input your netmask for example: 255.255.255.0 */
        
        err_t ret = netifapi_netif_set_addr(pNetif,&bp_ipaddr,&bp_netmask,&bp_gw);
        if(ret != ERR_OK)
        {
            printf("netifapi_netif_set_addr failed, error = %d.\r\n", ret);
            return -1;
        }
    
        ret = netifapi_dhcps_start(pNetif,0,0);      
        if(ret != ERR_OK)
        { 
            printf("netifapi_dhcp_start failed, error = %d.\r\n", ret);
            return -1;
        }

    }

    while (1)
    {
      /* code */
      osDelay(1);
    }
    

}


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;

    error_code = GetStationList(stainfo,&size);
    if (error_code != WIFI_SUCCESS) {
        printf("HotspotStaJoin:get list fail, error is %d.\r\n", error_code);
        return;
    }

     sta_list_node = stainfo;
     for(uint32_t i=0; i<size; i++,sta_list_node++)
     {
       uint8_t *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);
     }
     g_ap_enabled++;
}

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");
        }
    }
}

static void OnHotspotStateChangedHandler(int state)
{
   printf("HotspotStateChanged:state is %d.\r\n", state);
    if (state == WIFI_HOTSPOT_ACTIVE) 
    {
        printf("wifi hotspot active.\r\n");
    } 
    else 
    {
        printf("wifi hotspot noactive.\r\n");
    }
}

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);
        g_ap_enabled--;
    }

}

static void my_led_example(void)
{
   
    
     osThreadAttr_t attr;
     attr.attr_bits = 0;
     attr.name = "wifi_ap";
     attr.cb_mem = NULL;
     attr.cb_size = 0;
     attr.priority = 24;
     attr.stack_size = 10240;

     if(osThreadNew((osThreadFunc_t)WifiAPTask,NULL,&attr) == NULL)
     {
        printf("Falied to create adc_func!\n");
    }
}

SYS_RUN(my_led_example);

运行效果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雨依依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值