Linux socket 获取温度上报服务器

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

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 6666

int 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 4096

sqlite3 *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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值