ds18b20采集温度并上报服务器

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

交叉编译器:arm-linux-gcc-4.5.4

Linux内核版本:Linux-3.0

主机操作系统:Centos 6.5

开发板:FL2440

温度传感器:ds18b20

注:此程序的客户端是在装有ds18b20模块并有ds18b20驱动的系统上跑的,本人写的ds18b20的驱动

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

一、socket图解

socket是“open—write/read—close”模式的一种实现,而在socket编程里面,socket()就是open()函数了。socket编程的流程图示已经很清楚,各个函数的用法这里就懒得说了,也说不好,网上有一堆一堆的专业人士的解释,非专业人士还是直接上代码的比较好。

二、客户端代码:

  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 <[email protected]>
 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
 27 #define MAXLINE                 4096
 28 /********************************************************************************
 29  *  Description:
 30  *   Input Args:
 31  *  Output Args:
 32  * Return Value:
 33  ********************************************************************************/
 34 double get_tem(void)        //获取温度的函数
 35 {
 36     int fd;
 37     double result = 0;
 38     unsigned char buff[2];
 39     unsigned short temp = 0;
 40     int flag = 0;
 41
 42     if ((fd=open("/dev/ds18b20",O_RDWR | O_NDELAY | O_NOCTTY)) < 0)
 43     {
 44         perror("open device ds18b20 failed.\r\n");
 45         exit(1);
 46     }
 47
 48     printf("open device ds18b20 success.\r\n");
 49
 50     read(fd, buff, sizeof(buff));
 51     temp=((unsigned short)buff[1])<<8;
 52     temp|=(unsigned short)buff[0];
 53     result=0.0625*((double)temp);
 54     close(fd);
 55     printf("temperature is %4f \r\n", result);
 56     return result;
 57 }
 58
 59 int main (int argc, char **argv)
 60 {
 61     double      temperature;
 62     int         sockfd;
 63     char        temp[25];
 64     char        sendline[MAXLINE];
 65     struct sockaddr_in servaddr;
 66
 67     if(argc != 2)        //主函数中需要获得服务器的地址作为第二参数
 68     {
 69         printf("usage: ./client <ipaddress>.\n");
 70         return 0;
 71     }
 72
 73     if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)        //如果打开失败则打印错误并返回
 74     {
 75         printf("create socket error: %s(errno: %d).\n", strerror(errno), errno);
 76         return 0;
 77     }
 78
 79     memset(&servaddr, 0, sizeof(servaddr));
 80     servaddr.sin_family = AF_INET;
 81     servaddr.sin_port = htons(6666);
 82     if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)        //将点分十进制ip转换为点分二进制ip
 83     {
 84         printf("inet_pton error for %s.\n", argv[1]);
 85         return 0;
 86     }
 87
 88     if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)        //建立连接
 89     {
 90         printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
 91         return 0;
 92     }
 93
 94     temperature = get_tem();        //获取温度
 95     gcvt(temperature, 4, temp);        //将浮点型数转换为字符串
 96     memset(sendline, 0, sizeof(sendline));
 97     strcpy(sendline, temp);
 98     if(send(sockfd, sendline, strlen(sendline), 0) < 0)
 99     {
100         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
101         return 0;
102     }
103
104     close(sockfd);
105     return 0;
106 } /* ----- 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
11 #define MAXLINE 4096
12
13 int main(int argc, char** argv)
14 {
15     int         n;
16     int         listenfd;
17     int         connfd;
18     char        buff[4096];
19     struct  sockaddr_in     servaddr;
20
21     if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )        //打开socket,若失败则打印失败信息并返回
22     {
23         printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
24         exit(0);
25     }
26
27     memset(&servaddr, 0, sizeof(servaddr));
28     servaddr.sin_family = AF_INET;
29     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
30     servaddr.sin_port = htons(6666);
31
32     if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
33     {
34         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
35         exit(0);
36     }
37
38     if(listen(listenfd, 10) == -1)        //监听串口
39     {
40         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
41         exit(0);
42     }
43
44     printf("======waiting for client‘s request======\n");
45     while(1)
46     {
47         memset(buff, 0, sizeof(buff));
48         time_t rawtime;
49         struct tm* timeinfo;
50         char timE[80];
51         time(&rawtime);
52         timeinfo=localtime(&rawtime);
53         strftime(timE,80,"%y-%m-%d %I:%M:%S",timeinfo);        //获取系统时间
54
55         if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
56         {
57             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
58             continue;
59         }
60         n = recv(connfd, buff, MAXLINE, 0);        //从客户端获取数据,并返回数据大小
61         strcat(buff, "℃\0");
62         printf("the degrees is: %s %s\n", buff, timE);
63         close(connfd);
64     }
65     close(listenfd);
66 }
时间: 2024-11-01 09:43:34

ds18b20采集温度并上报服务器的相关文章

solr+采集程序合并搜索服务器

需求: 1,从数据库中获取目标url,用爬虫程序获取页面标题正文,加入solr服务器: 2,solr服务器提供前台做查询服务: 3,solrj做客户端提交数据. note:曾考虑为什么用solr不用关系型数据库,大数据文本搜索以及分词,solr搜索效率比mysql更高. STEP:1 下载solr3.4.0:http://archive.apache.org/dist/lucene/solr/3.4.0/ 生产环境使用该版本(现最新版本5.3) STEP:2 http://blog.csdn.n

2015电赛点滴

2015-7-2第1阶段 初步选题为通信类,和仪器仪表类.做红外光通信和频率特性分析仪两道题. 一.进度: 模拟部分:发送端去掉前面的电位器直接接在电容一侧进行耦合,接收端电路跳过前置放大的三极管. 传输距离较短,70cm左右: 数字部分 :单片机在4800波特率下传输键值,和简单字符进行双机通信没问题: 二.各自分工进展: 马永昊:搭建数字电路,模拟电路并调试 张初瞳:单片机的双机通信,温度显示 陈泽昱:滤波.运放电路.555芯片的使用 三.下一步: 提高模拟部分的传输距离,从前置放大,和lm

嵌入式linux驱动开发之给你的linux系统添加温度传感器模块

忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而且剩余很多,可以用软件资源来代替硬件资源,比如说可以用视频编解码软件取代硬件来工作.但有很多模块需要实时的采集数据这都是软件永远无法代替的,而且随着互联网的进一步发展,智能化也是一个必然的趋势,因此大量的传感器和控制芯片将被应用到生产生活中,所以个人觉得驱动开发还是个不错的方向.同时,作为学习者,再

基于arm的多路温度采集控制系统(2)需求分析

嵌入式项目实践–多路温度采集控制系统(2)需求分析 本文档视频教程多路温度采集系统–需求分析 项目实践流程: 1.设计项目需求文档 说明项目设计目的,项目功能,项目模块,实现技术. 2.项目编码设计 程序要求模块结构化(函数),编码风格良好,多文件结构实现. 3.项目测试 设计测试用例,说明测试步骤,测试结果. 4.项目总结与演示 编写项目总结文档,PPT演示文档,进行项目演示说明. 项目提交内容: 1.项目需求规格说明书. 2.项目源代码,makefile文件,可执行文件,项目实施说明书. 3

服务器的散热和Linux中温度的检测

当服务器被放在散热条件不好的条件下,这样会导致硬盘驱动过早损坏,并且服务器其他的组件也会很快出现故障.现代的服务器主板检测到CPU过热的时候,通常会限制CPU的频率,所以即使服务器没有完全损坏,也有可能达到一个无法使用的程度.有时候,组件过热也许会导致进程意外崩溃. 如果数据中心过热,可以购买一个可以检测温度的架装温度计. Linux提供了lm-sensors包工具. sensors 是一个调用检测传感器,用来检测服务器各个部分的温度 sh -c "yes|sensors-detect"

基于ARM-LINUX的温度传感器驱动(DS18B20) .

DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合.耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域. 技术性能描述 1. 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口

单片机练习 - DS18B20温度转换与显示

DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点.因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计.DS18B20 产品的特点: (1).只要求一个I/O 口即可实现通信.(2).在DS18B20 中的每个器件上都有独一无二的序列号.(3).实际应用中不需要外部任何元器件即可实现测温.(4).测量温度范围在-55 到+125℃之间; 在-10 ~ +8

python脚本采集服务器数据通过API提交到django web服务器,然后展示在页面上

采集服务器的信息的python程序 #coding:utf-8 import psutil import urllib import urllib.request import urllib.parse #import urllib2 import requests #获取数据 cpuData = psutil.cpu_times() #处理数据 cpuMax = cpuData.user+cpuData.system+cpuData.idle cpuUsed = cpuData.user+cp

UWB DWM1000 开源项目框架 之 温度采集

在之前博文开源一套uwb 框架,后面几篇博文会基于这个开源框架进行简单开发. 让uwb使用者更清楚了解基于这个basecode 开发工作. 这里所做内容是,采集dwm1000 温度,并发送到另一个节点,另一个节点通过串口打印,也就是这里是一个远程采集温度的工程.当然可以使用主控stm32 采集任何传感器,按照本文思路将数据打包发送到另外一个节点. 1 在tx_main.c增加温度采集函数,并做验证. 温度采集函数 uint16 BPhero_UWB_Get_Temperature(void) {