26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网

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

SmartConfig/Airkiss 配网需要APP/微信公众号,这节大家先使用我做好的APP/微信公众号

APP下载:

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

微信公众号: 扫描这个二维码关注我的公众号

    

其余的步骤等写完8266的配网程序,在下面演示.

如果想自己实现微信绑定可以看↓ (注:配置过程和源码全部是公开的,大家看文章即可实现)

如果你已经有做网页的经验了,可以直接

如果你没有做过网页,你需要先看

  

然后需要把微信小程序篇的所有章节从头到尾看一遍

现在开始写WIFI的配网程序

其实官方给了例子

咱把例子写个单独的.C和.H文件,方便咱后期使用

smart_config.c

#include "esp_common.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "espressif/espconn.h"
#include "espressif/airkiss.h"

#define server_ip "192.168.101.142"
#define server_port 9669

#define DEVICE_TYPE         "gh_9e2cff3dfa51" //wechat public number
#define DEVICE_ID             "122475" //model ID

#define DEFAULT_LAN_PORT     12476

LOCAL esp_udp ssdp_udp;
LOCAL struct espconn pssdpudpconn;
LOCAL os_timer_t ssdp_time_serv;

uint8  lan_buf[200];
uint16 lan_buf_len;
uint8  udp_sent_cnt = 0;

const airkiss_config_t akconf =
{
    (airkiss_memset_fn)&memset,
    (airkiss_memcpy_fn)&memcpy,
    (airkiss_memcmp_fn)&memcmp,
    0,
};

LOCAL void ICACHE_FLASH_ATTR
airkiss_wifilan_time_callback(void)
{
    uint16 i;
    airkiss_lan_ret_t ret;

    if ((udp_sent_cnt++) >30) {
        udp_sent_cnt = 0;
        os_timer_disarm(&ssdp_time_serv);//s
        //return;
    }

    ssdp_udp.remote_port = DEFAULT_LAN_PORT;
    ssdp_udp.remote_ip[0] = 255;
    ssdp_udp.remote_ip[1] = 255;
    ssdp_udp.remote_ip[2] = 255;
    ssdp_udp.remote_ip[3] = 255;
    lan_buf_len = sizeof(lan_buf);
    ret = airkiss_lan_pack(AIRKISS_LAN_SSDP_NOTIFY_CMD,
        DEVICE_TYPE, DEVICE_ID, 0, 0, lan_buf, &lan_buf_len, &akconf);
    if (ret != AIRKISS_LAN_PAKE_READY) {
        os_printf("Pack lan packet error!");
        return;
    }

    ret = espconn_sendto(&pssdpudpconn, lan_buf, lan_buf_len);
    if (ret != 0) {
        os_printf("UDP send error!");
    }
    os_printf("Finish send notify!\n");
}

LOCAL void ICACHE_FLASH_ATTR
airkiss_wifilan_recv_callbk(void *arg, char *pdata, unsigned short len)
{
    uint16 i;
    remot_info* pcon_info = NULL;

    airkiss_lan_ret_t ret = airkiss_lan_recv(pdata, len, &akconf);
    airkiss_lan_ret_t packret;

    switch (ret){
    case AIRKISS_LAN_SSDP_REQ:
        espconn_get_connection_info(&pssdpudpconn, &pcon_info, 0);
        os_printf("remote ip: %d.%d.%d.%d \r\n",pcon_info->remote_ip[0],pcon_info->remote_ip[1],
                                                pcon_info->remote_ip[2],pcon_info->remote_ip[3]);
        os_printf("remote port: %d \r\n",pcon_info->remote_port);

        pssdpudpconn.proto.udp->remote_port = pcon_info->remote_port;
        memcpy(pssdpudpconn.proto.udp->remote_ip,pcon_info->remote_ip,4);
        ssdp_udp.remote_port = DEFAULT_LAN_PORT;

        lan_buf_len = sizeof(lan_buf);
        packret = airkiss_lan_pack(AIRKISS_LAN_SSDP_RESP_CMD,
            DEVICE_TYPE, DEVICE_ID, 0, 0, lan_buf, &lan_buf_len, &akconf);

        if (packret != AIRKISS_LAN_PAKE_READY) {
            os_printf("Pack lan packet error!");
            return;
        }

        os_printf("\r\n\r\n");
        for (i=0; i<lan_buf_len; i++)
            os_printf("%c",lan_buf[i]);
        os_printf("\r\n\r\n");

        packret = espconn_sendto(&pssdpudpconn, lan_buf, lan_buf_len);
        if (packret != 0) {
            os_printf("LAN UDP Send err!");
        }

        break;
    default:
        os_printf("Pack is not ssdq req!%d\r\n",ret);
        break;
    }
}

void ICACHE_FLASH_ATTR
airkiss_start_discover(void)
{
    ssdp_udp.local_port = DEFAULT_LAN_PORT;
    pssdpudpconn.type = ESPCONN_UDP;
    pssdpudpconn.proto.udp = &(ssdp_udp);
    espconn_regist_recvcb(&pssdpudpconn, airkiss_wifilan_recv_callbk);
    espconn_create(&pssdpudpconn);

    os_timer_disarm(&ssdp_time_serv);
    os_timer_setfn(&ssdp_time_serv, (os_timer_func_t *)airkiss_wifilan_time_callback, NULL);
    os_timer_arm(&ssdp_time_serv, 1000, 1);//1s
}

void ICACHE_FLASH_ATTR
smartconfig_done(sc_status status, void *pdata)
{
    switch(status) {
        case SC_STATUS_WAIT:
            printf("SC_STATUS_WAIT\n");
            break;
        case SC_STATUS_FIND_CHANNEL:
            printf("SC_STATUS_FIND_CHANNEL\n");
            break;
        case SC_STATUS_GETTING_SSID_PSWD:
            printf("SC_STATUS_GETTING_SSID_PSWD\n");
            sc_type *type = pdata;
            if (*type == SC_TYPE_ESPTOUCH) {
                printf("SC_TYPE:SC_TYPE_ESPTOUCH\n");
            } else {
                printf("SC_TYPE:SC_TYPE_AIRKISS\n");
            }
            break;
        case SC_STATUS_LINK:
            printf("SC_STATUS_LINK\n");
            struct station_config *sta_conf = pdata;

            wifi_station_set_config(sta_conf);
            wifi_station_disconnect();
            wifi_station_connect();
            break;
        case SC_STATUS_LINK_OVER:
            printf("SC_STATUS_LINK_OVER\n");
            if (pdata != NULL) {
                //SC_TYPE_ESPTOUCH
                uint8 phone_ip[4] = {0};

                memcpy(phone_ip, (uint8*)pdata, 4);
                printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]);
            } else {
                //SC_TYPE_AIRKISS - support airkiss v2.0
                airkiss_start_discover();
            }
            smartconfig_stop();
            break;
    }
}

void ICACHE_FLASH_ATTR
smartconfig_task(void *pvParameters)
{
    smartconfig_start(smartconfig_done);
    vTaskDelete(NULL);
}

smart_config.h

#ifndef APP_INCLUDE_SMART_CONFIG_H_
#define APP_INCLUDE_SMART_CONFIG_H_

void smartconfig_task(void *pvParameters);

#endif /* APP_INCLUDE_SMART_CONFIG_H_ */

然后主函数

    wifi_station_disconnect();

    wifi_set_event_handler_cb(wifi_event_monitor_handle_event_cb);

    wifi_set_opmode(STATION_MODE);
    smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS);//SmartConfig  +  AirKiss
    xTaskCreate(smartconfig_task, "smartconfig_task", 256, NULL, 2, NULL);

现在是模块一启动就进去配网...

编译出错

加上    -lairkiss\

下载进去,咱先测试下

SmartConfig:

  

下载完WIFI的程序,复位下WIFI

     

这个APP是我做的一个面向开发使用的,该APP源码获取方式:  https://www.cnblogs.com/yangfengwu/p/11249674.html

AirKiss :  关注我的这个测试用的公众号

复位WIFI模块

    

好,现在优化下

按下固件按钮(GPIO0)大约3S, 让GPIO2那个灯快闪,进入配网模式,然后60S超时检测.还有就是不让WIFI打印官方内部写的东西(打印的东西太多了...)

原文地址:https://www.cnblogs.com/yangfengwu/p/11429007.html

时间: 2024-10-08 03:45:28

26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网的相关文章

28-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(官方API版,非RTOS版)

https://www.cnblogs.com/yangfengwu/p/11432795.html 注:这节实现的功能是WIFI模块作为TCP 客户端,连接咱的TCP服务器,然后实现透传 本来想着做成断线重连,但是无论如何测试,使用官方给的API默认大约2个小时以后就会主动断开连接...... 其实和咱 https://www.cnblogs.com/yangfengwu/p/11112014.html  (TCP 服务器差不多) 先看下程序测试 (连接路由器测试,让电脑和WIFI连接同一个路

19-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 连接和断开

https://www.cnblogs.com/yangfengwu/p/11130428.html 渐渐的看过去,,,好多节了... 这节做一个C# TCP客户端 新建项目啥子的就不详细截图写了,自行看前面了解 (我的文章只要是有序号的,必须要看前面,因为我所写的教程即是基础又是综合) 先做个这个页面,先做连接和断开 链接TCP用这个变量 其实连接TCP 几句就完了 我定义了一个函数是因为,其实连接时阻塞的,,所以咱需要开个任务 C# 的任务是这样用 OK  现在测试 由于我是用的台式机,,没

20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信

https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient { public partial class Form1 : Form { private TcpClient myTcpClient = null;// TcpClient Thread ConnectThread;//连接线程 string ipAddress;//记录ip地址 int Port = 0;//端口号

12-ESP8266 SDK开发基础入门篇--PWM,呼吸灯

https://www.cnblogs.com/yangfengwu/p/11094085.html PWM其实没有什么,就是看着官方给的API,,,然后就是用呗 对了,其实对于RTOS SDK版本的开发可以直接去参考非RTOS SDK的API  这个直接有例子 其实嵌入操作系统也没有什么,底层自带的外设硬件功能该怎么样还是怎么样,操作系统也不能改变什么,,操作系统的存在只是去操作咱定义的函数,让这些函数执行的时候快速的切换执行... 我直接说第三个参数 第三个参数是说要定义一个 这样的数组  

21-ESP8266 SDK开发基础入门篇--C# TCP客户端 , 控制LED亮灭

https://www.cnblogs.com/yangfengwu/p/11192603.html 由于是台式机,,没有插无线网卡...所以呢我就用调试助手监控下数据 后期让WIFI连接路由器的时候,在一个局域网内再和开发板联合测试 我就做的尽量简单点 那个CRC还需要再往后放一放,,,,,,需要和WiFi一块...现在我台式机不能连接WiFi信号,所以,,,,,再等一等 大家如果是笔记本 ,可以连接WiFi的无线,,然后 测试就可以 原文地址:https://www.cnblogs.com/

6-ESP8266 SDK开发基础入门篇--操作系统入门使用

https://www.cnblogs.com/yangfengwu/p/11080567.html 了解了8266的串口了,这一节咱就自己写程序,处理一下数据,如果接收到 0xaa 0x55 0x01  就控制指示灯亮 0xaa 0x55 0x00  就控制指示灯灭 注意哈,我是用的假设没有操作系统的思路,其实如果有了操作系统应该用操作系统提供的API实现 因为8266是用的FreeRtos,,,我还没有深入了解这个系统,所以我先用我的方式实现,后期的文章可能需要等些时间更新了,因为我需要充电

7-ESP8266 SDK开发基础入门篇--串口处理数据,控制LED

https://www.cnblogs.com/yangfengwu/p/11087467.html 接着上一节的写 咱先做一个单片机串口接收到什么就回过来什么 咱自己写个发送函数,其实就是仿照官方的写的 别忘了 现在咱建个任务处理串口数据 下载进去 现在是三个任务都在运行了...操作系统是不是很神奇 现在做这个 咱就控制GPIO5.咱把这里屏蔽掉 现在做处理,,,其实很简单 现在下载进去 OK 了 下一节,咱做一个上位机来控制 https://www.cnblogs.com/yangfengw

Android 开发基础入门篇: 复制一个工程作为一个新的工程

说明 咱们做项目很多时候都需要复制一份工程出来作为一个新的工程 把第一节的工程拷贝到这一节 修改工程名字 打开软件导入此工程 修改包名 第一节的时候说了,一个APP一个包名 自行添加修改 自行修改 自行修改 选择 Sync Now 清理下工程 然后安装到手机 原文地址:https://www.cnblogs.com/yangfengwu/p/11909225.html

Linux及Arm-Linux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟