物联那点事儿之SmartConfig技术一键配网!(arduino+点灯科技篇)

前言

  好久没更新了,最近在研究用ardunio+阿里云物联网平台+微信开发者者工具做微信小程序的项目,先来更新一下使用点灯科技第三方平台编写程序的代码吧!最近接触了了阿里云物联网平台之后,尤其是对mqtt的消息和订阅方面的知识,有点懵逼,发现还是点灯科技这个平台比较适合上手,因为blinker给出的库文件里面封装了mqtt的代码,新手是不需要考虑这个的,先上手如何使用smartConfig技术给esp8266智能配网吧!这个过程和刚买回家的天猫精灵配网差不多,具体请往下阅读!这篇帖子呢我以点灯科技的温湿度为例,代码中不包含小爱同学的代码,参考这篇文章的朋友可根据自己的需求自行更改代码哈。废话不多说,看下方!

物联那点事儿专栏回顾

  • arduino+点灯科技+温湿度DHT11+esp01=自制网络温湿度计
  • arduino+点灯科技+wifi继电器+esp01=网络远程控制开关机
  • ardunio+点灯科技+温湿度+云存储=温湿度变化曲线

前两篇帖子我们都是用的直接配网的方式,直接将wifi的名称和密码写到代码中,在进行blinker初始化的时候直接将代码中写好的wifi名称和密码放到blinker.begin()函数中。

char ssid[] = "**********";  //你的wifi 名称
char pswd[] = "**********";  //你的wifi 密码/
Blinker.begin(auth, ssid, pswd); // // 初始化blinker 

在代码中直接将wifi名称和密码直接写进去的话,这真的不是很符合现实中的需求,如果设备挪窝了咋办?如果换路由器了咋办?如果wifi名称和密码改了咋办?只能重新烧录程序了,要想批量生产的话是不现实的。而smartConfig技术就完美地解决了这个问题。


正文

  1. 准备:使用ardunio IDE上传程序(一定要安装好Blinker库和DHT库),手机配网方式用安信可的微信公众号直接给设备配网就可以了,当然也可使用手机app的esptouch配网,这里呢我还是建议用微信公众号去配网,比较省事情。硬件方面,用DHT11和esp01/nodemcu(和esp01相比就是引脚比较多,原理是一样的,都是esp8266)。
  2. 使用smartConfig技术进行wifi配网的大概原理:

 ; ; ;物联那点事儿之SmartConfig技术一键配网!(arduino+点灯科技篇)_第1张图片
    大概的意思就是,手机连接路由器,手机通过软件向外发出UDP的广播信号,并且这时不管是否有人接收,就一直往外广播,其中的广播信号的内容就是wifi的名称和密码,esp8266设备上电开机后,收到广播信号,拿到路由器的wifi名称和密码,就连接上了对应的路由器,类似于wifi共享。

代码部分

    在给es98266设备编写连接wifi程序的时候,实则是用的ESP8266WIFI库,这里呢,点灯科技给的库文件也包含了这个ESP8266WIFI库的内容,所以我们直接在前面包含blinker.h就能完成一键配网的功能。
整体思路: 直接配网的代码就是将wifi的名称和密码放到bkinker.begin()函数中,这里呢,一键配网也就是设备获取到wifi的名称和密码,然后再传给blinker.begin()函数中,所以需要删除之前程序中的ssid和pswd数组。
一、先写一个配网函数,用于获取到手机发送的UDP广播信号中的wifi名称和密码。

void smartConfig()//配网函数
{
  WiFi.mode(WIFI_STA);//使用wifi的STA模式
  Serial.println("\r\nWait for Smartconfig...");//串口打印
  WiFi.beginSmartConfig();//等待手机端发出的名称与密码
  //死循环,等待获取到wifi名称和密码
  while (1)
  {
    //等待过程中一秒打印一个.
    Serial.print(".");
    delay(1000);                                             
    if (WiFi.smartConfigDone())//获取到之后退出等待
    {
      Serial.println("SmartConfig Success");
      //打印获取到的wifi名称和密码
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      break;
    }
  }
}

二、写一个wifi初始化函数,用于wifi连接操作。
    因为esp8266乐鑫中的flash中会存储之前连接的wifi名称和密码,所以之前只要连接好WiFi之后,设备下次上电就不需要再去使用smartConfig技术去获取路由器wifi名称和密码,可以直接使用flsah存储的wifi名称和密码去连接路由器,.。

代码思路:

设备上电后,设备尝试使用flash中存储的wifi名称和密码连接路由器,定义一个整形全局变量count记录尝试连接次数,定义一个布尔型全局变量WIFI_Status并赋值为TRUE,用于表示连接状态,表示如果次数达到五次,WIFI_Status赋值为flase,执行smartConfig()配网函数。(1)定义全局变量。

int count=0;
bool WIFI_Status = true;

(2)初始化函数体。

void WIFI_Init()
{
    Serial.println("\r\n正在连接");
    //当设备没有联网的情况下,执行下面的操作
    while(WiFi.status()!=WL_CONNECTED)
    {
        if(WIFI_Status)//WIFI_Status为真,尝试使用flash里面的信息去 连接路由器
        {
            Serial.print(".");
            delay(1000);                                        
            count++;
            if(count>=5)
            {
                WIFI_Status = false;
                Serial.println("WiFi连接失败,请用手机进行配网"); 
            }
        }
        else//使用flash中的信息去连接wifi失败,执行
        {
            smartConfig();  //smartConfig技术配网
        }
     }  
     //串口打印连接成功的IP地址
     Serial.println("连接成功");  
     Serial.print("IP:");
     Serial.println(WiFi.localIP());
}

三、主函数中调用WIFI初始化函数,修改blinker.begin()函数
前面的代码都要写在setup函数前面啊,这样才可以在setup函数中调用wifi初始化函数,blinker.begin()函数中的参数分别是设备key、wifi名称、wifi密码。设备key是固定的,另外两个参数在 smartConfig()获取到的。

   WIFI_Init();//调用WIFI函数
    Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());//运行blinker

四、操作配网
代码上传成功后,就可以用安信可科技微信公众号给设备一键配网了,具体操作如下图,也看下面的演示视频。

一键配网效果演示

物联那点事儿之SmartConfig技术一键配网!(arduino+点灯科技篇)_第2张图片
源码获取地址:可点击跳转至GitHub获取整篇源码

总结

使用点灯科技第三方平台可以实现一键配网,当然如果用阿里云物联网平台也是可以的,道理和这个一样,可以自己尝试,我已经试出来了。

逆水行舟不进则退,有问题在下方评论或者私聊我一直在,一起进步!

你可能感兴趣的:(物联那点事儿)