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

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

1、首先进入 Yeelink 主页“ http://www.yeelink.net/ ”注册一个自己的帐号,下面是主页为我们开发者提供的一个简单的开发流程

2、按照上面的流程点击添加设备,输入设备信息,在下面的地图中选择设备所在地

3、进入到设备管理界面,设置设备图片,添加传感器


4、添加传感器,这里我们添加一个数值型传感器和一个开关型传感器,通过下面选择设置传感器信息


传感器添加完成之后宝马 1768 设备下面出现两个传感器: AD 转换值和 LED1 AD 转换值属于数值型传感器,显示 AD 转换电压, LED1 属于开关型传感器,用于控制宝马开发板 LED 灯亮灭,注意下面标记出来的地方蓝色框框第一个是设备 ID 即宝马 1768 ID ,第二个为传感器 ID 即对应 AD 转换值和 LED1 各自的 ID ,由于两个传感器同属于宝马 1768 设备下面的两个传感器所以设备 ID 相同,而传感器 ID 不同,这几个 ID 会在后面编程中使用到


6、进入我的账户找到 API KEY ,当要进行传输数据时需要使用到该密码



7、上面Yeelink的设置基本完成了,就要开始进行程序编写了,这里我们直接使用宝马开发板搭建好的TCP客户端例程进行添加修改,在系统配置完成之后初始化ADC和LED
  1. ADC_Init();         //        ADC初始化
  2. LPC_GPIO2->FIODIR  = 0x000000ff;    //        LED配置
  3. LPC_GPIO0->FIODIR  = 0x00200000;
  4. LPC_GPIO0->FIOPIN |= 0x00200000;              
  5. while(1)
  6. {
  7. 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
  8. }
  9. //TCP客户端实验
  10. int tcpclient(const char* url, int port,int num)
  11. {
  12.     char *recv_data;
  13.     struct hostent *host;
  14.     int sock, bytes_received;
  15.     struct sockaddr_in server_addr;
  16. int        Buf = 0;

  17.     /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
  18.     host = gethostbyname(url);

  19.     /* 分配用于存放接收数据的缓冲 */
  20.     recv_data = rt_malloc(BUFSZ);
  21.     if (recv_data == RT_NULL)
  22.     {
  23.         rt_kprintf("No memory\n");
  24.         return;
  25.     }

  26.     /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
  27.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  28.     {
  29.         /* 创建socket失败 */
  30.         rt_kprintf("Socket error\n");

  31.         /* 释放接收缓冲 */
  32.         rt_free(recv_data);
  33.         return 1;
  34.     }
  35. if(num == 1)         /
  36. {
  37. Buf   = ADC_Get();                     
  38. Buf = (Buf * 3300)/4096;
  39. INT_CHAR(Buf);
  40. send_data1[234] = dis[0];         //更改上传数据内容即AD值
  41. send_data1[234+1] = '.';
  42. send_data1[234+2] = dis[0+1];
  43. send_data1[234+3] = dis[0+2];
  44. }
  45.     /* 初始化预连接的服务端地址 */
  46.     server_addr.sin_family = AF_INET;
  47.     server_addr.sin_port = htons(port);
  48.     server_addr.sin_addr = *((struct in_addr *)host->h_addr);
  49.     rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

  50.     /* 连接到服务端 */
  51.     while (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
  52.     {
  53.         /* 连接失败 */
  54.         rt_kprintf("Connect fail!\n");
  55.         lwip_close(sock);

  56.          /*释放接收缓冲 */
  57.         rt_free(recv_data);
  58.                return 1;
  59.     }
  60. rt_kprintf("Connect OK!\n");

  61. if(num == 1)
  62. {
  63. /* 发送数据到sock连接 */
  64. if(send(sock,send_data1,strlen(send_data1), 0) < 0)
  65. {
  66. /* 发送失败,关闭这个连接 */
  67. rt_kprintf("\nSend error ");
  68. lwip_close(sock);

  69. /* 释放接收缓冲 */
  70. rt_free(recv_data);
  71. }
  72. else
  73. {
  74. rt_kprintf("\nSend OK ");
  75. bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
  76. lwip_close(sock);

  77. /* 释放接收缓冲 */
  78. rt_free(recv_data);
  79. }
  80. }
  81. else if(num == 2)
  82. {
  83. /* 发送数据到sock连接 */
  84. if(send(sock,send_data2,strlen(send_data2), 0) < 0)
  85. {
  86. /* 发送失败,关闭这个连接 */
  87. rt_kprintf("\nSend error ");
  88. lwip_close(sock);

  89. /* 释放接收缓冲 */
  90. rt_free(recv_data);
  91. }
  92. else
  93. {
  94. rt_kprintf("\nSend OK ");
  95. /* 从sock连接中接收最大BUFSZ - 1字节数据 */
  96.                 bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
  97. Buf = Search_str(recv_data,"\"value\":");
  98. if(recv_data[Buf] == '0')
  99. LPC_GPIO2->FIOPIN &= ~0xff;         //关闭LED
  100. else
  101. LPC_GPIO2->FIOPIN |= 0xff;         //打开LED
  102. rt_kprintf("\n%s ",recv_data+Buf);
  103. lwip_close(sock);

  104. /* 释放接收缓冲 */
  105. rt_free(recv_data);
  106. }
  107. }
  108.     return 1;
  109. }

复制代码


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[300] = "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[300] = "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


9、上面 Yeelink 设置和程序都介绍完了,下面就开始测试了下面是电脑显示波形


手机可以查看设备地址


下面在看一下 LED 控制,手机拍照效果不好






  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值