Forbinder RaspberryPi med TP-Link TL-WN727N

Hello, Habr!

Jeg tænkte engang at forbinde min Raspberry Pi til internettet trådløst.

Det blev gjort, og til det købte jeg en USB Wi-Fi-dongle fra det velkendte mærke TP-Link i den nærmeste butik. Jeg vil straks sige, at det ikke er en lille nano USB-enhed, men en ganske stor enhed, cirka på størrelse med et almindeligt USB-drev (eller, hvis det behager dig, på størrelse med en voksen mands pegefinger). Før købte jeg undersøgte lidt listen over understøttede dongler til RPI, og TP-Link var også på listen (dog viste det sig senere, at jeg ikke tog højde for detaljer, da djævlen som bekendt ligger i detaljerne). Således begynder den kolde fortælling om mine uheld; jeg præsenterer en detektivhistorie i tre dele. Interessede er velkomne til at fortsætte.

Artikel Forbinder WiFi-adapteren WN727N til Ubuntu/Mint det hjalp mig delvist, men lad os tage det i rækkefølge.

Opgavens betingelser

Givet:

  1. enkeltkortcomputer Raspberry Pi 2 B v1.1 — 1 stk.
  2. USB Wi-Fi dongle WN727N — 1 stk.
  3. et par ikke helt klodsede hænder — 2 stk.
  4. den seneste version af Raspbian er installeret (baseret på Debian 10 Buster)
  5. kerne version 4.19.73-v7+

Find: opret forbindelse til internettet (Wi-Fi deles fra hjemmerouteren)

Efter udpakning af adapteren læser jeg instruktionen indeni:

Systemkompatibilitet: Windows 10/8/7/XP (ligefrem endda XP) og MacOS 10.9-10.13

Nå, der står som sædvanligt ikke et ord om Linux. Det var år 2019, og drivere skulle stadig samles manuelt...

Vi havde 2 compilere med os, 75.000 biblioteker, fem binære blobs, halvdelen af et array af bare damer med logo og et helt hav af headers fra alle sprog og markup. Ikke, at det var et nødvendigt sæt til arbejdet. Men hvis man først begynder at samle systemet til sig selv, bliver det svært at stoppe. Det eneste, der bekymrede mig — var Wi-Fi-drivere. Intet er mere hjælpeløst, ansvarsløst og ødelagt end at samle drivere fra kildekode. Men jeg vidste, at vi før eller siden måtte gå videre til den beskedne løsning.

Som det er kendt, er bøvlet med USB Wi-Fi på Linux smertefuldt og noget usmageligt (som russiske sushi).

I kassen lå der også en CD med drivere. Jeg kiggede uden særlig håb på, hvad der var på den — præcis, de havde bestemt ikke taget sig af det. Søgningen på internettet førte mig til producentens hjemmeside, men der var kun Linux-drivere til revisionen af enheden v4, mens jeg havde v5.21. Og desuden til meget gamle kernelversioner 2.6-3.16. Jeg blev desillusioneret af fiaskoen lige fra starten og overvejede, at jeg burde have valgt TL-WN727N (den er lidt dyrere og kan klare 300Mbps mod 150 for min, men det viste sig ikke at have nogen betydning for Raspberry, som jeg vil komme ind på senere). Men det vigtigste er, at der allerede findes drivere til den, som nemt kan installeres som pakke. firmware-ralink. Man kan normalt se revisionsnummeret på enheden på mærkaten nær serienummeret på enhedens kabinet.

Yderligere googling og besøg på forskellige fora bragte ikke meget godt. Tilsyneladende har ingen før mig prøvet at tilslutte en sådan adapter til Linux. Hmm, jeg er virkelig uheldig.

Men nej, jeg lyver, besøgene på forum (primært engelsksprogede) gav også nogle resultater; i nogle tråde nævntes en herre ved navn lwfinger, der er berømt for at have skrevet en del drivere til Wi-Fi-adaptere. Hans Git-repository findes i slutningen af artiklen under links. Og en anden lektion, jeg lærte - det er nødvendigt at identificere sin enhed for at forstå, hvilken driver der kan passe til den.

Del 1. Identifikation af enheden

Da enheden blev tilsluttet porten, tændtes der naturligvis ingen lysdiode. Og der er overhovedet ikke nogen måde at forstå, om den fungerer eller ej.

Det første jeg gør for at finde ud af, om kernen kan se vores enhed, er at kigge i dmesg:

[  965.606998] usb 1-1.3: ny høghastigheds USB-enhed nummer 9 bruger dwc_otg
[  965.738195] usb 1-1.3: Ny USB-enhed fundet, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: Nye USB-enhedstrenge: Mfr=1, Produkt=2, Serienummer=3
[  965.738231] usb 1-1.3: Produkt: 802.11n NIC
[  965.738243] usb 1-1.3: Producent: Realtek
[  965.738255] usb 1-1.3: Serienummer: 00E04C0001

Det viste sig, at den kan se det, og det er endda klart, at der er en Realtek-chip og selve VID/PID for enheden på USB-bussen.

Lad os gå videre, vi ser på lsusb, og her står vi overfor endnu et nederlag

Bus 001 Device 008: ID 2357:0111 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Hurtig Ethernet-adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Systemet ved ikke, hvad det er for en enhed, og viser skamfuldt et tomt sted i stedet for navnet (selvom vendor=2357 helt sikkert er TP-Link).

På dette tidspunkt har den nysgerrige læser sikkert allerede bemærket noget interessant, men vi vil udsætte det til det rette tidspunkt.

Undersøgelsen af problemet med de tomme navne førte mig til en side med identifikatorer, hvor oplysninger om kendte VID/PID indsendes. Vores 2357:0111 var ikke der. Som det senere viste sig, er værktøjet... lsusb bruger filen /usr/share/misc/usb.ids, som er den samme liste over identifikatorer fra dette websted. For at forbedre visningen har jeg bare tilføjet linjer til TP-Link leverandøren i mit system.

2357  TP-Link
        0111  TL-WN727N v5.21

Men mens vi har fikset visningen i enhedslisten, har det ikke ligefrem bragt os nærmere valg af driver. For at vælge driveren skal man vide, hvilken chip din adapter er lavet med. Endnu en gang har forgæves forsøg på at finde dette ud online ikke ført til noget positivt. Bevæbnet med en fin skruefinder løfter jeg forsigtigt låget af adapteren, og for mit syn kommer min onkels skabning til syne i sin fulde, nøgne skønhed. Under forstørrelsesglasset kan man se chipnavnet — RTL8188EUS. Det er allerede godt. På nogle fora har jeg set indlæg, der siger, at denne chip passer godt med driveren fra hr. lwfinger (selv om han kun nævner RTL8188EU).

Del 2. Borns overlegenhed

Jeg downloader driverens kildekode fra Git.

Det er tid til at geninstallere Windows og beskæftige mig med det, man normalt forbinder med linuxere - at kompilere noget fra kilderne. Kompilering af drivere viste sig at ligne lidt på kompilering af programmer:

make
sudo make install

men for at kompilere kernel-moduler har vi brug for kernel-headers for vores specifikke version.

I det officielle repository er der en pakke raspberrypi-kernel-headers, men den indeholder versionen af filerne til kernen 4.19.66-v7l+, og det passer os ikke. Men for at få headers til den ønskede version, som det viste sig, er der et praktisk værktøj rpi-source (link i slutningen til GitHub), med hjælp af hvilket man kan downloade de nødvendige headers. Vi kloner repositoryet, gør scriptet eksekverbart og kører det. Den første kørsel fejler med en fejl — der mangler værktøjet bc. Heldigvis findes det i repositoryet, og vi installerer det bare.

sudo apt-get install bc

Efter det, en gentagen kørsel og download af headers (og derefter noget opsætning, husker ikke helt hvad) tager lidt tid, og så kan man læne sig tilbage i stolen, Windows er blevet bedre i alle dens udtryk.

Efter at alle headers er downloaded, tjekker vi, at der er oprettet en mappe /lib/modules/4.19.73-v7+ og i den er der et symlink, der peger på den placering, hvor de downloaded filer ligger (for mig er det /home/pi/linux):

pi@raspberrypi:/home/pi/rtl8188eu# ls -l /lib/modules/4.19.73-v7+/
lrwxrwxrwx  1 root root     14 Sep 24 22:44 build -> /home/pi/linux

Den forberedende fase er overstået, vi kan begynde samlingen. Samlingen af modulerne tager igen tid, Raspberry Pi'en er ikke hurtig (den har en 32bit 900Mhz Cortex ARM v7).
Så, alt er blevet kompilert. Vi installerer driveren i trin 2 (make install), mens vi også kopierer flere firmwarefiler, der er nødvendige for driverens funktion:

install:
        install -p -m 644 8188eu.ko  $(MODDESTDIR)
        @if [ -a /lib/modules/$(KVER)/kernel/drivers/staging/rtl8188eu/r8188eu.ko ] ; then modprobe -r r8188eu; fi;
        @echo "blacklist r8188eu" > /etc/modprobe.d/50-8188eu.conf
        cp rtl8188eufw.bin /lib/firmware/.
        /sbin/depmod -a ${KVER}
        mkdir -p /lib/firmware/rtlwifi
        cp rtl8188eufw.bin /lib/firmware/rtlwifi/.

Del 3. Ultimatum from Bourne

Jeg stikker donglen i porten og... der sker ingenting. Var alt dette spildt?

Jeg begynder at undersøge filerne inde i projektet og finder i en af dem, hvad problemet var: driveren angiver en komplet liste over VID/PID-identifikatorer, som den kan håndtere. For at få vores enhed til at fungere med denne driver, tilføjede jeg blot min id i filen rtl8188eu/os_dep/usb_intf.c

static struct usb_device_id rtw_usb_id_tbl[] = {
        /*=== Realtek demoboard ===*/
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
        /*=== Kunde ID ===*/
        /****** 8188EUS ********/
        {USB_DEVICE(0x07B8, 0x8179)}, /* Abocom - Abocom */
        {USB_DEVICE(0x0DF6, 0x0076)}, /* Sitecom N150 v2 */
        {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
        {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
        {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */
        {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */
        {USB_DEVICE(0x056E, 0x4008)}, /* Elecom WDC-150SU2M */
        {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */
        {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */
        {}      /* Terminerende entry */
};

Jeg har recompilert driveren og installeret den igen i systemet.

Og denne gang fungerede det hele. Lampen på adapteren lyste op, og der dukkede en ny enhed op på listen over netværksinterfaces.

En visning af de trådløse interfaces viser følgende:

pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eht0      no wireless extensions.

lo        no wireless extensions.

wlan0     unassociated  ESSID:""  Nickname:""
          Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/100  Signal level=0 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Bonus til dem, der læste det til ende

Husk, jeg sagde, at det ikke betyder noget, hvilken maksimal hastighed der er angivet på din adapter?
Sådan er det, på Raspberry Pi (indtil model 4), at alle enheder (inklusive ethernet-adapteren) er tilsluttet den samme USB-bus. Fantastisk, ikke? Derfor deles båndbredden på USB-bussen mellem alle enhederne. Når hastigheden blev målt både gennem ethernet og USB Wi-Fi (tilsluttet til 1 router), samt trådløst og kablet, viste det omkring 20 Mbit/s.

P.S. Denne guide til at kompilere driveren til denne specifikke adapter gælder ikke kun for RPI. Jeg gentog den også på min desktop med Linux Mint — der fungerede alt også. Du skal bare downloade de nødvendige header-filer til den version af kernen, du bruger.

UPD. Kyndige personer har foreslået: For ikke at afhænge af kernelversionen, skal du bygge og installere drivere ved hjælp af dkms. Denne mulighed er også nævnt i readme'en til driveren.

pi@raspberrypi:~# sudo dkms add ./rtl8188eu
pi@raspberrypi:~# sudo dkms build 8188eu/1.0
pi@raspberrypi:~# sudo dkms install 8188eu/1.0

UPD2. Den foreslåede patch for device id blev accepteret i mainstream-grenen af repositoryet lwfinger/rtl8188eu.

Links
— RPi USB Wi-Fi-adaptere
— GitHub lwfinger/rtl8188eu
— usb.ids
— rpi-source

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster