29-ESP8266 SDK開發基礎入門篇--編寫TCP 客戶端程序(Lwip RAW模式,非RTOS版,精簡入門)


https://www.cnblogs.com/yangfengwu/p/11456667.html

 

由於上一節的源碼長時間以后會自動斷開,所以再做這一版非RTOS版的,咱直接用lua源碼里面別人寫的(站在巨人的肩膀上)

咱再細細的看下lua怎么實現的源碼

首先確定lua都調用了什么函數

https://www.cnblogs.com/yangfengwu/p/7533302.html    lua寫的TCP 客戶端

用到的部分程序

Client = net.createConnection(net.TCP, 0) 


Client:connect(
8080,"192.168.1.103") Client:on("receive", function(Client, data) uart.write(0,data) end) Client:on("connection", function(sck, c) ClientConnectedFlage = 1 TcpConnect = Client print("Link OK") tmr.stop(1) Client:on("disconnection", function(sck, c) ClientConnectedFlage = 0 TcpConnect = nil tmr.start(1) end) end)

 

 

https://nodemcu.readthedocs.io/en/master/modules/net/    用到的函數都在net里面

 

 

 

 

注意:lua源碼里面為了使用戶操作起來便捷,所以封裝的很靈活(代碼更復雜些,咱只提取咱用到的部分)

 

 

源碼實際處理部分

 

 

 

 

 

 

 

 

 

 

就是返回的那個結構體變量,后面的話肯定就是調用結構體變量里面的成員變量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

大家知道lwip提供了兩種實現網絡通信的方式

 

第一種是 :RAW模式   就是不需要操作系統參與,所有的都是靠回調函數實現

 

第二種是:跑任務的

 

其實lua源碼里面是使用的RAW模式的

 

大家可以自行百度LWIP  RAW實現TCP客戶端,然后呢,大家大可不必深究lua的每一句代碼了,現在應該提煉人家實現的思想,把人家提供的源碼當做自己的參考

 

 

 

爛程序員關心的是代碼,好程序員關心的是數據結構和它們之間的關系!

實際上實現連接很簡單

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include "esp_common.h"
#include "gpio.h"
#include "uart.h"
#include "esp_timer.h"
#include "hw_timer.h"
#include "pwm.h"
#include  "data_dispose.h"
#include  "espconn.h"
#include  "esp_wifi.h"
#include "lwip/api.h"

#include "crc.h"
#include "smart_config.h"

#include "lwip/err.h"
#include "lwip/ip_addr.h"
#include "lwip/dns.h"
#include "lwip/igmp.h"
#include "lwip/tcp.h"


LOCAL os_timer_t public_timer;//定時器
u32 public_timer_cnt=0;//累加
u32 public_timer_state=0;//狀態
u32 public_timer_out=0;//超時
u32 public_timer_cnt1=0;//累加


extern u8  Usart1ReadBuff[Usart1ReadLen];//接收數據的數組
extern u32 Usart1ReadCnt;//串口1接收到的數據個數
extern u32 Usart1ReadCntCopy;//串口1接收到的數據個數拷貝
extern u8  Usart1ReadFlage;//串口1接收到一條完整數據


#define  SSID "Learn8266" //無線名稱
#define     PWD "11223344"     //密碼
struct softap_config soft_ap_Config;//AP模式配置

//連接的路由器信息
#define APssid "qqqqq"
#define APpassword "11223344"
struct station_config stationConf;

//TCP客戶端
struct tcp_pcb *TcpClient;
ip_addr_t addr;//創建連接的服務器地址用


ResolveData ResolveDataTest;//解析數據IEEE754
//uint32 pin_info_list[1][3]={PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5};//配置GPIO5作為PWM輸出
//int duty[1]={0};//高電平時間是0us


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 user_rf_cal_sector_set(void)
{
    flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

//串口調用此函數就說明接收到了一條完整的數據,就可以去處理了
void UartReadCallback()//定義一個函數
{

}

//網絡接收到數據
void TcpClientRecv(void *arg, char *pdata, unsigned short len)
{
    while(len--)
    {
        uart0_write_char(*(pdata++));//發送到串口
    }
}

//斷開了連接
void TcpClientDisCon(void *arg)
{
    dbg_printf("\nTcpClientDisCon\n");

}


//連接上服務器
err_t TcpConnected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
    if (TcpClient != tpcb || err != ERR_OK){
        TcpClient = NULL;
        dbg_printf("\nConnection aborted\n");
    }
    dbg_printf("\nTcpConnected\n");
    return ERR_OK;
}

//連接出錯
void TcpConnectErr(void *arg, sint8 err)
{
    dbg_printf("\nTcpConnectErr=%d\n",err);
}

//監聽WiFi狀態改變
void wifi_event_monitor_handle_event_cb(System_Event_t *evt)
{
  switch (evt->event_id)
  {
    case EVENT_STAMODE_CONNECTED://連接上路由器
        dbg_printf("\n\tSTAMODE_CONNECTED\n");

        dbg_printf("\tConnected to SSID %s, Channel %d\n",
          evt->event_info.connected.ssid,
          evt->event_info.connected.channel);
      break;

    case EVENT_STAMODE_DISCONNECTED://和路由器斷開
        dbg_printf("\n\tSTAMODE_DISCONNECTED\n");

        dbg_printf("\tDisconnect from SSID %s, reason %d\n",
          evt->event_info.disconnected.ssid,
          evt->event_info.disconnected.reason);
      break;

    case EVENT_STAMODE_AUTHMODE_CHANGE://這個是 啥..
        dbg_printf("\n\tSTAMODE_AUTHMODE_CHANGE\n");

        dbg_printf("\tAuthmode: %u -> %u\n",
          evt->event_info.auth_change.old_mode,
          evt->event_info.auth_change.new_mode);
      break;

    case EVENT_STAMODE_GOT_IP://連接上路由器,並獲取了IP
        dbg_printf("\n\tGOT_IP\n");

        dbg_printf("\tIP:" IPSTR ",Mask:" IPSTR ",GW:" IPSTR "\n",
          IP2STR(&evt->event_info.got_ip.ip),
          IP2STR(&evt->event_info.got_ip.mask),
          IP2STR(&evt->event_info.got_ip.gw));

        if(public_timer_state == 0)//正常運行下連接的路由器
        {
            TcpClient = tcp_new();//創建TCP,咱需要這個
            IP4_ADDR(&addr,192,168,1,93);//設置連接的IP地址
            tcp_connect(TcpClient, &addr,60000, TcpConnected);//連接
        }


      break;

    case EVENT_STAMODE_DHCP_TIMEOUT://連接上路由器,但是路由器給WIFI模塊分配IP等信息超時了
        dbg_printf("\n\tSTAMODE_DHCP_TIMEOUT\n");
      break;

    case EVENT_SOFTAPMODE_STACONNECTED://AP模式下,有設備連接WIFI模塊的無線
        dbg_printf("\n\tSOFTAPMODE_STACONNECTED\n");

        dbg_printf("\tStation: " MACSTR "join, AID = %d\n",
          MAC2STR(evt->event_info.sta_connected.mac),
          evt->event_info.sta_connected.aid);
      break;

    case EVENT_SOFTAPMODE_STADISCONNECTED://AP模式下,有設備斷開和WIFI模塊的無線連接
        dbg_printf("\n\tSOFTAPMODE_STADISCONNECTED\n");

        dbg_printf("\tstation: " MACSTR "leave, AID = %d\n",
          MAC2STR(evt->event_info.sta_disconnected.mac),
          evt->event_info.sta_disconnected.aid);
      break;

    case EVENT_SOFTAPMODE_PROBEREQRECVED://這是啥??,,,信號強度改變了
        dbg_printf("\n\tSOFTAPMODE_PROBEREQRECVED\n");

        dbg_printf("Station PROBEREQ: " MACSTR " RSSI = %d\n",
          MAC2STR(evt->event_info.ap_probereqrecved.mac),
          evt->event_info.ap_probereqrecved.rssi);
      break;

    default://其它錯誤
        dbg_printf("\n\tswitch/case default\n");
      break;
  }
}

//所有需要定時操作的函數在此函數中執行
LOCAL void ICACHE_FLASH_ATTR
public_timer_callback(void)
{
    if(GPIO_INPUT_GET(0) == 0)//按鍵按下
    {
        public_timer_cnt++;
        if(public_timer_cnt>=300 && public_timer_state==0)//3S
        {
            dbg_printf("\nstartsmart\n");
            public_timer_state=1;
            wifi_station_disconnect();
            wifi_set_opmode(STATION_MODE);
            smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);//SmartConfig  +  AirKiss
            xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);
        }
    }
    else
    {
        if(public_timer_state!=1 && public_timer_cnt>0 && public_timer_cnt<300)//短按復位
        {
            dbg_printf("\nsystem_restart\n");
            system_restart();//復位
        }
        public_timer_cnt=0;
    }

    switch(public_timer_state)
    {
        case 0:break;
        case 1:
            public_timer_out++;
            public_timer_cnt1++;
            if(public_timer_out>=6000)//60S
            {
                dbg_printf("\nsmartconfig_timeout\n");
                system_restart();//復位
            }
            if(public_timer_cnt1>10)//LED快閃
            {
                public_timer_cnt1=0;
                GPIO_OUTPUT_SET(2, 1-GPIO_INPUT_GET(2));//LED快閃
            }
            break;
        default:break;
    }
}


/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void user_init(void)
{
    GPIO_OUTPUT_SET(5, 1);
    GPIO_OUTPUT_SET(2, 0);//讓兩個燈初始的狀態一樣,GOIO2是反接的,0的時候是亮
    GPIO_OUTPUT_SET(0, 1);
    uart_init_new();
    printf("SDK version:%s\n", system_get_sdk_version());

    wifi_set_opmode(STATIONAP_MODE);//配置WiFi的模式STATION + AP AP--連接WIFI自身的無線實現通信  STATION--wifi連接路由器,手機或者電腦也連接路由器,實現通信
    soft_ap_Config.ssid_len = strlen(SSID);//熱點名稱長度,與你實際的名稱長度一致就好
    memcpy(soft_ap_Config.ssid,SSID,soft_ap_Config.ssid_len);//實際熱點名稱設置,可以根據你的需要來
    memcpy(soft_ap_Config.password,PWD,strlen(PWD));//熱點密碼設置
    soft_ap_Config.authmode = AUTH_WPA2_PSK;//加密模式
    soft_ap_Config.channel = 1;//信道,共支持1~13個信道
    soft_ap_Config.max_connection = 4;//最大連接數量,最大支持四個,默認四個

    wifi_softap_set_config_current(&soft_ap_Config);//設置 Wi-Fi SoftAP 接口配置,不保存到 Flash
    //    wifi_softap_set_config(&soft_ap_Config);//設置 Wi-Fi SoftAP 接口配置,保存到 Flash
    UartCallbackRegister(UartReadCallback);//把 UartReadCallback 函數地址傳過去,在串口里面調用

    os_timer_disarm(&public_timer);
    os_timer_setfn(&public_timer, (os_timer_func_t *)public_timer_callback, NULL);
    os_timer_arm(&public_timer, 10, 1);//10ms


    //設置連接的路由器,如果想直接測試不想配網,請去掉屏蔽
    stationConf.bssid_set = 0;
    memcpy(stationConf.ssid,APssid,strlen(APssid));//路由器名稱
    memcpy(stationConf.password,APpassword,strlen(APpassword));//路由器密碼
    wifi_station_disconnect();
    wifi_station_set_config(&stationConf);



    wifi_set_event_handler_cb(wifi_event_monitor_handle_event_cb);//監聽WiFi狀態改變

}

 

下載進去測試下

 

 

 

 我先整體說完哈,最后說一下細節問題

現在呢加幾個回調函數

 

 

 

lua里面封裝了以后 ,所有的信息都記錄在 ud那個結構體里面

tcp_arg()的第二個參數是ud

其實下面的每一個回調函數都有個參數,上面設置以后,傳遞給回調函數的參數就是ud了,lua做法是直接判斷和控制ud的成員變量

可以隨意看個回調

 

 

其實所有的鏈接信息都保存在ud里面,做這個程序的人需要 獲取 和 操作 這個變量,所以需要把ud傳給每一個回調函數.

咱呢不需要

所以

 

 

 

 直接上源碼吧!(實現的也是透傳)

 

#include "esp_common.h"
#include "gpio.h"
#include "uart.h"
#include "esp_timer.h"
#include "hw_timer.h"
#include "pwm.h"
#include  "data_dispose.h"
#include  "espconn.h"
#include  "esp_wifi.h"
#include "lwip/api.h"

#include "crc.h"
#include "smart_config.h"

#include "lwip/err.h"
#include "lwip/ip_addr.h"
#include "lwip/dns.h"
#include "lwip/igmp.h"
#include "lwip/tcp.h"


LOCAL os_timer_t public_timer;//定時器
u32 public_timer_cnt=0;//累加
u32 public_timer_state=0;//狀態
u32 public_timer_out=0;//超時
u32 public_timer_cnt1=0;//累加


extern u8  Usart1ReadBuff[Usart1ReadLen];//接收數據的數組
extern u32 Usart1ReadCnt;//串口1接收到的數據個數
extern u32 Usart1ReadCntCopy;//串口1接收到的數據個數拷貝
extern u8  Usart1ReadFlage;//串口1接收到一條完整數據


#define  SSID "Learn8266" //無線名稱
#define     PWD "11223344"     //密碼
struct softap_config soft_ap_Config;//AP模式配置

//連接的路由器信息
#define APssid "qqqqq"
#define APpassword "11223344"
struct station_config stationConf;

//TCP客戶端
struct tcp_pcb *TcpClient;
ip_addr_t addr;//創建連接的服務器地址用

#define TcpReadLen 2048
unsigned char TcpRead[TcpReadLen]={0};//接收數據緩存的數組,最大接收1024字節

ResolveData ResolveDataTest;//解析數據IEEE754
//uint32 pin_info_list[1][3]={PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5,5};//配置GPIO5作為PWM輸出
//int duty[1]={0};//高電平時間是0us


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 user_rf_cal_sector_set(void)
{
    flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

//串口調用此函數就說明接收到了一條完整的數據,就可以去處理了
void UartReadCallback()
{
    tcp_write(TcpClient, Usart1ReadBuff, Usart1ReadCntCopy, TCP_WRITE_FLAG_COPY);//存放到發送對列(默認延時一會組合起來所有數據再發送)
    tcp_output(TcpClient);//立即發送
}

//網絡接收到數據
err_t TcpClientRecv(void *arg, struct tcp_pcb *tpcb,struct pbuf *p, err_t err)
{
    int len = p->len;
    int cnt = 0;
    tcp_recved(tpcb,len);//獲取數據

    if(len > TcpReadLen){//接收的數據大於了數組大小
        len= TcpReadLen;
    }

    memcpy(TcpRead,p->payload,len);//拷貝數據到數組

    while(len--)
    {
        uart0_write_char(TcpRead[cnt]);//串口輸出
        cnt++;
    }
    pbuf_free(p);
    return ERR_OK;
}


//連接上服務器
err_t TcpConnected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
    if (TcpClient != tpcb || err != ERR_OK){
        TcpClient = NULL;
        dbg_printf("\nConnection aborted\n");
    }
    dbg_printf("\nTcpConnected\n");
    return ERR_OK;
}

//成功發送數據
err_t TcpClientSendOk(void *arg, struct tcp_pcb *tpcb,u16_t len)
{

    return ERR_OK;
}

//客戶端有錯誤
void TcpClientErr(void *arg, err_t err)
{

}

//監聽WiFi狀態改變
void wifi_event_monitor_handle_event_cb(System_Event_t *evt)
{
  switch (evt->event_id)
  {
    case EVENT_STAMODE_CONNECTED://連接上路由器
        dbg_printf("\n\tSTAMODE_CONNECTED\n");

        dbg_printf("\tConnected to SSID %s, Channel %d\n",
          evt->event_info.connected.ssid,
          evt->event_info.connected.channel);
      break;

    case EVENT_STAMODE_DISCONNECTED://和路由器斷開
        dbg_printf("\n\tSTAMODE_DISCONNECTED\n");

        dbg_printf("\tDisconnect from SSID %s, reason %d\n",
          evt->event_info.disconnected.ssid,
          evt->event_info.disconnected.reason);
      break;

    case EVENT_STAMODE_AUTHMODE_CHANGE://這個是 啥..
        dbg_printf("\n\tSTAMODE_AUTHMODE_CHANGE\n");

        dbg_printf("\tAuthmode: %u -> %u\n",
          evt->event_info.auth_change.old_mode,
          evt->event_info.auth_change.new_mode);
      break;

    case EVENT_STAMODE_GOT_IP://連接上路由器,並獲取了IP
        dbg_printf("\n\tGOT_IP\n");

        dbg_printf("\tIP:" IPSTR ",Mask:" IPSTR ",GW:" IPSTR "\n",
          IP2STR(&evt->event_info.got_ip.ip),
          IP2STR(&evt->event_info.got_ip.mask),
          IP2STR(&evt->event_info.got_ip.gw));

        if(public_timer_state == 0)//正常運行下連接的路由器
        {
            TcpClient = tcp_new();//創建TCP,咱需要這個
            IP4_ADDR(&addr,192,168,1,93);//設置連接的IP地址


            tcp_err(TcpClient, TcpClientErr);//有錯誤回調函數
            tcp_recv(TcpClient, TcpClientRecv);//接收到數據回調函數
            tcp_sent(TcpClient, TcpClientSendOk);//成功發送了數據回調函數

            tcp_connect(TcpClient, &addr,60000, TcpConnected);//連接


        }


      break;

    case EVENT_STAMODE_DHCP_TIMEOUT://連接上路由器,但是路由器給WIFI模塊分配IP等信息超時了
        dbg_printf("\n\tSTAMODE_DHCP_TIMEOUT\n");
      break;

    case EVENT_SOFTAPMODE_STACONNECTED://AP模式下,有設備連接WIFI模塊的無線
        dbg_printf("\n\tSOFTAPMODE_STACONNECTED\n");

        dbg_printf("\tStation: " MACSTR "join, AID = %d\n",
          MAC2STR(evt->event_info.sta_connected.mac),
          evt->event_info.sta_connected.aid);
      break;

    case EVENT_SOFTAPMODE_STADISCONNECTED://AP模式下,有設備斷開和WIFI模塊的無線連接
        dbg_printf("\n\tSOFTAPMODE_STADISCONNECTED\n");

        dbg_printf("\tstation: " MACSTR "leave, AID = %d\n",
          MAC2STR(evt->event_info.sta_disconnected.mac),
          evt->event_info.sta_disconnected.aid);
      break;

    case EVENT_SOFTAPMODE_PROBEREQRECVED://這是啥??,,,信號強度改變了
        dbg_printf("\n\tSOFTAPMODE_PROBEREQRECVED\n");

        dbg_printf("Station PROBEREQ: " MACSTR " RSSI = %d\n",
          MAC2STR(evt->event_info.ap_probereqrecved.mac),
          evt->event_info.ap_probereqrecved.rssi);
      break;

    default://其它錯誤
        dbg_printf("\n\tswitch/case default\n");
      break;
  }
}

//所有需要定時操作的函數在此函數中執行
LOCAL void ICACHE_FLASH_ATTR
public_timer_callback(void)
{
    if(GPIO_INPUT_GET(0) == 0)//按鍵按下
    {
        public_timer_cnt++;
        if(public_timer_cnt>=300 && public_timer_state==0)//3S
        {
            dbg_printf("\nstartsmart\n");
            public_timer_state=1;
            wifi_station_disconnect();
            wifi_set_opmode(STATION_MODE);
            smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);//SmartConfig  +  AirKiss
            xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);
        }
    }
    else
    {
        if(public_timer_state!=1 && public_timer_cnt>0 && public_timer_cnt<300)//短按復位
        {
            dbg_printf("\nsystem_restart\n");
            system_restart();//復位
        }
        public_timer_cnt=0;
    }

    switch(public_timer_state)
    {
        case 0:break;
        case 1:
            public_timer_out++;
            public_timer_cnt1++;
            if(public_timer_out>=6000)//60S
            {
                dbg_printf("\nsmartconfig_timeout\n");
                system_restart();//復位
            }
            if(public_timer_cnt1>10)//LED快閃
            {
                public_timer_cnt1=0;
                GPIO_OUTPUT_SET(2, 1-GPIO_INPUT_GET(2));//LED快閃
            }
            break;
        default:break;
    }
}


/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void user_init(void)
{
    GPIO_OUTPUT_SET(5, 1);
    GPIO_OUTPUT_SET(2, 0);//讓兩個燈初始的狀態一樣,GOIO2是反接的,0的時候是亮
    GPIO_OUTPUT_SET(0, 1);
    uart_init_new();
    printf("SDK version:%s\n", system_get_sdk_version());

    wifi_set_opmode(STATIONAP_MODE);//配置WiFi的模式STATION + AP AP--連接WIFI自身的無線實現通信  STATION--wifi連接路由器,手機或者電腦也連接路由器,實現通信
    soft_ap_Config.ssid_len = strlen(SSID);//熱點名稱長度,與你實際的名稱長度一致就好
    memcpy(soft_ap_Config.ssid,SSID,soft_ap_Config.ssid_len);//實際熱點名稱設置,可以根據你的需要來
    memcpy(soft_ap_Config.password,PWD,strlen(PWD));//熱點密碼設置
    soft_ap_Config.authmode = AUTH_WPA2_PSK;//加密模式
    soft_ap_Config.channel = 1;//信道,共支持1~13個信道
    soft_ap_Config.max_connection = 4;//最大連接數量,最大支持四個,默認四個

    wifi_softap_set_config_current(&soft_ap_Config);//設置 Wi-Fi SoftAP 接口配置,不保存到 Flash
    //    wifi_softap_set_config(&soft_ap_Config);//設置 Wi-Fi SoftAP 接口配置,保存到 Flash
    UartCallbackRegister(UartReadCallback);//把 UartReadCallback 函數地址傳過去,在串口里面調用

    os_timer_disarm(&public_timer);
    os_timer_setfn(&public_timer, (os_timer_func_t *)public_timer_callback, NULL);
    os_timer_arm(&public_timer, 10, 1);//10ms


    //設置連接的路由器,如果想直接測試不想配網,請去掉屏蔽
    stationConf.bssid_set = 0;
    memcpy(stationConf.ssid,APssid,strlen(APssid));//路由器名稱
    memcpy(stationConf.password,APpassword,strlen(APpassword));//路由器密碼
    wifi_station_disconnect();
    wifi_station_set_config(&stationConf);



    wifi_set_event_handler_cb(wifi_event_monitor_handle_event_cb);//監聽WiFi狀態改變

}

 

測試:

 

 

 

 

 

注:

這些回調函數的參數需要根據它內部規定的寫,我只說一個

 

 

 

 

 

 

 

 

 

 

所以

 

 

 

 

 

其它的就是固定形式了,就是要那樣做....

 

 

這節只當做個入門,只是簡簡單單的,下節接着優化,需要做上自動重連.

其實感覺挺有成就感的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM