Virtuální sériový port pomocí ESP8266

20161010_200000_webMožná si některý z čtenářů vzpomene na článek o přídavné WiFi destičce k RAMPS1.4 a tiskárně Rebel II, který jsem zde před časem uveřejnil. Zmiňoval jsem v něm program Stupido, který jsem napsal pro ověření funkčnosti “virtuálního WiFi drátu”. Program zatím nebylo možné uveřejnit, protože z ESP Core pro Arduino byla ve stabilní verzi vypuštěna podpora většího bufferu přijatých znaků a přenos tudíž občas znaky vynechával. V nové verzi (která je na githubu) už je podpora velkého přijímacího bufferu sice opět zavedena, ale vývojáři jsou zcela saturováni prací na Arduinu pro ESP32, takže se nového jádra v brzké době nejspíše nedočkáme. Je tomu asi měsíc, co jsem se po cca 20-ti letech opět potkal s člověkem, kterého si velmi vážím a který potřeboval shodou okolností “WiFi drát”, takže jsem se pustil do exhumace a vylepšování a výsledek předkládám veřejnosti…

Firmware, který realizuje síťové připojení s převodem na sériový port pro ESP8266 už existuje poměrně dlouho (viz. třeba ESP-Link, který považuji za nejzdařilejší), ale všechny varianty, které jsem viděl trpí stejným neduhem – je třeba nastavit parametry sériové linky ve webovém rozhraní a pak je možné posílat data oběma směry. Dalším problémem pak je přenos stavů řídících signálů RTS, CTS, DSR, DTR, což, pokud vím, neumí zatím žádný z dostupných firmware. Naštěstí ale existuje možnost, jak problém řešit. Od roku 1997 existuje rozšíření protokolu telnet o možnost síťového přenosu parametrů rozhraní a stavových informací pro emulaci sériového portu přes síť, nazvané Network Virtual Terminal (NVT). Toto rozšíření je definováno v RFC2217 (zatím stále označené jako Experimental) a zdaleka nejsem první, kdo si ho všiml. Co je pro nás důležité je to, že přede mnou si této možnosti všimli pánové z a napsali freewarový ovladač virtuálního sériového portu pro operační systém Windows. Pro zvídavé rovněž zpracovali hezký úvod do NVT. Naprogramoval jsem tedy implementaci RFC2217 pro Arduino a napojil komunikaci na vyrovnávací buffery, TCP soket a sériový port. Při testech se ale ukázal problém – vyrovnávací buffer (FIFO) pro HW sériový port na ESP8266 má kapacitu pouze 128 bytů, takže při vyšších rychlostech ztrácel port znaky. To jsem zpočátku řešil, jak už jsem napsal, použitím doplňujícího bufferu, ale tato možnost byla následně z Core odstraněna. Při exhumaci projektu jsem se tedy zaměřil na hledání “žrouta” času – program jsem převedl pod šablonu pro ESP a doplnil ladící výpisy (některé jsem stále v kódu nechal a jen je zapoznámkoval, takže je tam stále můžete najít…) pro měření času, stráveného v jednotlivých funkcích. Ukázalo se, že nejdéle trvá odeslání dat do TCP spojení.

screenshot-2016-10-10-11-01-40

Z obrázku je vidět, že odeslání prakticky jakýchkoliv dat do spojení trvalo zhruba 0.2 sekundy, což stačilo k tomu, aby na vyšších rychlostech přetekl přijímací buffer sériového portu a došlo ke ztrátě dat. Stáhl jsem tedy a nainstaloval ESP8266 Core přímo z githubu, povolil v configuration.h větší buffer a chtěl jsem vyzkoušet, zda přestane docházet ke ztrátám. Jenomže jsem zapomněl zapoznámkovat měření, takže po nahrání a spuštění testu jsem dostal tento výsledek

screenshot-2016-10-10-11-06-48

Doba přenosu se, použitím nového core, zkrátila na cca 500us, což je zrychlení o tři řády! Klidně jsem tedy doplňkový buffer mohl opět vypnout a ke ztrátách dat už stejně nedochází. Pokud tedy bude někdo tento projekt používat, tak doporučuji použít Core > 2.3.0, což je v současné době bohužel pouze github verze.

V programu jsou použity opět prakticky všechny moduly, které zde byly publikovány – díky NBNS například je možné se na zařízení odkazovat přes jeho symbolické jméno a není nutné hledat jeho DHCP adresu (vsp2 v následujícím obrázku)

screenshot-2016-10-10-10-40-40

Použitá šablona, na které jsem stavěl je následník šablony, uveřejněné zde (který bude také po doladění uveřejněný) s několika vylepšeními, o kterých bych se rád zmínil. V první řadě se mi podařilo trochu snížit paměťovou náročnost a snížit nároky na síťový přenos u stopaře. Byla přepracována konfigurace, protože jsem si uvědomil, že pokud bude třeba vytvořit program pro nějaký produkt, je zbytečné v něm mít OTA, která se dá využít prakticky jen z IDE, nebo za pomoci Python skriptu. Právě pro potřeby “produkční” aktualizace firmware jsem doplnil možnost aktualizace firmware přes webové rozhraní (na stránce <ip>/update je jednoduché webové rozhraní, umožňující aktualizaci firmware). Aby nám firmware do zařízení nemohl nahrávat kdejaký Jouda, je zde možnost chránit přístup na stránku pomocí jména a hesla. No a protože se v současnosti dost omílá bezpečnost v IoT a taky aby ten, kdo se bude snažit “louskat” váš kód měl trošku ztíženou práci je uživatelské jméno a heslo obfuskováno (čti “taknějakskorojako šifrováno”). Pro zvídavé je vše v souboru obfuscator.h a musel jsem se ponořit do temnější části webu, abych získal jeho základ, protože použitá technika je nejčastěji využívána v oblasti virů.

Věci, které se příliš nepovedly

I přes to, že jsem se snažil, je zde pár věcí, které zatím nepracují. V projektu je sice naprogramovaná podpora pro přenos a nastavování DTR/DSR/RTS/CTS (je třeba si dopsat ovládání I/O pinů, protože je má každý projekt jinak), tato podpora funguje s Serial/IP redirector od Tactical Software (testováno na Trial verzi), ale bohužel se mi přenos nepodařilo rozhýbat s VSP od hw-group a to i přesto, že podporu mají napsanou v dokumentaci. Uvítám tedy, když se na projekt koukne víc očí a třeba se ukáže, že jsem celou dobu pro stromy neviděl les 🙂 .

No a na úplný závěr už klasicky kompletní projekt ke stažení a informace o použitém vybavení:

OS: Windows 7 x64 Pro
IDE: 1.6.9
ESP8266Core: Github

 

Xpvsp-161102a
Xpvsp-161102a
xpvsp-161102a.zip
99.3 KiB
1313 Downloads
Detaily

4 komentáře u „Virtuální sériový port pomocí ESP8266“

  1. Zdravím,

    pěkný článek – vyzkoušeno a jede mi to ok 🙂

    Při zkoušení toho virtuálního sériového portu jsem si vzpomenul na starší článek od tebe a to na ESP8266 + C328R aneb WiFi (still) kamerka snadno a rychle. Nějakou dobu jsem si s kamerkou hrál a zkoušel jsem zvýšit rychlost přenosu, ale pořád se mi to nedaří. Nenapadá tě jak přenos obrázku z kamery do esp urychlit?

    Dik Patrik

Komentáře nejsou povoleny.