唯倚社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 874|回复: 3

[学习教程] ESP8266模块连接T-link云上传SIOT-DHT11数据

[复制链接]

132

主题

302

帖子

3693

积分

LV3

Rank: 3Rank: 3

积分
3693

最佳新人

发表于 2017-10-25 22:37:20 | 显示全部楼层 |阅读模式

轻松玩转社区

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

x
ESP8266模块连接T-link云上传SIOT-DHT11数据
本教程配送ESP8266源码
主要目的及流程
     背景目的
       针对于用户的提议与要求,希望本产品能够实现在外网上的控制,而不仅仅局限于内网。目前为止,我们向用户推出的教程指导与开发环境一直以TCP内网通信作为媒介,然而唯倚SIOT-1(DHT11)   WIFI传感器作为一款学习和自行DIY的教学模块,产品本身就是能够建立外网通信的(需使用者自身对模块进行二次开发)。但是唯倚物联不止是为广大单片机爱好者开发者提供便捷通道的团队,更是以服务用户、创新产品为目的团队。在外网通信上,介于公司一直在研发最新外网方案,研发还处在中期阶段,架构上存在不稳定因素,目前还未推出以公司自身服务器为平台的外网连接系统。为满足广大用户的需求,本公司以此教程作为一个范例,教大家如何借助网络上已有的免费的云平台,来实现本产品的互联,搭建一个属于你的外网控制设备。这些云平台在一定需求范围内是有其优势的,且具有一定的稳定,一般情况下不会存在数据掉包情况。而在接下的示范中,我们选择的T-link这个平台,连接与使用上相对简单,用户也比较容易懂,方便用户二次开发。(本教程仅作为学习交流使用)

编译环境:ESP_IDE                  
编译语言:C                             
硬件模块:WIFI传感器 SIOT_1模块DHT11版本
通信方式:串口                         TCP
平台:T-link云平台
硬件淘宝链接:  
SIOT-1:   查看/购买

平台使用流程
首先我们进入云平台官网,网址:http://www.tlink.io/index.htm
第1步注册一个账号

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

平台必须注册才能使用。

第2步我们得添加设备

F0D72BV)26~BF[8I61ZV20L.png



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


L]HS`X0M59@N2O%VFU)3O.png



在这里协议用到了两次数据标签,一定要看清楚数据的协议格式。切记!!!

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


Z@XF`[[2TJ(31P}VTBMLXXG.png

第5步 点击进入设备 点击设备连接


@BY2YZ}F)~25]1VX)}J6ATY.png


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


G_S@UNX43X53GS{A62Z7Y$C.png






第6步定协议 定自定义协议标签



B$%`]BB`3)UEGJ$PUN69[8X.png


协议数据头为W,数据长度是不限制的,因为有两个数据,所以我们还用到了数据分隔符,分隔符为S,另一个数据的长度也是不限制的,数据结束符为E,一定记得保存


第7步点击所有传感器 点击写入指令
先写入温度


_4_DP]5ZFY2I{%)_OE82R@7.png


A[_S%9$RDS10~0ICWNNX8QJ.png


选择自定义格式写入W1E,然后确定
再写入湿度


N(WXN0KUW5]~QD~8YR4PN)5.png



2{MMCD6Z}B%W8%5]$A)8LUG.png


选择自定义格式写入S1E,然后确定


第8步在左边的黑色属性栏点击监控中心,进入监控中心


S@)RYGJMBJ7E49IYN)W@NK7.png


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


AG$E)3)]Q85X4K@I776NK]S.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

当连接上服务器之后我们的左边的图标会变成绿色,然后发送系列号连接设备
一定要点击这两个链接,确保连接,切记!!!

[TE4(3P1{UF7C(O%%{KX6(L.jpg

OI0V3$UIZJ))U7)E]2[_8ZE.jpg

复制序列号粘贴到TCP工具的发送区
注意序列号没有空格,注意格式,切记!!!

当设备连接上之后我们云平台的设备颜色变成了绿色,当前状态也变成了已连接。

DS04WUP3_AZE0BVLKVH(%[N.png


发送W18.5S61.5E,云平台应该接收到温度为18.5℃,湿度为61.5%

E2PYL~[D]~]U]H07LLT0B.jpg


U72[CNVN}M8M(U~4N_PXGPW.png


到这里我们模拟设备结束
一定要保证你的设备已连接成功才能进行数据交互,切记!!!

代码实现
       首先我们得弄得一个流程,既然我们要连接云平台那么我们得模块必须是作为客户端,而且需要连接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下,切记!!!

793K2HS7IG{A5J1~KJ~76DT.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名称和密码一定是自己路由器的 一定要正确!!!!!


这是我们的主函数,我们对各个模块进行了初始化,并对相应函数进行了调用。这里我们还注册了TCP连接函数。我们没有像WIOT那样进行对按键操作。于此同时我们初始化了DHT11函数,这个函数里面我们开启了DHT11的数据上传更新。后续我们再继续介绍这个函数。
现在我们来打开DNS.c文件,我们看看里面的函数。

YC(DO[UK1Y9A_0~PR9K7.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文件这里我会着重介绍几个重要函数。



[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进行连接。

)N~W%2_RWUNJL2OV2S0HQ39.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,并连接上服务器。

IS`OQ$P@QECKSAK%[KDW)`9.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("0588QN61IXS4T71V");
    espconn_regist_disconcb(pespconn,user_tcp_discon_cb);//注册断开连接的回调函数
 
}

这是我们的TCP注册时间函数,当我们连接上TCP是我们给云平台发送设备序列号,发送完成之后我们就能连接上设备。这里的序列号一定是对应你的设备的序列号的,而且序列号具有唯一性。
注意序列号要跟你自己的设备上的序列号对上,切记!!!因为我创建了两次所以的图片上的序列号和代码块的可能存在不同,但是一定需要与你自己的设备相同!!!

E%S8W_Z_7PKH2C`2ALD51`Q.png
这是我们的TCP底层配置连接函数。具体参考ESP8266编程手册,这里不做介绍。
现在我们打开dht22.c文件,

I}YLS1CIQT5`XR@HZLZJU}K.png
我们可以看到DHT11初始化函数里面启动了一个上传数据定时器任务,每3秒更新一次数据,同时我们还做了一个关闭上传函数。

Z8A@E24%(KPXEJ}CY(D$ZMH.png
这是我们的上传数据函数,将读到的数据进行处理之后送往串口和云平台进行显示。
如果用户更改了协议,只要在这个函数里面更改上传格式即可
其余的DHT11驱动函数我们在此不做太多讲解,只要根据传感器的时序来,那就不会错。
记住一点不管你更改了任何东西,编译之前一定要保存全部。
到此我们的代码介绍完毕,我们对工程编译下载。
如果更改了代码,下载之前一定要全部保存,然后在进行编译,并且你下载时固件路径一定要正确,切记!!!
程序正常运行时

首先我们查看串口接收到的数据

[[W}_4Y}G8E22Z%XTWKWCTA.png

可以看到我们设备的IP DNS 网关,而且收到IP->OK说明我们已经连接上WiFi,并且能正常解析DNS

我们可以打开云平台的监控中心查看数据的变化


(J4`U~~[HQNB_]OJBWR.png


我们不需要对TCP进行接收,所以我们在此不做讲解。当程序正常运行,连接上设备后,我们可以通过云平台的监控中心查看传感器数据。至此我们实现了外网控制,只需你的手机有网络即可进行远程查看。
注意用户下载的程序目录是带中文的,编译环境和下载烧录软件一定不能出现中文路径,所以当用户下载完成之后立马更改路径名称,改成英文或者数字
源码分享连接
链接:http://pan.baidu.com/s/1dEYUq5r 密码:we8j

132

主题

302

帖子

3693

积分

LV3

Rank: 3Rank: 3

积分
3693

最佳新人

 楼主| 发表于 2017-10-26 11:56:39 | 显示全部楼层
6666666666
回复

使用道具 举报

31

主题

170

帖子

2276

积分

LV3

Rank: 3Rank: 3

积分
2276
发表于 2017-10-27 22:49:26 | 显示全部楼层
666666666666666666
回复

使用道具 举报

3

主题

26

帖子

157

积分

VIP

积分
157
发表于 2017-10-29 12:13:58 | 显示全部楼层
大神就是66666666666
[发帖际遇]: 一个袋子砸在了 root 头上,root 赚了 4 E币. 幸运榜 / 衰神榜
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-7-20 13:07 , Processed in 0.085013 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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