需求
最近刚接触BLINKER,不得不说,这是一个很好,很方便的工具。可以快速开发特联网项目。手头上正了有一个小项目,大致的需求如下:
1、一个基于8266的小终端。用户在使用之前必须要配网,配上后才能正常连上BLINKER的APP进行控制。
2、终端上会设计一个reset键,使用者在短按该键会使终端重启,那么这个重启会使系统重新连接上配好的wifi网络。如果是长按reset键,则使该 终端重新进入配网模式。
实现
当然有两种实现方式。一种 是利用ESP8266自带的SmartConfig功能,实现自动配网,这个好实现,同时把用户配网的SSID和PASSWORD以及配网成功的一个标志位存入EEPROM里。这样可以实现上述的需求。缺 点当然是和须要用微信云扫配网的二维码。用安信可提供的一个配网程序来完成。这种 方式就让用户体验会差一点,不能在一个APP上完全实现操作。
第二种 实现就是用BLINKER提供的EspTouch方式。(例程见这个链接)。其中的关键 就是最上面的那个宏定义
#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG
对应编译时,看到有第二个宏,系统用的是Blinker.begin(auth)
这个语法.。运行时启动的是EspTouch的配网模式(和ESP的SmartConfig功能一样,只是名字不一样)。但是由于上述的需求,我在SETUP里一定会有一个判断,当用户已在上一次配过网了,并把配网的参数SSID和PASSWORD都 存在了EEPROM里以后,我就要启动的是正常联网模式,也即要用到Blinker.begin(auth,ssid,pass)
这个语句。
然后苦逼的事性就来了。这时编译会出现如下的错误:
*
no matching function for call to ‘BlinkerESPMQTT::begin(char [13], const char*&, const char*&)’
一开始一直不理解为什么会出现这个错误,我语法没有错。(具体见下面程序)。后来我反复试了以后发现问题了。我只要删队上面的BLINKER_ESP_SMARTCONFIG
这个宏,就没有出错。如果加上这个宏,而出错的会Blinker.begin(auth)
这个语句了。也就是说我没办法同时在程序里根据条件来选择配网和连接模式。不知道 我这个困惑有什么办法解决吗。下面是两个程序 片断
#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG
。。。。。。
void setup()
{
if (flag !=1)
{
// IF flag!=1 then set 8266 in SmartConfig model .
Serial.println("<<<<<<<现在是【配置】模式>>>>>>>");
Blinker.begin(auth);
}
if (flag==1)
{
myssid=EEPROM_read(1,32); //从第一位读32位
myssid.trim();
mypass=EEPROM_read(33,11); //从第33位读11位
mypass.trim();
Serial.println("登入的SSID是:"+myssid+"密码是:"+mypass);
ssid = myssid.c_str(); //把string 赋给 char*
pass = mypass.c_str();
Serial.println("执行BLinker.begin()");
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
Blinker.begin(auth,ssid,pass);
}
}
是我思路错了还是模式错了。哪位高手帮我指证一下。