суббота, 11 апреля 2015 г.

MacBook Pro и проблемы с WiFi

Это случилось! Я, старый, прожженный виндузятник и начинающий линуксоид, пишу про MacBook. Единственное, что меня утешает, писать я буду не про превосходство яблочной продукции. Вообще, когда не сталкиваешься с каким-то продуктом, так сказать, лично, представление о нем складывается из прочтенных публикаций и услышанных историй, и все это дополняется огромной порцией собственного восприятия, не всегда объективного. И это собственное восприятие, как не странно, оказывается наиболее весомым при формировании нашего отношения к чему-либо.

На протяжении всей своей карьеры я постоянно слышал о значительном превосходстве продукции Apple. В конце 80-ых знакомые, занимающиеся версткой, прожужжали все уши о великолепной графике, с конца нулевых только и делается, что превозносятся айфоны, айпады и макбуки. Но тогда, в 80-ых, я не занимался графикой - не писал программ для верстки и игр с навороченной графикой, а с точки зрения рядового программиста, занимающегося разработкой программ имитационного моделирования сетей массового обслуживания и расчета зарплаты... Ну не знаю, CGA, конечно, был слабоват, но уже  возможностей EGA, в принципе, мне хватало за глаза. А сейчас, если честно, я не очень понимаю, чем айпад лучше, чем андроидный планшет. И вообще, в 2006 году я был обладателем замечательной машинки HP iPAQ hx2795b с Windows Mobile 5 на борту, и ничего, был очень даже доволен. К тому же, дочка, мечтавшая об айфоне и, наконец, получившая его пятую версию, что-то как-то стала значительно реже употреблять превосходные эпитеты в его адрес. Постоянно ломающийся шнур это, конечно, серьезное подтверждение юзабилити. Ну и про макбук и его глюки я тоже наслушался историй от дочери. Но, одно дело - слышать, а другое - участвовать... Вот об этом - подробнее.

Итак, какое-то время назад у дочки произошла смена ноута: она перебралась с Samsung-а на MacBook Pro. Как я уже писал выше, переход этот, помимо положительных эмоций обладания, ознаменовался также некоторым количеством досадных ляпов. Все они, до поры до времени, обходили меня стороной, но было ясно, что god mode рано или поздно закончится. И вот, в какой-то момент, доча вдруг заявляет решительный протест. 

Оказывается, ее MacBook очень часто вообще не видит домашних сетей. Вот вчера все нормально подключилось и работало, а сегодня в сеть не выйти, точнее, не зайти. В списке доступных сетей перечислены все сети нашего и соседнего подъездов, а родных, домашних, сетей нет и в помине. Почему во множественном числе? Потому, что сети две: в диапазоне 2.4 ГГц одна сеть и еще одна - в диапазоне 5 ГГц. И это при том, что Мак должен уметь цепляться к обоим!

Но я ведь тертый калач. Что касается той сети, которая работает в диапазоне 2.4 ГГц - у меня сразу появилась догадка, почему ее не видно. Дело в том, что что-то похожее происходило с некоторым оборудованием и раньше. А все потому, что я загнал эту сетку на 13-ый канал. С другой стороны, известно, что доступность каналов сильно зависит от страны. У меня был ноут от HP, который тоже отказывался видеть домашнюю сетку, так как в настройках драйвера WiFi была выставлена страна США, а там 13-ый канал под запретом. Правда, 5 ГГц сетка использует ничем не примечательный 36 канал, который, на мой взгляд, защищен от этих юридических казусов (как выяснилось позже, я заблуждался). Но я решил временно забыть про этот диапазон - Apple любит выпендриваться и предъявлять какие-то требования, которые сам выполняет, а другие фирмы-производители - не всегда; мало ли, что он мог придумать для сеток в диапазоне 5 ГГц. 

В общем, я начал поиски в том направлении, в котором впереди маячил какой-никакой свет - надо понять, есть ли у маков настройка страны для драйвера WiFi, и, если есть, то где можно посмотреть, какое значение там выставлено. И самое главное - как его можно изменить, если, конечно, можно.

Первый же запрос к Гуглу показал мне, что в вопросах работы с WiFi сетями у маков не все хорошо - разросшиеся ветки множества форумов говорили о большом количестве людей, испытывавших проблемы с доступом. Конечно, подобные форумы расцветают буйным цветом и для других операционных систем и производителей оборудования. Львиная же часть вопросов в таких ветках связана с отсутствием элементарных знаний у большинства пользователей, и это понятно - нельзя требовать от пользователя слишком глубоких знаний в областях, в которых он не специализируется. Но, ведь Apple свою продукцию позиционирует как самую-самую user friendly, дружелюбную, то бишь. А на деле она оказывается ничуть не дружелюбней ненавистной винды?

Ну ладно, не буду слишком сильно язвить по этому поводу, хотя, конечно, очень хочется. Главное, что на форумах я получил ответ на пару своих ламерских вопросов: да, настройки страны для драйвера WiFi есть, и посмотреть текущее значение можно в  в приложение "Сведения о системе", в разделе Wi-Fi. 

Однако то, что я увидел, меня, мягко говоря, впечатлило - страна была прописана, как TW, то бишь, Тайвань. Кроме того, для удобства пользователя (не забываем - это ж user friendly MacBook Pro) был приведен список каналов, которые можно в этом Тайване использовать. Что могу сказать, тайваньцев ограничивают, вот такие каналы доступны в их стране:

en1: 802.11d country code set to 'TW'.
en1: Supported channels 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165

Что характерно - с списке доступных каналов нет не только 13-го канала, но и канала с номером 36. Именно поэтому дочкин MacBook Pro не видел ни 2.4-гигагерцовую домашнюю сетку, ни 5-гигагерцовую. Вот так все вопросы "почему?" получили ответы, осталось разрешить вопросы "как?".

Вот с поисками ответов на  эти "как" и начались проблемы. Сразу хочу отметить, что алгоритмы работы продукции Apple, описываемые разными знатоками в различных источниках, несколько отличаются, но, в основном, различия эти проявляются в деталях.  В общем, углубление в дебри информации по MacOS и MacBook выявило следующую особенность поведения этого пользовательско-ориентированного программно-аппаратного комплекса.

Для драйверов WiFi приняты некоторые значения страны по умолчанию, так сказать, базовые настройки, и они зависят от страны происхождения и продажи, что, в общем-то, ожидаемо. Но они также зависят от адаптера WiFi, который вставлен в ноутбук. Да-да, за якобы WiFi адаптерами Apple AirPort скрываются некошерные адаптеры от Atheros и Broadcom. Пора, все-таки, перестать иронизировать, но ведь так и подмывает!

Дальше - еще интересней. Я уже говорил, что Apple любит выпендриваться? Так вот, это чудо техники (я про MacBook) слушает эфир в надежде, что в округе есть какой-нибудь роутер, который по протоколу 802.11d вещает в эфир свои региональные настройки. Нет, конечно, все это сделано для реализации концепции user friendly. Ведь все пользователи ноутов от Apple, конечно же, используют только роутеры от Apple, пользуются телефонами от Apple, ходят без часов, пока Apple их не выпустит, и живут в окружении таких же Apple ориентированных соседей.

Но суровая правда действительности вносит свои коррективы в картину мира. На практике получается, что придуманный - для мира от Apple - алгоритм определения страны для WiFi ноутбука в реальном мире элементарно сбоит. Потому, что кругом полно "серых" роутеров от китайских и других производителей, прошитых неофициальными прошивками и настроенных, или не настроенных, как бог на душу положит. Да и потом, что будет делать Apple сейчас, когда в Штатах запретили использование 802.11d?

Ну вот, не вещает ваш роутер по протоколу 802.11d - вы сами отключили, или производитель не предусмотрел, Или, что хуже, вы его купили через Алибабу, и он пришел к вам с настройками, предназначенными для Китая или Тайваня. А вы - ни сном, ни духом. И вообще, не в курсе всяких протоколов. И это не вы, а ваш сосед этажом выше. Просто так случилось, что, согласно алгоритму, или вопреки ему - программисты ведь допускают ошибки в программах - его сетка просканировалась раньше вашей. И все! Получите страну TW или CH для своего WiFi модуля. И все это безобразие будет запомнено до следующего отключения питания. А если вы включили ноут в гостях или в кафе? Или... Да мало ли таких "или" можно придумать?! Воистину, остерегайтесь случайных связей! Возьмите свой MacBook, роутер AirPort, лучше, AirPort Extreme, уезжайте в чистое поле, или в лесную глушь, и там, вдали от цивилизации, наслаждайтесь миром Apple. Да, не забудьте чемодан с аккумуляторами.

На самом деле, самое плохое решение во всем этом... раю, это то, что вам не дали никакой возможности выставить эти настройки явным образом, то есть, нельзя зайти в какую-нибудь программу и указать слишком умному устройству на его место: типа, родной, очнись, ты в Европе, а не в Азии. Наверное, потому, что дружелюбное устройство не должно давать криворукому пользователю свою криворукость проявить. Вот такие дела.

Но я верил в человечество. И не ошибся. Продолжение поисков привело меня на страничку форума, на которой пользователь привел способ, с помощью которого можно пропатчить драйвер так, чтобы он вел себя более простым образом - после патча в драйвер прочно прописывается код определенной страны и метания - в поисках лучшей страны - прекращаются. Сам же патч из себя представляет так называемый one-liner - вызов интерпретатора perl с передачей ему команды, которую надо выполнить (можно почитать еще и тут). Командой было выражение regex, заменяющее один набор байтов другим - банальный бинарный патч.

В тот момент лично я подумал, что решение найдено, и дал ссылку дочери, чтобы она выполнила нужную команду на своем ноутбуке. Через некоторое время до меня были доведены результаты выполнения патча - MacBook перестал видеть WiFi карточку. Да, значок WiFi стал сереньким и при просмотре свойств карточки выдавалось сообщение о том, что аппаратная часть не найдена. Что называется, приплыли.

Пришлось устраивать мозговой штурм для исправления ситуации. Немного успокоившись и поразмыслив, я пришел к выводу, что бинарный патч что-то испортил в драйвере и тот перестал загружаться. Еще небольшое усилие и было найдено решение для возвращения ситуации к исходным рубежам - раз патч заменяет один набор байтов другим, надо выполнить обратную замену. Я попросил дочь выполнить модернизированную команду (это все одна строка):

sudo perl -pi -e ‘s|\x81\x78\x30\x6B\x10\x00\x00\x90\xE9|\x81\x78\x30\x6B\x10\x00\x00\x0F\x85|’ /System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortBrcm4331.kext/Contents/MacOS/AirPortBrcm4331 && sudo touch /System/Library/Extensions/

 и, через минуту, облегченно вздохнул - после перезагрузки аппаратная часть вернулась к жизни.

И все-таки, что с патчем не так? Ведь некоторые пользователи отписались о том, что патч нормально отработал и выполнил свое предназначение. Первой, и, как оказалось в последствии, правильной, мыслью было копнуть в сторону версий MacOS. Я посмотрел, что установлено у дочери - там гордо высвечивались цифры 10.10.2, то есть, Yosemite. Большинство отписавшихся об удачном опыте использовали более ранние версии операционки, и только на страничке с патчем было упоминание о том, что все сработало и на нужной мне версии ОС.

Некоторое время я продолжал ползать - при помощи Гугла - по англоязычному сегменту интернета. Но, в какой-то момент, очередной вопрос я задал с использованием родного и могучего языка. Почему! Почему, я не сделал этого раньше?! В выдаче присутствовала страничка блога, а сам блог - это просто кладезь полезной информации, да еще с решениями, да еще на русском.

В общем, как я и ожидал, бинарный патчер натворил дел. Нет, он, скорее всего, все исправил правильно. Но в Yosemite эти драйвер подписаны и при их загрузке подпись проверяется. Естественно, замена нескольких байт сделала подпись недействительной, драйвер не загрузился, MacBook, как следствие, выдал предупреждение о том, что аппаратное обеспечение не найдено. Выполнив зеркальную команду, мы вернули байты на свои места, проверка подписи при загрузке завершилась удачно, работоспособность восстановилась.

Пока я рыл интернет в поисках всей этой информации, дочка провела эксперимент - она несколько раз выключила/включила ноут, перемещаясь по квартире. В каком-то месте MacBook соизволил схватить роутер с правильными региональными настройками, возможно, даже, домашний, после чего подключился к сетке без проблем. На этом принципе (выключения/включения WiFi модуля), кстати, было построено одно из обсуждаемых на англоязычных форумах решений описываемой проблемы - предлагалось написать скрипт, который бы выключал и включал модуль до тех пор, пока не был бы выставлен нужный код страны.

После небольшого консилиума с дочерью было решено не проводить эксперименты по сценарию, описанному в блоге - ей нужно было работать, а ведь существовал риск того, что что-то не сработает и ноут вновь перестанет коннектиться с сеткой, или опять не загрузит драйвера. Основным камнем преткновения для меня стало то, что в первоначальном one-liner-е и в one-liner-е, предлагаемом в блоге, использовались разные regex выражения. Так что, сказать, что приведенная в блоге информация исправляет ситуацию, я не могу, хотя, все выглядит очень убедительно, особенно часть, связанная с отключением проверки подписи при загрузке драйверов. Может, когда-нибудь, дочка решится и мы доведем исследование до логического конца. А пока, пожалуй, все...

Комментариев нет:

Отправить комментарий