Instalacja OpenWRT na Xiaomi AIoT Router AC2350 18


Szukając niedrogiego routera który obsłużył by OpenWRT wpadłem na Xiaomi AIoT Router AC2350. Oryginalnie zainstalowane jest na nim oprogramowanie producenta ale na szczęście da się wgrać OpenWRT 🙂

Bardzo pomocny jest poradnik znajdujący się na oficjalnej stronie OpenWRT ale przy wgraniu oprogramowania wykorzystałem ten poradnik wraz z plikami z githuba.

Po pierwsze musimy pobrać wymagane pliki:

  • oprogramowanie routera w chińskiej wersji 1.8 (która umożliwia dostęp po SSH) – Link
  • oprogramowanie OpenWRT – pobrane z eko.one.pl – Link
  • skrypty flash_fw.sh, crash.sh oraz art.sh pobrane z githuba

Poniżej jest zawartość tych skryptów które ja użyłem:

Skrypt flash_fw.sh – zmodyfikowana nazwa pliku z openwrt aby od razu wgrać pobrany przeze mnie obraz zawierający luci:

#!/bin/sh

. /bin/boardupgrade.sh

board_prepare_upgrade
mtd erase rootfs_data
mtd write /tmp/luci-21.02-snapshot-r16521-b1c3539868-ath79-generic-xiaomi_aiot-ac2350-squashfs-sysupgrade.bin firmware
sleep 3
reboot

Skrypt crash.sh:

#!/usr/bin/env sh

set -e

CRASH=/tmp/crash_unlock.bin
CRASHDATA=/tmp/crash.data

dd if=/dev/zero ibs=65536 count=1 2> /dev/null | tr "\000" "\377" > "${CRASH}"
PRINTF=$(which printf)
${PRINTF} "\xa5\x5a\0\0" > "${CRASHDATA}"
dd conv=notrunc if="${CRASHDATA}" of="${CRASH}" bs=1 count=4 > /dev/null 2>&1

echo "'crash_unlock' hack generated."
echo
echo "Write 'crash_unlock' dump using the following command:"
printf "\tmtd write %s crash\n" ${CRASH}
printf "\treboot\n"
echo
echo "After applying 'crash_unlock' hack, don't forget to run the command:"
printf "\tmtd erase crash\n"

Skrypt art.sh:

#!/usr/bin/env sh

set -e

BACKUP=/root/art.backup
PWRTEMP=/tmp/art.txpwr.temp
PWRPATCH=/tmp/art.txpwr.patch
OUTPUT=/tmp/art.mod.bin
MD5ORIG="16e0a5bf7f859455381a8ff4da86e170"
MD5PATCH="9f2027ebf7e67b1ca3c827e5f9ce2c52"

# Create backup of mtd5 (art)
if [ -f "${BACKUP}" ]; then
    echo "${BACKUP} exists. Please rename file and try again."
    exit
fi
dd if="/dev/$(grep art /proc/mtd | cut -d":" -f1)" of="${BACKUP}" > /dev/null 2>&1

dd if="${BACKUP}" of="${PWRTEMP}" bs=1 count=104 skip=$((0x10CE)) > /dev/null 2>&1
MD5=$(md5sum "${PWRTEMP}" | cut -d" " -f1)
if [ "${MD5}" = "${MD5PATCH}" ]; then
    echo "Art already patched."
    exit
fi

if [ "${MD5}" != "${MD5ORIG}" ]; then
    echo "Unknown content of art partition was detected. Patching is canceled. Contact the developer."
    exit
fi

cp "${BACKUP}" "${OUTPUT}"

PRINTF=$(which printf)
${PRINTF} "\x30\x30\x30\x30\x30\x30\x30\x30\x2E\x2E\x2E\x2C\x2E\x2E\x2E\x2C\x2E\x2E\x2E\x2C\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A\x2E\x2E\x2C\x2A" > "${PWRPATCH}"
dd conv=notrunc if="${PWRPATCH}" of="${OUTPUT}" bs=1 count=104 seek=$((0x10CE)) > /dev/null 2>&1

echo "Patching done."
echo "You must first unlock art partition using 'crash_unlock' hack!"
echo
echo "Write the modified dump using the following command:"
printf "\tmtd write %s art\n" ${OUTPUT}
echo
echo "After applying 'crash_unlock' hack, don't forget to run the command:"
printf "\tmtd erase crash\n"

Drugim krokiem jest wgranie do routera starszego, chińskiego oprogramowania. Adres routera to 192.168.31.1.

Po odpaleniu grywamy wersję oprogramowania 1.8 i czekamy na restart.

Logujemy się do nowo wgranego systemy (całość po chińsku więc polecam zapamiętać kroki wstępnej konfiguracji routera z wersji międzynarodowej).

Po zalogowaniu się kopiujemy ciąg znaków oznaczony jako STOK:

I używamy go do wygenerowania certyfikatów co umożliwi połączenie przez ssh (pogrubiony ciąg znaków powinien pochodzić z twojej sesji):

http://192.168.31.1/cgi-bin/luci/;stok=9f8decc273de03ee31e3392bdbf77539/api/misystem/set_config_iotdev?bssid=any&user_id=any&ssid=-h%0Anvram%20set%20ssh_en%3D1%0Anvram%20commit%0Ased%20-i%20%27s%2Fchannel%3D.%2A%2Fchannel%3D%5C%5C%22debug%5C%5C%22%2Fg%27%20%2Fetc%2Finit.d%2Fdropbear%0A%2Fetc%2Finit.d%2Fdropbear%20start%0A

Jeśli wszystko jest ok otrzymamy potwierdzenie „code”:0 – po ok 30 – 60 sekundach można podłączyć się przez ssh:

Po każdym restarcie routera wartość stok się zmienia i dostęp SSH zostaje wyłączony więc trzeba powtarzać powyższe 2 kroki po każdym restarcie routra aby dostać się po SSH do niego.

Aby otrzymać hasło użytkownika root do routra należy go obliczyć na podstawie numeru seryjnego routra poniższym poleceniem (lub używając generatora online):

printf "%s6d2df50a-250f-4a30-a5e6-d44fb0960aa0" "28151/E0QM56502" | md5sum - | head -c8 && echo

Podmieniając pogrubiony numer seryjny na swój własny.

Kiedy już mam hasło roota możemy podłączyć się przez SSH:

Kolejnym krokiem jest stworzenie backupu istniejącego systemu (w celu ewenrualnego ożywienia) poleceniem:

dd if=/dev/mtd0 of=/tmp/ALL.backup

I pobraniem go na nasz komputer poprzez SCP:

scp root@192.168.31.1:/tmp/ALL.backup ./

Teraz możemy przejść do modyfikowania systemu na routerze.

Po pierwsze kopiujemy poprzez SCP plik crash.sh na router:

scp crash.sh root@192.168.31.1:/tmp/

I uruchamiamy poniższe polecenia na routerze:

cd tmp
chmod +x crash.sh
./crash.sh
mtd write /tmp/crash_unlock.bin crash
reboot

Po restarcie routera należy pamiętać aby włączyć ponownie dostęp po ssh i przejść do skryptu art.sh który kopiujemy poleceniem:

scp art.sh root@192.168.31.1:/tmp/

Następnie na routerze wydajemy te polecenia:

cd tmp
chmod +x art.sh
./art.sh
mtd write /tmp/art.mod.bin art
mtd erase crash
reboot

Teraz po restarcie włączamy dostęp po SSH po raz ostatni i wgrywamy plik z oprogramowaniem openwrt oraz skrypt flash_fw.sh:

scp flash_fw.sh root@192.168.31.1:/tmp/
scp luci-21.02-snapshot-r16521-b1c3539868-ath79-generic-xiaomi_aiot-ac2350-squashfs-sysupgrade.bin root@192.168.31.1:/tmp/

Po wgraniu plików logujemy się na router po SSH i uruchamiamy polecenie:

/bin/ash /tmp/flash_fw.sh &

Po wydaniu tego polecenia połączenie ssh zostanie przerwane – to normalne.

Czekamy ok 2 minuty aż dioda na routerze zmieni się na niebieską i uruchamiamy w przeglądarce adres 192.168.1.1:

Działa 🙂

Teraz mamy już router z naszym ulubionym OpenWRT z interfejsem luci.

Linkografia:

https://github.com/eisaev/r2350

https://openwrt.org/toh/xiaomi/aiot_router_ac2350


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

18 komentarzy do “Instalacja OpenWRT na Xiaomi AIoT Router AC2350

  • SanchoPansa

    Po zainstalowaniu według opisu wszystko działało ok aż do pierwszego reboota routera. Po ponownym uruchomieniu internet przestał działać. Dopiero po wejściu w zakładkę Sieć -> Interfejsy i zrestartowaniu interfejsu WAN internet powrócił

    • sloniupl Autor wpisu

      Dziwne, jakiego typu WAN używszy? czy masz na nim jakaś autentykacje?
      Polecam również zaktualizowanie softu do najnowszego ze strony eko.one.pl i przetestowanie czy po reboocie nadal będzie taki problem.

  • Robert Dobosz

    Może kojarzysz na jakim najwyższym kanale działa połączenie z dekoderem UPC 4K – jakoś nie udało mi się ustawić wyższego kanału niż 48?

      • Robert Dobosz

        Pewnie się zaloguje, bo zainstalowałem ostatecznie wersje Eko – ogólnie nawiększa możliwa moc we wszystkich możliwych kombinacjach to 23dBm. Wo-fi juz sie nie martwię – martwi mnie to że na połaczeni przewodowym z Giga Conect Box mam ok 900 M, a ma połączniu przewodowym z Xiaomi Ac2350 wyciskam tylko 250 M. Próbowałem opcji flow offload, ale nie widze róznicy – może powinienem poczekac na ustawienie się właściwe Giga Conect Box – nie wiem już sam….

        • sloniupl Autor wpisu

          Upewnij się że wgrałeś OpenWrt 22.03. Dla użytego chipsetu dopiero w kernelu od wersjo 5.10 działa poprawnie hardware offload i wtedy będzie gigabit. Przynajmniej u mnie jest na światłowodzie od Orange.

          • Robert Dobosz

            Rzeczywiście na 22.03 działa lepiej – poprawiłem sobie też osiągi Wifi instalując firmwate ath10k bez ct.

          • Robert Dobosz

            Jednak firmware nie jest stabilny z flow offload i obecnie działam na ath10 9984 ct http i jestem bardzo zadowolony z małych opóźnień.

          • Robert Dobosz

            Napisałem na telefonie i zadziałała autokorekta – zamiast http miało być htt.

      • SanchoPansa

        Po zainstalowaniu według opisu wszystko działało ok aż do pierwszego reboota routera. Po ponownym uruchomieniu internet przestał działać. Dopiero po wejściu w zakładkę Sieć -> Interfejsy i zrestartowaniu interfejsu WAN internet powrócił

  • Robert Dobosz

    Działa, ale to nie 28dBm jak to wcześniej robiłem na tym Chińskim firmware tylko 23dBm. Chyba muszę wrócić na forum Openwrt i pogadać z eisaev – kiedyś udało mi się jako jedynemu zrobić SSH na firmware 3.0.36 to i to się ogarnie. Przypuszczam, że może chodzić jeszcze o wgranie partycji Bdata, ale nie wiem. Może niepotrzebnie wgrałem poprzednią konfigurację zamiast wszystko na nowo ustawiać.

    • sloniupl Autor wpisu

      Raczej nie, ale zawsze możesz spróbować wgrać oryginalny firmware. I zacząć od nowa. Poza tym jeśli tego nie zrobiłeś to jedyny efekt uboczny powinien być mniejsza ilość poziomów mocy nadawania ale router powinien działać poprawnie.

    • Robert Dobosz

      Działa ale brakuje mu mocy – wrzucę znowu ten chiński firmware i zrobię po kolei – przy okazji przygotuję sobie zapasowy router.
      Czy można zgrać konfigurację między różnymi urządzeniami?
      Działa ci szerokość 160Hz – z jakich ustawień Wi-Fi korzystasz?

      • sloniupl Autor wpisu

        Ja używam szerokość 80MHz ze względu na wsparcie urządzeń klienckich + WPA2/WPA3. Daj znać czy będziesz miał większą moc po zmodyfikowaniu partycji ART.