ESP8266实现联网配置

ESP8266的wifi设置网上已经很多文章,本文也是配置wifi信息,但是是一种自定义的通用方式而不仅仅用来配置wifi设置。本文通过使用ESP8266WebServer来实现一个网页配置。

先上代码

class CAutoConnect
{
    CConfigMgr m_configMgr;
    ESP8266WebServer m_autoConfigWebServer;
    bool m_bRunFirst = true;

    void TryConnect(const char *SSID, const char *PSW)
    {
        int tryCount = 0;
        WiFi.begin(SSID, PSW);
        while ((tryCount < MAX_TRY_COUNT) && (WiFi.status() != WL_CONNECTED))
        {
            delay(1000);
            tryCount++;
        }
    }

    void HandleHtmlRoot()
    {
        m_autoConfigWebServer.send(200, "text/html", AutoConfigHTML);
    }

    void HandleHtmlAutoConfig()
    {
        String ssid, psw;
        ssid = m_autoConfigWebServer.arg("ssid");
        psw = m_autoConfigWebServer.arg("psw");
        Serial.println("尝试连接路由器,SSID: " + ssid + "密码: " + psw);

        TryConnect(ssid.c_str(), psw.c_str());

        if (WiFi.status() == WL_CONNECTED)
        {
            m_autoConfigWebServer.send(200, "text/html", "hello esp8266");

            Serial.println("----------连接路由器成功");
            m_configMgr.SetSSID(ssid.c_str());
            m_configMgr.SetPSW(psw.c_str());
            // 保存一下,这玩意儿一般就是拔电。要自动析构保存怕是比较难
            m_configMgr.SaveConfig();
        }
        else
        {
            Serial.println("连接路由器失败------------");
        }
    }

    void HtmlConfigInit()
    {
        WiFi.mode(WIFI_AP_STA); // 双模式
        IPAddress ip, gateway, subnet;
        ip.fromString("192.168.1.1");
        gateway.fromString("192.168.1.1");
        subnet.fromString("255.255.255.0");
        WiFi.softAPConfig(ip, gateway, subnet);

        WiFi.softAP(AUTOCFGSSID, AUTOCFGPSW);

        m_autoConfigWebServer.on("/", std::bind(&CAutoConnect::HandleHtmlRoot, this));
        m_autoConfigWebServer.on("/AutoConfig", HTTP_GET, std::bind(&CAutoConnect::HandleHtmlAutoConfig, this));
        m_autoConfigWebServer.begin(80);
    }

    void HtmlConfig(bool useTimeout=false)
    {

        unsigned long start = millis();

        while (true)
        {
            m_autoConfigWebServer.handleClient();
            if (WiFi.status() == WL_CONNECTED)
            {
                Serial.println("----配网成功----");
                m_autoConfigWebServer.close();
                break;
            }
            // 60秒还没有连接则退出
            if (useTimeout&&(millis() - start >= 60 * 1000))
            {
                break;
            }
        }
    }

public:
    CAutoConnect() : m_configMgr()
    {
        HtmlConfigInit();
    }

    ~CAutoConnect() {}

    void AutoConnect()
    {
        if (m_bRunFirst)
        {
            HtmlConfig(true);
            m_bRunFirst = false;
        }

        // wifi已经连接直接退出
        if (WiFi.status() == WL_CONNECTED)
            return;

        if ( m_configMgr.IsValid())
        {
            TryConnect(m_configMgr.SSID().c_str(), m_configMgr.PSW().c_str());
            if (WiFi.status() == WL_CONNECTED)
                return;
        }
        Serial.println("进入HTML配网模式");
        HtmlConfig();
    }
};

CConfigMgr 是一个配置保存和读取类,这个另外说。

CAutoConnect的AutoConnect方法来实现自动配置和连接wifi(当然也可以配置其它参数);如果是开机启动则进入60秒配网模式,这个时候在192.168.1.1即可打开网页配置。AutoConfigHTML 为配置网页。如果60秒没有通过网页配置,它则从保存的配置来设置wifi。当然保存的连接不可用也会进入网页配网模式。

const char *AutoConfigHTML = u8R"esp8266_html(<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF8">
    <title>ESP8266自动配置</title>
</head>

<body style="font-size: 30px">

    <style>
        .inputText{
            height: 38px;
            font-size: 30px;
            line-height: 30px;
            padding-left: 15px;
            border-radius: 10px;
            background-color: #dff1f7;
            border: 2;
        }
        .inputText:focus{
            outline: none;
            background-color: #d6e4eb;
        }
        .buttonText{
            height: 38px;
            font-size: 30px;
            line-height: 30px;
            padding-left: 15px;
            border-radius: 10px;
            background-color: #FE5E08;
            border: none;
        }
        .buttonText:focus{
            outline: none;
            background-color: #FE5E08;
        }
    </style>

    <center>
        <form>
            <table>
                <tr>
                    <td>Wifi SSID:</td>
                    <td><input type="text" class="inputText" id="SSID" placeholder="WIFI SSID"></td>
                </tr>
                <tr>
                    <td>Wifi 密码:</td>
                    <td><input type="text" class="inputText" id="PSW" placeholder="WIFI PASSWORD"></td>
                </tr>
            </table>
            <input type="button" class="buttonText" value="连接到WIFI" onclick="configWifi()">
        </form>
    </center>
    <script language="javascript">
        function isNotEmptyStr(s) {
            if (typeof s == 'string' && s.length > 0) {
                return true
            }
            return false
        }
        function configWifi() {
            var ssid = SSID.value;
            var psw = PSW.value;
            if (!isNotEmptyStr(ssid)) {
                alert("请输入有效的SSID");
                return;
            }
            if (!isNotEmptyStr(psw)) {
                alert("请输入有效的Wifi密码");
                return;
            }
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", "/AutoConfig?ssid=" + ssid + "&psw=" + psw, true);
            xmlhttp.send();
        }
    </script>
</body>

</html>)esp8266_html";

网页实际效果为以上,当然这里可以添加任意需要处理的配置参数,合理保存即可。

 HtmlConfigInit为webserver主要方法。

使用方法,先打开手机WIFI。连接到名为ESP8266_WIFI的wifi热点(注意,因为这个节点无法访问internet。部分手机网络助手会自动断开。所以先在手机里设置一下防止它自动断开)。这个时候使用浏览器打开 192.168.1.1

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的HC89F0431驱动ESP8266实现联网的工程代码示例,仅供参考: ```c #include <REG89F0431.H> #define ESP8266_BAUDRATE 115200 void uart_init() { // 设置波特率为9600bps SCON = 0x50; TMOD &= 0x0F; TMOD |= 0x20; TH1 = 0xFD; TL1 = TH1; TR1 = 1; // 设置数据位数为8位,无校验位,停止位为1位 SCON = 0x50; // 允许串口中断 ES = 1; } void uart_send_byte(unsigned char data) { SBUF = data; while(!TI); TI = 0; } unsigned char uart_read_byte() { unsigned char data; while(!RI); data = SBUF; RI = 0; return data; } void esp8266_init() { // 发送AT指令,等待ESP8266返回“OK”响应 uart_send_byte('A'); uart_send_byte('T'); uart_send_byte('\r'); uart_send_byte('\n'); while (uart_read_byte() != 'O'); while (uart_read_byte() != 'K'); // 发送AT+CWJAP指令,设置WiFi SSID和密码,等待ESP8266返回“OK”响应 uart_send_byte('A'); uart_send_byte('T'); uart_send_byte('+'); uart_send_byte('C'); uart_send_byte('W'); uart_send_byte('J'); uart_send_byte('A'); uart_send_byte('P'); uart_send_byte('='); uart_send_byte('"'); uart_send_byte('S'); uart_send_byte('S'); uart_send_byte('I'); uart_send_byte('D'); uart_send_byte('"'); uart_send_byte(','); uart_send_byte('"'); uart_send_byte('P'); uart_send_byte('A'); uart_send_byte('S'); uart_send_byte('S'); uart_send_byte('W'); uart_send_byte('O'); uart_send_byte('R'); uart_send_byte('D'); uart_send_byte('"'); uart_send_byte('\r'); uart_send_byte('\n'); while (uart_read_byte() != 'O'); while (uart_read_byte() != 'K'); // 发送AT+CIPSTART指令,打开TCP连接或UDP连接,等待ESP8266返回“OK”响应 uart_send_byte('A'); uart_send_byte('T'); uart_send_byte('+'); uart_send_byte('C'); uart_send_byte('I'); uart_send_byte('P'); uart_send_byte('S'); uart_send_byte('T'); uart_send_byte('A'); uart_send_byte('R'); uart_send_byte('T'); uart_send_byte('='); uart_send_byte('T'); uart_send_byte('C'); uart_send_byte('P'); uart_send_byte(','); uart_send_byte('"'); uart_send_byte('1'); uart_send_byte('9'); uart_send_byte('2'); uart_send_byte('.'); uart_send_byte('1'); uart_send_byte('6'); uart_send_byte('8'); uart_send_byte('.'); uart_send_byte('0'); uart_send_byte('.'); uart_send_byte('1'); uart_send_byte('"'); uart_send_byte(','); uart_send_byte('8'); uart_send_byte('0'); uart_send_byte('0'); uart_send_byte('0'); uart_send_byte('\r'); uart_send_byte('\n'); while (uart_read_byte() != 'O'); while (uart_read_byte() != 'K'); } void esp8266_send_data(char *data) { // 发送AT+CIPSEND指令,设置发送数据的长度,等待ESP8266返回“>”响应 int len = strlen(data); char len_str[10]; sprintf(len_str, "%d", len); uart_send_byte('A'); uart_send_byte('T'); uart_send_byte('+'); uart_send_byte('C'); uart_send_byte('I'); uart_send_byte('P'); uart_send_byte('S'); uart_send_byte('E'); uart_send_byte('N'); uart_send_byte('D'); uart_send_byte('='); uart_send_byte(len_str[0]); uart_send_byte(len_str[1]); uart_send_byte(len_str[2]); uart_send_byte(len_str[3]); uart_send_byte('\r'); uart_send_byte('\n'); while (uart_read_byte() != '>'); // 发送数据,等待ESP8266返回“SEND OK”响应 for (int i = 0; i < len; i++) { uart_send_byte(data[i]); } while (uart_read_byte() != 'S'); while (uart_read_byte() != 'E'); while (uart_read_byte() != 'N'); while (uart_read_byte() != 'D'); while (uart_read_byte() != ' '); while (uart_read_byte() != 'O'); while (uart_read_byte() != 'K'); } void main() { uart_init(); esp8266_init(); esp8266_send_data("Hello world!"); while (1); } ``` 需要注意的是,以上代码仅供参考,具体的ESP8266模块配置和数据传输方式可能存在差异,需要根据实际情况进行调整和修改。同时需要注意避免数据的丢失和错误,保证数据传输的可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值