最近接触了一个物联网平台 Yeelink。这个平台可以使用户通过Http请求的方式上传或查询数据,通过这样的方式可以使用WEB方式访问Yeelink平台,通过这种方式获取传感器信息或是控制执行设备。下面就来说说Yeelink中控制执行设备的Http请求格式。
【本文目的】
Yeelink平台提供了一些例子,但是非常的遗憾硬件平台都是围绕Arduino,个人对此平台不是很熟悉,想通过STM32辅以uIP或lwIP的方式实现执行设备的远程控制,这就需要嵌入式系统发送格式正确的HTTP请求。查阅了Yeelink的网页,虽然API函数写的非常详细,但是毕竟没有实践一把来的爽。
【相关博文】
【Yeelink平台查询开关量——套接字编程 Windows平台 】
【Yeelink平台推送传感器结果——套接字编程 Windows平台】
【Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32 】
【树莓派学习笔记——yeelink 远程控制LED 】
设备可以包含多个传感器,本例中设备ID为1949。【我一直觉得我这个ID非常霸气——1949】
传感器为输入设备或者输出设备,例如开关和等,本例中设备传感器ID为2511。
数据类型包括数据点datapoint和图像photo,本例中数据类型为数据点datapoint
在Yeelink中,首先需要创建一个设备(Device)。这个设备可以理解为PLC,该设备可能具有多种功能,例如传感器输入通道,或是执行器输出通道。一般在PLC中传感器输入称之为AI,执行器控制称之为DO。但是非常遗憾的是Yeelink把执行器的控制端口定义在传感器类型中,在传感器类型中有开关的子类型,如果有一个变量存放该开关的状态的话,这个变量不是0就是1。(可能yeelink的开发者可能不清楚开关和灯并不是一类设备,开关为输入设备,灯为输出设备或执行设备)
图1 传感器类型
查询开关状态需要明确开关的URI和本用户的API-Key。可以通过Http调试软件发送Http请求以获得此时开关量的状态。例如以下多图所示。
图2 发送Http请求
图3 Http请求和响应结果
GET /v1.0/device/1949/sensor/2511/datapoints HTTP/1.1 U-ApiKey: ffa3826972d6cc7ba5b17e104ec5XXXX Host: api.yeelink.net Cookie: CAKEPHP=n2n4g8q1j8om2326eu0cfseqg0
【1】使用GET方法,查询开关状态
【2】URI中包括设备编号和传感器编号及类型,设备编号为1949,传感器编号为2511,传感器类型为datapoint
【3】U-ApiKey,相当于用户的操作密码
图 开关状态和Http请求结果对应关系
Http响应采用JSON格式,其中包括查询此开关状态的时间和此时的开关状态结果,1表示开关闭合,0表示开关断开,根据开关的状态可以控制响应的执行设备,例如LED灯,或电机等。
HTTP/1.1 200 OK Server: nginx/1.0.14 Date: Sun, 24 Feb 2013 12:07:24 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.3.10 P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" Vary: Accept-Encoding Content-Length: 45 {"timestamp":"2013-02-24T20:05:44","value":0}
POST /v1.0/device/1949/sensor/2511/datapoints HTTP/1.1 U-ApiKey: ffa3826972d6cc7ba5b17e104ec59fa3 Host: api.yeelink.net Content-Length: 11 Cookie: CAKEPHP=n2n4g8q1j8om2326eu0cfseqg0 {"value":1}
【3】URI中包括设备编号和传感器编号及类型,设备编号为1949,传感器编号为2511,传感器类型为datapoint
【3】U-ApiKey,相当于用户的操作密码
HTTP/1.1 200 OK Server: nginx/1.0.14 Date: Sun, 24 Feb 2013 13:41:52 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.3.10 P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" Vary: Accept-Encoding Content-Length: 0
推送传感器数据的过程也类似。和查询执行器不同的是,推送传感器数据使用POST方法,在HTTP请求中包含了传感器的采集数据,以JSON格式存放。具体操作如下图所示。
图 Http请求
图 Http请求和响应
POST /v1.0/device/1949/sensor/2510/datapoints HTTP/1.1 U-ApiKey: ffa3826972d6cc7ba5b17e104ecXXXX Host: api.yeelink.net Content-Length: 12 Cookie: CAKEPHP=n2n4g8q1j8om2326eu0cfseqg0 {"value":41}
【1】使用POST方法
【2】URI中包括设备编号和传感器编号及类型,设备编号为1949,传感器编号为2510,传感器类型为datapoint
【3】U-ApiKey,相当于用户的操作密码
【4】请求内容中包括传感器的数据,采用{“value”:xx.xx}格式。
图 操作结果
从图中的结果可以看出,数据41被成功上传到Yeelink服务器。