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 <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
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 }
ds18b20采集温度并上报服务器的更多相关文章
- 单片机C语言实现的采用DS18B20的温度检测装置
这几天老师布置了一个课程设计题目:采用51单片机控制的DS18B20温度检测系统.大概花了我一个礼拜的时间,幸好我的C语言学得还可以,最后还是让我搞出来了,真是高兴,我是采用STC-52单片机和DS1 ...
- jacoco统计Android手工测试覆盖率并自动上报服务器
改进了几个点 1. 不用借助Instrumentation启动,正常启动即可: 2. 测试代码不用push到主分支,主分支代码拉到本地后用git apply patch方式合并覆盖率代码: 3. 测试 ...
- 嵌入式linux驱动开发之给linux系统添加温度传感器模块
忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而 ...
- 基于ARM-LINUX的温度传感器驱动-DS18B20
转载:http://blog.csdn.net/ayangke/article/details/6883244 作者:冯建,华清远见嵌入式学院讲师. DS18B20数字温度传感器接线方便,封装成后可应 ...
- 基于ARM-LINUX的温度传感器驱动(DS18B20) .
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装 ...
- 一种快速查询多点DS18B20温度的方法(转)
源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言 为了满足实时性要 ...
- CMDB服务器管理系统【s5day88】:采集资产之Agent、SSH和Salt模式讲解
在对获取资产信息时,简述有四种方案. 1.Agent (基于shell命令实现) 原理图 Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库 优点: ...
- 用树莓派和DS18B20做个汽车温度记录仪[原创]
用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该很简单,于是就尝试捣鼓了一下,半天时间就搞定了,写 ...
- 用树莓派和DS18B20做个汽车温度记录仪
原文:用树莓派和DS18B20做个汽车温度记录仪 用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该 ...
随机推荐
- 错误/异常:java.io.FileNotFoundException: .\src\db.properties (系统找不到指定的路径。);的解决方法
1.异常视图 2.解决方法 与之相关的部分代码: static{ try { //读取db.properties Properties props = new Properties(); FileIn ...
- 将eclipse的maven项目导入到intellij idea中
最近项目中需要用到idea,需要将原来的eclipse项目进行转移.捣鼓了半天终于成功了,在这里和大家分享下,希望对大家有所帮助,如有错误,欢迎指正. idea的确是一款很智能的开发工具,真的是爱不释 ...
- python 全栈开发,Day134(爬虫系列之第1章-requests模块)
一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...
- MySQL学习笔记:一道group by+group_concat解决的小问题
闲来无事,逛逛V2EX发现一道MySQL数据库题目,原题如下: 遂打开很长一段时间都没用过SQLyog,噗呲噗呲的干起活来…… 建测试表: CREATE TABLE test_001 ( id INT ...
- Kubernetes图形化归纳总结基础介绍整理
今天了解了下k8s,看了很多资料,自己归纳总结下,如果需要测试集群的话需要准备三台Linux服务器,一台做Master,其余两台作为Node仆从(MINION)节点, 先说下Node节点,就是宿主机器 ...
- Delphi---TServerSocket和TClientSocket发送和接收大数据包
https://www.cnblogs.com/zhangzhifeng/p/6065244.html TServerSocket和TClientSocket用非阻塞模式发送和接收比较大的数据时,可能 ...
- Python 可命名元祖
import collections MytupleClass = collections.namedtuple('MytupleClass',['x','y','z']) obj = Mytuple ...
- 009 使用servlet API作为参数
1.哪些可以使用 MVC中的Handler方法可以接受ServletAPI类型的参数. 2.controller package com.spring.it; import java.io.IOExc ...
- CentOS下生成密钥对(公钥、私钥)
1.公钥.私钥简述: 假设数据传输方A向数据接收方B传输数据(以A为服务器,B为客户端为例).现在B有一对密钥对(公钥和私钥),B将公钥发送给A,A通过公钥加密后将数据传给B,B收到数据后利用手里的私 ...
- UVA 11624-Fire!【双BFS】
<题目链接> 题目大意: 你的任务是帮助J走出一个大火蔓延的迷宫.J每分钟可以超上下左右四个方向移动,而所有着火的格子每一分钟都会往四个方向蔓延一格.迷宫中有一些障碍,J和火都无法进入.当 ...