Linux socket 获取温度上报服务器

来源:互联网 发布:小额贷款那个软件最好 编辑:程序博客网 时间:2024/06/05 02:14

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

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



0 0