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

交叉编译器: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);
}

Linux下sqlite3编程的更多相关文章

  1. linux 下 poll 编程

    poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...

  2. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  3. Linux 下IOport编程訪问

    曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...

  4. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  5. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  6. linux下libnet编程 亲自测试可用

    linux下libnet编程 亲自测试可用 亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD    IPv6 0x86e ...

  7. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  8. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  9. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

随机推荐

  1. linux基础的基础命令操作

    一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 操作:su - root 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 操作:ctrl ...

  2. HDU1166(线段树单点更新区间查询)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. js 触发LinkButton点击事件,执行后台方法

    页面 <asp:LinkButton ID="lbtButton" runat="server"  CssClass="lbtButton&qu ...

  4. XML解析代码

    import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.LinkedLi ...

  5. Mac自带的SSH客户端

    https://segmentfault.com/q/1010000002806469 还能设置连接成持久连接,方便使用: ttps://www.zhihu.com/question/20541129 ...

  6. [ Centos 7 iscsi搭建 及 1台客户端同时挂载多台iscsi服务端问题 ]

    一.什么是iscsi iSCSI技术是一种由IBM公司研究开发的,是一个供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千 ...

  7. Spring MVC 基础篇4

    Spring MVC Controller中返回数据到页面 1.使用ModelAndView 进行数据返回到请求页面 2.利用Map类型的入参进行Controller返回到页面上 3.将数据放到Ses ...

  8. selenium 截图 添加时间戳

    在自动化程序中运行的代码报错信息或者是相关日志有可能并无法直观的判断出错信息.因此截图是避免不了的.为了避免因为重复运行或者是图片名称相同导致截图被覆盖. 建议在截图时使用时间戳,保证截图图片名称的唯 ...

  9. windows 下配置浏览器使用 kerberos

    最近 hadoop 一系列软件都给加上了 kerberos 认证,整体来说还算顺利,各组件也都继续正常工作,唯独 storm ui,个天杀的在 windows 上打不开. HTTP ERROR: 40 ...

  10. Chief Technology Officer

    转自地址:http://www.swoole.com/News/76.html 1)错误都是自上而下 当事情出现混乱的时候,人们总是寻求寄托于Process的制定,很多的管理者,觉察到事情的失控,却不 ...