sszztt 发表于 2016-12-29 14:31

一步步教你使用云端服务器yeelink远程监控

随着物联网逐渐进入我们的生活,我们需要随时随地查看远端的设备运行状态及对设备进行控制,Yeelink为我们提供了一
个很好的云端服务器平台,设备通过网络连接到Yeelink服务器,上传本地检测数据,电脑或手机通过手机访问即可看到设备数据,
网上也有很多朋友使用Yeelink来做远程监控的示例,下面我们来介绍如何使用Yeelink做远程检测与控制,如有错误还请大家指正。

下面是Yeelink远程监控的一个大致框图
http://cache.amobbs.com/new2012/forum/201407/14/092956x6za65xpt366okf6.png.thumb.jpg
1、首先进入Yeelink主页注册一个自己的帐号,下面是主页为我们开发者提供的一个简单的开发流程
http://cache.amobbs.com/new2012/forum/201407/14/093007u00a0blvok0fswoz.png.thumb.jpg

2、按照上面的流程点击添加设备,输入设备信息,在下面的地图中选择设备所在地
http://cache.amobbs.com/new2012/forum/201407/14/093004nzr9cjzax57n0ezx.png.thumb.jpg
3、进入到设备管理界面,设置设备图片,添加传感器
http://cache.amobbs.com/new2012/forum/201407/14/093010mubbi2au02iuwlbf.png.thumb.jpg

4、添加传感器,这里我们添加一个数值型传感器和一个开关型传感器,通过下面选择设置传感器信息
http://cache.amobbs.com/new2012/forum/201407/14/093008reyafxyiyoq7jqbd.png.thumb.jpg
5、传感器添加完成之后宝马1768设备下面出现两个传感器:AD转换值和LED1,AD转换值属于数值型传感器,显示AD转换电压,
LED1属于开关型传感器,用于控制宝马开发板LED灯亮灭,注意下面标记出来的地方蓝色框框第一个是设备ID即宝马1768的ID,第
二个为传感器ID即对应AD转换值和LED1各自的ID,由于两个传感器同属于宝马1768设备下面的两个传感器所以设备ID相同,而传感
器ID不同,这几个ID会在后面编程中使用到
http://cache.amobbs.com/new2012/forum/201407/14/093006fs8veqnapqnqs5ql.png.thumb.jpg

6、进入我的账户找到API KEY,当要进行传输数据时需要使用到该密码
http://cache.amobbs.com/new2012/forum/201407/14/093007yq0ljgf7fkjqz76i.png.thumb.jpg

7、上面Yeelink的设置基本完成了,就要开始进行程序编写了,这里我们直接使用宝马开发板搭建好的TCP客户端例程进行添加修改,
在系统配置完成之后初始化ADC和LED

[*]ADC_Init();                                                      //      ADC初始化
[*]
[*]LPC_GPIO2->FIODIR= 0x000000ff;    //      LED配置
[*]LPC_GPIO0->FIODIR= 0x00200000;
[*]LPC_GPIO0->FIOPIN |= 0x00200000;
[*]while(1)
[*]{
[*]      tcpclient("42.96.164.52",80 ,1);                //AD转换值上传
[*]      tcpclient("42.96.164.52",80 ,2);                //获取LED状态并改变开发板LED状态
[*]      rt_thread_delay(RT_TICK_PER_SECOND * 4);      //延时4s
[*]}
[*]//TCP客户端实验
[*]int tcpclient(const char* url, int port,int num)
[*]{
[*]    char *recv_data;
[*]    struct hostent *host;
[*]    int sock, bytes_received;
[*]    struct sockaddr_in server_addr;
[*]      int      Buf = 0;
[*]
[*]    /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
[*]    host = gethostbyname(url);
[*]
[*]    /* 分配用于存放接收数据的缓冲 */
[*]    recv_data = rt_malloc(BUFSZ);
[*]    if (recv_data == RT_NULL)
[*]    {
[*]      rt_kprintf("No memory\n");
[*]      return;
[*]    }
[*]
[*]    /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
[*]    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
[*]    {
[*]      /* 创建socket失败 */
[*]      rt_kprintf("Socket error\n");
[*]
[*]      /* 释放接收缓冲 */
[*]      rt_free(recv_data);
[*]      return 1;
[*]    }
[*]      if(num == 1)                /
[*]      {
[*]                Buf   = ADC_Get();
[*]                Buf = (Buf * 3300)/4096;
[*]                INT_CHAR(Buf);
[*]                send_data1 = dis;                //更改上传数据内容即AD值
[*]                send_data1 = '.';
[*]                send_data1 = dis;
[*]                send_data1 = dis;
[*]      }
[*]
[*]    /* 初始化预连接的服务端地址 */
[*]    server_addr.sin_family = AF_INET;
[*]    server_addr.sin_port = htons(port);
[*]    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
[*]    rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
[*]
[*]    /* 连接到服务端 */
[*]    while (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
[*]    {
[*]      /* 连接失败 */
[*]      rt_kprintf("Connect fail!\n");
[*]      lwip_close(sock);
[*]
[*]         /*释放接收缓冲 */
[*]      rt_free(recv_data);
[*]               return 1;
[*]    }
[*]      rt_kprintf("Connect OK!\n");
[*]
[*]      if(num == 1)
[*]      {
[*]                /* 发送数据到sock连接 */
[*]                if(send(sock,send_data1,strlen(send_data1), 0) < 0)
[*]                {
[*]                        /* 发送失败,关闭这个连接 */
[*]                        rt_kprintf("\nSend error ");
[*]                        lwip_close(sock);
[*]
[*]                        /* 释放接收缓冲 */
[*]                        rt_free(recv_data);
[*]                }
[*]                else
[*]                {
[*]                        rt_kprintf("\nSend OK ");
[*]                        bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
[*]                        lwip_close(sock);
[*]
[*]                        /* 释放接收缓冲 */
[*]                        rt_free(recv_data);
[*]                }
[*]      }
[*]      else if(num == 2)
[*]      {
[*]                /* 发送数据到sock连接 */
[*]                if(send(sock,send_data2,strlen(send_data2), 0) < 0)
[*]                {
[*]                        /* 发送失败,关闭这个连接 */
[*]                        rt_kprintf("\nSend error ");
[*]                        lwip_close(sock);
[*]
[*]                        /* 释放接收缓冲 */
[*]                        rt_free(recv_data);
[*]                }
[*]                else
[*]                {
[*]                        rt_kprintf("\nSend OK ");
[*]                        /* 从sock连接中接收最大BUFSZ - 1字节数据 */
[*]                bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
[*]                        Buf = Search_str(recv_data,"\"value\":");
[*]                        if(recv_data == '0')
[*]                              LPC_GPIO2->FIOPIN &= ~0xff;                        //关闭LED
[*]                        else
[*]                              LPC_GPIO2->FIOPIN |= 0xff;                        //打开LED
[*]                        rt_kprintf("\n%s ",recv_data+Buf);
[*]                        lwip_close(sock);
[*]
[*]                        /* 释放接收缓冲 */
[*]                        rt_free(recv_data);
[*]                }
[*]      }
[*]    return 1;
[*]}

复制代码


8、我们可以看到程序中通过判断num值来发送两个不同的字符串,这里num就是用来区别是用来上传AD转换值还是LED状态获取的
下面看看两个字符串数据,我们可以看到下面两个字符串中第一行都出现了我们设备的ID和传感器ID,send_data1对应是AD转换值
上传,所以ID为20165,而send_data2为LED控制,ID对应为20166,U-ApiKey后面紧跟着就是我们上面在账户设置里面的密码,
Yeelink的API格式比较固定,至于其他一些参数可以参考Yeelink API文档

[*]char send_data1 = "POST /v1.0/device/12402/sensor/20165/datapoints HTTP/1.1\r\n\
[*]Host: api.yeelink.net\r\n\
[*]Accept: */*\r\n\
[*]U-ApiKey: 615e52feacb3a8b18ab424703c00bfbf\r\n\
[*]Content-Length: 14\r\n\
[*]Content-Type: application/json;charset=utf-8\r\n\
[*]Connection: close\r\n\
[*]\r\n\
[*]{\"value\":96}\r\n"; /* 发送用到的数据 */
[*]这里有一点需要注意的是Content-Length的长度必须为”value”后面跟着字符串的长度值加10,上面设置为14即”value”后面的值为4位,
[*]这里初始化是”96“
[*]char send_data2 = "GET /v1.0/device/12402/sensor/20166/datapoints HTTP/1.1\r\n\
[*]Host: api.yeelink.net\r\n\
[*]Accept: */*\r\n\
[*]U-ApiKey: 615e52feacb3a8b18ab424703c00bfbf\r\n\
[*]Content-Length: 0\r\n\
[*]Connection: close\r\n\
[*]\r\n\
[*]print get done.\r\n"; /* 发送用到的数据 */

复制代码


另外还有一点需要注意的是,当我们查询LED状态时需要接收Yeelink服务器数据,那么数据的哪部分才是对我们有用的呢,我们可以使用
网络调试助手,将调试助手连接到Yeelink服务器,发送字符串send_data2的内容,即可获取服务器返回消息,其中”value”后面的0是我们
需要的数据,表明现在开关是关着的,若开关打开则返回为1
http://cache.amobbs.com/new2012/forum/201407/14/093004z9095yc58gy8dw4v.png.thumb.jpg


9、上面Yeelink设置和程序都介绍完了,下面就开始测试了下面是电脑显示波形
http://cache.amobbs.com/new2012/forum/201407/14/093005twwwwgmy51ldxxlg.png.thumb.jpg

手机可以查看设备地址
http://cache.amobbs.com/new2012/forum/201407/14/093008xs9ncv7s76o5mnno.jpg.thumb.jpg
http://cache.amobbs.com/new2012/forum/201407/14/093008o5q4f9hrqx9l14f4.png.thumb.jpg


下面在看一下LED控制
http://cache.amobbs.com/new2012/forum/201407/14/093005gu6uzz7uoowawu6u.png.thumb.jpg

15113484470 发表于 2016-12-29 15:15

rt-therad+lwip,再用yeelink,厉害

15113484470 发表于 2016-12-29 15:15

用yeelink传图像,有没弄过?

sszztt 发表于 2016-12-30 10:55

15113484470 发表于 2016-12-29 15:15
rt-therad+lwip,再用yeelink,厉害

随便玩玩{:smile:}还望多多指教

maggie6969 发表于 2017-1-3 11:32

谢谢大家的关注。有问题可以多多指导,你们的支持是给我们最大的帮助。

maggie6969 发表于 2017-1-3 11:32

来,来,来,新年来抢沙发坐坐。

sszztt 发表于 2017-1-4 16:20

maggie6969 发表于 2017-1-3 11:32
来,来,来,新年来抢沙发坐坐。

2017(17)进步~~

sszztt 发表于 2017-7-4 15:53

CC2530模块资料分享,可定制方案 可定制方案 可定制方案

sszztt 发表于 2018-2-28 10:13

云端服务器yeelink远程监控

sszztt 发表于 2019-6-12 11:58

sszztt 发表于 2019-6-17 15:39

sszztt 发表于 2019-6-24 14:38

sszztt 发表于 2019-7-8 14:05

sszztt 发表于 2019-7-30 10:16

sszztt 发表于 2019-8-14 15:52

sszztt 发表于 2019-8-23 10:57

sszztt 发表于 2019-8-28 14:06

sszztt 发表于 2019-9-26 14:20

sszztt 发表于 2019-10-30 11:32

sszztt 发表于 2019-12-31 09:25

页: [1]
查看完整版本: 一步步教你使用云端服务器yeelink远程监控