ESP8266接入Yeelink平台

      很早就了解了物联网云平台Yeelink,一直没有实践一把。最近有个项目用到了安信可科技的ESP8266模组,强大的ESP8266片上搭载ESP32,内置TCP/IP协议。不仅可以实现局域网内数据的无线传输,还可以通过简单配置接入互联网。
     下面我就分享一下我用ESP8266接入Yeelink平台的一个简单的演示。

0.准备工作

  • ESP8266模块一个,我用的是ESP8266-12F(不同系列的都行 ESP8266-01S也可以)
  • USB-TTL转换器一个 (常用的转换器的驱动有CH340G/PL2303等)
  • PC端串口调试助手
  • Yeelink平台 提前注册,添加一个设备,并在设备上添加上数值型传感器
    温馨提示:当前环境要有能接入互联网的路由设备
    ESP8266接入Yeelink平台_第1张图片
    ESP8266接入Yeelink平台_第2张图片
    ESP8266接入Yeelink平台_第3张图片

做好了准备工作,让你一分钟接入Yeelink

1.配置 ESP8266WiFi模块的工作模式

ESP8266作为一个串口转WiFi模块,通过串口的AT指令可以把WiFi设定为P/STA/AP+STA三种模式。
现在我们要同Yeelink平台建立连接,所以要借助路由才能连接到Internet。
因此我们要把ESP8266设置为STA模式–>连接路由—>
ESP8266设备作为TCP Client—>Yeelink作为TCP Server
具体配置如下

//首先设置为STA模式
//连接到当前环境下可以联网的路由
//连接到 与Yeelink建立TCP连接
//开启透传模式

AT+CWMODE=1
AT+CWJAP="412","cxjlb412"  //这个改为当前环境WiFi的名称和密码
AT+CIPMUX=0
AT+CIPMODE=1
AT+CIPSTART="TCP","api.yeelink.net",80
AT+SAVETRANSLINK=1,"api.yeelink.net",80,"TCP"  //下次自动连接
AP+CIPSEND

ESP8266接入Yeelink平台_第4张图片
发送这些命令的时候注意发送新行

安信可科技的ESP8266内置TCP/IP协议,所以在我们按照上一步与Yeelink建立了TCP连接之后,按POST方式发送HTTP请求就行。
POST的格式参考了Yeelink官方的API V1.0文档
具体格式如下

POST /v1.0/device/16927/sensor/29314/datapoints HTTP/1.1
Host: api.yeelink.net
Accept: */*
U-ApiKey: ad7d2938************8e0250fc9d44
Content-Length: 12
Content-Type: application/json;charset=utf-8
Connection: close

{"value":25}

注意数据长度就是最后一行JSON的字节长度,最后要发送新行
ESP8266接入Yeelink平台_第5张图片
Response 回复200 OK才算正确

两次POST请求的间隔要>10s 不能太频繁地请求
ESP8266接入Yeelink平台_第6张图片

//正常的Response
>HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Fri, 21 Apr 2017 13:00:45 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=locq2gbchea0eo9huqn43g7i43; expires=Sat, 29-Apr-2017 21:00:45 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"

0

3.实现远程对本地开关的控制

       Yeelink平台定义的传感器类型中有开关型,那么如何才能实现通过Yeelink网页或者手机APP实现对硬件设备的远程开关控制呢。
     Yeelink平台在与ESP8266建立连接后,只能实现ESP8266(TCP Client端)向Yeelink端(TCP Server端)发送请求,Yeelink才会对ESP8266做出响应。也就是说,无论你在Yeelink网页端和客户端如何拨动开关,Yeelink不会主动给你发数据。拨动开关只能改变开关在服务器中的状态。根本影响不了本地状态。
ESP8266接入Yeelink平台_第7张图片
     所以要实现远程对本地开关的控制,还是要通过我们频繁地向Yeelink发送请求,参考官方API文档,要实现这个功能,我们要通过向Yeelink平台发送GET型的HTTP请求。 请求后Yeelink端的响应中的JSON数据中包含了当前服务器中开关的状态,这样我们就能根据服务器更新本地开关的状态。具体的GET指令如下:

GET /v1.0/device/16927/sensor/377650/datapoints HTTP/1.1
Host: api.yeelink.net
Accept: */*
U-ApiKey: ad7d2938************8e0250fc9d44
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Connection: close
                        //!!!!!注意最后一行空行必须要有,不然会错的

ESP8266接入Yeelink平台_第8张图片
ESP8266接入Yeelink平台_第9张图片
这个就是因为最后一行没有加空行,一直出错,找了半天。后来想可能是因为我们POST的时候,最后有一个JSON数据{},前面空了一行。 GET虽然没发JSON,Content-Length=0,所以最后跟一个空行

//正确的GET响应
//Response
HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Wed, 19 Apr 2017 08:47:08 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.3.10-1ubuntu3.6
Set-Cookie: CAKEPHP=5npfd3i5hr299gc3p6v3ffnul6; expires=Thu, 27-Apr-2017 16:47:08 GMT; path=/
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"

2d
{"timestamp":"2017-04-19T16:46:04","value":0}
0

value:0 说明当前服务器上开关状态为0 根据这个值更新本地让 KEY=0
下次服务器上开关翻转,再通过GET请求,再更新本地,那么本地也就可以更新了
GET请求的频率也不能太快,基本上1次/s 还可以,虽然这样看着开关会有点延时。

说明:POST上传数据是我用串口调试助手模拟的
GET请求是我把ESP8266挂载在STM32微控制器上,实现对板子上的LED控制的

参考文档:
Http协议及Json格式简介(给yeelink使用者的)

你可能感兴趣的:(物联网云平台)