一年前本想就ESP8266自己做一套简单的智能家居产品,后面就面临实习和毕业工作就放下了,去做了ZigBee,最近因为一些原因离职了,就想着完成自己大学的这个梦想,在实际开发中,发现网上的ESP8266SDK有太多坑了,这里就做个记录吧,也帮助有一样梦想的博友,我会从一年的进度开始写,烧录程序和安信可IDE的安装就不重复说了,网上有很多最新,实在搞不定在问我吧。
编程软件: 安信可IDEV1.5.2
ESP8266SDK版本: ESP8266_NONOS_SDK-3.0
为了方便测试,我就先把8266的两个串口波特率都设置为9600,直接use_init 函数里面设置
uart_init(9600,9600); // 串口0,串口1
标题我们说了TCP连接是要在AP模式下的,所以我们先把ESP8266设置为AP模式
void Wifi_AP_Init(void)
{
struct softap_config apConfig; //WiFi参数结构体
apConfig.ssid_len = os_strlen("longfeng_keji"); //设置wifi命长度
//设置ssid名字
os_strcpy(apConfig.ssid,"longfeng_keji");
//设置wifi密码
//os_strcpy(apConfig.password,"12345678");
//设置加密方式
apConfig.authmode = AUTH_OPEN;
//设置信标间隔时长,100ms-60000ms
apConfig.beacon_interval = 100;
//通道号,1-13
apConfig.channel = 11;
//最大连接数
apConfig.max_connection = 4;
//隐藏ssid,false
apConfig.ssid_hidden = 0;
//设置wifi soft_ap接口配置,并保存到flash
wifi_softap_set_config(&apConfig);
wifi_set_opmode(0x02);
}
我这里AP热点设置为开放,并没有设置密码,如果要设置密码,把上面的的那条密码注释去掉,修改自己想要的密码,注意: 密码至少要8位,不然运行会出现错误,同时还要把设置加密修改加密,要那种加密可以看这里
typedef enum _auth_mode {
AUTH_OPEN = 0,
AUTH_WEP,
AUTH_WPA_PSK,
AUTH_WPA2_PSK,
AUTH_WPA_WPA2_PSK
} AUTH_MODE;
现在我们已经写好设置AP模式这部分代码了,接下来我们就进行TCP Sever这部分代码的编写了。
首先我们先定义一个TCP结构体
struct espconn User_Tcp_Espconn;
接下来就只要配置结构体里面的内容,根据自己想要的进行设置
void Inter_Init_Tcp(uint32_t Local_port)
{
os_printf("开始连接");
User_Tcp_Espconn.proto.tcp = (esp_tcp *) os_malloc(sizeof(esp_tcp)); //分配空间
User_Tcp_Espconn.type = ESPCONN_TCP; //设置类型为TCP
User_Tcp_Espconn.state = ESPCONN_NONE; //初始状态
User_Tcp_Espconn.proto.tcp->local_port = Local_port; //本地端口
espconn_regist_connectcb(&User_Tcp_Espconn,Server_Listen); //注册TCP连接成功建立后的回调函数
espconn_regist_reconcb(&User_Tcp_Espconn, Server_Recon); //注册 TCP 连接发生异常断开时的回调函数,可以在回调函数中进行重连
espconn_accept(&User_Tcp_Espconn); //创建 TCP server,建立侦听
espconn_regist_time(&User_Tcp_Espconn, 180, 0); //设置超时断开时间 单位:秒,最大值:7200 秒
}
还有,因为我们是作为服务端的,所有ESP8266默认的服务端ip为
192.168.4.1
如果需要修改这个ip,听说是可以修改的,不过因为我没有用到,就没去研究了,如果谁知道怎么修改的话,可以在评论说告诉我下。
假设现在已经连接成功了,那我们就在上面写的连接成功的回调函数里注册其他函数
void ICACHE_FLASH_ATTR
Server_Listen(void *arg)
{
struct espconn *pespconn = arg;
os_printf("连接成功");
espconn_regist_recvcb(pespconn,Server_Recv); //接收
espconn_regist_sentcb(pespconn,Server_Sent); //发送
espconn_regist_disconcb(pespconn,Server_Discon); //断开连接
}
接收回调函数
void ICACHE_FLASH_ATTR
Server_Recv(void *arg, char *pdata, unsigned short len)
发送成功回调函数
void ICACHE_FLASH_ATTR
Server_Sent(void *arg)
连接断开回调函数
void ICACHE_FLASH_ATTR
Server_Discon(void *arg)
好了,基本架构我们都写完了,接下来就只需把
Wifi_AP_Init()
Inter_Init_Tcp()
这两个函数放到user_main.c文件中的user_init的这个函数里,烧录固件就可以实现AP模式TCP连接了。
当然最后我们这两个函数肯定不是放在这里,放这里不符合我们要实现智能家居的想法,后面我会随着进度继续写下去的,这篇就到这里就结束了,如果有哪里写错了,欢迎指正。