------------------------------------------------------------------------------------------------------------------------------

交叉编译器:arm-linux-gcc-4.5.4

Linux内核版本:Linux-3.0

主机操作系统:Centos 6.5

开发板:FL2440

温度传感器:ds18b20

注:此程序的客户端是在装有ds18b20模块并有ds18b20驱动的系统上跑的,本人写的ds18b20的驱动

------------------------------------------------------------------------------------------------------------------------------

以下操作是建立在你有sqlite3数据库的情况下,sqlite3数据库的安装参考链接:http://www.linuxidc.com/Linux/2012-07/66854.htm

注:数据库安装好之后会在/home下自动创建一个sqlite-3.6.18的用户,其中保存了数据库sqlite3所有的执行文件,头文件还有库函数。

以下程序实现的功能是:客户端读取温度传感器的温度以及当时的时间,并向服务器发送数据。若连接服务器失败则保存数据到数据库。等待客户端可以连接上服务器的时候把保存的数据发送给服务器。

一、客户端代码

 /*********************************************************************************
* Copyright: (C) 2016 2013dianxin_3
* All rights reserved.
*
* Filename: mclient.c
* Description: This file
*
* Version: 1.0.0(08/16/2016)
* Author: xiaohexiansheng <1392195453@qq.com>
* ChangeLog: 1, Release initial version on "08/16/2016 07:16:44 PM"
*
********************************************************************************/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.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 <sqlite3.h> #define MAXLINE 4096
char get_sql[];
/********************************************************************************
* Description:
* Input Args:
* Output Args:
* Return Value:
********************************************************************************/
double get_tem(void) //获取温度的函数
{
int fd;
double result = ;
unsigned char buff[];
unsigned short temp = ;
int flag = ; if ((fd=open("/dev/ds18b20",O_RDWR | O_NDELAY | O_NOCTTY)) < )
{
perror("open device ds18b20 failed.\r\n");
exit();
} printf("open device ds18b20 success.\r\n"); read(fd, buff, sizeof(buff));
temp=((unsigned short)buff[])<<;
temp|=(unsigned short)buff[];
result=0.0625*((double)temp);
close(fd);
printf("temperature is %4f \r\n", result);
return result;
} int save_tem(char *s_temp) //将数据保存到数据库
{
char sql[];
sqlite3 *db;
FILE *fd; sqlite3_open("temperature.db", &db);
memset(sql, '\0', );
strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");
sqlite3_exec(db, sql, NULL, NULL, NULL); memset(sql, '\0', );
strcpy(sql, "insert into tb(data) values(\"");
strcat(sql, s_temp);
strcat(sql, "\")");
sqlite3_exec(db, sql, NULL, NULL, NULL);
sqlite3_close(db);
return ;
} int wf_callback(void *addr, int nr, char **values, char **names) //回掉函数依次将数据库中的数据发送给服务器
{ int sockfd;
char sendline[MAXLINE];
struct sockaddr_in servaddr; if((sockfd = socket(AF_INET, SOCK_STREAM, )) < )
{
printf("create socket error: %s(errno: %d).\n", strerror(errno), errno);
return ;
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons();
if(inet_pton(AF_INET, addr, &servaddr.sin_addr) <= )
{
printf("inet_pton error for %s.\n", addr);
return ;
} memset(sendline, , sizeof(sendline));
if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < )
{
printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
return ;
} if(send(sockfd, values[], strlen(values[]), ) < )
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
return ;
}
close(sockfd);
return ;
} int read_sql(char *addr) //读取数据库中的数据并发送的函数
{
char sql[];
sqlite3 *db; sqlite3_open("test.db", &db);
sqlite3_exec(db, "select * from tb", wf_callback, addr, NULL); //读取数据,并调用回调函数 sqlite3_close(db);
return ;
} int delet_sql(void) //删除数据库中表的函数
{
char sql[];
sqlite3 *db; sqlite3_open("test.db", &db);
sqlite3_exec(db, "DROP TABLE tb;", NULL, NULL, NULL); sqlite3_close(db);
return ;
} int main (int argc, char **argv)
{
double temperature;
int sockfd;
int ret;
char timE[];
time_t rawtime;
char temp[];
char sendline[MAXLINE];
char recvline[MAXLINE];
struct tm* timeinfo;
struct sockaddr_in servaddr; if(argc != ) //第二个参数为客户端的Ip地址,必须要有
{
printf("usage: ./client <ipaddress>.\n");
return ;
} if((sockfd = socket(AF_INET, SOCK_STREAM, )) < ) //打开一个socket的文件描述符
{
printf("create socket error: %s(errno: %d).\n", strerror(errno), errno);
return ;
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(); //使用6666号端口
if(inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= )
{
printf("inet_pton error for %s.\n", argv[]);
return ;
} temperature = get_tem(); //获取温度值并返回给temperature
gcvt(temperature, , temp); //将温度值转换为字符串类型的
memset(sendline, , sizeof(sendline));
strcpy(sendline, "the degrees is ");
strcat(sendline, temp); memset(timE, , sizeof(timE));
time(&rawtime);
timeinfo=localtime(&rawtime);
strftime(timE,,"%y-%m-%d %I:%M:%S",timeinfo); //获取当前时间 strcat(sendline, "℃, time is ");
strcat(sendline, timE); if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < )
{
ret = save_tem(sendline); //若连接客户端失败则调用save_tem函数保存数据
printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
return ;
} if(send(sockfd, sendline, strlen(sendline), ) < )
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
return ;
}
else
{
read_sql(argv[]); //如果可以连接数据库则读取数据库并发送
delet_sql(); //读取完了之后删除数据库
} close(sockfd); //关闭socket文件描述符
return ;
} /* ----- End of main() ----- */

二、服务器代码

 #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 <sys/time.h>
#include<time.h>
#include <sqlite3.h> #define MAXLINE 4096 int save_tem(char *s_temp)
{
char sql[];
sqlite3 *db;
FILE *fd; sqlite3_open("tem.db", &db);
memset(sql, '\0', );
strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");
sqlite3_exec(db, sql, NULL, NULL, NULL); memset(sql, '\0', );
strcpy(sql, "insert into tb(data) values(\"");
strcat(sql, s_temp);
strcat(sql, "\")");
sqlite3_exec(db, sql, NULL, NULL, NULL);
sqlite3_close(db);
return ;
} int main(int argc, char** argv)
{
int n;
int listenfd;
int connfd;
char buff[];
struct sockaddr_in servaddr; if((listenfd = socket(AF_INET, SOCK_STREAM, )) == - )
{
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -)
{
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} if(listen(listenfd, ) == -)
{
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} printf("======waiting for client's request======\n"); while()
{
memset(buff, , sizeof(buff)); if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -)
{
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
n = recv(connfd, buff, MAXLINE, );
printf("%s\n", buff);
save_tem(buff);
close(connfd);
}
close(listenfd);
}

最新文章

  1. SQL Server 得到数据库中所有表的名称及数据条数
  2. ActiveReports 报表应用教程 (9)---交互式报表之动态排序
  3. URAL(timus) 1272 Non-Yekaterinburg Subway(最小生成树)
  4. ASP.NET 4.0的ClientIDMode属性
  5. _beginthreadex创建多线程详解
  6. Lua学习笔记(五):面向对象的实现
  7. POJ 3281 Dining 网络流最大流
  8. 函数buf_LRU_free_block
  9. 普通pc电脑安装苹果系统mac_详细教程(精)附带所有工具下载
  10. HTTP Content-type 对照表
  11. 转:MFC创建多线程实例
  12. ListView实现上拉下拉刷新加载功能
  13. css text-indent:999em
  14. pandas常用函数之shift
  15. SQL server 多个字段设为主键
  16. leetcode18&mdash;4Sum
  17. Unity3d-Particle System系统的学习(二)
  18. 微信小程序插件开发
  19. Task 10 统计从1到某个整数之间出现的1的次数
  20. 【洛谷】P4585 [FJOI2015]火星商店问题

热门文章

  1. ie8以上及非ie8情况下的写法
  2. LeetCode 4 Median of Two Sorted Array
  3. malloc和new的区别 end
  4. php常用的系统函数
  5. react-slick无法显示预期效果问题
  6. django自带的orm之查询
  7. 【SQL】单个表的查询
  8. python批量下载淘宝图片3
  9. Selenium2+python自动化31-生成测试报告【转载】
  10. location.href、location.assign和location.replace的区别