Differences

This shows you the differences between two versions of the page.

Link to this comparison view

eim:laboratoare:laborator08 [2018/04/24 19:07]
dragos.niculescu [Zeroconf sub Linux]
eim:laboratoare:laborator08 [2021/05/06 08:29] (current)
madalina.barbu [Activitate de Laborator]
Line 54: Line 54:
 Apoi se poate verifica cu tcpdump traficul specific DNS-SD care este generat: ​ Apoi se poate verifica cu tcpdump traficul specific DNS-SD care este generat: ​
 <code shell> <code shell>
-#tcpdump -ni eth0 'udp port 5353'+#tcpdump -ni eth0 -s0 -w '​file1.pcap' ​'udp port 5353'
 </​code>​ </​code>​
 +
 +Traficul capturat în file1.pcap poate fi examinat cu ''​wireshark file1.pcap''​. Dacă ați rulat tcpdump pe telefon, este necesară aducerea fișierului .pcap pe desktop cu jurorul comanzii ''​adb pull /​sdcard/​file1.pcap .'' ​
  
 Din alt terminal, se poate lansa o căutare de servicii de tipul chatservice: ​ Din alt terminal, se poate lansa o căutare de servicii de tipul chatservice: ​
Line 988: Line 990:
 {{ :​eim:​laboratoare:​laborator09:​chatservice04.png?​nolink&​400 }} {{ :​eim:​laboratoare:​laborator09:​chatservice04.png?​nolink&​400 }}
  
-**1.** În contul Github personal, să se creeze un depozit denumit 'Laborator09'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''​README.md'',​ nici a fișierului ''​.gitignore''​ sau a a fișierului ''​LICENSE''​).+**1.** În contul Github personal, să se creeze un depozit denumit 'Laborator08'. Inițial, acesta trebuie să fie gol (nu trebuie să bifați nici adăugarea unui fișier ''​README.md'',​ nici a fișierului ''​.gitignore''​ sau a a fișierului ''​LICENSE''​).
  
 **2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​eim-lab/​Laborator08|]]. ​ **2.** Să se cloneze în directorul de pe discul local conținutul depozitului la distanță de la [[https://​www.github.com/​eim-lab/​Laborator08|]]. ​
Line 1004: Line 1006:
 </​code>​ </​code>​
  
-**4.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ​''​ChatServiceAndroidNSD''​ sau ''​ChatServiceJmDNS''​ din directorul ''​labtasks''​.+**4.** Să se importe în mediul integrat de dezvoltare Android Studio proiectul ''​ChatServiceJmDNS''​ din directorul ''​labtasks''​.
  
 **5.** Să se ruleze aplicația Android pe două dispozitive mobile care să se găsească în aceeași rețea. **5.** Să se ruleze aplicația Android pe două dispozitive mobile care să se găsească în aceeași rețea.
  
 +**5a.**
 <note tip> <note tip>
 În cazul Genymotion, se pot crea două imagini pentru două dispozitive mobile (virtuale) de același tip, care vor putea fi rulate separat, fiecare dintre acestea primind adrese Internet diferite din intervalul ''​192.168.56.101''​ → ''​192.168.56.254''​. În cazul Genymotion, se pot crea două imagini pentru două dispozitive mobile (virtuale) de același tip, care vor putea fi rulate separat, fiecare dintre acestea primind adrese Internet diferite din intervalul ''​192.168.56.101''​ → ''​192.168.56.254''​.
 +Pentru interfața WiFi, genymotion nu poate folosi decât NAT sau Bridge ([[https://​www.genymotion.com/​help/​desktop/​faq/#​network-configuration|manual Genymotion]]). Pentru acest laborator, este necesară configurația bridge. ​
  
-{{ :​laboratoare:​laborator09:​genymotion01.png?​nolink&​600 }} 
  
-În VirtualBox (> versiunea 4.3.26), se verifică faptul că dispozitivele virtuale comunică între ele prin intermediul unei interfețe de rețea, configurată să folosească ​NAT (Network Address Translation)+În VirtualBox (> versiunea 4.3.26), se verifică faptul că dispozitivele virtuale comunică între ele prin intermediul unei interfețe de rețea, configurată să folosească ​Bridge
  
 În acest sens, trebuie realizate următoarele operații: În acest sens, trebuie realizate următoarele operații:
 +  * în configurația aferentă fiecărui dispozitiv virtual (//​Machine//​ → //​Settings//​ sau Ctrl + S), se va selecta //Bridge// folosind rețeaua astfel definită pentru interfața //Adapter 2//
  
-  * se va crea rețea NAT în cadrul VirtualBox ​(//File// → //​Preferences// ​sau Ctrl + G)+  * apoi se setează ​adresă MAC random pentru adapter 2 (manual, ​sau cu butonul asociat)
  
-{{ :eim:​laboratoare:​laborator09:​virtualbox01.png?​nolink&​400 }}+Acestea vor putea rula instanțe diferite ale aplicației Android, fiecare folosind __**o denumire proprie pentru serviciu**__ (la valoarea generică ''​Constants.SERVICE_NAME''​ definită în pachetul ''​ro.pub.cs.systems.eim.lab08.chatservice.general''​ se sufixează în mod automat un șir de caractere generat aleator, astfel încât aceasta să fie unică în rețeaua locală).
  
-{{ :eim:​laboratoare:​laborator09:​virtualbox02.png?​nolink&​400 }}+Se verifică faptul că fiecare aplicație Android rulează pe un dispozitiv diferit:
  
-  * în configurația aferentă fiecărui dispozitiv virtual (//​Machine//​ → //​Settings//​ sau Ctrl + S), se va selecta //NAT Network// folosind rețeaua astfel definită pentru interfața //Adapter 2//+{{ :​eim:​laboratoare:​laborator09:​genymotion02.png?​nolink&​600 }}
  
-<​hidden>​+{{ :​eim:​laboratoare:​laborator08:​vbox_bridge.png?​nolink&​400}}
  
   * în configurația aferentă fiecărui dispozitiv virtual (//​Machine//​ → //​Settings//​ sau Ctrl + S), se va selecta //Bridged// folosind rețeaua astfel definită pentru interfața //Adapter 2//   * în configurația aferentă fiecărui dispozitiv virtual (//​Machine//​ → //​Settings//​ sau Ctrl + S), se va selecta //Bridged// folosind rețeaua astfel definită pentru interfața //Adapter 2//
-  * În acest mod, fiecare ​telefon ​va fi cuplat în rețaua laboratorului,​ iar cu comanda avahi-browse -rk _chatservice._tcp se pot vizualiza toate instanțele care rulează în acel moment  ​ +  * În acest mod, fiecare ​emulator ​va fi cuplat în rețeaua laboratorului,​ iar cu comanda avahi-browse -rk _chatservice._tcp se pot vizualiza toate instanțele care rulează în acel moment  ​
-</​hidden>​+
  
-{{ :​eim:​laboratoare:​laborator09:​virtualbox03.png?​nolink&​400 }}+===== Telefon personal ===== 
 +  * Pentru a folosi telefonul personal, she recomanda reteaua wifi EG106, care este in bridge cu toate PCurile din sala. Se poate folosi un emulator in bridge ca partener pentru telefon
  
-</​note>​+  * În Logcat, se pot utiliza filtre diferite pentru fiecare dintre dintre instanțele aplicației Android, astfel încât să se faciliteze procesul de depanare.
  
-Acestea vor putea rula instanțe diferite ale aplicației Android, fiecare folosind __**o denumire proprie pentru serviciu**__ (la valoarea generică ''​Constants.SERVICE_NAME''​ definită în pachetul ​''​ro.pub.cs.systems.eim.lab08.chatservice.general'' ​se sufixează în mod automat un șir de caractere generat aleator, astfel încât aceasta să fie unică în rețeaua locală).+**5b.** Să se utilizeze utilitarul ZeroConf Browser, deja instalat pe emulatoare pentru a identifica serviciile pornite în rețeaDacă emulatoarele sunt în aceeași rețea cu o mașină Linux, se poate rula ''​avahi-browse -rk _chatservice._tcp'' ​pentru a vizualiza serviciile pornite 
 +{{:​eim:​laboratoare:​laborator08:​zeroconfbrowser1.png?​nolink&​300|}} ​
  
-Se verifică faptul că fiecare aplicație Android rulează pe un dispozitiv diferit:+**5c.** La momentul publicării cu succes a serviciului (când butonul devine verde), să se colecteze adresele IP locale pe care serviciul devine vizibil. Aceasta se face în funcția OnCreateView a listener-ului care primește schimbarea stării serviciului (ServiceDiscoveryStatusButtonListener). ​
  
-{{ :eim:​laboratoare:​laborator09:​genymotion02.png?​nolink&​600 ​}}+<code java> 
 +        ... 
 +        if (view == null) { 
 +            view = inflater.inflate(R.layout.fragment_chat_network_service,​ parent, false); 
 +        } 
 +        // List all IPs where the server is visible 
 +        Enumeration interfaces = null; 
 +        try { 
 +            interfaces = NetworkInterface.getNetworkInterfaces();​ 
 +        } catch (IOException e){ 
 +            Log.e(Constants.TAG,​ "Could not query interface list" + e.getMessage());​ 
 +            if (Constants.DEBUG) { 
 +                e.printStackTrace();​ 
 +            ​} 
 +        ​} 
 +        String IPs = "";​ 
 +        while(interfaces.hasMoreElements()) 
 +        { 
 +            NetworkInterface n = (NetworkInterface) interfaces.nextElement();​ 
 +            Enumeration ee = n.getInetAddresses();​ 
 +            while (ee.hasMoreElements()) 
 +            { 
 +                InetAddress i = (InetAddress) ee.nextElement();​ 
 +                if (i instanceof Inet4Address) { 
 +                    if(IPs.length() > 0) 
 +                        IPs += ", "; 
 +                    IPs += i.getHostAddress().toString();​ 
 +                } 
 +            } 
 +        } 
 +        TextView LocalIPs = (TextView)view.findViewById(R.id.service_discovery_local_addr);​ 
 +        LocalIPs.setText(IPs);​
  
-În Logcat, se pot utiliza filtre diferite pentru fiecare dintre dintre instanțele aplicației Androidastfel încât să se faciliteze procesul ​de depanare.+        return view; 
 +</​code>​  
 +Verificați afișarea adreselor pe care serviciul devine disponibil. Utilitarele de explorare servicii (ZeroconfBrowseravahi-browser) vor vedea serviciul pe una dintre aceste adrese. ​  
 + 
 +**5d.** La apăsarea butonului ​de publicare serviciu, se va modifica titlul aplicatiei pentru a reflecta starea curentă a publicării:​  
 + 
 +În register: 
 +<code java>  
 + ​chatActivity.setTitle(serviceInfo.getName());​ 
 +        Log.i(Constants.TAG,​ "​Register service " + 
 +                serviceInfo.getName() + ":"​ + 
 +                serviceInfo.getTypeWithSubtype() + ":"​ + 
 +                serviceInfo.getPort() 
 +        ); 
 +</​code>​ 
 + 
 +În unregister:​ 
 +<code java> 
 +chatActivity.setTitle("​Chat Service JmDNS"​);​ 
 +</​code>​
  
 **6.** Să se implementeze rutina pentru trimiterea mesajelor, pe metoda ''​run()''​ a firului de execuție ''​SendThread''​ din clasa ''​ChatClient''​ a pachetului ''​ro.pub.cs.systems.eim.lab08.chatservice.networkservicediscoveryoperations''​. **6.** Să se implementeze rutina pentru trimiterea mesajelor, pe metoda ''​run()''​ a firului de execuție ''​SendThread''​ din clasa ''​ChatClient''​ a pachetului ''​ro.pub.cs.systems.eim.lab08.chatservice.networkservicediscoveryoperations''​.
Line 1092: Line 1147:
     - se afișează mesajul în fragmentul de tip ''​ChatConversationFragment''​ (prin intermediul metodei ''​appendMessage()''​),​ dacă acesta este asociat activității la momentul respectiv.     - se afișează mesajul în fragmentul de tip ''​ChatConversationFragment''​ (prin intermediul metodei ''​appendMessage()''​),​ dacă acesta este asociat activității la momentul respectiv.
  
-**8.** ​ Să se încarce modificările realizate în cadrul depozitului '​Laborator08'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​+**8.**  Să se examineze folosind tcpdump/​wireshark schimbul de mesaje între dispozitive 
 +  - asigurați-vă folosind ''​ping''​ că telefoanele sunt în contact IP între ele, și cu masina host (Linux) 
 +  - notați adresele IP folosite de fiecare dispozitiv: pentru telefoane, ele sunt afișate pe rândul 2 al activitătii,​ pentru Linux, folosind comanda ''​ip ro''​. ​  
 +  - porniți din starea în care toate butoanele sunt pe roșu (serviciul nu este public, iar descoperirea este inactivă). În linux, directorul /​etc/​avahi/​services/​ nu conține nimic 
 +     - Pe linux, cu comanda ''​avahi-browse -ac'',​ identificați serviciile și stațiile disponibile în rețeaua locală 
 +     - Pe Android, folosind utilitarul ''​ZeroconfBrowser'',​ identificați serviciile și stațiile disponibile în rețeaua locală 
 +     - Folosind ''​avahi-browse -rk _chatservice._tcp'',​ asigurați-vă că nu există instanțe ale serviciului pe vreuna dintre mașini 
 +  - pregătiți recoltarea pachetelor folosind comanda <code shell>​tcpdump -ni any 'udp port 5353' -w ./​dnssd.pcap </​code>​  
 +  - activați serviciul pe unul dintre telefoane, comanda avahi-browse de mai sus identifică apariția numelor și perechii IP/port.  
 +  - ce fel de mesaj este folosit pentru publicarea serviciului?​  
 +  - observați folosirea înregistrărilor de tip PTR, SRV 
 +  - dacă ați pornit mai multe emulatoare/​telefoane,​ observați cumularera răspunsurilor anterioare în fiecare răspuns ​  
 +  - cum se face descoperirea serviciilor (prin ce tip de mesaje)?  
 + 
 +**9.** Folosind instrucțiunile din secțiunea **Zeroconf sub Linux** de mai sus 
 +    - pe PC-ul local publicați un serviciu pe portul 5003 
 +    - rulați serviciul folosind ''​while true; do nc -v -l -p 5003; done''​ 
 +    - verificați interoperabilitatea cu clienții implementați pe Android 
 +    - puteți folosi clienți Linux cu comanda ''​nc <​adresă>​ <​port>''​ pentru a conversa cu un server descoperit la  
 + ''​adresa:​port''​ (pe Android sau Linux). ​   
 + 
 +**10.**  Să se încarce modificările realizate în cadrul depozitului '​Laborator08'​ de pe contul Github personal, folosind un mesaj sugestiv. <​code>​
 student@eg106:​~/​Laborator08$ git add * student@eg106:​~/​Laborator08$ git add *
 student@eg106:​~/​Laborator08$ git commit -m "​implemented tasks for laboratory 08" student@eg106:​~/​Laborator08$ git commit -m "​implemented tasks for laboratory 08"
eim/laboratoare/laborator08.1524586056.txt.gz · Last modified: 2018/04/24 19:07 by dragos.niculescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0