-----------------------------------------------------------------------
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 还有更强大的功能,让我们一起去发现并实现吧!