Lab在局域网中找到你的树莓派(windows平台)

如果,你的电脑和树莓派连在了同一个局域网中。如何从它的MAC地址知道它的IP呢?

教程目标:

写一个PC的程序,Unix或Windows,能通过对局域网内所有IP地址的ping,找到arp表里的MAC地址和IP地址对应关 系,根据RPi的MAC段找到局域网内的RPi的IP地址。

教程器材及软件:

  1. 树莓派的板子。
  2. SD卡(已经有镜像刷入)。
  3. 电源线及USB充电器。
  4. putty和psftp。(可以到http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载)
  5. 有DHCP的网线。

原理:

原理其实比较简单,就是arp表和ping的原理。在http://blog.163.com/woxiangxin5@126/blog/static/210450682008102234334173/ 中有比较好的介绍,在此就不重复了。

代码:

  1. 代码也十分简单,就是先从命令行参数中读入,主机IP地址和树莓派的MAC地址。(主机IP可以用ipcofig命令查看,树莓派MAC地址可以用ifconfig在树莓派中查看。)
  2. 将主机所在的网段全部ping一遍。(此时使用的system()函数,在stdlib.h中。)
  3. 然后,再用arp -a 读出arp表,用树莓派的MAC地址找出树莓派IP地址。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

void help(void);
void ping_all_ip(const char* local_host_address);
void resolve_arp_tables(char* mac_address,char* ip_address);

int main(int argc,char** argv)
{
	char ip_address[20];
	if(argc!=3)
	{
		help();
		return -1;
	}

	ping_all_ip(argv[1]);
	resolve_arp_tables(argv[2],ip_address);

	puts("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
	printf("Your raspberry's IP is %s\n",ip_address);
	puts("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");


	return 0;
	
}
void help(void)
{
	puts("find_your_raspberry is used to find your raspberry in the"
		"local network.You should run it like find_your_raspberry "
		"(local computer IP in the LAN) (The MAC of your raspberry).");
}
void ping_all_ip(const char* local_host_address)
{
	char address[256];
	char num[10];
	char*p = NULL;
	strcpy(address,local_host_address);
	assert((p=strstr(address,"."))!=NULL);
	p++;
	assert((p=strstr(p,"."))!=NULL);
	p++;
	assert((p=strstr(p,"."))!=NULL);
	p++;
	*p='\0';
	
	//for(int i=100;i<110;i++)
	for(int i=0;i<256;i++)
	{
		char command[512]="ping -n 1 -w 20 ";
		itoa(i,num,10);
		strcat(address,num);
		strcat(command,address);

		puts(command);
		system(command);

		*p='\0';
	}

}
char* strip(char* str)
{
	while(*str==' ' && *str!='\0')
	{
		str++;
	}
	int len = strlen(str);
	while(str[len-1]==' ')
	{
		len--;
		str[len]='\0';
	}
	return str;
}
void resolve_arp_tables(char* mac_address,char* ip_address)
{
	char line[256];
	FILE *file=NULL;

	ip_address[0] = '\0';

	system("arp -a>>temp");
	assert((file=fopen("temp","r"))!=NULL);
	while(!feof(file))
	{
		char* p=NULL;
		fgets(line,sizeof(line),file);
		p=strstr(line,mac_address);
		if(p!=NULL)
		{
			*p='\0';
			strcpy(ip_address,strip(line));
			break;
		}
	}
	fclose(file);

	system("del temp");
}

步骤:

  1. 将树莓派组装好后,接上电源。
  2. 查看主机IP地址。

  3. 查看树莓派的MAC地址。

  4. 编写代码。
  5. 编译执行。
  6. 结果:

备注:

此教程为浙江大学计算机学院嵌入式系统的扩展实验报告。

发布了35 篇原创文章 · 获赞 2 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章