Geolokácie podľa IP adresy v C # .NET WPF - Časť 1
Dnes vás prevediem svetom geolokácie napísané v C# a využívajúce .NET framework. Budeme využívať IP adresy pre určenie polohy. Využijeme na to servery http://checkip.dyndns.org a API https://ipgeolocation.io, ktoré poskytne triedu pre komunikáciu s ich databázou. Cieľom bude zistenie aktuálnej polohy pomocou GPS koordinátu, Longitude a Latitude, a prípadne ďalšie detailnejšie informácie.
Čo budeme potrebovať
- Visual Studio 2017 alebo 2019 (v tejto verzii budem vytvárať sprievodca, zmeny oproti verzii 2017 by mali byť len kozmetické)
- Základná znalosť jazyka C# a Visual Studia
- Registráciu na https://ipgeolocation.io
Čo sa dnes naučíme
- Prácu s balíčkami nugety
- Jednoduchý návrh formulára pomocou WPF
- Implementáciu triedy https://ipgeolocation.io v našom kóde
Založenie nového projektu
Vytvoríme nový projekt typu Aplikácia WPF (.NET Framework). Môžete zvoliť aj postup pre nový .NET Core, či UWP, ale tam treba počítať s nulovou spätnou kompatibilitou (spravidla je problém aj s OS Windows 10, ktorý nemá tohtoročný update 1903). Pre verzie UWP pre .NET Core použijeme oficiálny balík nugety - viac neskôr.
Design aplikácie
Tu sa nebudeme nad ničím pozastavovať, dizajn bude čisto účelný:
XAML kód okna bude nasledujúci:
<Grid> <WrapPanel Margin="5,0,5,0" HorizontalAlignment="Center" Background="DarkGray" Orientation="Vertical" > <TextBlock Text="Locate ours IP adress" FontSize="24" Margin="5"/> <TextBox Name="IPlist" Margin="5" ></TextBox> <Button x:Name="IP_button" Content="Get IP" Click="IP_button_Click" FontSize="16" Margin="5"/> <TextBlock Text="Locate our city name :" FontSize="24" Margin="5"/> <ListView Name="Citytext" FontSize="18" Foreground="Magenta" Margin="5"/> <Button x:Name="GPS" Content="Get Position" Click="Button_Click" FontSize="16" Margin="5"/> </WrapPanel> </Grid>
V kóde sme použili:
WrapPanel
, ktorý pekne zarovná komponenty na stred a vysporiada sa aj s prípadným rastúcimListView
TextBox
, do ktorého sa vypíše naším kódom zistená IP adresa, prípadne môžeme zadať ručne pre vyskúšanie funkcieButton
pre automatické zistenie IP adresyListView
, kam sa nám vypíšu všetky informácie získané z IPGeolocation.io pomocou nášho kódu- A príslušné tlačidlo pre spustenie nášho kódu
Takto približne by mal formulár vyzerať:
Vlastný kód - Zistenie IP adresy
Začneme vytvorením vlastnej metódy GetIP()
s návratovou
hodnotou typu string
, ktorá nám vráti aktuálnu verejnú IP
adresu:
private string GetIP() { string url = "http://checkip.dyndns.org"; ...
K získaniu IP adresy využijeme služby servera http://checkip.dyndns.org, ktorý navracia hodnotu s jednoduchým textom v HTML. Takto vyzerá zdrojový kód stránky:
<html><head><title>Current IP Check</title></head><body>Current IP Address: 212.79.96.92</body></html>
Toho využijeme v nasledujúcich riadkoch, kde si zdrojový kód načítame do textového reťazca:
...
System.Net.WebRequest req = System.Net.WebRequest.Create(url);
System.Net.WebResponse resp = req.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
Využijeme tu systémové metódy pre načítanie a prevzatie oslovených
webové stránky. Tie poskytujú triedy WebRequest
,
WebResponse
a potom už familiárna trieda
StreamReader
pre načítanie obsahu stránky do premennej
string sr
. Z premenné sr
prečítame vďaka metódam
ReadToEnd().Trim()
dáta a vynecháme všetky prázdne znaky.
Zvyšok uložíme:
string response = sr.ReadToEnd().Trim();
Využijeme jedinečného znaku :
, ktorý sa v reťazci vyskytuje
vždy a reťazec tu rozdelíme:
string[] a = response.Split(':');
Tu rozdelený reťazec obsahujúci IP adresu uložíme do novej premennej
a2
:
string a2 = a[1].Substring(1);
Teraz v reťazci zostáva IP adresa a za ňou zvyšok HTLM tagov, ktoré
odrežeme detekciou prvý ostré zátvorky <
. To uložíme do
nového stringového poľa a3
:
string[] a3 = a2.Split('<');
A funkcií navrátime hodnotu prvého reťazca stringu a3
obsahujúce nami požadovanú IP adresu:
return a3[0]; }
Týmto máme hotovú funkciu pre navrátenie našej verejnej IP adresy, teraz sa môžeme vrhnúť na to, ako z nej vytiahnuť našu polohu.
Geolokácia - Zistenie polohy z IP adresy
Tu si prejdeme postupne jednotlivé kroky tak, aby sme na konci mali funkčné kód pre zistenie polohy z IP adresy.
1. Založenie účtu u ipgeolocation.io
Na https://app.ipgeolocation.io/auth/login sa zaregistrujte pod vaším e-mailom / Google účtom atp. a vykonajte potrebné kroky pre overenie emailu.
Potom sa prihláste do vášho účtu, kde hneď na prvej stránke nájdete to, čo budete potrebovať - vaše API údaje hneď pod textom Your API Key. API Key si niekam poznačte, alebo si nechajte stránku otvorenú na pozadí, budeme ho potrebovať neskôr:
2. Inštalácia nugety balíčka IPGeolocation
Teraz, keď už máme založený účet, môžeme jednoducho využiť funkcií IPGeoLocation cez balíčky. Oficiálne balíček má však jednu vadu a to že nepodporuje nový .NET Core. Nanešťastie komunita zapracovala na balíčku pre .NET framework, s ktorým budeme pracovať my. Na GitHub nájdete balíčky aj pre ďalšie programovacie jazyky.
Balíček nugety pre .NET framework
Balíček pre klasický .NET nainštalujeme nasledujúcim spôsobom:
- V menu vyberieme Nástroje -> Správca balíčkov nugety -> Spravovať balíčky nugety pre riešenie ...
- Prepneme sa do záložky Prehľadávať a vyhľadáme
IPGeolocation.Net
, na obrázku je ako prvý - Označíme náš projekt a zvolíme nainštalovať, počkáme, až sa potrebné súbory stiahnu a nainštalujú. Úspešné nainštalovanie si môžeme skontrolovať v záložke nainštalované, kde sa zobrazí všetky nainštalované balíčky
- Manuál a zdrojové kódy nájdeme na GitHub - https://github.com/...i-dotnet-sdk
Balíček nugety pre .NET Core
Ak chcete ísť cestou .NET Core, zvolíme iný balík:
- V menu prejdeme na Nástroje -> Správca balíčkov nugety -> Spravovať balíčky nugety pre riešenie ...
- Vyberieme balíček
IP2Location.IPGeolocation
, na obrázku zobrazený ako druhá položka - Pokračujeme rovnako ako v postupe pre klasický .NET
Pokračovať budeme v druhej časti tutoriálu.