查看: 2463|回复: 0

linux下向yeelink添加数据点

[复制链接]
  • TA的每日心情
    开心
    2013-12-17 13:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2017-8-18 13:51:36 | 显示全部楼层 |阅读模式
    分享到:
    初步简单的实现 并不完整
    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}
    复制代码
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-5-4 23:27 , Processed in 0.123311 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.