Linux socket 获取温度上报服务器
2016-08-23 20:54
513 查看
-----------------------------------------------------------------------
Cross compiler:arm-linux-gcc-4.5.4
Linux kernel version:linux-3.0
Development board:fl2440
MySQL:sqlite3
Author: Yuzhonghan <754270866@qq.com>
-----------------------------------------------------------------------
近期实现了一个关于网络socket 编程,客户端获取到的温度上报给服务器,服务器接收温度并存储到
数据库;当客户端与服务器的网络未连接时,客户端获取温度,连接网络失败,并将读取的温度保存到数据库,等待网络连接再发送给服务器。
服务器端:Linux 虚拟机 ; 客户端,FL2440开发板
在进行传输时要确保你的客户端与服务器之间的网络连接正常!!!
获取温度的驱动这里就不做编写,获取温度的应用程序使用本人编写的驱动所执行!!!
客户端代码:
客户端调用的数据库:
服务器代码:
服务端的数据库:
这里只是一个简单的实现采集温度的网络socket ,由于温度测得也不是很准确,也是短距离传输,关于网络socket 还有更强大的功能,让我们一起去发现并实现吧!
Cross compiler:arm-linux-gcc-4.5.4
Linux kernel version:linux-3.0
Development board:fl2440
MySQL:sqlite3
Author: Yuzhonghan <754270866@qq.com>
-----------------------------------------------------------------------
近期实现了一个关于网络socket 编程,客户端获取到的温度上报给服务器,服务器接收温度并存储到
数据库;当客户端与服务器的网络未连接时,客户端获取温度,连接网络失败,并将读取的温度保存到数据库,等待网络连接再发送给服务器。
服务器端:Linux 虚拟机 ; 客户端,FL2440开发板
在进行传输时要确保你的客户端与服务器之间的网络连接正常!!!
获取温度的驱动这里就不做编写,获取温度的应用程序使用本人编写的驱动所执行!!!
客户端代码:
/********************************************************************************* * Copyright: (C) 2016 Yuzhonghan<754270866@qq.com> * All rights reserved. * * Filename: client.c * Description: This file * * Version: 1.0.0(08/11/2016) * Author: Yuzhonghan <754270866@qq.com> * ChangeLog: 1, Release initial version on "08/11/2016 09:28:08 PM" * ********************************************************************************/ #include <sqlite3.h> #include <stdio.h> #include <sys/types.h> #include <sys/ioctl.h> #include <stdlib.h> #include <termios.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/time.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <time.h> #define MAXLINE 4096 /* make temperature*/ int temperature(void) { int fd; unsigned char buff[2]; unsigned short data = 0; float temp=0; printf("will open fd... \n"); if ((fd=open("/dev/ds18b20",O_RDWR | O_NDELAY | O_NOCTTY)) < 0) { printf("Open Device ds18b20 failed . \r\n"); exit(1); } else { printf("Open Device ds18b20 Successed . \r\n"); read(fd,buff,sizeof(buff)); data=((unsigned short)buff[1])<<8; data|=(unsigned short)buff[0]; temp = 0.0625 * ((double) data); printf("Temperature = %.4f ℃ \n",temp); sleep(2); close(fd); } return (char)temp; } int main(int argc, char** argv) { char buf[MAXLINE]; struct sockaddr_in servaddr; int sockfd, n; if( argc != 2) { printf("usage: ./client <ipaddress>\n"); exit(0); } if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error: %s(errno: %d)\n", strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6666); if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { printf("inet_pton error for %s\n",argv[1]); exit(0); } /* make temperature of the information in client port */ char temp[50]; double number = temperature(); int sign = 4; gcvt(number, sign, temp); memset(buf , 0 , sizeof(buf)); strcpy(buf,temp); if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)<span style="white-space:pre"> </span>//connect server port { printf("connect error: %s(errno: %d)\n",strerror(errno),errno); sql(buf,temp);<span style="white-space:pre"> </span>// call sqlite function exit(0); } if( send(sockfd, buf, strlen(buf), 0) < 0) //send date { printf("send msg error: %s(errno: %d)\n", strerror(errno), errno); exit(0); } close(sockfd); return 0; }
客户端调用的数据库:
/********************************************************************************* * Copyright: (C) 2016 Yuzhonghan<754270866@qq.com> * All rights reserved. * * Filename: sqlite3.c * Description: This file * * Version: 1.0.0(08/22/2016) * Author: Yuzhonghan <754270866@qq.com> * ChangeLog: 1, Release initial version on "08/22/2016 06:26:36 PM" * ********************************************************************************/ #include <sqlite3.h> #include <stdio.h> #include <sys/types.h> #include <sys/ioctl.h> #include <stdlib.h> #include <termios.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/time.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <time.h> /* Each record callback once the function, the number of how many times on the callback number */ int myfunc(void *data,int argc,char **argv,char **argvv) { int i; for(i=0;i<argc;i++) { printf("%s=%s\n",argvv[i], argv[i]); } return 0; } int sql(int argc, char * argv) { sqlite3 *db; char *err = 0; int ret = 0; sqlite3_open("temperature",&db); //open the name call "temperaturn" sql if(db == NULL) { printf("open err!\n"); return; } sqlite3_exec(db,"create table t(tem text);",0 ,0,&err); // createing a sql call "temperature" if(ret !=SQLITE_OK) { printf("create table err\n"); return -1; } /*write temperature*/ char data[100] = "insert into t values(\""; strcat(data, argv); strcat(data, "\"); "); printf("%s\n", data); ret = sqlite3_exec(db ,data,NULL,NULL,NULL); if(ret != SQLITE_OK) { printf("write err\n"); return -1; } /* save date */ sqlite3_exec(db, "select * from t;",myfunc , NULL, &err); if(ret != SQLITE_OK) { printf("exec err\n"); return -1; } sqlite3_close(db); printf("close seccess\n"); db = 0; return 0; }
服务器代码:
</pre><pre code_snippet_id="1847334" snippet_file_name="blog_20160823_4_9678537" name="code" class="cpp">/********************************************************************************* * Copyright: (C) 2016 Yuzhonghan<754270866@qq.com> * All rights reserved. * * Filename: server.c * Description: This file * * Version: 1.0.0(08/19/2016) * Author: Yuzhonghan <754270866@qq.com> * ChangeLog: 1, Release initial version on "08/19/2016 07:10:56 PM" * ********************************************************************************/ #include<sqlite3.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<time.h> #define MAXLINE 4096 #define DEFAULT_PORT 6666 int main(int argc , char** argv) { int socket_fd, connect_fd; int n; char buff[MAXLINE]; struct sockaddr_in servaddr; if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) { printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(DEFAULT_PORT); if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) { printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } if( listen(socket_fd, 10) == -1) { printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("======waiting for client's request======\n"); while(1) { if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1) { printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } /*make tempetature from client port and connect system time from server port */ memset(buff ,0,sizeof(buff)); n = recv(connect_fd, buff, MAXLINE, 0); char tmpbuf [128]; time_t cur_time; struct tm *tminfo; cur_time = time(NULL);//time(&cur_time) tminfo = gmtime(&cur_time); strftime(tmpbuf,128,"Day %d of %B in the year %Y.",tminfo); strcat(buff, "℃\0"); printf("Temperature is :%s --%s", buff, tmpbuf); create_table();<span style="white-space:pre"> </span>// write_table(buff,tmpbuf); read_table(); close(connect_fd); } close(socket_fd); }
服务端的数据库:
/********************************************************************************* * Copyright: (C) 2016 Yuzhonghan<754270866@qq.com> * All rights reserved. * * Filename: sqlite3.c * Description: This file * * Version: 1.0.0(08/18/2016) * Author: Yuzhonghan <754270866@qq.com> * ChangeLog: 1, Release initial version on "08/18/2016 02:17:51 PM" * ********************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<sqlite3.h> #define MAXLINE 4096 sqlite3 *open_sql(void) { int ret = 0; sqlite3 *db; ret = sqlite3_open("temperature", &db); if(ret != SQLITE_OK) { printf("open erri!\n"); return (sqlite3 *)-1; } return db; } int close_sql(sqlite3 *db) { sqlite3_close(db); return 0; } int create_table(void) { char *err = 0; int ret = 0; sqlite3 *db; db = open_sql(); ret = sqlite3_exec(db, "create table t(temperature text, time text perimary key);", NULL, NULL, &err); if(ret != SQLITE_OK) { printf("create table err!\n"); sqlite3_close(db); return -1; } close_sql(db); return 0; } int write_table(char *temperature, char *time0) { sqlite3 *db; int ret; char *err = 0; char data[100] = "insert into t values (\""; db = open_sql(); strcat(data, temperature); strcat(data, "\", \""); strcat(data, time0); strcat(data, "\");"); printf("%s\n", data); ret = sqlite3_exec(db, data, NULL, NULL, NULL); if(ret != SQLITE_OK) { printf("write err\n"); close_sql(db); return -1; } } int myfunc(void *p, int argc, char **argv, char **argvv) { int i; for(i =0; i < argc; i++) { printf("%s = %s ", argvv[i], argv[i]); } putchar('\n'); return 0; } int read_table(void) { sqlite3 *db; int ret; char *err = 0; db = open_sql(); ret = sqlite3_exec(db, "select * from t;", myfunc, NULL, &err); if(ret != SQLITE_OK) { printf("exec err\n"); close_sql(db); return -1; } close_sql(db); return 0; }
这里只是一个简单的实现采集温度的网络socket ,由于温度测得也不是很准确,也是短距离传输,关于网络socket 还有更强大的功能,让我们一起去发现并实现吧!
相关文章推荐
- Socket再学习——开发板ds18b20获取温度值并上报服务器
- FL2440 通过Socket使开发板作为服务器支持多个客户端连接并与之通信,可通过命令获取当前温度。
- 获取服务器上的工作路径
- 如何获取局域网中的所有 SQL Server 服务器
- 使用XMLHTTP Request Object获取服务器数据
- JSP中获取一些服务器变量
- “无法从web服务器获取项目文件”解决方案
- 无法从Web服务器获取项目文件
- 获取服务器信息的几个ServerVariables
- 关于如何在java的web应用获取服务器资源。
- AJAX 的应用范例---获取服务器的内存
- 获取Web服务器所处局域网的网上邻居信息
- 获取Sql服务器列表 (C#)
- ASP.NET获取服务器变量信息
- JSP中获取一些服务器变量
- 使用XMLHTTP Request Object获取服务器数据
- 获取Sql服务器列表
- 自定义服务器组件获取其页面控件里所输入的值的方法
- 使用XMLHTTP Request Object获取服务器数据
- ASP中如何获取服务器的名称