ITnetwork summer 2020 ITnetwork summer 2020

Geolokace podle IP adresy v C# .NET WPF - Část 1

Dnes vás provedu světem geolokace napsané v C# a využívající .NET framework. Budeme využívat IP adresy pro určení polohy. Využijeme k tomu servery http://checkip.dyndns.org a API https://ipgeolocation.io, které poskytne třídu pro komunikaci s jejich databází. Cílem bude zjištění aktuální polohy pomocí GPS koordinátů, Longitude a Latitude, a případně další detailnější informace.

Co budeme potřebovat

  • Visual Studio 2017 či 2019 (v této verzi budu vytvářet průvodce, změny oproti verzi 2017 by měly být jen kosmetické)
  • Základní znalost jazyka C# a Visual Studia
  • Registraci na https://ipgeolocation.io
Co se dnes naučíme
  • Práci s balíčky NuGet
  • Jednoduchý návrh formuláře pomocí WPF
  • Implementaci třídy https://ipgeolocation.io v našem kódu

Založení nového projektu

Vytvoříme nový projekt typu Aplikace WPF (.NET Framework). Můžete zvolit i postup pro nový .NET Core, či UWP, ale tam je třeba počítat s nulovou zpětnou kompatibilitou (zpravidla je problém i s OS Windows 10, který nemá letošní update 1903). Pro verze UWP pro .NET Core použijeme oficiální balíček NuGet – více později.

Design aplikace

Tady se nebudeme nad ničím pozastavovat, design bude čistě účelný:

XAML kód okna bude následující:

<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ódu jsme použili:

  • WrapPanel, který hezky zarovná komponenty na střed a vypořádá se i s případným rostoucím ListView
  • TextBox, do kterého se vypíše naším kódem zjištěná IP adresa, případně můžeme zadat ručně pro vyzkoušení funkce
  • Button pro automatické zjištění IP adresy
  • ListView, kam se nám vypíší veškeré informace získané z IPGeolocation.io pomocí našeho kódu
  • A příslušné tlačítko pro spuštění našeho kódu

Takto přibližně by měl formulář vypadat:

Formulář vzor

Vlastní kód – Zjištění IP adresy

Začneme vytvořením vlastní metody GetIP() s návratovou hodnotou typu string, která nám vrátí aktuální veřejnou IP adresu:

private string GetIP()
{
    string url = "http://checkip.dyndns.org";
    ...
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

K získání IP adresy využijeme služby serveru http://checkip.dyndns.org, který navrací hodnotu s jednoduchým textem v HTML. Takto vypadá 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 následujících řádcích, kde si zdrojový kód načteme do textového řetězce:

...
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 zde systémové metody pro načtení a stažení dotazované webové stránky. Ty poskytují třídy WebRequest, WebResponse a poté již familiární třída StreamReader pro načtení obsahu stránky do proměnné string sr. Z proměnné sr přečteme díky metodám ReadToEnd().Trim() data a vynecháme veškeré prázdné znaky. Zbytek uložíme:

string response = sr.ReadToEnd().Trim();

Využijeme jedinečného znaku :, který se v řetězci vyskytuje vždy a řetězec zde rozdělíme:

string[] a = response.Split(':');

Zde rozdělený řetězec obsahující IP adresu uložíme do nové proměnné a2:

string a2 = a[1].Substring(1);

Nyní v řetězci zbývá IP adresa a za ní zbytek HTLM tagů, které odřízneme detekcí první ostré závorky <. To uložíme do nového stringového pole a3:

string[] a3 = a2.Split('<');

A funkcí navrátíme hodnotu prvního řetězce stringu a3 obsahující námi požadovanou IP adresu:

    return a3[0];
}

Tímto máme hotovou funkci pro navrácení naší veřejné IP adresy, nyní se můžeme vrhnout na to, jak z ní vytáhnout naši polohu.

GeoLokace – Zjištění polohy z IP adresy

Zde si projdeme postupně jednotlivé kroky tak, abychom na konci měli funkční kód pro zjištění polohy z IP adresy.

1. Založení účtu u ipgeolocation.io

Na https://app.ipgeolocation.io/auth/login se zaregistrujte pod vaším e-mailem/Google účtem atp. a proveďte potřebné kroky pro ověření emailu.

Sign up pro registraci

Poté se přihlaste do vašeho účtu, kde hned na první stránce najdete to, co budete potřebovat - vaše API údaje hned pod textem Your API Key. API Key si někam poznamenejte, nebo si nechte stránku otevřenou na pozadí, budeme jej potřebovat později:

Dashboard vaší registrace s API klíčem

2. Instalace NuGet balíčku IPGeolocation

Nyní, když již máme založený účet, můžeme jednoduše využít funkcí IPGeoLocation přes balíčky. Oficiální balíček má nicméně jednu vadu a to že nepodporuje nový .NET Core. Naneštěstí komunita zapracovala na balíčku pro .NET framework, se kterým budeme pracovat my. Na GitHubu naleznete balíčky i pro další programovací jazyky.

Balíček NuGet pro .NET framework

Balíček pro klasický .NET nainstalujeme následujícím způsobem:

  • V menu vybereme Nástroje -> Správce balíčků NuGet -> Spravovat balíčky NuGet pro řešení...
  • Přepneme se do záložky Procházet a vyhledáme IPGeolocation.Net, na obrázku je jako první
  • Označíme náš projekt a zvolíme nainstalovat, počkáme, až se potřebné soubory stáhnou a nainstalují. Úspěšné nainstalování si můžeme zkontrolovat v záložce nainstalováno, kde se zobrazí veškeré nainstalované balíčky
  • Manuál a zdrojové kódy nalezneme na GitHubu - https://github.com/…i-dotnet-sdk

Balíček NuGet pro .NET Core

Pokud chcete jít cestou .NET Core, zvolíme jiný balíček:

  • V menu přejdeme na Nástroje -> Správce balíčků NuGet -> Spravovat balíčky NuGet pro řešení...
  • Vybereme balíček IP2Location.IPGeolocation, na obrázku zobrazen jako druhá položka
  • Pokračujeme stejně jako v postupu pro klasický .NET
Instalace NuGet balíčku

Pokračovat budeme v druhé části tutoriálu.


 

Všechny články v sekci
Práce se soubory a sítí v C# .NET
Článek pro vás napsal Michal Kotek
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje programování již od útlých let, aktuálně programuje rok v .NET framework pomocí C#.
Aktivity (3)

 

 

Komentáře

Avatar
Petr Doležal:20.11.2019 9:51

Nebylo by lepší pro získání IP adresy použít Regular expression (viz. příloha):

(?<=(: ))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</body>))
 
Odpovědět
20.11.2019 9:51
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Michal Kotek
Redaktor
Avatar
Michal Kotek:20.11.2019 18:07

No vidíš, to mě nenapadlo :D Super díky za tip.

Odpovědět
20.11.2019 18:07
Give a man a fish and you feed him for a day; teach a man to fish and you feed him for a lifetime.Teach a man to code...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.