唯倚社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 928|回复: 2

[学习教程] ESP8266模块连接TLink平台控制WIOT继电器的开关

[复制链接]

127

主题

293

帖子

4491

积分

LV3

Rank: 3Rank: 3

积分
4491

最佳新人

发表于 2017-10-23 16:41:33 | 显示全部楼层 |阅读模式

轻松玩转社区

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
ESP8266连接T-link云控制WIOT继电器

本教程含ESP8266源码

       大家在测试了wiot-1能内网控制的学习之后,很多朋友希望能在外网对wiot-1模块进行控制,今天我们就来将wiot-1接入一个第三方平台从而来达到外网控制的教程.
       如果要在外网进行控制,那么我们必须让这个模块作为客户端,因为外网中,你无法找到你的设备,你必须依靠一个第三方的服务器作为中转.有关于更多的网络知识,以后我们会继续更新这方面的知识!
      
      今天我们选择了一个比较好用的第三方物联网平台,T-link平台,这个平台的好处在于简单开发易于理解本次教程的知识.而且你也可以在此基础上进行二次开发.

编译环境:ESP_IDE                  

编译语言:C                             

硬件模块:WiFi继电器WIOT-1模块             WIFI传感器 SIOT_1模块

通信方式:串口                         TCP

平台:T-link云平台


WIOT-1淘宝链接:  



平台使用流程
进入云平台官网,网址:http://www.tlink.io/index.htm

第1步注册一个账号。

7%{VUSQXP`XT2N{%(C{OK1E.png

$%~E0Q`QI_FDZ7O0]PVVH4O.png


注册完成后我们开始创建设备
第2步 添加(创建)设备

F0D72BV)26~BF[8I61ZV20L.png

第3步添加设备名称 -> 选择协议 -> 选择上传周期 -> 追加类型 -> 更换图标 -> 选择是否公开

A9~A0][3FG]4VUCVQL9K3A4.png
因为我们是开关设备,涉及到隐私问题,故此,我们建议选择不公开

还是在第4步的界面下面   选择地区 -> 点击创建设备

Z@XF`[[2TJ(31P}VTBMLXXG.png
这个地址可以任其自由选择

第5步 点击进入设备 点击设备连接
4{IO%T)9HF{VYZYE1MI72XA.png

我们可以看到我们的设备信息

`D[UJGTX8)C3H}J1IQ34LTG.png

第6步定协议 定自定义协议标签
M_ZTM8P27538%D@W)YEIV)P.png

协议数据头为W,数据长度是不限制的,数据结束符为E,一定记得保存



第7步点击所有传感器 点击写入指令
JXGM2]E)X5))XVW8SC9({}V.png

选择自定义格式,ON为W1E,OFF为W0E分别点击写入,然后点击确认,确认之后所有协议已经定完
AXI)[FR)YWY[AH58)0IQBDL.png


第8步在左边的黑色属性栏点击监控中心,进入监控中心
S@)RYGJMBJ7E49IYN)W@NK7.png

进入之后我们可以看到我们的设备是未连接的,且设备为灰色

6%XQQRDGWY8HZPZBST)(0OY.png


第9步 我们进行TCP工具模拟设备连接云平台


我们用到的TCP助手软件名称为TCP&UDP测试工具
下载链接:http://pan.baidu.com/s/1geBjJer  密码:9mp5

TCP&UDP测试工具安装教程   http://bbs.weiecn.com/thread-377-1-1.html

先点击创建连接 选择类型为TCP 数据IP和端口号 选择随机 点击创建

L8FIK3ZEO]6$QEKG`DY7F$R.png

IP为:tcp.tlink.io
端口号:8647
注意格式别打错了,域名没有空格

依次点击连接



~RJ@RO]~SD4S]31WWzHOV.jpg


当连接上服务器之后我们的左边的图标会变成绿色,然后发送系列号连接设备,这样就可以让服务器完成设备的注册,也就是类似于我们的账户登陆过程一样.


91C]78{OH1`U~(MXU@G]D`P.png

复制序列号粘贴到TCP工具的发送区

注意序列号是没有空格的

[6%LHA4U7__OZV%%4$@OLG8.jpg


当设备连接上之后我们云平台的设备颜色变成了绿色,当前状态也变成了已连接。
到了这一步说明已经接入tlink平台.


(BE5~])(3F14ZVRY%$C{4K2.png



将开关拨动到ON


Y[4VMWTE}DGWP%EL0G7M99U.png



Y~{BA_7P%4ID913H$OX2L]Q.png


将我们可以看到TCP工具的接收区接收到了相应数据,我们发送W0E到云平台,开关则又会回到OFF,因为这是我们之前定好的协议

这里你可以自行定义协议.


W~$%FNMX15D{V91(67UOTJW.jpg

W1E为ON,W0E为OFF


代码实现
       首先我们得弄得一个流程,既然我们要连接云平台那么我们得模块必须是作为客户端,而且需要连接WiFi,意思是模块必须连接网络。那么我们还得做一个事情,那就是云平台服务器的IP地址不是固定的,只有端口号固定。那么我们需要对它进行解析,来获取我们的固定的服务器的IP地址,或许你会说我们解析一次然后把它的IP记下来固定下来,以后服务器的IP就是我们记下来的这个。这样认为肯定是错的,我们从DNS域名中解析出来的IP是会变的。在我们的ESP8266SDK编程手册中有一个函数举例,函数名espconn_gethostbyname。手册中举了一个例子。

       主要流程就是:先连接WiFi,在获取本地IP,获取完本地IP去解析DNS,获取到目标IP然后连接服务器。连接到服务器成功之后发送序列号连接设备,再与设备进行通信。

主要代码讲解
我们先将工程导入,导入工程流程我就不讲解了。我们进入工程之后先打开我们的user_main.c文件,找到我们WiFi连接函数user_set_station_config
配送的源程序,所有用户需要更改的程序都在app文件夹的user和driver下,切记!!!

1ZKK7IW@8[6XB~L9FZVIB.png



[C] 纯文本查看 复制代码
void ICACHE_FLASH_ATTR
user_set_station_config(void)
{
char ssid[32] = "XXXXX";                                        //设置路由器WiFi名称
char password[64] = "XXXXXXX";                //设置WiFi密码
struct station_config stationConf;
stationConf.bssid_set = 0;
os_memcpy(&stationConf.ssid, ssid, 32);
os_memcpy(&stationConf.password, password, 64);
wifi_station_set_config(&stationConf);
}

连接的WiFi用户家里的WiFi,WiFi名称与密码都设为数字或者英文,最好不能出现因为,可能导致连接不上WiFi,连接不上就获取不到本地IP,后续的工作也开展不了。
切记WiFi名称和密码一定是自己路由器的 一定要正确!!!!!

于此同时我还对按键也做了相应函数。当程序正常运行的时候,当用户按下按键时也能对继电器进行开或者关的操作,并且会向云平台发送数据进行对接同步。

8KOWY}2LX57H`WCL%AGK}OW.png
RPMX9YI_XR0CH3IZ211OW(O.png

这是我们的主函数,我们对各个模块进行了初始化,并对相应函数进行了调用,开启了我们的按键定时器函数。这里我们还注册了TCP连接函数。

现在我们来打开DNS.c文件,我们看看里面的函数。

34EVA`QO%@_XEJX(H5GH8T2.png



[C] 纯文本查看 复制代码
void getipbydns(char *name,dns_found_callback found)
{
        ip_addr_t addr;
        user_tcp_conn.proto.tcp = &user_tcp;
        user_tcp_conn.type = ESPCONN_TCP;
        user_tcp_conn.state = ESPCONN_NONE;
        tcp_server_ip.addr = 0;
    espconn_gethostbyname(&user_tcp_conn,name, &addr, found); // DNS function
}


我们可以看到这个文件里面只有一个函数,函数名getipbydns,主要功能就是得到解析后的DNS,传进去的参数一个是域名DNS指针,另外一个是要执行的回调函数。

现在我们来看TCPClient.c文件这里我会着重介绍几个重要函数

E@_~LVF0CUGW)H}M}OWOU`M.png


[C] 纯文本查看 复制代码
LOCAL void ICACHE_FLASH_ATTR
user_dns_found(const char *name, ip_addr_t *ipaddr, void *arg)
{
    struct espconn *pespconn = (struct espconn *)arg;

    struct ip_addr ip;
    if (ipaddr == NULL) {
        os_printf("user_dns_found NULL \r\n");
        return ;
    }
    os_printf("user_dns_found %d.%d.%d.%d  \r\n",IP2STR(ipaddr));
    ip.addr=ipaddr->addr;
            struct ip_info info; //用于获取IP地址的信息
        wifi_get_ip_info(STATION_IF,&info);
        my_station_init(&ip,&info.ip,8647);
}


这个时查找DNS是否存在的回调函数,当检测到DNS存在时,去提取目标IP和端口号还有本地IP进行连接。

1D8U82~[APKH33@Q%7M@FVX.png


[C] 纯文本查看 复制代码
void wifi_handle_even_cb(System_Event_t *evt)
{
  switch(evt->event)
  {
    case EVENT_STAMODE_GOT_IP:
                os_printf("IP->OK\n");                //获取IP成功
                HaveIP=true;
                reconnected=true;
                getipbydns("tcp.tlink.io",user_dns_found);
      break;
      default:
              os_printf("IP->ON\n");
              reconnected=false;
                HaveIP=false;
          break;
  }
}


这个函数只有当我们连接上WiFi之后我们就会获取到本地IP,当获取到本地IP之后我们就对目标域名DNS进行解析,从而获取到目标IP,并连接上服务器。

97S353{9G{6`H[P2BU9O{_Q.png


这是我们的TCP接收函数,这里我们对接收到的数据进行判断然后对继电器进行处理。当收到W1E为开继电器,W0E为关继电器。

70N(HFC)PB{WFCYE55C_X2V.png

[C] 纯文本查看 复制代码
struct espconn *pespconn;
void ICACHE_FLASH_ATTR user_tcp_connect_cb(void *arg){
        pespconn = arg;
    espconn_regist_recvcb(pespconn,user_tcp_recv_cb);//注册接收数据的回调函数
    espconn_regist_sentcb(pespconn,user_tcp_sent_cb);//注册发送数据成功的回调函数
    SendTcpStr("QXN80S46211Q63O0");
    espconn_regist_disconcb(pespconn,user_tcp_discon_cb);//注册断开连接的回调函数

}

这是我们的TCP注册时间函数,当我们连接上TCP是我们给云平台发送设备序列号,发送完成之后我们就能连接上设备。这里的序列号一定是对应你的设备的序列号的,而且序列号具有唯一性。
注意序列号要跟你自己的设备上的序列号对上,切记!!!

L_0IL{U`Y`NO09A)35PYO{Y.png

这是我们的TCP底层配置连接函数。具体参考ESP8266编程手册,在这里就不做详细的介绍了。
记住一点,不管你更改了任何东西,编译之前一定要保存全部。
到此我们的代码介绍完毕,我们对工程编译下载。当程序正常运行,连接上设备后,我们可以通过云平台的监控中心控制继电器,当我们按下板子上的下载按键我们也能看到它能对继电器进行控制,并且能与云平台进行同步。至此我们实现了外网控制,只需你的手机有网络即可进行远程控制。

如果更改了代码,下载之前一定要全部保存,然后在进行编译,并且你下载时固件路径一定要正确,切记!!!
当我们连接上云平台服务器时,我们可以打开串口看到有相应数据发送上来。


[[W}_4Y}G8E22Z%XTWKWCTA.png

可以看到我们设备的IP DNS 网关,而且收到IP->OK说明我们已经连接上WiFi,并且能正常解析DNS
注意用户下载的程序目录是带中文的,编译环境和下载烧录软件一定不能出现中文路径,所以当用户下载完成之后立马更改路径名称,改成英文或者数字

程序源码分享链接
游客,如果您要查看本帖隐藏内容请回复


评分

参与人数 1E币 +10 收起 理由
admin + 10 不错,支持下

查看全部评分

127

主题

293

帖子

4491

积分

LV3

Rank: 3Rank: 3

积分
4491

最佳新人

 楼主| 发表于 2017-10-27 22:37:54 | 显示全部楼层
666666666666666
回复

使用道具 举报

1

主题

6

帖子

58

积分

LV1

Rank: 1

积分
58
发表于 2018-2-7 16:34:11 | 显示全部楼层
system_uart_de_swap
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|weiecn ( 湘ICP备14002058号 )

GMT+8, 2018-5-25 20:46 , Processed in 0.088241 second(s), 12 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表