Kuinka ottaa USB-virheenkorjaustila oikein käyttöön Androidissa: tehokkaimmat tavat

Sattui niin, että rikoin rakkaan Nexus 4:ni näytön. Ensimmäinen ajatukseni oli "Hitto!" Nyt olen kuin yksi näistä kerjäläisistä rikki näyttö! Mutta ilmeisesti Nexus 4:n luojat olivat kiihkeitä köyhyyden vastustajia, koska rikkoutuneen näytön ohella se epäonnistui täysin kosketusnäyttö. Yleensä ei hätää, vie puhelin huoltoon ja se on siinä. Puhelimessa oli kuitenkin tiedostoja, joita tarvitsin juuri nyt, enkä parin viikon kuluttua. Mutta ne oli mahdollista saada vain näytön lukitsematta; puhelin vaati "supersalaisen" eleen syöttämistä, eikä se kategorisesti halunnut toimia ulkoisena asemana.

Harkittuani hieman adb:tä, luovuin yrittämästä avata näytön lukitusta konsolin kautta. Kaikki lukitusnäytön hakkerointivinkit vaativat rootin, eikä puhelimeni ole yksi niistä. Päätettiin toimia sisältä käsin. Valinta osui JCIFS-kirjastoon, koska olin työskennellyt sen kanssa jo aiemmin, eikä minulla ollut ongelmia sen käytössä.

Oli tarpeen kirjoittaa sovellus, joka kopioi tiedostoja itsenäisesti puhelimesta Wi-Fi:n kautta jaettuun kansioon. Tällaisen tempun edellytykset: USB-virheenkorjaus on käytössä ja tietokone, jolle puhelin on jo antanut luvan virheenkorjaukseen, sekä läsnäolo Wi-Fi-verkot, johon puhelin muodostaa yhteyden heti, kun se näkee sen (minulle tämä on kotini Wi-Fi).

Esityö

Luodaan projekti yhdellä toiminnolla. Vaikka se ei näe päivänvaloa lukitusnäytön takia, sitä tarvitaan päätyön tekevän palvelun käynnistämiseen.

MainActivity.java

public class MainActivity laajentaa toimintaa ( @Override suojattu void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); startService(new Intent(this, SynchronizeService.class)); ) )


Tiedostojen kopioinnista huolehtii erillinen palvelu. Koska Activity ei ole näkyvissä, sen kannattavuuteen ei kannata luottaa, mutta Foregroundissa lanseerattu palvelu selviää tästä tehtävästä erinomaisesti.

SynchronizeService.java

public class SynchronizeService laajentaa palvelua ( yksityinen staattinen lopullinen int FOREGROUND_NOTIFY_ID = 1; @Override public void onCreate() ( super.onCreate(); lopullinen NotificationCompat.Builder builder = uusi NotificationCompat.Builder(this) .setSmallIcon(R.mippanmap.) .setContentTitle(getString(R.string.app_name)) .setContentText(getString(R.string.synchronize_service_message)) .setContentIntent(getDummyContentIntent()) .setColor(Colour.Blue) .0Progress, FOREGROUND_NOTIFY_ID, builder.build()); // Tämä auttaa pitämään prosessorin hereillä PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); lopullinen WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WakeLokeTackron); ( ); ) @Override public int onStartCommand(Intent intent, int flags, int startId) ( return START_NOT_STICKY; ) @Override public IBinder onBind(Intent intent) ( return null; ) )


Ennen kuin siirrymme eteenpäin, lisätään riippuvuus, build.gradle-tiedosto, joka lisää JCIFS-kirjaston projektiin.
riippuvuudet ( ... käännä "jcifs:jcifs:1.3.17" )
Sinun on myös lisättävä joitain käyttöoikeuksia luetteloon ja älä unohda kirjoittaa palvelustamme sinne. Lopulta AndroidManifest.xml-tiedostoni näytti tältä.

AndroidManifest.xml

// Tarvitaan estämään puhelinta nukkumasta. // Pakollinen verkon kanssa työskentelyyn. // SD-kortilta lukemiseen.

Tiedostojen kopioiminen

Kaikki valmistelut on siis tehty. Jos nyt suoritat sovelluksen, palveluviestit näkyvät ilmoitusluettelossa (Android 5:stä alkaen voit määrittää viestien näyttämisen lukitusnäytöllä. Jos Android-versio on vanhempi, et näe tätä viestiä), mikä tarkoittaa, että sovellus toimii niin kuin pitääkin ja voit aloittaa herkullisimman asian - tiedostojen siirtämisen.

Jotta emme suorittaisi verkkotoimintoja pääsäikeessä, siirrämme tämän koko asian AsyncTaskiin.
public class CopyFilesToSharedFolderTask laajentaa AsyncTaskin ( yksityinen lopullinen tiedosto mFolderToCopy; yksityinen lopullinen merkkijono mSharedFolderUrl; yksityinen lopullinen NtlmPasswordAuthentication mAuth; yksityinen FileFilter mFileFilter; julkinen CopyFilesToSharedFolderTask(File folderToCopy, String password shareFolderUrl, FileCopy-kansio) (superTopy-kansio, String(,TiedostolFiter) ToCopy; // Kansio , joka tulee kopioida mSharedFolderUrl = shareFolderUrl // URL verkkokansioon, johon puhelimen tiedostot kopioidaan mAuth = (käyttäjä != null && salasana != null) ? new NtlmPasswordAuthentication(user + ":" + salasana) : NtlmPasswordAuthentication.ANONYMOUS; mFileFilter = fileFilter; ) ) Erityistä huomiota tulee kiinnittää käyttäjä- ja salasanaparametreihin. Tämä on sen verkkokansion kirjautumistunnus ja salasana, jota käytetään NtlmPasswordAuthenticationin luomiseen. Jos salasanaa ei tarvita kansion käyttämiseen, sinun on käytettävä todennusna NtlmPasswordAuthentication.ANONYMOUS-tiedostoa. Vaikka se näyttää yksinkertaiselta, todennus on suurin ongelma, jonka kohtaat työskennellessäsi verkko-osuuksien kanssa. Yleensä useimmat ongelmat ovat piilossa tietokoneen väärin määritettyihin suojauskäytäntöihin. Paras tapa tarkistaa, että asetukset ovat oikein, on yrittää avata puhelimesi verkkokansio millä tahansa muulla verkon yli työskentelyä tukevalla tiedostonhallinnalla.

SmbFile on verkkotiedostojen käsittelyyn tarkoitettu tiedosto. Yllättäen JCIFS on erittäin helppo työskennellä tiedostojen kanssa. Et tunne juuri mitään eroa SmbFilen ja tavallisen tiedoston välillä. Ainoa asia, joka pistää silmään, on hallittujen poikkeusten läsnäolo melkein kaikissa luokan menetelmissä. Ja SmbFile-objektin luomiseen tarvitset aiemmin luomamme todennustiedot.
yksityinen kaksinkertainen mMaxProgress; yksityinen kaksinkertainen mProgress; ... @Override suojattu merkkijono doInBackground(Void... voids) ( mMaxProgress = getFilesSize(mFolderToCopy); mProgress = 0; publishProgress(0d); kokeile ( SmbFile sharedFolder = new SmbFile(mSharedFolderUrl, mAuth); if (sharedFolder.existsFolder) () && shareFolder.isDirectory()) ( copyFiles(mFolderToCopy, shareFolder); ) ) catch (MalformedURLException e) ( palauttaa "Virheellinen URL."; ) catch (IOException e) ( e.printStackTrace(); return e.getMessage( ); ) return null; ) DoInBackground-metodi palauttaa virheilmoituksen. Jos nolla palautetaan, kaikki sujui sujuvasti ja ilman virheitä.

Tiedostoja voi olla paljon... Ei, ei niin. Niitä voi olla PALJON! Siksi edistyksen näyttäminen on elintärkeä toiminto. Rekursiivinen getFilesSize-menetelmä laskee kokonaisedistyksen laskemiseen tarvittavien tiedostojen kokonaiskoon.
yksityinen double getFilesSize(Tiedostotiedosto) ( if (!checkFilter(file)) palauttaa 0; if (file.isDirectory()) ( int size = 0; File filesList = file.listFiles(); for (File innerFile: filesList) size += getFilesSize(innerFile); paluu koko; ) return (double) file.length(); ) yksityinen looginen checkFilter(Tiedostotiedosto) ( return mFileFilter == null || mFileFilter.accept(file); ) Suodatin välitettiin constructor auttaa sulkemaan pois tarpeettomat tiedostot ja kansiot. Voit esimerkiksi sulkea pois kaikki pisteellä alkavat kansiot tai lisätä "Android"-kansion mustalle listalle.

Kuten aiemmin sanoin, työskentely SmbFilen kanssa ei eroa tavallisen tiedoston kanssa työskentelystä, joten tietojen siirto puhelimesta tietokoneeseen ei ole alkuperäinen. Piilotan tämän koodin jopa spoilerin alle, jotta en sotke artikkelia vieläkin selkeämmällä koodilla.

copyFiles- ja copySingleFile-menetelmät

yksityinen staattinen lopullinen String LOG_TAG = "WiFiSynchronizer"; private void copyFiles(File fileToCopy, SmbFile sharedFolder) heittää IOExceptionin ( if (!checkFilter(fileToCopy)) paluu; // Jos tiedosto tai kansio ei läpäise suodatinta, älä kopioi sitä. if (fileToCopy.exists()) ( if (fileToCopy. isDirectory()) ( File filesList = fileToCopy.listFiles(); // Kun luot hakemistoa, laita "/" loppuun. SmbFile newSharedFolder = new SmbFile(sharedFolder, fileToCopy.getName() + "/" ); if (!newSharedFolder. exists()) ( newSharedFolder.mkdir(); Log.d(LOG_TAG, "Kansio luotu:" + newSharedFolder.getPath()); ) else Log.d(LOG_TAG, "Kansio on jo olemassa: " + newSharedFolder.getPath() ); for (Tiedostotiedosto: filesList) copyFiles(file, newSharedFolder); // Rekursiivinen kutsu ) else ( SmbFile newSharedFile = new SmbFile(sharedFolder, fileToCopy.getName()); // Jos tiedosto on jo luotu, emme kopioi sitä. // Tietysti toisessa tilanteessa kannattaa lisätä hash-tarkistus, mutta minun tapauksessani se olisi tarpeetonta, jos (!newSharedFile.exists()) ( copySingleFile(fileToCopy) , newSharedFile); Log.d(LOG_TAG, "Tiedosto kopioitu:" + newSharedFile.getPath()); ) else Log.d(LOG_TAG, "Tiedosto on jo olemassa:" + newSharedFile.getPath()); // Päivityksen edistyminen. mProgress += (kaksois) fileToCopy.length(); publishProgress(mProgress / mMaxProgress * 100d); ) ) ) // Merkittävä tapa kopioida tiedostoja. private void copySingleFile(Tiedostotiedosto, SmbFile jaettuTiedosto) heittää IOExceptionin ( IOException poikkeus = null; InputStream inputStream = null; OutputStream outputStream = null; try ( outputStream = new SmbFileOutputStream(sharedFile); inputfferStream = new FileInu); tavu; int bytesRead; while ((bytesRead = inputStream.read(bytesBuffer)) > 0) ( outputStream.write(bytesBuffer, 0, bytesRead); ) ) catch (IOException e) ( poikkeus = e; ) final ( if (inputStream) != null) try ( inputStream.close(); ) catch (IOException e) ( e.printStackTrace(); ) if (outputStream != null) try ( outputStream.close(); ) catch (IOException e) ( e. printStackTrace(); ) ) if (poikkeus != null) heittää poikkeus; )

Koodi on ilmeinen, mutta siinä on yksi, ei ollenkaan ilmeinen kohta - merkin "/" lisääminen kansion nimen loppuun luotaessa uutta SmbFileä. Tosiasia on, että JCIFS käsittelee kaikkia tiedostoja, jotka eivät pääty "/"-merkkiin, vain tiedostona, ei hakemistona. Siksi, jos verkkokansion URL-osoite näyttää tältä: "file://MY-PC/shared/some_foldel", tapauksia syntyy, kun luodaan uusi kansio "some_foldel"-kansioon. Nimittäin "some_foldel" hylätään, ja uudessa kansiossa on URL: "file://MY-PC/shared/new_folder" odotetun "file://MY-PC/shared/some_foldel/new_folder" sijaan. . Samanaikaisesti tällaisissa kansioissa menetelmät isDirectory, mkdir tai listFiles toimivat oikein.

Melkein valmis. Aloitetaan nyt tämän tehtävän suorittaminen palvelun onCreatessa.
yksityinen staattinen lopullinen int FOREGROUND_NOTIFY_ID = 1; yksityinen staattinen lopullinen int MESSAGE_NOTIFY_ID = 2; yksityinen staattinen lopullinen String SHARED_FOLDER_URL = "file://192.168.0.5/shared/"; ... lopullinen tiedosto folderToCopy = getFolderToCopy(); CopyFilesToSharedFolderTask tehtävä = new CopyFilesToSharedFolderTask(folderToCopy, SHARED_FOLDER_URL, null, null, null) ( @Override suojattu void onProgressUpdate(Double... arvot) ( builder.setProgress(100, arvot.intTValue) ("%s %.3f", getString(R.string.synchronize_service_progress), arvot) + "%"); mNotifyManager.notify(FOREGROUND_NOTIFY_ID, builder.build()); ) @Override suojattu void onPostExecute(String errorMessage) ( stopForeground(true); if (errorMessage == null) showNotification(getString(R.string.synchronize_service_success), Color.GREEN); else showNotification(errorMessage, Color.RED); stopSelf(); wakeLock.release(); // Älä unohda vapauttaa wakeLockia on suljettu stopSelf(); wakeLock.release(; ) ); task.execute(); Minun tapauksessani sisäänkirjautumista ja salasanaa ei vaadita, en myöskään määrittänyt suodatinta. OnProgressUpdate-menetelmä ohitetaan näyttämään edistymisen tilaa, ja onPostExecute näyttää viestin latauksen valmistumisesta tai virheestä ja lopettaa sitten palvelun.

Käynnistä sovellus. Käynnissä olevasta palvelusta ilmestyi viesti. Kun tiedoston kokonaiskokoa lasketaan, näytössä näkyy määrittelemätön edistymistila. Mutta indikaattori näyttää 0%, jonka jälkeen palkki vähitellen, pienin, tuskin havaittavissa olevin askelin, alkaa liikkua kohti 100%.



Kun työ oli valmis, näytölle ilmestyi onnistuneesta tuloksesta kertova viesti, ja tietokoneellani olivat kaikki tarvittavat tiedostot, jotka oli aiemmin tallennettu rikkinäiseen puhelimeen.

Odottamattomia johtopäätöksiä

Sain mitä tarvitsin. Nyt on aika keittää teetä, levätä sohvalla ja käynnistää tv-sarjoja. Mutta odota! Huolimatta siitä, että puhelin oli minun ja pääsy sen tiedostoihin ei ole ristiriidassa Venäjän lain kanssa, otin ne pois ilman salasanaa! Samaan aikaan puhelin ei ollut juurtunut. Tämä tarkoittaa, että kun virheenkorjaustila on päällä, ei ole vaikeaa päästä käsiksi "SD-kortin" sisältöön tietämättä edes salasanaa. Ainoa pelastus on, että ainoa heikko kohta suojauksessa hakkeroinnilta on tarve käyttää tietokonetta, jolla on jo virheenkorjausoikeudet.

Androidin uusi versio, joka esiteltiin vähän aikaa sitten, saattaa sulkea tämän aukon, koska tarvittavien käyttöoikeuksien saaminen vaatii käyttäjän vahvistuksen, mikä on mahdotonta, kun näyttö on lukittu. Sillä välin, Android-kehittäjä, ole varuillasi, jos et halua jonkun muun näkevän alastonkuvasi. Ja muista, että sallimalla minkä tahansa tietokoneen virheenkorjauksen USB:n kautta, luot uuden porsaanreiän oman puhelimesi hakkerointiin.

Kiitos huomiostasi. Haluaisin nähdä ajatuksesi kommenteissa.
Lähdekoodi löytyy seuraavasta linkistä: github.com/KamiSempai/WiFiFolderSynchronizer

UPD: Kuten epäilin, ongelmaani on yksinkertaisempi ratkaisu. Nimittäin hyödyntää adb-komento Vedä. Valitettavasti harvinainen adb:n käyttö ja kapea näkemys ongelmasta eivät sallineet minun päästä siihen. Yritin avata näytön lukituksen, en ladata tiedostoja.
Kiitos EvgenT:lle hyvästä huomautuksesta.

Android-pohjaisten laitteiden käyttäjien keskuudessa kaikki eivät ymmärrä laitteensa toiminnan monimutkaisuutta. Usein jonkun on otettava USB-virheenkorjaus käyttöön, mutta henkilö ei tiedä miten se tehdään. Lisäksi mahdollisuus aktivoida virheenkorjaus siirtyy usein valikon kohdasta toiseen riippuen asennetusta versiosta käyttöjärjestelmä ja ohjelmiston kuoren (laiteohjelmiston) ominaisuudet.

Eli mistä kannattaa katsoa ensin?:
1. Asetukset-->Sovellukset-->Kehitys-->USB-virheenkorjaus.
2. Asetukset-->Järjestelmä-->Tietoja Tablet PC:stä-->Koontinumero. Seuraavaksi sinun on napautettava intensiivisesti rakennusnumeroa. Tämä toiminto, joka toistetaan noin 10 kertaa, johtaa asetusten lukituksen avaamiseen kehittäjille. Seuraavaksi sinun pitäisi palata pääosasto asetukset ja kirjoita näkyviin tuleva valikkokohta "Kehittäjille". Jäljelle jää vain valintaruutu vastaavan "USB-virheenkorjaus" -kohdan vieressä.

Onko mahdollista ottaa USB-virheenkorjaus käyttöön, jos tabletti on sammutettu?

Valitettavasti nykyaikaiset laitteet eivät vielä voi miellyttää käyttäjiään tällä mahdollisuudella. USB-virheenkorjaus tabletissa voidaan ottaa käyttöön tai poistaa käytöstä vain asetuksista. Tilanteessa, jossa tablettia ei voida käynnistää tai käyttöjärjestelmä ei lataudu, suosittelemme toiminnon käyttöä.

Mitä tehdä, jos laitteen anturi ei toimi tai kosketusnäyttö ja lasi ovat rikki?

Kun anturi ei reagoi käyttäjän toimiin, mutta näytöllä näkyy silti tekstiä ja kuvia, voit liittää hiiren gadgetiin tavallisella OTG-kaapelilla.
Seuraavaksi ohjaa kursoria, sinun on siirryttävä tabletin asetuksiin, joista löydät tarvittavan kohteen ja aktivoit USB-virheenkorjauksen. Jos näyttö ei myöskään näytä mitään, ainoa vaihtoehto korjata tilanne on vaihtaa näyttö.

Joissakin tilanteissa älypuhelin on diagnosoitava tietokoneen kautta. Tätä tarkoitusta varten kehittäjät ovat luoneet erityisen USB-virheenkorjaustilan. Huolimatta siitä, että tämä vaihtoehto on aina valikossa Järjestelmäasetukset, hänellä voi olla monia vaihtoehtoja lisäsijaintilleen. Katsotaanpa muutamia perus tapoja ottaa USB-virheenkorjaustila käyttöön Androidissa.

Laitevalikko

Virheenkorjausasetukset


Sisäänkäynti valikkoon voi olla joko avoin tai piilotettu. Tämä riippuu laitteesi merkistä ja Android-käyttöjärjestelmän versiosta, ja se on kehittäjien harkinnassa. Jos se on auki, testaa sitä mobiililaite Helpoimmin se onnistuu tietokoneen kautta. Mallista riippuen tulo voi sijaita järjestelmäasetusvalikon eri välilehdillä. Luettelemme sen sijainnin päävaihtoehdot:
  • "Kehittäjille" -välilehti ("Kehittäjävalikko", "Kehittäjävaihtoehdot"), joka sijaitsee suoraan pääasetusvalikossa.
  • Jonkin kohteen alaosio: "erikoisominaisuudet", "lisäasetukset" jne.

lyhyttä tietoa

Tilan käyttöönotto


Kun olet siirtynyt haluttuun hakemistoon, USB-virheenkorjauskohde on ensimmäinen luettelossa. Ota se käyttöön napsauttamalla kohteen nimeä vastapäätä olevaa valintaruutua. Nyt voit liittää mobiililaitteesi tietokoneeseesi ja työskennellä sen kanssa ADB-apuohjelman avulla. Suosittelemme katsomaan visuaalisen videon ohjeet USB-virheenkorjaustilan käyttöönotosta Android-versiossa 5.1.

Kirjaudu sisään piilotetun valikon kautta

Laite asetukset

Laitteen ominaisuudet


Monissa älypuhelinmalleissa, joissa on Android 4.2 tai uudempi käyttöjärjestelmä, tila on piilotettu käyttäjiltä. Voit havaita ja ottaa sen käyttöön seuraavalla tavalla:
  • Siirry järjestelmäasetusvalikkoon.
  • Valitse "Tietoja laitteesta" -välilehti.
  • Napauta nopeasti "koontinumero" -kohtaa, kunnes järjestelmä lähettää tietoilmoituksen, että sinulle on määritetty kehittäjän tila.

Tämän jälkeen voit käyttää Android-älypuhelimesi erikoisasetusvalikkoa. Voit ottaa USB-virheenkorjaustilan käyttöön toistamalla edellisessä osiossa kuvatut vaiheet.

Ohjelmiston tiedot

Ohjelmiston ominaisuudet

Palautustilan kautta

Joissakin tapauksissa tätä tilaa ei voi ottaa käyttöön mobiililaitteella. Tämä voi johtua esimerkiksi kosketusnäytön vauriosta tai toimimattomasta matkapuhelimesta yleensä. Tällaisessa tilanteessa menetelmä, joka sisältää palautustilan, auttaa sinua. On syytä huomata, että tämän toteuttamiseksi älypuhelimessa on oltava mukautettu palautus CWM tai TWRP. Tämän avulla voit saada juurioikeudet pääsy matkapuhelimen käyttöjärjestelmään.
Tarkastellaan luetteloa tarvittavista toimista, jotka on suoritettava, jotta puhelimen virheenkorjaus voidaan suorittaa tässä tapauksessa:

  • Lataa ja pura qtADB-cwm-edition-sovellus viralliselta verkkosivustolta tietokoneen käyttöjärjestelmän juurihakemistoon.
  • Luo siellä kansio nimeltä SQlite3_Windows ja asenna siihen valmiiksi ladattu SQLite-relaatiotietokanta.
  • Käynnistä matkapuhelimesi uudelleen ja kirjaudu sisään Palautus tila painamalla useita näppäimiä samanaikaisesti. Kuinka siirtyä palautustilaan tietty malli voit lukea valmistajan viralliselta verkkosivustolta.
  • Liitä matkapuhelimesi tietokoneeseen käyttämällä USB kaapeli.
  • Suorita executive-tiedosto QtADB.exe tietokoneellasi, joka sijaitsee aiemmin lataamasi hallintaohjelman kansiossa.
  • Napsauta "Lisäasetukset" -kohtaa ja varmista, että mobiililaitteen "Data"-osio näkyy oikein.
  • Valitse vasemmasta paneelista "tiedostot" -välilehti ja avaa sitten aiemmin luotu kansio SQLite-relaatiotietokannan kanssa.
  • Avaa hakemisto data/com.android.providers.settings/databases/ ohjelman oikeasta paneelista.
  • Siirrä tiedosto nimeltä settings.db oikeanpuoleisesta paneelin kansiosta vasemmalle.
  • Suorita komento Windows-merkkijono(käyttäen Win+R-näppäinyhdistelmää) ja kirjoita: "cd C:\Sqlite3_Windows", "sqlite3 settings.db", "update secure set value=1 where name='adb_enabled".
  • Kopioimme takaisin settings.db-nimisen tiedoston ja suostumme kirjoittamaan uudelleen ja käynnistämään mobiililaitteen uudelleen.

Jos mikään menetelmä ei toimi

Mietitään, mitä on tehtävä, jos ADB ei näe mobiililaitetta. Ensinnäkin sinun on tarkistettava ohjelmistokomponentti, johon saattaa liittyä käyttöä epävirallinen laiteohjelmisto tai sopimattomia ADB-ajureita. Käyttöjärjestelmäversion voi aina ladata valmistajan verkkosivuilta ja vaadittu ohjelmisto Googlen verkkosivuilta. Toinen syy, miksi virheenkorjaus tietokoneesta ei toimi, on viallisen USB-kaapelin tai -liittimen käyttö. Voit tarkistaa tämän kytkemällä matkapuhelimesi eri johdolla ja eri liittimeen.