初步簡單的實現 並不完整
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}