温度实时监控上报
客户端功能
1、树莓派上运行socket客户端程序,每隔30秒以字符串“ID/时间/温度”形式上报 采样温度,其中ID为树莓派的编号,便于服务器端区别是哪个树莓派客户端,如“RPI0001/2019-01-05 11:40:30/30.0C”;
2、通过命令行参数指定服务器IP地址和端口以及间隔采样时间;
3、程序放到后台运行,并通过syslog记录程序的运行出错、调试日志;
4、程序能够捕捉kill信号正常退出;
代码
1、该模块是用于客户端与服务器建立连接。
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
//port和ser_ip由用户自己输入指定的服务器端口和地址
int connect_server(int port, char *server_ip)
{
int con_fd = -1;
struct sockaddr_in ser_addr;
//创建socket_fd
con_fd = socket(AF_INET, SOCK_STREAM, 0);
if (con_fd < 0)
{
printf("Creat socket failure:%s\n",strerror(errno));
return -2;
}
//设置服务器端IP地址及端口信息
memset(&ser_addr, 0, sizeof(ser_addr)); //ser_addr结构体变量占用内存区域清零
ser_addr.sin_family = AF_INET; //设定协议族为AF_INET,即使用ipv4(32位)与端口号(16位)的组合
ser_addr.sin_port = htons(port); //调用htons()函数,将端口号由主机字节序转变成网络字节序
inet_aton(ser_ip, &ser_addr.sin_addr); //将目前字符串形式的IP地址转变成一个32位的网络序列的IP地址
//与服务器端建立连接,并判断是否成功连接
//ipv4对应sockaddr_in类型,此时应进行强制类型转换为通用套接字sockaddr类型
if (connect(con_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) < 0)
{
printf("Connect server failure:%s\n", strerror(errno));
return -3;
}
//连接成功,打印相关信息
printf("Establish the connection with server successfully\n");
//返回客户端创建的socket_fd
return con_fd;
}
2、该模块用于采集温度数据
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
int temperper_get(float *temper);
int temperper_get(float *temper)
{
int fd = -1;
int found = 0;
char f_name[32];
char cache[512];
char *ptr = NULL;
char path[128]="/sys/bus/w1/devices/";
DIR *dirp = NULL;
struct dirent *direntp = NULL;
//打开温度传感器设备文件夹
dirp = opendir(path);