Comment 0 for bug 2045186

Revision history for this message
psl (slansky) wrote :

Ubuntu 20.04, Linux Mint 20.3, amd64
network-manager 1.22.10-1ubuntu2.3

I wanted to script nmcli to make configuration of WiFi of IoT device easy but it is not an easy task. I assume this is a bug in nmcli design, not specific to Ubuntu...

The problem. IoT devices with WiFi has to be configured in some way. WiFi parameters could be hardcoded in the code or there could be a way to configure WiFi in other way, like that device is switched to AP mode and user can connect and configure the device. ESP32 devices have WiFi Manager library for WiFi provisioning https://dronebotworkshop.com/wifimanager/

A nice example of such device is NerdMiner based on ESP32, https://github.com/BitMaker-hub/NerdMiner_v2

NerdMiner in WiFi provisioning mode creates WiFi AP with SSID NerdMinerAP and WiFi password is MineYourCoins. I found it really boring to configure this device manually and I tried to script it. It is boring to wait until user notebook founds WiFi "NerdMinerAP, it can take a minute or two, so I tried to use nmcli to automate the process...

Issues:

1) I know I want to connect to AP NerdMinerAP but until notebook founds it, I cannot do that.
There is no way to force nmcli to wait for NerMinerAP

$ nmcli --wait 120 dev wifi connect NerdMinerAP
Error: No network with SSID 'NerdMinerAP' found.

2) nmcli dev wifi scan returns always "Success" and error code 10.
NerdMinerAP is not available:

$ nmcli dev wifi list | grep NerdMinerAP; nmcli dev wifi list bssid NerdMinerAP; echo $?
Success
10

NerdMinerAP is visible, error code is 10, again :-(:

$ nmcli dev wifi list | grep NerdMinerAP; nmcli dev wifi list bssid NerdMinerAP; echo $?
        86:FC:E6:11:22:33 NerdMinerAP Infra 1 135 Mbit/s 90 ▂▄▆█ WPA2
Success
10

---

It is possible to script that action but it is not as easy as it could be. This is a working solution:

```
#!/bin/sh

BSSID="NerdMinerAP"
[ -n "$1" ] && BSSID="$1"

# wait until provisioning AP is visible..
while sleep 2; do
  echo "Waiting for WiFi $BSSID..."
  R="$(nmcli dev wifi list 2> /dev/null | grep $BSSID)"
  [ -n "$R" ] && break
  #nmcli device wifi rescan 2>/dev/null
done

# We have found it, connect to it!
echo "WiFi $BSSID detected, connecting..."
nmcli dev wifi connect "$BSSID"

# show connection details
nmcli connection show --active
nmcli dev wifi show # show QR code!! Shows password...
```