回答

收藏

[Linux] linux下向yeelink添加数据点

嵌入式系统 嵌入式系统 3051 人阅读 | 0 人回复 | 2017-08-18

初步简单的实现 并不完整
Linux下最简单的实现方式就是curl来实现
请求实例 (运用curl):
curl --request POST --data-binary @datafile.txt --header "U-ApiKey: YOUR_API_KEY_HERE"
http://api.yeelink.NET /v1.0/device/12/sensor/3/datapoints
需要在HTTP Header中增加API Key来授权写入操作, 具体请参照API Key. 支持一次传送一个数据或者批量上传.

这里的代码是纯c实现的
为了将来方便移植到lwip
目前函数都已经修改
这是最基本的测试
三个文件
client.c  发送http请求给服务器
server.c 用来测试client发送的数据对不对
makefile用来编译上面的两个文件
使用时之需要执行client.c即可 没写退出函数 所以暂时用 ctrl+c结束进程
使用时先make
然后./client

client.c  发送http请求给服务器
  1. /*client.c*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>
  8. #include <fcntl.h>
  9. #include <sys/stat.h>
  10. #include <sys/types.h>
  11. #include <sys/socket.h>
  12. #define PORT 80
  13. #define REMOTE_IP "202.136.56.203"

  14. //#define PORT 4321
  15. //#define REMOTE_IP "192.168.1.104"

  16. int   main(int argc,char *argv[])
  17. {   
  18.    int s ;
  19.    struct sockaddr_in addr ;
  20.     char mybuffer[256];
  21.         char *str1="POST /v1.0/device/1847/sensor/2326/datapoints HTTP/1.0\r\nHost: api.yeelink.net\r\nAccept: */*\r\n";
  22.         char *str2="U-ApiKey: c3b3d0671f3d962ee2b8aaa1cece81\r\nContent-Length: 12\r\nContent-type: application/json;charset=utf-8\r\n";
  23.         char *str3="\r\n";
  24.         char *str10="{"value":14}\r\n";

  25.    if( (s=socket(AF_INET,SOCK_STREAM,0))<0 )  //IPV4 TCP
  26.    {
  27.       perror("socket");
  28.       exit(1);
  29.    }
  30.    else
  31.    {
  32.             printf("socket created .\n");
  33.             printf("socked id: %d \n",s);
  34.         }

  35.    bzero(&addr,sizeof(addr));
  36.    addr.sin_family =AF_INET;  //IPV4
  37.    addr.sin_port=htons(PORT); //SERVER PORT
  38.    addr.sin_addr.s_addr=inet_addr(REMOTE_IP);  //SERVER IP

  39.    if(connect(s,(struct sockaddr *)&addr,sizeof(addr))<0)
  40.    {
  41.       perror("connect");
  42.       exit(1);
  43.    }
  44.    else
  45.    {
  46.               printf("connected ok!\n");
  47.               printf("remote ip:%s\n",REMOTE_IP);
  48.               printf("remote port:%d\n",PORT);
  49.     }

  50.         bzero(mybuffer,sizeof(mybuffer));

  51. //send http request
  52.         printf("tcp send start!--");
  53.    if(send(s,str1,strlen(str1),0)<0)
  54.       {
  55.          perror("send");
  56.          exit(1);
  57.       }
  58.    if(send(s,str2,strlen(str2),0)<0)
  59.       {
  60.          perror("send");
  61.          exit(1);
  62.       }
  63.    if(send(s,str3,strlen(str3),0)<0)
  64.       {
  65.          perror("send");
  66.          exit(1);
  67.       }
  68. //body
  69.    if(send(s,str10,strlen(str10),0)<0)
  70.       {
  71.          perror("send");
  72.          exit(1);
  73.       }

  74.    printf("tcp send ok!--");

  75.    recv(s ,mybuffer,sizeof(mybuffer),0);
  76.    printf("%s\n",mybuffer);
  77.    printf("enter os");
  78.    while(1)
  79.    {
  80.          bzero(mybuffer,sizeof(mybuffer));
  81.          recv(s ,mybuffer,sizeof(mybuffer),0);
  82.   //       printf("received:%s\n",mybuffer);
  83.    }
  84. }
复制代码
server.c 用来测试client发送的数据对不对
  1. /*server.c*/

  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <sys/ioctl.h>
  8. #include <unistd.h>
  9. #include <netinet/in.h>

  10. #define PORT                        4321
  11. #define BUFFER_SIZE                1024
  12. #define MAX_QUE_CONN_NM        5

  13. int main()
  14. {
  15.         struct sockaddr_in server_sockaddr, client_sockaddr;
  16.         int sin_size, recvbytes;
  17.         int sockfd, client_fd;
  18.         char buf[BUFFER_SIZE];
  19.         
  20.         /*建立socket连接*/
  21.         if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
  22.         {
  23.                 perror("socket");
  24.                 exit(1);
  25.         }
  26.         printf("Socket id = %d\n",sockfd);
  27.         
  28.         /*设置sockaddr_in 结构体中相关参数*/
  29.         server_sockaddr.sin_family = AF_INET;
  30.         server_sockaddr.sin_port = htons(PORT);
  31.         server_sockaddr.sin_addr.s_addr = INADDR_ANY;
  32.         bzero(&(server_sockaddr.sin_zero), 8);
  33.         
  34.         int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */
  35.         setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));        
  36.         
  37.         /*绑定函数bind*/
  38.         if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1)
  39.         {
  40.                 perror("bind");
  41.                 exit(1);
  42.         }
  43.         printf("Bind success!\n");
  44.         
  45.         /*调用listen函数*/
  46.         if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
  47.         {
  48.                 perror("listen");
  49.                 exit(1);
  50.         }
  51.         printf("Listening....\n");
  52.         
  53.         /*调用accept函数,等待客户端的连接*/
  54.         if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
  55.         {
  56.                 perror("accept");
  57.                 exit(1);
  58.         }
  59.         
  60.         /*调用recv函数接收客户端的请求*/
  61. while(1){
  62.         memset(buf , 0, sizeof(buf));
  63.         if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)
  64.         {
  65.                 perror("recv");
  66.                 exit(1);
  67.         }else{
  68.         printf("Received a message: %s\n", buf);
  69.         }
  70. }

  71. close(sockfd);
  72. exit(0);
  73. }
复制代码
makefile用来编译上面的两个文件
  1. EXEC1 = server
  2. EXEC2 = client
  3. OBJS1 = server.o
  4. OBJS2 = client.o
  5. HEADERS =

  6. CC = gcc
  7. INC =
  8. CFLAGS = ${INC} -g

  9. all:${EXEC1} ${EXEC2}
  10. ${EXEC1} : ${OBJS1}
  11.         ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS1}

  12. ${OBJS1} : ${HEADERS}

  13. ${EXEC2} : ${OBJS2}
  14.         ${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS2}

  15. ${OBJS2} : ${HEADERS}

  16. .PHONY : clean
  17. clean :
  18.         -rm -f ${OBJS1} ${EXEC1}
  19.         -rm -f ${OBJS2} ${EXEC2}
复制代码
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条