Модуль WiFi ломается, когда на него никто не смотрит. (или: Schrodingers WiFi)
Я прихожу к вам, ребята, со странной проблемой.
Для нашего проекта мы используем NodeJS на Raspberry Pi3 (под управлением Raspbian). Мы строим модуль Wi-Fi, используя следующую библиотеку: WifiControl. Для мониторинга логов приложения на Raspberry Pi мы используем pm2. Для ввода SSID и пароля, к которому должен подключиться Pi, у нас работает небольшой графический интерфейс, который позволяет пользователю отправлять эти данные Pi.
Дело в следующем:
- Когда пользователь вводит свой SSID и пароль
- Это отправить на Pi3
- Pi3 использует библиотеку, чтобы попытаться подключиться к предоставленной точке доступа
- Пи информирует графический интерфейс о состоянии попытки подключения (успешно / не удалось)
Это работает нормально, если мы просматриваем журналы Pi с pm2 во время попытки подключения (мы запускаем ssh в Pi и затем используем журналы pm2). Pi всегда подключается к Wi-Fi (при условии, что ввод учетных данных были правильными), когда мы используем его таким образом.
Теперь, если мы повторим те же самые шаги, что и выше, но на этот раз мы не подключимся к Pi и не отследим, что происходит, Pi никогда не сможет подключиться. Что может быть причиной этого "Wi-Fi Schrodingers", где наблюдение за попыткой подключения означает, что оно работает, а не наблюдение за тем, что это не так? Ниже я добавил журналы из pm2 во время 2 разных попыток подключения. Строки с префиксом 'WifiControl' являются отладочным выводом из библиотеки.
Выход при наблюдении за попыткой подключения:
1|OCB-RN3K | 2017-11-02 10:46 +00:00: [2017-11-02T10:46:05.709Z] [WIFI]: Trying to connect to: { ssid: 'ssid', password: 'password' }
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: It appears there is already a connection for this SSID.
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: Executing: nmcli connection delete "ssid"
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: Success!
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: Executing: nmcli device wifi connect "ssid" password "password"
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: Success!
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: WiFi connection request to "ssid" has been processed.
1|OCB-RN3K | 2017-11-02 10:46 +00:00: WiFiControl: Successfully connected to "ssid"
1|OCB-RN3K | 2017-11-02 10:46 +00:00: [2017-11-02T10:46:09.681Z] [WIFI]: Successfully connected to: Onmi Airspace
1|OCB-RN3K | [2017-11-02T10:46:09.682Z] [CONTROLS]: WiFi Connected!
Вывод после не наблюдения за попыткой подключения:
[WIFI]: Trying to connect to: { ssid: 'ssid', password: 'password' }
1|OCB-RN3K | 2017-11-02 10:48 +00:00: WiFiControl: Executing: nmcli device wifi connect "ssid" password "password"
1|OCB-RN3K | 2017-11-02 10:48 +00:00: WiFiControl: WiFi connection request to "ssid" has been processed.
1|OCB-RN3K | 2017-11-02 10:48 +00:00: [2017-11-02T10:48:56.737Z] [WIFI]: Error during connection attempt [1/3]: { ssid: 'ssid',
1|OCB-RN3K | success: false,
1|OCB-RN3K | msg: 'Error: Could not connect to ssid' }
Это было проверено несколько раз, и мы считаем, что это не случайно.
1 ответ
Эта проблема, по-видимому, связана не с журналами pm2, а с некоторыми отсутствующими разрешениями для Raspberry Pi. Это означало, что когда мы выполняли SSH в Pi, мы входили в систему и запускали правильные разрешения для этого пользователя, позволяющие функционировать nmcli (даже если программа запускается при запуске, вошедшей в систему под именем того же пользователя, которого мы используем во время ssh).
РЕДАКТИРОВАТЬ: Следующее не работает в конце концов:
Проблема была решена путем предоставления привилегий sudo пользователю, на котором запускается программа, и теперь мы рассматриваем другие варианты разрешений (поскольку sudo немного переусердствовал). Я оставляю этот вопрос для дальнейшего использования, так как это было очень сложно сузить.