采集温度和时间网络上报

实现了采集温度和温度对应的时间并发送到主机端。。主机端保存到数据库中的函数

主机是虚拟机centos6。。linux系统。。客户端采集是fl2440的板子。。s3c2440的芯片。。跑的linux3.0的内核

因为是采集温度。。所以务必先完成板子的温度传感器的驱动实现。。因为是通过网络上报。。所以也务必实现wifi的sta模式可以ping通外网。。还有是要在主机断安装数据库。。我安装的是sqlite3.。安装别的的朋友可以酌情改一下sql.c中的代码

客户端代码如下

temperature.c

 1 #include"head.h"
  2 char get_tem(void)
  3 {
  4     int fd;
  5     unsigned char buf[2];
  6     unsigned short temp=0;
  7     double result=0;
  8     int flag=0;
  9 
 10     if ((fd=open("/dev/DS18B20",O_RDWR | O_NDELAY | O_NOCTTY)) < 0)
 11     {
 12         printf("Open Device DS18B20 failed.\r\n");
 13         exit(1);
 14     }
 15     else
 16     {
 17                     read(fd, buf, sizeof(buf));
 18                     temp=((unsigned short)buf[1])<<8;
 19                     temp|=(unsigned short)buf[0];
 20                     result=0.0625*((double)temp);
 21                     printf("temperature is %4f \r\n", result);
 22                     sleep(2);
 23 
 24         close(fd);
 25     }
 26 
 27     return (char)result;
 28 }

实现的功能是通过ds.ko温度传感器驱动。。采集温度并返回温度数值

socket.c

 14 #include<stdio.h>
 15 #include<stdlib.h>
 16 #include<string.h>
 17 #include<errno.h>
 18 #include<sys/types.h>
 19 #include<sys/socket.h>
 20 #include<netinet/in.h>
 21 #include <sys/time.h>
 22 #include<time.h>
 23 
 24 #define MAXLINE 4096
 25 
 26 int main(int argc, char **argv)
 27 {
 28     int sockfd, n;
 29     char buff[4096];
 30     struct sockaddr_in servaddr;
 31 
 32     if (argc != 2)
 33     {
 34         printf("usage: ./client<ipaddress>\n");
 35         exit(0);
 36     }
 37 
 38     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
 39     {
 40        printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
 41        exit(0);

 42     }
 43 
 44     memset(&servaddr, 0, sizeof(servaddr));
 45     servaddr.sin_family = AF_INET;
 46     servaddr.sin_port = htons(6666);
 47     if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
 48     {
 49         printf("inet_pton error for %s\n",argv[1]);
 50         exit(0);
 51     }
 52 
 53     if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) <0 )
 54     {
 55         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
 56         exit(0);
 57     }
 58 /* make information */
 59     time_t rawtime;
 60     struct tm* timeinfo;
 61     char timE[80];
 62     time(&rawtime);
 63     timeinfo=localtime(&rawtime);
 64     strftime(timE,80,"%m-%d %I:%M:%S",timeinfo);
 65 
 66     double num = get_tem();
 67     int sig = 4;
 68     gcvt(num, sig, buff);
 69 
 70     strcat(buff, "|");
 71     strcat(buff, timE);
 72     strcat(buff, "\0");
 73 
 74     if (send(sockfd, buff, strlen(buff), 0) <0 )
 75     {
 76         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
 77         exit(0);
 78     }
 79 

80     close(sockfd);
 81     return 0;
 82 }

实现的是采集系统当前时间并和温度整理成一个字符串。。通过网络socket上报

head.h

14 #include <stdio.h>
 15 #include <sys/types.h>
 16 #include <sys/ioctl.h>
 17 #include <stdlib.h>
 18 #include <termios.h>
 19 #include <sys/stat.h>
 20 #include <fcntl.h>
 21 #include <sys/time.h>
 22 #include<string.h>
 23 #include<errno.h>
 24 #include<sys/socket.h>
 25 #include<netinet/in.h>
 26 #include<time.h>
 27 
 28 #define MAXLINE 4096

头文件。。本来准备写Makefile。。后来懒得写了。。这个头文件是为了Makefile写的。。在采集温度的函数中有调用

这就是全部的客户端代码。。下面介绍主机端

sql.c

14 #include"head.h"
 15 
 16 sqlite3 *open_sql(void)
 17 {
 18     int ret = 0;
 19     sqlite3 *db;
 20 
 21     ret = sqlite3_open("temperature", &db);
 22     if(ret != SQLITE_OK)
 23     {
 24         printf("open erri!\n");
 25         return (sqlite3 *)-1;
 26     }
 27 
 28     return db;
 29 }
 30 
 31 int close_sql(sqlite3 *db)
 32 {
 33     sqlite3_close(db);
 34     return 0;
 35 }
 36 
 37 int create_table(void)
 38 {
 39     char *err = 0;
 40     int ret = 0;
 41     sqlite3 *db;

 42 
 43     db = open_sql();
 44 
 45     ret = sqlite3_exec(db, "create table t(tem text, time text perimary key);", NULL, NULL, &err);
 46     if(ret != SQLITE_OK)
 47     {
 48         printf("create table err!\n");
 49         sqlite3_close(db);
 50         return -1;
 51     }
 52 
 53     close_sql(db);
 54     return 0;
 55 
 56 }
 57 
 58 int write_table(char *tem, char *time)
 59 {
 60     sqlite3 *db;
 61     int ret;
 62     char *err = 0;
 63     char data[50] = "insert into t values(\"";
 64 
 65     db = open_sql();
 66 
 67     strcat(data, tem);
 68     strcat(data, "\", \"");
 69     strcat(data, time);
 70     strcat(data, "\");");
 71 
 72     printf("%s\n", data);
 73 
 74     ret = sqlite3_exec(db, data, NULL, NULL, NULL);
 75     printf("1\n");
 76     if(ret != SQLITE_OK)
 77     {
 78         printf("write err\n");

 79         close_sql(db);
 80         return -1;
 81     }
 82 
 83 }
 84 
 85 int myfunc(void *p, int argc, char **argv, char **argvv)
 86 {
 87     int i;
 88 
 89     for(i =0; i < argc; i++)
 90     {
 91         printf("%s = %s ", argvv[i], argv[i]);
 92     }
 93 
 94     putchar('\n');
 95     return 0;
 96 }
 97 
 98 int read_table(void)
 99 {
100     sqlite3 *db;
101     int ret;
102     char *err = 0;
103 
104     db = open_sql();
105 
106     ret = sqlite3_exec(db, "select * from t;", myfunc, NULL, &err);
107     if(ret != SQLITE_OK)
108     {
109         printf("exec err\n");
110         close_sql(db);
111         return -1;
112     }
113 
114     close_sql(db);
115 
116     return 0;
117 }

这就是全部的操作数据库的代码。。包括打开创建表和读写。。读是读出数据。。要打印到屏幕上还要实现里面的回调函数myfun。。

socket.c

13 #include"head.h"
 14 
 15 int main(int argc, char** argv)
 16 {
 17     int listenfd, connfd;
 18     struct sockaddr_in  servaddr;
 19     char buff[MAXLINE];
 20     int n;
 21 
 22     if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
 23     {
 24         printf("create  socket error:%s(errno:%d)\n", strerror(errno),errno);
 25         exit(0);
 26     }
 27 
 28     memset(&servaddr, 0, sizeof(servaddr));
 29     servaddr.sin_family = AF_INET;
 30     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
 31     servaddr.sin_port = htons(6666);
 32 
 33     if((bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))) == -1)
 34     {
 35         printf("bind error:%s(errno:%d)\n", strerror(errno), errno);
 36         exit(0);
 37     }
 38 
 39     if (listen(listenfd, 10) == -1)
 40     {
 41         printf("listen socket error:%s(errno:%d)\n", strerror(errno), errno)

 42         exit(0);
 43     }
 44 
 45     printf("=================waiting for client's request=====================\n");
 46     while(1)
 47     {
 48         if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
 49         {
 50             printf("accept error:%s(errno:%d)\n", strerror(errno), errno);
 51             continue;
 52         }
 53         n = recv(connfd, buff, MAXLINE, 0);
 54 /* solve information */
 55         char tem1[10];
 56         char time1[20];
 57         char *tem = (char *)tem1;
 58         char *time = (char *)time1;
 59         char *ptr;
 60         char *opt = buff;
 61 
 62         memset(tem1, 0, strlen(tem1));
 63         memset(time1, 0, strlen(time1));
 64 
 65         ptr = strchr(opt, '|');
 66         if(ptr-opt == 0)
 67             printf("tem is NULL!\n");
 68         else
 69             strncpy(tem1, opt, ptr-opt);
 70 
 71         opt = ptr + 1;
 72         ptr = strchr(opt, '\0');
 73         if(ptr-opt == 0)
 74             printf("time is NULL!\n");
 75         else
 76             strncpy(time1, opt, ptr-opt);
 77         printf("%s,%s", tem1, time1);
 78 
 79         create_table();
 80         write_table(tem1, time1);

 81         read_table();
 82 
 83 
 84         close(connfd);
 85     }
 86 
 87     close(listenfd);
 88 }

这就是全部的socket主机段的函数。。主要功能是完成socket的链接。。并且将解析出的两个温度和时间的字符串调用对应的读写函数。。

head.h

 14 #include<sqlite3.h>
 15 #include<stdio.h>
 16 #include<stdlib.h>
 17 #include<string.h>
 18 #include<errno.h>
 19 #include<sys/socket.h>
 20 #include<sys/types.h>
 21 #include<netinet/in.h>
 22 
 23 #define MAXLINE 4096
头文件

 Makefile

  1 CC=gcc
  2 
  3 objs =sql.o socket.o
  4 srcs =sql.c socket.c
  5 
  6 tem: $(objs)
  7             $(CC) -o tem $(objs) -lsqlite3
  8                 @make clean
  9 
 10 
 11 socket.o: $(srcs) head.h
 12              $(CC) -c  $(srcs)
 13 
 14 sql.o: sql.c head.h
 15             $(CC) -c    sql.c
 16 
 17 clear:
 18              @rm  tem
 19 
 20 .PHONY: clean
 21 clean:  
 22             @rm *.o 

Makefile。。上面客户端的Makefile也可以参照这个写。。

这里要说明的几点是。。

第一。。传温度我考虑的是传客户端的温度。。因为我们这个采集什么的不算精准。。而且短距离。。所以客户端的时间和主机端时间基本同步。。但是监控肯定是实时准确的。。采集的是当地当时的温度。。出于标准化我这里的时间也是打包传递过来的客户端时间。。

第二。。这里的我的数据库是不支持时间date数据格式的。。所以我这里自己配置了字符串时间格式。。并以字符串的形式写入了数据库

第三。。这里给sqlite3_exec的sql语句不能过长。。过长会出现段错误。。所以我这里对数据进行了适当的调整。。将时间格式缩短并且简化了表的名称。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值