您的位置:首页 > 运维架构 > Linux

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开发板



在进行传输时要确保你的客户端与服务器之间的网络连接正常!!!
获取温度的驱动这里就不做编写,获取温度的应用程序使用本人编写的驱动所执行!!!


客户端代码:

/*********************************************************************************
*      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 还有更强大的功能,让我们一起去发现并实现吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: