linux下向yeelink添加資料點

來源:互聯網
上載者:User

初步簡單的實現 並不完整

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請求給伺服器

/*client.c*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/socket.h>#define PORT 80#define REMOTE_IP "202.136.56.203"//#define PORT 4321//#define REMOTE_IP "192.168.1.104"int   main(int argc,char *argv[]){      int s ;   struct sockaddr_in addr ;    char mybuffer[256];char *str1="POST /v1.0/device/1847/sensor/2326/datapoints HTTP/1.0\r\nHost: api.yeelink.net\r\nAccept: */*\r\n";char *str2="U-ApiKey: c3b3d0671f3d962ee2b8aaa1cece81\r\nContent-Length: 12\r\nContent-type: application/json;charset=utf-8\r\n";char *str3="\r\n";char *str10="{\"value\":14}\r\n";   if( (s=socket(AF_INET,SOCK_STREAM,0))<0 )  //IPV4 TCP   {      perror("socket");      exit(1);   }   else   {    printf("socket created .\n");    printf("socked id: %d \n",s);}   bzero(&addr,sizeof(addr));   addr.sin_family =AF_INET;  //IPV4   addr.sin_port=htons(PORT); //SERVER PORT   addr.sin_addr.s_addr=inet_addr(REMOTE_IP);  //SERVER IP   if(connect(s,(struct sockaddr *)&addr,sizeof(addr))<0)   {      perror("connect");      exit(1);   }   else   {      printf("connected ok!\n");      printf("remote ip:%s\n",REMOTE_IP);      printf("remote port:%d\n",PORT);    }bzero(mybuffer,sizeof(mybuffer));//send http requestprintf("tcp send start!--");   if(send(s,str1,strlen(str1),0)<0)      {         perror("send");         exit(1);      }   if(send(s,str2,strlen(str2),0)<0)      {         perror("send");         exit(1);      }   if(send(s,str3,strlen(str3),0)<0)      {         perror("send");         exit(1);      }//body   if(send(s,str10,strlen(str10),0)<0)      {         perror("send");         exit(1);      }   printf("tcp send ok!--");   recv(s ,mybuffer,sizeof(mybuffer),0);   printf("%s\n",mybuffer);   printf("enter os");   while(1)   {         bzero(mybuffer,sizeof(mybuffer));         recv(s ,mybuffer,sizeof(mybuffer),0);  //       printf("received:%s\n",mybuffer);   }}

server.c 用來測試client發送的資料對不對

/*server.c*/#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <unistd.h>#include <netinet/in.h>#define PORT4321#define BUFFER_SIZE1024#define MAX_QUE_CONN_NM5int main(){struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes;int sockfd, client_fd;char buf[BUFFER_SIZE];/*建立socket串連*/if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1){perror("socket");exit(1);}printf("Socket id = %d\n",sockfd);/*設定sockaddr_in 結構體中相關參數*/server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_port = htons(PORT);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(&(server_sockaddr.sin_zero), 8);int i = 1;/* 使得重複使用本地地址與通訊端進行綁定 */setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));/*綁定函數bind*/if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1){perror("bind");exit(1);}printf("Bind success!\n");/*調用listen函數*/if (listen(sockfd, MAX_QUE_CONN_NM) == -1){perror("listen");exit(1);}printf("Listening....\n");/*調用accept函數,等待用戶端的串連*/if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1){perror("accept");exit(1);}/*調用recv函數接收用戶端的請求*/while(1){memset(buf , 0, sizeof(buf));if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1){perror("recv");exit(1);}else{printf("Received a message: %s\n", buf);}}close(sockfd);exit(0);}

makefile用來編譯上面的兩個檔案

EXEC1 = serverEXEC2 = clientOBJS1 = server.oOBJS2 = client.oHEADERS =CC = gccINC =CFLAGS = ${INC} -g all:${EXEC1} ${EXEC2}${EXEC1} : ${OBJS1}${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS1} ${OBJS1} : ${HEADERS}${EXEC2} : ${OBJS2}${CC} ${CFLAGS} ${LDFLAGS} -o $@ ${OBJS2} ${OBJS2} : ${HEADERS}.PHONY : cleanclean :-rm -f ${OBJS1} ${EXEC1}-rm -f ${OBJS2} ${EXEC2}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.