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


已有 3912 次阅读2014-7-11 11:30 |个人分类:LPC1768

随着物联网逐渐进入我们的生活,我们需要随时随地查看远端的设备运行状态及对设备进行控制, 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 控制,手机拍照效果不好





本文来自论坛,点击查看完整帖子内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值