I.最初に、クライアントは、機能を実装する必要があります。
1、ラズベリーは30秒ごとに、ID番号は、クライアントのラズベリーを送信するために区別サーバを容易にラズベリーを、送信されることを特徴とするサンプル文字列「ID /時間/温度」によって報告されたフォームの温度をクライアントプログラムを実行している来るソケットなど端、「RPI0001 / 2019年1月5日11:40:30 / 30.0C」;
2は、コマンドラインパラメータは、サーバのIPアドレスとポート、およびサンプリング時間間隔を指定
し、システムログを記録することによって3、バックグラウンドで実行中のプログラムをプログラムエラーを実行して、デバッグログ;
4、プログラムがkillシグナルの正常終了をキャプチャすることができます。
第二に、のフローチャートのクライアントの実装:
スリーコード:
1、ドメイン名解決によって、IPアドレスへのラズベリーパイドメイン名:
void print_usage(char *order)
{
printf("%s usages:\n",order);
printf("-I(IP):server IP\n");
intf("-p(port):server port\n");
printf("-h(help):help information\n");
exit(0);
}
int main(int argc,char **argv)
{
char *serv_IP = NULL;
int serv_port = 0;
int opt;
struct sockaddr_in serv_addr;
char buf[100];
char buf1[100];
char chip[20];
int sockfd;
int rv = -1;
int on = 1;
float temp;
int line;
struct timespec tout;
struct tm *tmp;
struct hostent *hptr;
struct option long_options[]=
{
{"IP",1,NULL,'i'},
{"port",1,NULL,'p'},
{"help",0,NULL,'h'},
{0,0,0,0}
};
mylog(argv[0],__LINE__,DEBUG,"This is debug info");
hptr = gethostbyname(argv[1]);
if(hptr != NULL)
{
printf("domian name visit.\n");
// printf("IP address1:%s\n",inet_ntoa(*(struct in_addr *)hptr->h_addr_list[1]));
serv_IP = hptr->h_addr_list[1];
printf("IP address2:%s\n",inet_ntoa(*(struct in_addr *)serv_IP));
}
else if(hptr == NULL)
{
switch(opt)
{
case 'i':
serv_IP = optarg;
break;
case 'p':
serv_port = atoi(optarg);
break;
case 'h':
print_usage(argv[0]);
break;
default:
break;
}
}
if((!serv_IP)|(!serv_port))
{
print_usage(argv[0]);
}
}
2socket機能が初期化
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("socket failed: %s\n",strerror(errno));
}
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(serv_port);
inet_aton(serv_IP,&serv_addr.sin_addr);
memset(buf,0,sizeof(buf));
printf("client is connecting serve...\n");
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
{
printf("connect failed: %s\n",strerror(errno));
}
else
{
printf("Connect successfully...\n");
}
3whileサイクル
while(1)
{
DS_get_tem(&temp,chip);
tmp = localtime(&tout.tv_sec);
strftime(buf1,sizeof(buf1),"%r",tmp);
sprintf(buf,"%s %.3f鈩?%s",chip,temp,buf1);
if(write(sockfd,buf,strlen(buf)) <0 )
{
printf("write to serve unsuccessfully: %s\n",strerror(errno));
goto cleanup;
}
memset(buf,0,sizeof(buf));
if((rv = read(sockfd,buf,sizeof(buf))) < 0)
{
printf("read from serve unsuccessfully: %s\n",strerror(errno));
goto cleanup;
}
if(rv == 0)
{
printf("disconnect serve\n");
goto cleanup;
}
printf(" %s\n",buf);
memset(buf,0,sizeof(buf));
sleep(10);
}
close(sockfd);
cleanup:
close(sockfd);
return 0
}
4関数温度をサンプリングし、温度センサが測定した温度が、特定のフォルダへの文字列によって記録さDS18B20来るラズベリー、ファイルの内容は、温度の変化に伴って変化するであろう。その後、我々は、I / Oは、温度値を取得することで、関連するファイルの下のLinuxオペレーティングを使用する必要があります。
void DS_get_tem(float *temp,char *chip)
{
DIR *dp;
struct dirent *dirp;
char w1_path[30] = "/sys/bus/w1/devices/";
int found = 0;
int fd;
char *ptr;
char buf[100];
if((dp = opendir(w1_path)) < 0)
{
printf("opendir w1_path failed: %s\n",strerror(errno));
}
while((dirp = readdir(dp)) != NULL)
{
if(strstr(dirp->d_name,"28-") > 0)
{
strcpy(chip,dirp->d_name);
found = 1;
break;
}
}
closedir(dp);
strncat(w1_path,chip,sizeof(w1_path));
strncat(w1_path,"/w1_slave",sizeof(w1_path));
if(!found)
{
printf("readdir failed and can't find %s\n",dirp->d_name);
}
if((fd=open(w1_path,O_RDONLY)) < 0)
{
printf("open w1_path failed: %s\n",strerror(errno));
close(fd);
}
if(read(fd,buf,sizeof(buf)) < 0)
{
printf("read from w1_path failed: %s\n",strerror(errno));
close(fd);
}
ptr = strstr(buf,"t=");
if(!ptr)
printf("ERROR:can't get temperature\n");
ptr+=2;
*temp = atof(ptr)/1000;
}
oid sig_kill(int signo)
{
printf("SIGKILL[%d] caught\n",signo);
exit(0);
}
出典ます。https://gitee.com/yangjianing1/test