Linux socket 获取温度上报服务器
来源:互联网 发布:小额贷款那个软件最好 编辑:程序博客网 时间:2024/06/05 02:14
-----------------------------------------------------------------------
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 6666int 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 4096sqlite3 *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 还有更强大的功能,让我们一起去发现并实现吧!
0 0
- Linux socket 获取温度上报服务器
- Socket再学习——开发板ds18b20获取温度值并上报服务器
- Linux 获取CPU温度
- soapui 在linux服务器上报错解决方法
- 采集温度和时间网络上报
- 程序在linux服务器上报Mysql表不存在的问题
- FL2440 通过Socket使开发板作为服务器支持多个客户端连接并与之通信,可通过命令获取当前温度。
- Socket UDP上报读取对象
- Nagios监控平台之四:监控Linux服务器CPU温度
- 服务器的散热和Linux中温度的检测
- linux多线程socket服务器
- linux socket多路复用服务器
- linux socket服务器框架
- linux socket服务器框架
- linux socket服务器框架
- linux socket服务器框架
- linux socket服务器框架
- Socket编程获取服务器时间
- 二叉树中和为某一值的路径
- 基础篇--StringBuffer、StringBuilder、String
- My First Blog
- UNITY之加载
- python 实例变量
- Linux socket 获取温度上报服务器
- C++设计模式之观察者模式
- 动态建树加深搜之——模仿手机九键输入法
- spring cloud config 配置自建git服务器
- 机器学习(2.100)数据知识积累——香农熵
- 关于主键和外键,我犯傻了
- 自定义事件
- 手把手教你给一个iOS app配置多个环境变量
- 290. Word Pattern