Sonoff LAN üzemmód
2018. augusztus 31. írta: eNeS

Sonoff LAN üzemmód

Amikor nemrégen megjelent a "LAN mode" lehetőség a Sonoff wifis kütyüiben, sokakhoz hasonlóan rögtön érdekelni kezdett a lehetőség, mert az élet a Felhő nélkül nem olyan árnyékos...

De ha az ember jobban utánanéz, már nem is annyira érdekes a dolog. A LAN módot kapcsolgathatjuk ugyan az eWeLink mobiltelefonos appikációban, de csak akkor fog bármit is találni, ha van Wifi, de nincs Internetkapcsolat!

sonoff_lanmode.jpg

Ezt egyszerűen úgy tudjuk elérni, ha Wifi routerünk bejövő netkábelét kihúzzuk, vagy bonyolultabban, ahogy én csináltam: DHCP-n egy adott IP címet rendeltem a Sonoff kütyü MAC címéhez, és ennek az IP címnek a wifi router tűzfalán keresztül megtiltottam, hogy kijusson a belső hálózatból. (OpenWRT-vel ez könnyen megoldható, egyszerűbb, gyári router firmware-ekkel nehézkes lehet)
Ám még mielőtt letiltanánk a kütyüt a netről, érdemes az eWeLink "Setting"-en keresztül a firmware-t megfrissíteni, mert csak 1.8 vagy annál újabb esetén működik a dolog.

sonoff_lanmode3.jpg

Nomeg érdemes azt is ellenőrizni, hogy véletlenül nem olyan típussal próbálkozunk-e, ami még nem tudja ezt a funkciót, mint pl én egy Sonoff POW-al akartam próbálni, aztán láttam, hogy nincs rajta a LAN módot támogató típusok listáján, és elővettem egy S20-at inkább. :)

Tehát, ha minden fenti feltétel adott, az eWeLink-ben bekapcsolhatjuk a LAN módot a kezdőlapon. Amennyiben ugyanazon az IP alhálózaton, amire a telefon wifire csatlakozott, található olyan, az eWeLinkben már regisztrált eszköz, ami nem tudott az internetre/Felhőre csatlakozni, akkor a LAN módban az eWeLink direktben megtalálja.. (a 21. század csodája - bár szerintem ez egyébként is természetes lenne)

sonoff_lanmode2.jpg

Aki most boldogan csápolva felugrott a székről, nyugodtan visszaülhet, a be és kikapcsoláson kívül semmilyen más funkció nem megy LAN módban, nem lehet új eszközt hozzáadni, csak a már felvett eszközöket lehet kapcsolni, nem mennek az időzítők, ütemezők, stb sem. Egyértelmű, hogy internetkimaradás esetére vészhelyzeti megoldásnák szánták, és nem arra, hogy a nyílt forrású, szabványos protokollt használó okosotthon-automatizálási szerverünkbe be tudjuk integrálni. (Bár a 8081-es WebSocket vezérlőport elérhető akkor is, amikor az eszköz online, ennek tesztelésének lehetőségét meghagyom másnak)
És ha ez mind nem lenne elég, pár perc után meg is szakadt a kapcsolat, amit csak a telefonon a LAN mód leállításával és újra bekapcsolásával tudtam helyreállítani. (lehet megállt a ping-pong?) Így továbbra is Tasmota firmware-t fogok minden Sonoffomra tenni.

Ám még mielőtt törölném erről az S20-ról a gyári firmware-t, elővettem a WireShark-ot, és megnéztem vajon mi történhet a háttérben. Gyengébb idegzetűek ne olvassanak tovább.

Első körben az eWeLink applikáció a LAN mód bekapcsolása után a 255.255.255.255 broadcast címre UDP (58000 portról 58100-ra) csomagokat kezdett küldözgetni, annyiszor 5 csomagot, ahány Sonoff eszköz volt beregisztrálva. Vagyis fogta az egyedi azonosítóikat, becsomagolta egy 80 bájt hosszú adatcsomagba, és ötször ismételve körbeküldte.
Amire az internetről letiltott Sonoff S20 kétszer válaszolt (58100-as UDP portról a küldő 58000 portra) 123 bájtba csomagolva válaszát, ami valamilyen titkosító kulccsal lehet megjáratva, nem igazán szánok rá annyi időt, hogy visszafejtsem, biztos vagyok benne, hogy a regisztrációkor generált eszköz-azonosítókat járatják oda-vissza.

Miután azonosították egymást, az eWeLink az eszköz TCP 8081-es portjával kezdett kommunikálni, ami mint kiderült valamilyen HTTP szerver lehet, mert egyszercsak ez ötlött a szemembe:

HTTP/1.1
origin: http://192.168.2.128:8081
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: b/taEnNJRpCTu8cq3cV8lQ==
Sec-WebSocket-Version: 13
Host: 192.168.2.128:8081
Accept-Encoding: gzip
User-Agent: okhttp/3.7.0

(A .128 az S20 IP címe volt a teszt során)

Amire valami efféle válasz érkezett, némi protokoll-egyeztetésnek tűnik:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 4NZ6lj7t1TrB/BkSg4wzEo9o/+U=
Sec-WebSocket-Protocol: chat

Ezt követően az applikáció még egyszer megszórta a 255.255.255.255 broadcast címet, hátha mégis van még ott valaki, aki válaszol.. de nem jött be neki.

Biztos ami biztos, az applikáció a telefonom legfontosabb paramétereit leküldte az S20-nak.. a wifis kütyünek biztosan feltétlenül tudnia kell a telefonom IMEI számát?

{"action":"userOnline","ts":"1535743284","version":6,"imei":"837aa2a85db1xxxx","model":"LG-D410_w7","os":"Android","romVersion":"7.1.2","at":"d8e607824c96cd101678d37012d975158f60a827",
"appid":"oeVkj2lYFGnJu5XUtWisfW4utiN4u9Mq","nonce":"1bz88j3i","apkVesrion":"4.2",
"apikey":"0387c81c-4889-498b-b771-2641a865de4b","sequence":"1535743284824","userAgent":"app"}

Az S20 a bimbózó barátság reményében erre visszaküldte a saját adatait: (vagy ez lenne a standard nyugtázó válasza, mert később többször előkerült még)

{"error":0,"apikey":"81129236-e651-4c9b-a09b-05abd64a518d","sequence":"1535743284824","deviceid":"10002cxxxx"}

Aztán a 8081-es TCP portról ilyesmi állapotüzenetek/státuszok kezdtek érkezni:

{
"userAgent":"device",
"apikey":"0387c81c-4889-498b-b771-2641a865xxxx",
"deviceid":"10002c4xxx",
"action":"update",
"params":{
"switch":"on"
}
}

Aztán, hogy elüssék az időt, és fenn tartsák a kapcsolatot, a telefon

{"ping":"ping"}

üzeneteire az S20 ezzel válaszolt mindig:

{"pong":"pong"}

És ekkor kiszúrtam, hogy az alábbi WebSocket/JSON-ba csomagolt, 8081-es portra küldött paranccsal kapcsolta be az eWeLink az S20 reléjét:

{"action":"update","deviceid":"10002cxxxx","apikey":"0387c81c-4889-498b-b771-2641a865de4b","selfApikey":"0387c81c-4889-498b-b771-2641a865de4b","params":{"switch":"on"},"sequence":"1535743289125","userAgent":"app"}

Ezzel pedig kikapcsolta:

{"action":"update","deviceid":"10002cxxxx","apikey":"0387c81c-4889-498b-b771-2641a865de4b","selfApikey":"0387c81c-4889-498b-b771-2641a865de4b","params":{"switch":"off"},"sequence":"1535743291209","userAgent":"app"}

Azért néha próbálkozott feloldani az eu-disp.coolkit.cc DNS-t a kütyü, hátha megszánja valaki némi  netkapcsolattal, de nem jött be neki. :)

Némi keresés után úgy tűnik az eWeLink felhő parancsai pontosan megfelelnek a fenti, LAN módban lokálisan használtaknak, az alábbi mintapéldában egy eWeLink mobilalkalmazást utánzó programot fedeztem fel:

https://github.com/AlayshChen/sonoff-server/blob/master/sonoff-server.py

A protokoll analízise pedig megtalálható itt:

https://blog.nanl.de/2017/05/sonota-flashing-itead-sonoff-devices-via-original-ota-mechanism/

A bejegyzés trackback címe:

https://bitekmindenhol.blog.hu/api/trackback/id/tr2914214659

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.