如果,你的电脑和树莓派连在了同一个局域网中。如何从它的MAC地址知道它的IP呢?
教程目标:
写一个PC的程序,Unix或Windows,能通过对局域网内所有IP地址的ping,找到arp表里的MAC地址和IP地址对应关 系,根据RPi的MAC段找到局域网内的RPi的IP地址。
教程器材及软件:
- 树莓派的板子。
- SD卡(已经有镜像刷入)。
- 电源线及USB充电器。
- putty和psftp。(可以到http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载)
- 有DHCP的网线。
原理:
原理其实比较简单,就是arp表和ping的原理。在http://blog.163.com/woxiangxin5@126/blog/static/210450682008102234334173/ 中有比较好的介绍,在此就不重复了。
代码:
- 代码也十分简单,就是先从命令行参数中读入,主机IP地址和树莓派的MAC地址。(主机IP可以用ipcofig命令查看,树莓派MAC地址可以用ifconfig在树莓派中查看。)
- 将主机所在的网段全部ping一遍。(此时使用的system()函数,在stdlib.h中。)
- 然后,再用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"); }
步骤:
- 将树莓派组装好后,接上电源。
- 查看主机IP地址。
-
- 查看树莓派的MAC地址。
-
- 编写代码。
- 编译执行。
- 结果:
-
备注:
此教程为浙江大学计算机学院嵌入式系统的扩展实验报告。