Как настроить wpa_supplicant с SSID iPhone по умолчанию?

9

Более новые айфоны будут транслировать SSID в режиме точки доступа как таковой:

My Name\342\\\200\\\231\\s iPhone

Я наблюдал этот SSID в GUI.

Когда я беру SSID через командную строку:

$ sudo iwlist wlan0 scan | grep ESSID
> My Name\xE52\x80\x99s iPhone

В iPhone это выглядит как:

My Name's iPhone

Если в wpa_supplicant.conf я введу:

network={
    ssid="My Name's iPhone"
    psk="my_passcode"
}

Raspberry Pi не будет подключаться к точке доступа iPhone.

Однако, если wpa_supplicant.confя введу:

network={
    ssid="My Name\342\\\200\\\231\s iPhone"
    psk="my_passcode"
}

Я получаю сообщение об ошибке в командной строке.

$ sudo ifdown wlan0
$ sudo ifup wlan0
> wpa_supplicant: /sbin/wpa_supplicant daemon failed to start
> run-parts: /etc/network/if-pre-up/wpasupplicant exited with return code 1
> Failed to bring up wlan0

Через графический интерфейс я получаю ошибку «Неверный аргумент».

Если в wpa_supplicant.confя вхожу:

network={
    ssid="My Name\xE52\x80\x99s iPhone"
    psk="my_passcode"
}

Тогда raspbian не будет подключаться к нему и подключится к сети с более низким приоритетом (предположим, что у меня правильно установлены приоритеты, которые я протестировал).

ericmjl
источник
Почему бы вам просто не установить SSIDiPhone? Я не хочу, чтобы все видели «iPhone Джо Блоггса» в любом случае и внесли разумный вклад SSID.
Milliways
Это требует изменения имени iPhone моего коллеги, что я предпочел бы не делать. Цель состоит в том, чтобы подключить интернет к полевому сайту, где мы собираем данные с помощью малинового писа, чтобы он мог правильно установить время.
ericmjl
@Milliways: отнюдь не имею в виду не согласиться с вашим предложением в качестве потенциального решения; если бы это было мое собственное устройство, я бы полностью сделал то, что вы предложили :).
ericmjl
Как вы определили SSID? '\' - это обычный управляющий символ NIX. Я предполагаю, что это происходит от Unicode (возможно, U + 2019)
Milliways
@Milliways: я обновил свой пост с подробностями о том, как я получил SSID. Из графического интерфейса я получаю те, которые с тройной косой чертой. Из терминала я получаю версию с \xE52\x80\x99.
ericmjl

Ответы:

2

Приглашение iPhone содержит символ Unicode U + 2019 «одинарная правая кавычка». Это действительно (если очень неудобно).

Достаточно просто включить символы Unicode в строки. Следующее повторяет это в bashкомандной строке.

echo $'My Name\u2019s iPhone'
echo $'My Name\xE2\x80\x99s iPhone'

(Очень схематичная) документация man wpa_supplicant.conf, похоже, не определяет, как ssidинтерпретируется параметр. Вы можете попробовать форму выше $'My Name\u2019s iPhone'и посмотреть, поможет ли это.

ПРИМЕЧАНИЕ Строка "My Name\xE52\x80\x99s iPhone"в вашем вопросе не является допустимым Unicode (есть лишний символ 5), но это МОЖЕТ работать, если вы исправите это.

Milliways
источник
У меня была такая же проблема, но изменение SSID iphone все исправило. Спасибо Milliways
2

Я посмотрел, как wpa_supplicant анализирует файл конфигурации, и кажется, что он извлекает точные байты между ssid="последним и последним ". Экранированный Unicode (\ u) и экранированные символы не-ascii (\ x) не будут работать.

В вашем случае вы должны указать свой SSID следующим образом:

    ssid="My Name’s iPhone"

Который будет выглядеть так в шестнадцатеричном редакторе:

09 73 73 69 64 3D 22 4D 79 20 4E 61 6D 65 E2 80 99 73 20 69 50 68 6F 6E 65 22

Если вы используете вывод из iw(который выходит за пределы символов, отличных от ascii), вы можете использовать Python для интерпретации и записи точных байтов в файл:

$ python
>>> ssid = 'My Name\xE5\x80\x99s iPhone'
>>> file = open('ssid', 'w')
>>> file.write(ssid)
>>> file.close()

Обратите внимание , что если вы хотите подключиться к точке доступа с SSID A so called "SSID"он будет работать , чтобы ввести его в : ssid="A so called "SSID"". Это потому, что wpa_supplicant будет искать байты между первой и последней кавычкой в ​​строке.

Одно ограничение, которое я обнаружил, заключается в том, что wpa_supplicant.conf не будет принимать символы новой строки (0x0A) в SSID, даже если это технически возможно.

KyotoFox
источник
Я подтверждаю, что это работает. Я написал текст в строке Python Unicode, хотя: ssid="\U0001F4A9"и затем я написал его с file.write(ssid.encode("UTF-8")). Прочитать ssidфайл xxdи скопировать байты без пробелов. Строка в моем конфиге теперь читает ssid=f09f92a9.
Кристоф Де Тройер
2

Вы можете взять ssid, в данном случае «iPhone моего имени» (без кавычек), и конвертировать в гекс, используя https://www.browserling.com/tools/text-to-hex .

Возьмите результат, в этом случае 4d 79 20 4e 61 6d 65 e2 80 99 73 20 69 50 68 6f 6e 65 и удалите пробелы.

Или в баш

    $ echo -n $'My Name\xE2\x80\x99s iPhone' | od -t x1 -A n -w100000 | tr -d ' '
    4d79204e616d65e2809973206950686f6e65

Обновите /etc/wpa_supplicant/wpa_supplicant.conf:

network = {
    # Hex encoded 'My Name\xE2\x80\x99s iPhone', NO quotes in ssid=...
    ssid=4d79204e616d65e2809973206950686f6e65
    psk="your passphrase"
    key_mgmt=WPA-PSK
}

Затем выйдите из редактора и в терминале:

$ sudo ifdown wlan0
$ sudo ifup wlan0

Если у вас нет ошибок, попробуйте подключиться. Должно сработать. Просто убедитесь, что ваше шестнадцатеричное значение ssid НЕ в кавычках и не содержит пробелов.

Ура!

Тиффани Антопольски
источник
1

Вы должны переименовать свой iPhone, чтобы удалить пробелы ... это можно сделать в меню «Настройки»> «Основные»> «О программе».

Как только вы выбрали имя без пробелов, вы сможете подключиться к горячей точке, которая не вызывает проблем.

iAN_MiLES
источник