Примечание переводчика: Представьте, что ваш кондиционер работает отлично, но вдруг перестает включаться из-за поломки простого планшета, который выполняет роль выключателя. Вам предлагают решить проблему, заменив всю систему за $1697.
Заставлять клиентов менять всю систему из-за поломки самого дешевого компонента — возможно, и выгодно, но меня это так взбесило, что я решил разобраться сам. Я понимаю, что мои действия могут оказаться сложными для большинства пользователей Advantage Air, но в ходе моего исследования я выяснил, что причина несовместимости современных планшетов с более старыми системами управления кроется только в программном обеспечении. Если бы они просто добавили в свои приложения функцию выбора "системы", это решило бы проблему для всех, а их кастомный POE-разъем все равно бы заставлял использовать их оборудование.
Контроллер кондиционера
Моя семья купила новый дом в 2019 году. В рамках строительного пакета была установлена большая система кондиционирования воздуха с обратным циклом (тепловой насос) и воздуховодами. Поскольку это было частью всего строительного плана, я не знаю точной стоимости этой системы, но, исходя из других предложений, которые я видел для домов подобного размера, я предполагаю, что она составляет 10-12 тысяч долларов. Система состоит из двух основных частей: собственно кондиционера Daikin и управляющего блока Advantage Air на чердаке, который открывает вентиляционные отверстия в различных зонах. Эта система управления управляется дешевым планшетом на Android с питанием через POE, установленным на стене в гостиной.
Система e-zone от Advantage Air представляет собой адекватный интерфейс, который выполняет свою задачу достаточно хорошо, он может активно контролировать температуру и регулировать углы открытия вентиляционных отверстий и скорость вентилятора для достижения желаемой температуры в различных зонах. В сочетании с возможностью удаленного управления через мобильные приложения из любой точки, я был бы рад рекомендовать эту систему каждому.
Потеря управления
В воскресенье 18 августа 2024 года, примерно через 6 месяцев после окончания гарантии, все изменилось. Планшет начал жаловаться, что "Приложение Сервисы Google остановлено". Я закрыл это сообщение и продолжил то, что я хотел сделать, а именно выключил обогреватель. Позже в тот же день я вернулся домой и собирался снова включить обогреватель, но на этот раз приложение e-zone перестало работать и отказывалось запускаться совсем. Я перезагрузил планшет, но он застрял на бесконечном экране загрузки ANDROID.
Так как было воскресенье, я провел несколько часов в поисках решений и попытках снова заставить планшет работать. Я вошел в режимы восстановления как на английском, так и на китайском языках и сбросил все настройки и разделы, которые мог. На устройстве не было видимого USB-интерфейса, поэтому я не мог подключить его к компьютеру. Было очевидно, что что-то не так с операционной системой, "проверка целостности системы" вернула несколько ошибок.
Разочаровывающий сервис
На следующий день я позвонил в службу поддержки Advantage Air и ждал обратного звонка. В конце концов, со мной связался сотрудник поддержки, и я объяснил ему свою проблему. Один из первых вопросов, который мне задали, касался возраста системы. После того как он выяснил, что гарантия закончилась, мне сообщили, что если планшет вышел из строя, мне потребуется новая система управления за $1245. Когда я начал возражать, говоря, что мне нужно заменить только дешевый планшет, я получил что-то вроде хорошо заученного объяснения в духе: "Ну, технологии продолжают развиваться, и системы не совместимы, каждый год выходят новые телефоны". (Примечание переводчика: судя по всему, сотрудник имел в виду, что планшеты, которые сейчас поставляет компания - новых версий и они не совместимы с кондиционером автора). Я был в недоумении, я за умные вещи, но это по сути просто выключатель для моего кондиционера. Чтобы было ясно, кондиционер работал нормально, управляющий блок работал нормально, только планшет на Android вышел из строя. Мы закончили разговор тем, что он предложил отправить мне инструкции о том, как сделать полный сброс планшета.
Когда инструкции наконец пришли, оказалось, что в них не было ничего, чего бы я уже не пробовал. Тем временем мои надежды укрепились благодаря свидетельствам того, что люди успешно использовали новейшие модели планшетов с системами, старше моей. Это положило начало серии переписок по электронной почте между мной и службой поддержки, где я становился все более разочарованным из-за их полного отказа продать мне управляющий планшет и постоянных нелепых оправданий, которые сопровождали этот отказ. Я был зол, и было ясно, что я не единственный.
Последней каплей стало официальное предложение, которое я получил. Оказалось, что заменить нужно было не только планшет и систему управления, но и беспроводные температурные датчики. Это увеличило цену до $1697. $1697, чтобы снова включить обогреватель. Это, честно говоря, возмутительно и похоже на откровенный грабеж. К счастью, в Австралии уже почти была весна, но летом люди готовы заплатить почти любую сумму, чтобы снова включить кондиционер.
Хорошо, разберусь сам
Меня охватил праведный гнев. Я не собирался платить этой компании ни копейки и твёрдо решил починить или заменить их планшет, либо установить систему другой компании. Первым делом я сорвал планшет со стены и разобрал его. POE-подключение оказалось нестандартным — на средние пины подавалось 12В и 2В, что мне было незнакомо.
Когда я открыл планшет, то обнаружил скрытый USB-порт! Подключив его к компьютеру, я смог зарядить устройство, но, что бы я ни пробовал — режим fastboot, recovery, adb sideload и другие — компьютер его не распознавал. Сначала я подумал, что это из-за того, что я никогда не включал «Отладку по USB» в интерфейсе Android, но позже понял, что проблема была в POE-разъеме.
После нескольких часов безуспешных попыток загрузить разные прошивки через SD-карту (стоит отметить, что я полный новичок в Android и делал все это неуклюже), я наконец решил открутить основную плату и посмотреть, куда ведут дополнительные провода от POE-разъема.
Ага, три провода, подключены к USB 5V и линиям данных! Первым делом я обрезал эти линии данных, и планшет сразу стал отображаться, когда я запускал команду fastboot devices. Это повлекло за собой еще пару часов, потраченных на безуспешные попытки использовать mtktool для разблокировки загрузчика. Хотя все выглядело многообещающе, процесс всегда останавливался на втором этапе, что, как мне казалось, было связано с аппаратными проблемами.
Оглядываясь назад, понимаю, что я потратил слишком много времени, пытаясь реанимировать этот явно неисправный планшет. По какой-то причине (я подозреваю, что это связано с отказом накопителя) планшеты у всех выходят из строя примерно в одно и то же время.
Когда я наконец оставил попытки восстановить этот планшет, все стало на свои места. Единственной по-настоящему уникальной частью этого устройства с точки зрения железа был POE-адаптер. Я понял, что он выполняет две функции: во-первых, заменяет батарею для обеспечения постоянного питания, а во-вторых, является USB-устройством.
Моим первым порывом было купить другой дешевый планшет на Android и подключить его точно так же, как этот. Но я практически ничего не знаю о платах, а пайка мелких компонентов у меня получается ужасно. Поэтому второй идеей было подключить этот POE-разъем к USB-A штекеру, соединить его с компьютером (через хаб, так как я совершенно не доверял своей пайке) и посмотреть, смогу ли я его обнаружить.
Ничего не обнаружилось, и я понял, что, возможно, он работает как хост и может подключаться только к планшетам или телефонам. Мне понадобился Android-планшет или телефон. К счастью, я вспомнил, что у меня был Android-планшет — я выиграл Samsung Galaxy Tab 4 в 2015 году в случайном конкурсе от пивной компании Hahn. Я понятия не имел, где он находится, и потратил еще час, переворачивая дом вверх дном в поисках этого забытого раритета. Жена спросила, что я делаю, и когда я объяснил, она спокойно сказала: "А, белый? Я видела его в шкафу в прачечной, он вообще работает?"
Я не знал, работает ли он, но после пяти минут зарядки увидел экран блокировки и с волнением подключил свой ужасно спаянный разъем.
Вот это был шаг вперед, и именно в этот момент я понял, что мое предприятие увенчается успехом. Я не эксперт в области аппаратного обеспечения или электроники, но в программном обеспечении я чувствую себя очень уверенно.
Изначально планшет eZone работал на Android 6.0, а этот Samsung был все еще на 5.0, но я не думал, что это станет проблемой, поэтому начал с того, чего явно не хватало: необходимых приложений. Все приложения eZone доступны как на сайте Advantage Air, так и на сайте apkpure. О существовании apkpure я узнал из поста, в котором кто-то писал, что ему порекомендовал его технический специалист из AA.
Я установил два приложения. Приложение AAService, которое, как я предположил, отвечает за постоянное фоновое обслуживание системы, и приложение-интерфейс Ezone. С волнением я снова подключил POE-донгл:
Ну конечно, я и не ожидал, что все будет так просто, но это стало очередным препятствием. Мне предстояло научиться патчить Android-приложения. Я уже набил руку на Softice в DOS, разбирая гораздо более сложное программное обеспечение ради развлечения, так что меня это не пугало. Но я точно не ожидал, что это будет так чертовски легко.
Патчинг Android-приложений
Благодаря одной статье я узнал, что существует инструмент под названием apktool, который позволяет не только декомпилировать apk-файл в smali (некий вид машинного кода для выполнения на Java), но и вносить изменения, а затем с помощью команды apktool b собрать его обратно в работоспособное приложение! Больше не нужно заменять байты через hex-редактор, чтобы остаться в пределах допустимого… Честно говоря, это кажется магией.
$ apktool d app-aaservice2-release-14.116
Вишенкой на торте оказалось то, что можно использовать декомпилятор JAXE на apk-файле, который постарается преобразовать его обратно в Java-код. Этот код не скомпилируется, но будет иметь точно такую же структуру, как smali-код. Таким образом, можно определить, что нужно изменить в псевдо-Java, а затем внести эти изменения в smali. Я воспользовался потрясающей веб-версией этого инструмента.
Я открыл декомпилированный проект на Java в VSCode, сделал поиск по фразе "AA Hardware" и оказался здесь:
/* access modifiers changed from: protected */
public void onResume() {
super.onResume();
f2272e.set(true);
Log.d(f2271d, "onResume");
if (ServicePleaseReboot.f2283b.get()) {
setContentView(R.layout.reboot_now);
e.a((Activity) this);
} else if (f.a()) {
a();
} else {
Log.d(f2271d, "Not on AA Hardware");
Toast.makeText(this, R.string.not_on_aa_hardware_error, 1).show();
finish();
}
}
Отлично, если f.a() возвращает false, то появится ошибка «Not on AA Hardware», и приложение завершится. Следуя по импортам (я не специалист по Java, так что это немного застало меня врасплох), я нашел, что класс f выглядел так:
import b.a.a.a.i;
/* compiled from: GetTabletInfo */
class f {
static boolean a() {
return i.c() || i.d() || i.e() || i.g() || i.f() || i.b();
}
}
Теперь, если перейти в sources/b/a/a/a/i.java, можно увидеть, что каждая из этих функций выполняет проверку на основе Build.MODEL устройства.
Например, i.c():
public static boolean c() {
return a().contains("eZone") || a().contains("e-zone") || a().equals("PIC7KS-EZ") || a().equals("PIC7KS6") || a().equals("PIC7KS6-EZ");
}
Таким образом, функции вроде i.c(), i.d() и другие — это просто флаги, проверяющие имя модели устройства. Функция c() выше, вероятно, называется что-то вроде isEzone(). Другая может называться, например, isMyAir4() или isZone10(), и так далее. У меня было два простых варианта, чтобы заставить это работать с моим контроллером e-Zone. Я мог сделать так, чтобы функция i.c() (isEzone()) всегда возвращала true, или же мог заставить функцию a() всегда возвращать имя устройства моего старого планшета. Оглядываясь назад, думаю, первый вариант тоже бы сработал, но тогда я не был уверен, проверяется ли имя модели еще где-то, поэтому выбрал второй.
Имя модели моего старого планшета было указано на наклейке внутри корпуса, но, судя по коду, я увидел, что к концу строки нужно добавить идентификатор -EZ. Итак, строка, которую я должен был вернуть, выглядела как «PIC7KS6-EZ». Исходная функция на Java выглядела так:
private static String a() {
String str = Build.MODEL;
if (str.equals("SM-T113")) {
str = "MyAir5";
}
.
. // other if statements overriding Build.MODEL
.
if (str.equals("PIC8GS8")) {
return "MyAir5";
}
return str; //
}
Перейдя к файлу sources/b/a/a/a/i.smali, я нашел ту же функцию, но уже с кодом smali. Я увидел те же операторы if и ту же строку возврата. Мне нужно было просто изменить возвращаемую строку на “PIC7KS6-EZ”.
:cond_4
const-string v1, "PIC8GS8"
.line 7
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_5
goto :goto_0
:cond_5
#move-object v2, v0 # <-- this was return str;
const-string v2, "PIC7KS6-EZ" # this returning the new string instead
:goto_0
return-object v2
.end method
Ок, модификация сделана, время пересобрать приложение.
$ apktool b app-aaservice2-release-14.116
Как по волшебству, теперь у вас есть новый apk-файл в папке dist. Однако этот apk не был подписан, поэтому мне нужно было его подписать. Я не занимаюсь работой с Android, так что пришлось гуглить, что делать, и в итоге я создал хранилище ключей вот так.
$ keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-android-release
Затем я подписал apk с помощью этой команды.
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore ../my-release-key.jks -storepass passwordiused dist/app-aaservice2-release-14.116.apk my-android-release
Потом я подключил планшет и попытался установить приложение. Но тут возникла ошибка INSTALL_FAILED_DUPLICATE_PERMISSION. Оказалось, это произошло потому, что я устанавливал приложение aaservice, которое запрашивало те же разрешения, что и приложение ezone. Это нормально, если оба приложения подписаны одним и тем же ключом, но в моем случае они были подписаны разными ключами. Чтобы все заработало, я просто удалил приложение ezone.
На этот раз я запустил приложение aaservice, и оно заработало! Я даже получил приятное уведомление с текстом «Система подключена». Отлично! У меня было рабочее сервисное приложение, теперь оставалось только запустить интерфейсное приложение eZone. Я сделал ту же декомпиляцию с помощью apktool и JAXE, но VSCode не нашел никаких строк с именем устройства или проверок Build.MODEL. Я быстро подписал приложение eZone соответствующим ключом и установил его, надеясь, что больше никаких изменений не потребуется. При открытии оно, казалось, пыталось подключиться, но в итоге вернуло ошибку о неизвестной системе.
Я вернулся к декомпилированному Java-коду и понял, что VSCode просто долго выполнял поиск, поэтому я сузил его до Java-файлов. Вскоре я нашел тот же самый код проверки устройства. Я внес те же изменения в smali/com/air/advantage/w1/k.smali, пересобрал apk, установил его, подключил к POE и…
Я был в восторге. После того как я отказался от попыток починить оригинальный планшет, на то, чтобы заставить работать этот, у меня ушло всего несколько часов, и это было чертовски весело. Этому планшету уже больше 10 лет, но он все равно работает гораздо быстрее, чем тот хлам, который шел в комплекте с системой. Если я захочу обновить его на что-то более мощное, например, чтобы управлять своим Home Assistant и другими системами, мне нужно будет просто подключить новое устройство через USB. Но для включения и выключения кондиционера этого более чем достаточно. Сейчас я жду, когда прибудет красивый утопленный разъем, после чего установлю планшет на стену.
На следующий день моя компания по установке кондиционеров (не Advantage Air) любезно прислала мне электронное письмо с предложением купить старый планшет, который один из их установщиков нашел в задней части фургона, за $400. Хотя цена все равно кажется неоправданно высокой для такого устройства, если бы Advantage Air предложили мне это сразу, я бы, возможно, согласился. Зато теперь я доволен, что справился с этим сам.
От автора перевода: меня зовут Евгений Потапов, я инженер последние 20 лет, основатель компании ITSumma и веду личный телеграм канал. Там я пишу заметки о технологиях, высоких нагрузках, менеджменте и тайм менеджменте и, в последнее время - все больше о всяких олдскульных и не очень низкоуровневых вещах (это одно из моих хобби). Буду рад если добавитесь.