Loading...

我是基于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)网状网络协议的系统。下面是脚本中每个部分的解释:

  1. sudo batctl if add wlan0 :此命令将 wlan0 接口添加到 batman-adv 中。 wlan0 通常是一个无线网络接口的名称。这个命令告诉 batman-adv 将 wlan0 作为其接口之一。
  2. sudo ifconfig bat0 mtu 1468 :这将 bat0 接口的最大传输单元(MTU)设置为 1468。MTU 是可以通过网络发送的数据包的最大大小。将其设置为特定值可以有助于优化网络性能或与某些网络配置兼容。
  3. sudo batctl gw_mode client :此命令将 batman-adv 接口 bat0 配置为网关客户端。在 batman-adv 网状网络中,有一些节点充当到更广泛网络(通常是互联网)的网关,此命令指定此特定节点是一个客户端,将使用其中一个网关。
  4. sudo ifconfig wlan0 up :这将激活 wlan0 接口,意味着它可以发送和接收数据,将无线网络接口启动。
  5. sudo ifconfig bat0 up :这将激活 bat0 接口,在 batman-adv 网状网络中启用它。

请注意,此脚本使用 sudo 以超级用户权限运行这些命令,因此需要管理员权限。此外,脚本的成功取决于您的系统上是否存在 batman-adv 并且 wlan0 接口是否正确命名。在使用此脚本之前,请确保 batman-adv 已安装并且您的系统上的无线接口正确命名为 wlan0 。在使用此脚本时,您还应该熟悉您的特定网络设置和要求。

在 BATMAN-adv 网络中,节点可以配置为三种不同的模式:客户端模式、网关模式和受限节点模式。以下是每种模式的设置方法:

  1. 客户端模式 ( client ): 在客户端模式中,节点连接到 BATMAN-adv 网络并通过网关节点访问其他网络(比如互联网)。

    设置节点为客户端模式的命令是:

    sudo batctl gw_mode client
  2. 网关模式 ( server ): 在网关模式中,节点充当网关,负责将 BATMAN-adv 网络中的数据转发到其他网络(比如互联网)。

    设置节点为网关模式的命令是:

    sudo batctl gw_mode server
  3. 受限节点模式 ( 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

img

# Iperf 网络吞吐量测量

# 安装 iperf

  • 执行命令

    sudo apt install iperf

    # 开启服务端

  1. 假设在一台 IP 地址为 192.168.11.101 的设备上启用服务端。
  2. 执行 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