zoukankan      html  css  js  c++  java
  • Linux下sqlite3编程

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

    交叉编译器: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所有的执行文件,头文件还有库函数。

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

    一、客户端代码

      1 /*********************************************************************************
      2  *      Copyright:  (C) 2016 2013dianxin_3
      3  *                  All rights reserved.
      4  *
      5  *       Filename:  mclient.c
      6  *    Description:  This file 
      7  *                 
      8  *        Version:  1.0.0(08/16/2016)
      9  *         Author:  xiaohexiansheng <1392195453@qq.com>
     10  *      ChangeLog:  1, Release initial version on "08/16/2016 07:16:44 PM"
     11  *                 
     12  ********************************************************************************/
     13 #include <sys/types.h>
     14 #include <sys/ioctl.h>
     15 #include <termios.h>
     16 #include <sys/stat.h>
     17 #include <fcntl.h>
     18 #include <sys/time.h>
     19 #include <stdio.h>
     20 #include <stdlib.h>
     21 #include <string.h>
     22 #include <errno.h>
     23 #include <sys/types.h>
     24 #include <sys/socket.h>
     25 #include <netinet/in.h>
     26 #include <sqlite3.h>
     27 
     28 #define MAXLINE                 4096
     29 char                            get_sql[4096]; 
     30 /********************************************************************************
     31  *  Description:
     32  *   Input Args:
     33  *  Output Args:
     34  * Return Value:
     35  ********************************************************************************/
     36 double get_tem(void)        //获取温度的函数
     37 {
     38     int fd;
     39     double result = 0;
     40     unsigned char buff[2];
     41     unsigned short temp = 0;
     42     int flag = 0;
     43 
     44     if ((fd=open("/dev/ds18b20",O_RDWR | O_NDELAY | O_NOCTTY)) < 0)
     45     {
     46         perror("open device ds18b20 failed.
    ");
     47         exit(1);
     48     }
     49 
     50     printf("open device ds18b20 success.
    ");
     51     
     52     read(fd, buff, sizeof(buff));
     53     temp=((unsigned short)buff[1])<<8;
     54     temp|=(unsigned short)buff[0];
     55     result=0.0625*((double)temp);
     56     close(fd);
     57     printf("temperature is %4f 
    ", result);
     58     return result;
     59 }
     60 
     61 int save_tem(char *s_temp)            //将数据保存到数据库
     62 {
     63     char sql[128];
     64     sqlite3 *db;
     65     FILE *fd;
     66 
     67     sqlite3_open("temperature.db", &db);
     68     memset(sql, '', 128);
     69     strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");
     70     sqlite3_exec(db, sql, NULL, NULL, NULL);
     71 
     72     memset(sql, '', 128);
     73     strcpy(sql, "insert into tb(data) values("");
     74     strcat(sql, s_temp);
     75     strcat(sql, "")");
     76     sqlite3_exec(db, sql, NULL, NULL, NULL);
     77     sqlite3_close(db);
     78     return 0;
     79 }
     80 
     81 int wf_callback(void *addr, int nr, char **values, char **names)        //回掉函数依次将数据库中的数据发送给服务器
     82 {
     83 
     84     int         sockfd;
     85     char        sendline[MAXLINE];
     86     struct sockaddr_in servaddr;
     87 
     88     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
     89     {
     90         printf("create socket error: %s(errno: %d).
    ", strerror(errno), errno);
     91         return 0;
     92     }
     93 
     94     memset(&servaddr, 0, sizeof(servaddr));
     95     servaddr.sin_family = AF_INET;
     96     servaddr.sin_port = htons(6666);
     97     if(inet_pton(AF_INET, addr, &servaddr.sin_addr) <= 0)
     98     {
     99         printf("inet_pton error for %s.
    ", addr);
    100         return 0;
    101     }
    102 
    103     memset(sendline, 0, sizeof(sendline));
    104     if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    105     {
    106         printf("connect error: %s(errno: %d)
    ", strerror(errno), errno);
    107         return 0;
    108     }
    109 
    110     if(send(sockfd, values[1], strlen(values[1]), 0) < 0)
    111     {
    112         printf("send msg error: %s(errno: %d)
    ", strerror(errno), errno);
    113         return 0;
    114     }
    115     close(sockfd);
    116     return 0;
    117 }
    118 
    119 int read_sql(char *addr)        //读取数据库中的数据并发送的函数
    120 {
    121     char sql[128];
    122     sqlite3 *db;
    123 
    124     sqlite3_open("test.db", &db);
    125     sqlite3_exec(db, "select * from tb", wf_callback, addr, NULL);        //读取数据,并调用回调函数
    126     
    127     sqlite3_close(db);
    128     return 0;
    129 }
    130 
    131 int delet_sql(void)                //删除数据库中表的函数
    132 {
    133     char sql[128];
    134     sqlite3 *db;
    135 
    136     sqlite3_open("test.db", &db);
    137     sqlite3_exec(db, "DROP TABLE tb;", NULL, NULL, NULL);
    138 
    139     sqlite3_close(db);
    140     return 0;
    141 }
    142 
    143 int main (int argc, char **argv)
    144 {
    145     double      temperature;
    146     int         sockfd;
    147     int         ret;
    148     char        timE[80];
    149     time_t      rawtime;
    150     char        temp[25];
    151     char        sendline[MAXLINE];
    152     char        recvline[MAXLINE];
    153     struct tm* timeinfo;
    154     struct sockaddr_in servaddr;
    155 
    156     if(argc != 2)        //第二个参数为客户端的Ip地址,必须要有
    157     {
    158         printf("usage: ./client <ipaddress>.
    ");
    159         return 0;
    160     }
    161 
    162     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)        //打开一个socket的文件描述符
    163     {
    164         printf("create socket error: %s(errno: %d).
    ", strerror(errno), errno);
    165         return 0;
    166     }
    167     
    168     memset(&servaddr, 0, sizeof(servaddr));
    169     servaddr.sin_family = AF_INET;
    170     servaddr.sin_port = htons(6666);            //使用6666号端口
    171     if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    172     {
    173         printf("inet_pton error for %s.
    ", argv[1]);
    174         return 0;
    175     }
    176 
    177     temperature = get_tem();        //获取温度值并返回给temperature
    178     gcvt(temperature, 4, temp);            //将温度值转换为字符串类型的
    179     memset(sendline, 0, sizeof(sendline));
    180     strcpy(sendline, "the degrees is ");
    181     strcat(sendline, temp);
    182    
    183     memset(timE, 0, sizeof(timE));
    184     time(&rawtime);
    185     timeinfo=localtime(&rawtime);
    186     strftime(timE,80,"%y-%m-%d %I:%M:%S",timeinfo);            //获取当前时间
    187 
    188     strcat(sendline, "℃, time is ");
    189     strcat(sendline, timE);
    190 
    191     if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    192     {
    193         ret = save_tem(sendline);                //若连接客户端失败则调用save_tem函数保存数据
    194         printf("connect error: %s(errno: %d)
    ", strerror(errno), errno);
    195         return 0;
    196     }
    197     
    198     if(send(sockfd, sendline, strlen(sendline), 0) < 0)
    199     {
    200         printf("send msg error: %s(errno: %d)
    ", strerror(errno), errno);
    201         return 0;
    202     }
    203     else
    204     {
    205         read_sql(argv[1]);                //如果可以连接数据库则读取数据库并发送
    206         delet_sql();                    //读取完了之后删除数据库
    207     }
    208 
    209     close(sockfd);                        //关闭socket文件描述符
    210     return 0;
    211 } /* ----- End of main() ----- */

    二、服务器代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<errno.h>
     5 #include<sys/types.h>
     6 #include<sys/socket.h>
     7 #include<netinet/in.h>
     8 #include <sys/time.h>
     9 #include<time.h>
    10 #include <sqlite3.h>
    11 
    12 #define MAXLINE 4096
    13 
    14 int save_tem(char *s_temp)
    15 {
    16     char sql[128];
    17     sqlite3 *db;
    18     FILE *fd;
    19 
    20     sqlite3_open("tem.db", &db);
    21     memset(sql, '', 128);
    22     strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");
    23     sqlite3_exec(db, sql, NULL, NULL, NULL);
    24 
    25     memset(sql, '', 128);
    26     strcpy(sql, "insert into tb(data) values("");
    27     strcat(sql, s_temp);
    28     strcat(sql, "")");
    29     sqlite3_exec(db, sql, NULL, NULL, NULL);
    30     sqlite3_close(db);
    31     return 0;
    32 }
    33 
    34 int main(int argc, char** argv)
    35 {
    36     int         n;
    37     int         listenfd;
    38     int         connfd;
    39     char        buff[4096];
    40     struct  sockaddr_in     servaddr;
    41     
    42     if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    43     {
    44         printf("create socket error: %s(errno: %d)
    ",strerror(errno),errno);
    45         exit(0);
    46     }
    47 
    48     memset(&servaddr, 0, sizeof(servaddr));
    49     servaddr.sin_family = AF_INET;
    50     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    51     servaddr.sin_port = htons(6666);
    52 
    53     if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    54     {
    55         printf("bind socket error: %s(errno: %d)
    ",strerror(errno),errno);
    56         exit(0);
    57     }
    58 
    59     if(listen(listenfd, 10) == -1)
    60     {
    61         printf("listen socket error: %s(errno: %d)
    ",strerror(errno),errno);
    62         exit(0);
    63     }
    64 
    65     printf("======waiting for client's request======
    ");
    66     
    67     while(1)
    68     {
    69         memset(buff, 0, sizeof(buff));
    70         
    71         if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
    72         {
    73             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
    74             continue;
    75         }
    76         n = recv(connfd, buff, MAXLINE, 0);
    77         printf("%s
    ", buff);
    78         save_tem(buff);
    79         close(connfd);
    80     }
    81     close(listenfd);
    82 }
  • 相关阅读:
    机器学习面试问题7
    机器学习面试问题6
    机器学习面试问题5
    机器学习面试问题4
    机器学习面试问题3
    机器学习面试问题2
    机器学习面试问题1
    推荐算法
    机器学习面试问题8
    决策树与随机森林算法
  • 原文地址:https://www.cnblogs.com/xiaohexiansheng/p/5799516.html
Copyright © 2011-2022 走看看