Обмен между клиентом Wi-Fi и точкой доступа?

Этот вопрос является расширением информации в этой записи .
Этот вопрос выглядит так же, как этот , но не является. Я использую systemd-networkd.

Я успешно следовал инструкциям в посте, чтобы создать простую автономную точку доступа. Как раз то, что я хотел.

Я хотел бы иметь возможность поменять местами точку доступа Wi-Fi и обычный клиент Wi-Fi. По умолчанию будет клиент. Для моего приложения, если RPi перезагружается, я хочу, чтобы клиентская конфигурация wifi по умолчанию работала, а не как точка доступа. Мне нужно назначить статический IP-адрес для работы AP, и мне нужно назначить динамический IP-адрес для нормальной работы Wi-Fi клиента.

Я думаю, что мне нужно сделать три вещи.

  1. укажите WPA_supplicant на альтернативный файл конфигурации,

  2. включите службу по умолчанию для запуска при загрузке и

  3. поменяйте местами конфигурацию сети WLAN между статическими и динамическими IP-адресами (в зависимости от приложения).

Я не знаю лучшего способа изменить настройки wpa в программном обеспечении. Я точно не хочу перезагружаться. Это слишком медленно.

Мне также нужно изменить настройки сети. Согласно руководству: man systemd.network

  

Наряду с сетевым файлом foo.network может существовать «раскрывающийся» каталог foo.network.d /. Все файлы с суффиксом ".conf" из этого каталога будут проанализированы после анализа самого файла. Это полезно для изменения или добавления параметров конфигурации без необходимости изменения основного файла конфигурации. Каждый файл должен иметь соответствующие заголовки разделов.

Не уверен, что лучший способ поменять конфигурацию сети. Я мог бы поменять .conf файл (ы) в /из директории для внесения изменений в сеть. Затем перезапустите сетевой сервис.

1 голос | спросил dazz 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 27 Sep 2018 13:10:28 +0300 2018, 13:10:28

1 ответ


0

Согласно вашей ссылочной ссылке вы уже используете systemd-networkd . Поэтому я начну с настройки wlan0 в качестве клиентского подключения. Для справки я использую Raspbian Stretch Lite 2018-06-27 , полностью обновленный с помощью sudo apt update && sudo apt full-upgrade && reboot сделано в 2018-09-27.

Настройте wpa_supplicant в качестве wifi-клиента с wlan0

Настройте wpa_supplicant с помощью этого файла и своих настроек и включите его.

rpi ~$ sudo -Es
rpi ~# cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="[email protected]"
    psk="verySecretPwassword"
}
EOF

rpi ~# chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
rpi ~# systemctl disable wpa_supplicant.service
rpi ~# systemctl enable [email protected]

Настройте wpa_supplicant в качестве точки доступа с ap0

Создайте этот файл конфигурации:

rpi ~# cat > /etc/wpa_supplicant/wpa_supplicant-ap0.conf <<EOF
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

ap_scan=2
network={
    ssid="RPiNet"
    mode=2
    key_mgmt=WPA-PSK
    psk="anotherPassword"
    frequency=2412
}
EOF

rpi ~# chmod 600 /etc/wpa_supplicant/wpa_supplicant-ap0.conf

Настроить интерфейсы

Создайте эти два файла конфигурации:

rpi ~# cat > /etc/systemd/network/08-wlan0.network <<EOF
[Match]
Name=wlan0
[Network]
DHCP=yes
EOF

rpi ~# cat > /etc/systemd/network/12-ap0.network <<EOF
[Match]
Name=ap0
[Network]
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 84.200.70.40
EOF

Изменить сервис для точки доступа для использования ap0

ap0 - это виртуальный интерфейс, который необходимо создать и удалить при запуске /остановке службы. Также необходимо изменить зависимости. Это невозможно сделать с помощью добавления файла, поэтому нам нужно изменить весь сервис. Кроме того, эта служба конфликтует со службой подключения клиента с wlan0 . Мы устанавливаем зависимость Conflicts=, поэтому нам не нужно заботиться об остановке другого сервиса. Сделайте это с:

rpi ~# systemctl disable [email protected]
rpi ~# systemctl edit --full [email protected]

Измените /вставьте только эти строки: Requires=, After=, Conflicts=, ExecStartPre= и ExecStopPost=, как показано. Оставьте все остальные нетронутыми, сохраните их и выйдите из редактора:

[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-wlan0.device
[email protected]
Before=network.target
Wants=network.target

# NetworkManager users will probably want the dbus version instead.

[Service]
Type=simple
ExecStartPre=/sbin/iw dev wlan0 interface add ap0 type __ap
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -Dnl80211,wext -i%I
ExecStopPost=/sbin/iw dev ap0 del

[Install]
Alias=multi-user.target.wants/[email protected]%i.service

Reboot.

Проверить с помощью

rpi ~$ sudo iw dev
rpi ~$ systemctl status [email protected]

После этого вы сможете:

rpi ~$ sudo systemctl start [email protected]
rpi ~$ sudo systemctl start [email protected]

Нет необходимости останавливать службу.

Вы можете установить этого маленького помощника, чтобы быстрее получать случайные числа для шифрования:

rpi ~$ sudo apt install rng-tools

Устранение неполадок

Если вы не используете Raspbian Stretch Lite 2018-06-27 , полностью обновленный с sudo apt update && sudo apt full-upgrade && reboot, как я, вам следует загрузить изображение и попробовать его, если у вас есть запасная SD-карта. Это должно гарантировать, что это не проблема с оборудованием. Если вы используете эту версию, но уже выполнили некоторые установки и /или конфигурации, возможно, вы столкнулись с общей проблемой при настройке точки доступа.

Если физический интерфейс, здесь он wlan0 , занят драйвером, вы не сможете установить на него дополнительный виртуальный интерфейс ap0 . Сообщение об ошибке: command failed: Device or resource busy (-16). Вы можете найти это сообщение в журнале. Найдите сообщения, подобные следующим:

rpi ~$ journalctl -b -e
...
raspberrypi systemd[1]: Starting WPA supplicant daemon (interface-specific version)...
raspberrypi iw[641]: command failed: Device or resource busy (-16)
raspberrypi systemd[1]: [email protected]: Control process exited, code=exited status=240
raspberrypi systemd[1]: Failed to start WPA supplicant daemon (interface-specific version).
raspberrypi systemd[1]: [email protected]: Unit entered failed state.
raspberrypi systemd[1]: [email protected]: Failed with result 'exit-code'.

Здесь вы видите строку с префиксом: raspberrypi iw[641]:. Это линия, которую мы ищем. Теперь вам нужно выяснить, какой сервис по вашей установке занимает устройство Wi-Fi. Вы можете проверить, запускается ли точка доступа при удалении ap0 раньше:

rpi ~$ sudo iw dev ap0 del
rpi ~$ sudo systemctl start [email protected]

Если это работает, вы можете добавить строку непосредственно перед ExecStartPre= в [email protected] . Рассмотрим знак минус после знака равенства. Он подавляет сообщения об ошибках, если ap0 отсутствует:

ExecStartPre=-/sbin/iw dev ap0 del

Теперь у нас есть два ExecStartPre. Вы можете попробовать установить ap0 перед любым другим сервисом. Это делается с помощью этого дополнительного сервиса, созданного с помощью sudo systemctl edit --force --full interface-ap0.service:

[Unit]
Description=Interface for the access point
Documentation=https://raspberrypi.stackexchange.com/q/89428/79866
Requires=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-wlan0.device
Wants=network.target
Before=network.target
[email protected]

[Service]
Type=oneshot
ExecStart=/sbin/iw dev wlan0 interface add ap0 type __ap

[Install]
WantedBy=multi-user.target

Включите его:

rpi ~$ sudo systemctl enable interface-ap0.service

Reboot.

Но interface-ap0.service может не помочь, если неизвестная служба, занимающая устройство wifi, также запускает Before = network.target . Если вы найдете неизвестный сервис, вы можете добавитьстрока Before=name-of-unknown.service в разделе Unit interface-ap0.service .

Может быть, вы найдете несколько подсказок с помощью

rpi ~$ systemctl list-dependencies
ответил Ingo 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 28 Sep 2018 02:44:17 +0300 2018, 02:44:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132