我是基于CHatGPT实现的AI助手,在此网站上负责整理和概括文章
使用BatMan进行adhoc网络组建,首先需要配置wpa_supplicant和interfaces文件,然后安装和设置Batman-adv软件。通过启动脚本配置batman-adv接口、激活接口和设置节点模式,最后将脚本变为可执行文件并添加到开机启动项中。通过barctl命令查看网络节点,ping测试连接,使用iperf进行网络吞吐量测试。编写bash脚本实现单个和多个树莓派的iperf测试,并介绍如何生成SSH密钥对和免密码登录。在处理问题时,可使用dos2unix命令转换文件格式,以及通过在运行脚本前添加`sudo -E ssh-add`来解决`sudo`运行时需要密码的问题。
# B.A.T.M.A.N. 实现无线随意网络 Ad Hoc
应当注意,目前 Ad hoc 网络已经被 Mesh 网络取代。
# 在开始之前:
使用的是一台树莓派 4B,一台显示屏用来与树莓派连接。
# 首先
# 配置 wpa_supplicant 文件:
在命令行中输入:
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf |
进入后再输入:
ctrl_interface=DIR=/var/run/wpa_supplicnat GROUP=netdev | |
update_config=1 | |
country=CN | |
network={ | |
ssid=''XXXX'' | |
psk=''XXXX'' | |
priority=10 | |
} |
其中:
ctrl_interface=DIR=/var/run/wpa_supplicant
:指定控制接口的目录为/var/run/wpa_supplicant
,这是wpa_supplicant
用来与其他网络管理工具(例如 NetworkManager)通信的目录。GROUP=netdev
:指定控制接口目录的访问权限,允许属于netdev
组的用户访问该目录,系统默认语句不用更改。update_config=1
:此行表示启用wpa_supplicant
的配置文件自动更新功能,允许wpa_supplicant
自动保存新连接信息到配置文件中。如果设置为0
,则不会自动更新配置文件。priority
:无线网络优先级,有多个 WiFi 的时候可以设置优先级,选择联网的匹配顺序,priority 值越大,优先级越高。- 相同的网络名称下,基于 adhoc 协议的设备会自动连接。
# 配置 interfaces 文件
在命令行中输入:
sudo nano /etc/network/interfaces |
进入界面后,添加下面语句:
auto wlan1 | |
allow-hotplug wlan1 | |
iface wlan0 inet dhcp | |
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf #让 wlan1 端口通过 WiFi 配置文件进行联网 | |
#配置 wlan0 设置为 ad-hoc 模式,方便组网 | |
auto wlan0 | |
iface wlan0 inet static | |
address 192.168.11.11 | |
netmask 255.255.255.0 | |
network 192.168.11.0 | |
broadcast 192.168.11.255 | |
wireless-channel 1 | |
wireless-essid ikemennFang-adhoc | |
wireless-mode ad-hoc |
其中:
auto wlan1
:这一行指示系统在启动时自动激活wlan1
网络接口。auto
关键字告诉系统在启动时自动启用这个接口。allow-hotplug wlan1
:这一行告诉系统在插入wlan1
硬件设备时启用这个接口。与auto
不同,allow-hotplug
选项会在接口的硬件设备被插入时自动激活,而不需要系统重启。iface wlan0 inet dhcp
:这是一个网络接口配置块的开始,它用于配置wlan0
网络接口的设置。在这里,wlan0
被配置为使用 DHCP 自动获取 IP 地址。wireless
-essid:可以自己设置但是要保证同一个网络下名称相同。
可以用以下命令检测那些 channel 可用:
sudo iwlist wlan0 channel |
# 更新 apt 库
输入以下命令更新:
sudo apt-get update && sudo apt-get upgrade -y |
# 设置 Batman-adv
# 安装 Batman-adv 软件
输入以下命令安装:
sudo apt-get install libnl-genl-3-dev | |
sudo apt install -y git | |
sudo git clone https://github.com/open-mesh-mirror/batctl | |
cd batctl | |
sudo make install |
# 设置 Batman-adv 软件:
输入命令行进行设置:
sudo nano ~/start-batman-adv.sh |
#!/bin/bash | |
# batman-adv interface to use | |
sudo batctl if add wlan0 | |
sudo ifconfig bat0 mtu 1468 | |
# Tell batman-adv this is a gateway client | |
sudo batctl gw_mode client | |
# Activates batman-adv interfaces | |
sudo ifconfig wlan0 up | |
sudo ifconfig bat0 up |
这个 Bash 脚本用于配置使用 batman-adv(Better Approach To Mobile Ad-hoc Networking - Advanced)网状网络协议的系统。下面是脚本中每个部分的解释:
sudo batctl if add wlan0
:此命令将wlan0
接口添加到 batman-adv 中。wlan0
通常是一个无线网络接口的名称。这个命令告诉 batman-adv 将wlan0
作为其接口之一。sudo ifconfig bat0 mtu 1468
:这将bat0
接口的最大传输单元(MTU)设置为 1468。MTU 是可以通过网络发送的数据包的最大大小。将其设置为特定值可以有助于优化网络性能或与某些网络配置兼容。sudo batctl gw_mode client
:此命令将 batman-adv 接口bat0
配置为网关客户端。在 batman-adv 网状网络中,有一些节点充当到更广泛网络(通常是互联网)的网关,此命令指定此特定节点是一个客户端,将使用其中一个网关。sudo ifconfig wlan0 up
:这将激活wlan0
接口,意味着它可以发送和接收数据,将无线网络接口启动。sudo ifconfig bat0 up
:这将激活bat0
接口,在 batman-adv 网状网络中启用它。
请注意,此脚本使用 sudo
以超级用户权限运行这些命令,因此需要管理员权限。此外,脚本的成功取决于您的系统上是否存在 batman-adv 并且 wlan0
接口是否正确命名。在使用此脚本之前,请确保 batman-adv 已安装并且您的系统上的无线接口正确命名为 wlan0
。在使用此脚本时,您还应该熟悉您的特定网络设置和要求。
在 BATMAN-adv 网络中,节点可以配置为三种不同的模式:客户端模式、网关模式和受限节点模式。以下是每种模式的设置方法:
-
客户端模式 (
client
): 在客户端模式中,节点连接到 BATMAN-adv 网络并通过网关节点访问其他网络(比如互联网)。设置节点为客户端模式的命令是:
sudo batctl gw_mode client
-
网关模式 (
server
): 在网关模式中,节点充当网关,负责将 BATMAN-adv 网络中的数据转发到其他网络(比如互联网)。设置节点为网关模式的命令是:
sudo batctl gw_mode server
-
受限节点模式 (
off
): 在受限节点模式中,节点既不是客户端也不是网关,只能与同一 BATMAN-adv 网络中的其他节点通信。设置节点为受限节点模式的命令是:
sudo batctl gw_mode off
# 将 start-batman-adv.sh 文件变成可执行文件
sudo chmod +x ~/start-batman-adv.sh |
确保加载 batman-adv 内核模块:
echo 'batman-adv' | sudo tee --append /etc/modules |
停止 dhcp 进程尝试管理无线局域网接口 wlan0:
echo 'denyinterfaces wlan0' | sudo tee --append /etc/dhcpcd.conf |
将启动 start-batman-adv.sh 文件写入开机启动项中,并在 exit 0 前插入:
sudo nano /etc/rc.local | |
插入此行: | |
/home/pi/start-batman-adv.sh & |
重启树莓派
# 查看网络节点
命令行输入:
sudo batctl n |
可以查看到包含的树莓派设备的 ad-hoc 端口的 MAC 地址,如果想要识别出来每个 MAC 地址对应的是哪个树莓派
可以在 etc 文件夹下建立一个文件:
sudo nano /etc/bat-hosts |
在弹出的窗口中输入以下命令:
MAC 名称 |
再次使用查看网络节点命令即可看到对应名称。
# ping
ping xxxxxx #对应树莓派的 ip 地址 |
目前 3 个树莓派:
192.168.11.11
192.168.11.22
192.168.11.33
# Iperf 网络吞吐量测量
# 安装 iperf
-
执行命令
sudo apt install iperf
# 开启服务端
- 假设在一台 IP 地址为
192.168.11.101
的设备上启用服务端。 - 执行
iperf -s -p 5201
,开启一个端口为 5201 的服务端。
# 连接服务端
- 连接服务端。
iperf3 -c 192.168.11.101 -p 5201 |
# 编写 bash 脚本
#!/bin/bash | |
# Function to perform iperf test for individual Raspberry Pi | |
individual_test() { | |
address=$1 | |
output_file=$2 | |
ssh pi@$address "iperf -c 192.168.11.11 -t $test_time -y C > /tmp/iperf_result" | |
result=$(ssh pi@$address "cat /tmp/iperf_result") | |
# Extracting throughput in Mbytes | |
throughput=$(echo "$result" | awk '/sec/{print $6}') | |
# Extracting rate in Mbits/sec | |
rate=$(echo "$result" | awk '/sec/{print $7}') | |
echo "$address Throughput: $throughput Mbytes, Rate: $rate Mbits/sec" >> "$output_file" | |
} | |
# Function to perform iperf test for all Raspberry Pis simultaneously | |
simultaneous_test() { | |
output_file=$1 | |
for ((i = 22; i <= num_pis*11; i+=11)); do | |
address="192.168.11.$i" | |
ssh pi@$address "iperf -c 192.168.11.11 -t $test_time -y C > /tmp/iperf_result" & | |
done | |
wait | |
for ((i = 22; i <= num_pis*11; i+=11)); do | |
address="192.168.11.$i" | |
result=$(ssh pi@$address "cat /tmp/iperf_result") | |
throughput=$(echo "$result" | awk '/sec/{print $6}') | |
rate=$(echo "$result" | awk '/sec/{print $7}') | |
echo "$address Throughput: $throughput Mbytes, Rate: $rate Mbits/sec" >> "$output_file" | |
done | |
} | |
# Main script | |
test_time=$1 # Test time in seconds | |
output_file="iperf_results.txt" | |
# Get the number of Raspberry Pis to test | |
echo "Enter the number of Raspberry Pis to test:" | |
read num_pis | |
# Perform individual tests for each Raspberry Pi | |
for ((i = 22; i <= num_pis*11; i+=11)); do | |
address="192.168.11.$i" | |
individual_test "$address" "$output_file" | |
done | |
# Perform simultaneous test for all Raspberry Pis | |
simultaneous_test "$output_file" |
# 如何通过 SSH 密钥对生成和免密码登录:
# 生成 SSH 密钥对 | |
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" |
这将在默认目录 ~/.ssh/
下生成公钥文件 id_rsa.pub
和私钥文件 id_rsa
。
# 将公钥复制到目标设备
ssh-copy-id pi@192.168.11.XX |
将公钥添加到目标设备上的 ~/.ssh/authorized_keys
文件中。如果您的用户名不是 pi
,请将 pi
替换为的用户名, 192.168.11.XX
替换为树莓派的 IP 地址。输入目标设备的密码,将公钥复制到目标设备上。
完成上述步骤后,可以通过以下命令无需输入密码登录到目标设备:
ssh pi@192.168.11.XX |
# 遇到的问题:
输入 sudo barctl n
后显示 error interface bat0 is not present or not a batman-adv interface
sudo batctl if add wlan0 |
Bash 运行脚本后显示 iperf_test.sh: line 2: $'\r' :command not found iperf_test.sh: line 4: syntax error near unexpected token '$'{\r'' 'perf_test.sh : line 4:' individual_test(){'
这是由于这可能是由于在 Windows 上编辑脚本文件后将其传输到 Linux 系统中导致的。
使用 dos2unix 命令来转换文件格式,以将其转换为 Unix 格式的换行符。
dos2unix iperf_test.sh |
如果您使用 sudo
运行脚本,则可能会导致 SSH 密钥无法自动加载,因为 sudo
会使用 root
用户的环境,而不是您当前用户的环境。这可能会导致脚本在执行时需要密码。
您可以尝试在运行脚本之前先将 SSH 密钥添加到 root
用户的 SSH 代理中,方法是在 sudo
命令前运行 sudo -E ssh-add
。这样可以确保 sudo
命令也能够使用 SSH 密钥,而无需手动输入密码。
例如:
bashCopy codesudo -E ssh-add | |
sudo bash iperf_test.sh 60 |
这样做可以尝试解决在使用 sudo
运行脚本时需要输入密码的问题。
如何重新连接互联网
/etc/wpa_supplicant/wpa_supplicant.conf
/etc/network/interface