我想尝试使用 Raspberry Pi 进行一些网络项目,并且我只需要在一对 pi 之间发送数据包。作为第一步,我很高兴能够在临时模式下 ping 到 Raspberry Pi。尽管在网上查看了一些教程和示例,但我还没有成功完成此操作。
我有 2 个安装了 Debian Wheezy 操作系统的 Raspberry Pi。我正在使用以下 USB 适配器,我在两个 pi 上安装了固件,并通过以托管模式将它们连接到路由器来测试它们的工作情况: 总线 001 设备 004:ID 050d:945a Belkin Components F7D1101 v1 基本无线适配器 [Realtek RTL8188SU]
以下是一些有关网络信息的打印输出:
每个 pi 的 /etc/network/interfaces:
pi1@raspberrypi ~ $ cat /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet manual
address 192.168.2.1
netmask 255.255.255.0
wireless-channel 4
wireless-essid pi-ad-hoc
wireless-mode ad-hoc
pi2@raspberrypi ~ $ cat /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet manual
address 192.168.2.2
netmask 255.255.255.0
wireless-channel 4
wireless-essid pi-ad-hoc
wireless-mode ad-hoc
在每个 pi 上进行 ifconfig:
pi1@raspberrypi ~ $ ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr ec:1a:59:46:8e:5a
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:26 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
pi2@raspberrypi ~ $ ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr ec:1a:59:46:59:0a
inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:6 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
每个 pi 上的 iwconfig:
pi1@raspberrypi ~ $ iwconfig wlan0
wlan0 IEEE 802.11bg ESSID:"pi-ad-hoc" Nickname:"rtl_wifi"
Mode:Ad-Hoc Cell: 02:11:87:FA:4A:02 Bit Rate:54 Mb/s
Sensitivity:0/0
Retry:off RTS thr:off Fragment thr:off
Power Management:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
pi2@raspberrypi ~ $ iwconfig wlan0
wlan0 IEEE 802.11bg ESSID:"pi-ad-hoc" Nickname:"rtl_wifi"
Mode:Ad-Hoc Cell: 02:11:87:C4:F2:01 Bit Rate:54 Mb/s
Sensitivity:0/0
Retry:off RTS thr:off Fragment thr:off
Power Management:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
一个 pi 的路由(与其他 pi 相同):
pi1@raspberrypi ~ $ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
192.168.2.0 * 255.255.255.0 U 0 0 0 wlan0
iwlist 在每个 pi 进行扫描:
pi1@raspberrypi ~ $ sudo iwlist wlan0 scan
wlan0 Scan completed :
Cell 01 - Address: 02:11:87:FA:4A:02
ESSID:"pi-ad-hoc"
Protocol:IEEE 802.11bg
Mode:Ad-Hoc
Frequency:2.427 GHz (Channel 4)
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Quality:0 Signal level:0 Noise level:0
Cell 04 - Address: 02:11:87:C4:F2:01
ESSID:"pi-ad-hoc"
Protocol:IEEE 802.11bg
Mode:Ad-Hoc
Frequency:2.427 GHz (Channel 4)
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Signal level=100/100
pi2@raspberrypi ~ $ sudo iwlist wlan0 scan
wlan0 Scan completed :
Cell 01 - Address: 02:11:87:C4:F2:01
ESSID:"pi-ad-hoc"
Protocol:IEEE 802.11bg
Mode:Ad-Hoc
Frequency:2.427 GHz (Channel 4)
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Quality:0 Signal level:0 Noise level:0
Cell 02 - Address: 02:11:87:FA:4A:02
ESSID:"pi-ad-hoc"
Protocol:IEEE 802.11bg
Mode:Ad-Hoc
Frequency:2.427 GHz (Channel 4)
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Signal level=100/100
Ping 不起作用,而且它们之间似乎没有网络。从 iwconfig 中,您可以看到它们每个都有一个不同的“Cell”地址(与 iwlist 扫描中的 Cell 不同),这是用于定义 ad-hoc 网络的伪基站 ID(我最好的理解是我读过的内容)。另外,从 iwlist,每个 pi 都可以看到自己的以及其他 pi 的 ad-hoc 网络。我假设他们需要选择相同的 Cell id 进行通信,但我不确定如何让他们自动执行此操作。我尝试静态地强制这些与每个 pi 上的以下命令相同,这不会更改单元格 ID,因此不起作用:
sudo iwconfig wlan0 ap (some address)
我还尝试了一种在 wpa_supplicant 配置中使用 ap_scan=2 的解决方案,但这似乎没有帮助。
有人知道我做错了什么吗?
经过一番搜索,我发现我使用的 Belkin USB 适配器显然没有 Linux 驱动程序的 ad-hoc 模式支持。我购买了其他一些效果很好的无线 USB 适配器“Edimax EW-7811Un 150 Mbps 无线 11n 纳米尺寸 USB 适配器”。它们更便宜、更小,而且可以在临时模式下工作,甚至不需要司机担心。如果您还想进行临时树莓派项目,我提供的故障排除详细信息可以用作指南。
这在 /etc/network/interfaces 中对我有用:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
wireless-essid "MYPINET"
wireless-channel 3
wireless-mode ad-hoc
wireless-ap 11:5F:02:38:5C:45
address 192.168.10.1
netmask 255.255.255.0
essid、channel 和 ap 可以是任何有效值(所有 Pi 上都相同)。确保将同一子网上的不同地址分配给不同的 Pi,这样应该没问题。 ap 定义了上面提到的小区 ID。 FWIW我使用的是TP-link WN725N。它具有 RTL8188CUS 芯片组,即使 dmesg 指示 Pi 将其视为 RTL8192,开箱即用也能正常工作。
我使用任何使用
RTL8188CUS
芯片组的适配器都不成功。幸运的是,我有一些支持 RT5370
接口和 ad-hoc 模式的 Ralink nl80211
加密狗(来自 这个套件)。
我的解决方案涉及使用
wpa_supplicant
并配置了2个文件。确保已安装 nl80211
驱动程序:
sudo apt-get install libnl1
接下来,在每个 Pi 上创建以下
wpa_supplicant
配置文件,名为 /etc/wpa_supplicant-adhoc.conf
:
ctrl_interface=DIR=/run/wpa_supplicant GROUP=netdev
update_config=1
ap_scan=2
network={
ssid="pihoc_wpa"
mode=1
frequency=2462
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="password"
}
您可以在其中选择
ssid
、frequency
(请在此处查找有效值)和 psk
。使用命令 确保您属于用户组
net-dev
getent group netdev
如果没有,您可以使用
添加自己sudo usermod -a -G netdev userName
接下来,将以下块添加到每个 Pi 上的
/etc/network/interfaces
文件中:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 10.10.2.1
netmask 255.255.255.0
pre-up wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant-adhoc.conf
其中每个 Pi 都有一个以
address
开头的不同 10.10.2.
字段。另外,如果您的 RT5370
适配器使用 wlan0
以外的接口(例如 wlan1
、wlan2
等),请务必使用该接口名称。
此时,树莓派重启后应该会自动加入网络。通过 ping 或使用 ssh 测试连接,例如从 IP 地址为
10.10.2.1
的代理运行以下命令:
ssh 10.10.2.2
使用IP地址访问代理
10.10.2.2
。
此处列出的步骤改编自此 Arch Linux wiki 文章 和 此 Raspberry Pi 论坛讨论。