Differences

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

Link to this comparison view

eim:colocvii:colocviu02 [2017/05/15 08:50]
andrei.rosucojocaru
eim:colocvii:colocviu02 [2021/05/30 21:52] (current)
dan_valentin.bina [Observații Generale]
Line 3: Line 3:
 ===== Model de Subiect ===== ===== Model de Subiect =====
  
-/*<​HTML>​+<​HTML>​
 <​center>​ <​center>​
 </​HTML>​ </​HTML>​
  
-{{url>​https://​ocw.cs.pub.ro/​courses/​_media/​eim/​colocvii/​colocviu02/​eim2017-tp02-varsim.pdf 90%,800px}}+{{url>​https://​ocw.cs.pub.ro/​courses/​_media/​eim/​colocvii/​colocviu02/​eim-colocviu2-exemplu.pdf 90%,800px}}
  
 <​HTML>​ <​HTML>​
Line 13: Line 13:
 </​HTML>​ </​HTML>​
  
-{{ :​eim:​colocvii:​colocviu02:​eim2017-tp02-varsim.pdf }}*/+{{ :​eim:​colocvii:​colocviu02:​eim-colocviu2-exemplu.pdf }}
  
 ===== Observații Generale ===== ===== Observații Generale =====
Line 53: Line 53:
 dependencies { dependencies {
   ...   ...
-  ​compile ​group: '​cz.msebera.android',​ name: '​httpclient',​ version: '​4.4.1.2'​+  ​implementation ​group: '​cz.msebera.android',​ name: '​httpclient',​ version: '​4.4.1.2'​
 } }
 </​file>​ </​file>​
Line 67: Line 67:
 dependencies { dependencies {
   ...   ...
-  ​useLibrary ​'​org.apache.http.legacy'​+  ​implementation ​'​org.apache.http.legacy'​
 } }
 </​file>​ </​file>​
Line 79: Line 79:
 dependencies { dependencies {
   ...   ...
-  ​compile ​project (':​jsoup-1.10.2'​)+  ​implementation ​project (':​jsoup-1.10.2'​)
 } }
 </​file>​ </​file>​
Line 99: Line 99:
 ===== Rezolvări ===== ===== Rezolvări =====
  
-Proiectul Android Studio corespunzător aplicației Android ce conține rezolvările complete ale cerințelor colocviului sunt disponibile pe [[https://​github.com/​eim2017/​PracticalTest02|contul de Github al disciplinei]].+Proiectul Android Studio corespunzător aplicației Android ce conține rezolvările complete ale cerințelor colocviului sunt disponibile pe [[https://​github.com/​eim-lab/​PracticalTest02|contul de Github al disciplinei]].
  
-**1.** Se accesează [[https://​www.github.com|Github]] și se realizează autentificarea în contul personal, prin intermediul butonului //Sign in//.+**1.** **a)** Se accesează [[https://​www.github.com|Github]] și se realizează autentificarea în contul personal, prin intermediul butonului //Sign in//.
  
 {{ :​eim:​colocvii:​colocviu02:​05github_authentication.png?​nolink&​700 }} {{ :​eim:​colocvii:​colocviu02:​05github_authentication.png?​nolink&​700 }}
Line 122: Line 122:
 {{ :​eim:​colocvii:​colocviu02:​07github_repository_configuration.png?​nolink }} {{ :​eim:​colocvii:​colocviu02:​07github_repository_configuration.png?​nolink }}
  
-**2.** Prin intermediul comenzii ''​git clone''​ se poate descărca întregul conținut în directorul curent (de pe discul local), inclusiv istoricul complet al versiunilor anterioare (care poate fi ulterior reconstituit după această copie, în cazul coruperii informațiilor stocate pe serverul la distanță).+**b)** Prin intermediul comenzii ''​git clone''​ se poate descărca întregul conținut în directorul curent (de pe discul local), inclusiv istoricul complet al versiunilor anterioare (care poate fi ulterior reconstituit după această copie, în cazul coruperii informațiilor stocate pe serverul la distanță).
  
 <​note>​În situația în care se dorește clonarea conținutului din depozitul la distanță în alt director decât cel curent, acesta poate fi transmis ca parametru al comenzii, după URL-ul la care poate fi accesat proiectul în Github.</​note>​ <​note>​În situația în care se dorește clonarea conținutului din depozitul la distanță în alt director decât cel curent, acesta poate fi transmis ca parametru al comenzii, după URL-ul la care poate fi accesat proiectul în Github.</​note>​
  
 <​code>​ <​code>​
-student@eim2017:~$ git clone https://​www.github.com/​perfectstudent/​PracticalTest02+student@eim:~$ git clone https://​www.github.com/​perfectstudent/​PracticalTest02
 </​code>​ </​code>​
  
-**3.** Se urmăresc indicațiile disponibile în secțiunea [[eim:​laboratoare:​laborator01#​crearea_unei_aplicatii_android_in_android_studio_-_obligatoriu|Crearea unei aplicații Android în Android Studio]].+**c)** Se urmăresc indicațiile disponibile în secțiunea [[eim:​laboratoare:​laborator01#​crearea_unei_aplicatii_android_in_android_studio_-_obligatoriu|Crearea unei aplicații Android în Android Studio]].
  
-**4.** Pentru implementarea interfeței grafice, se vor defini controalele care asigură interacțiunea cu utilizatorul pentru fiecare dintre componentele aplicației Android:+**2.** Pentru implementarea interfeței grafice, se vor defini controalele care asigură interacțiunea cu utilizatorul pentru fiecare dintre componentele aplicației Android:
   * serverul   * serverul
     * un câmp text pentru specificarea portului pe care va accepta conexiuni de la clienți;     * un câmp text pentru specificarea portului pe care va accepta conexiuni de la clienți;
Line 150: Line 150:
  
 <file xml activity_practical_test02_main.xml>​ <file xml activity_practical_test02_main.xml>​
 +<?xml version="​1.0"​ encoding="​utf-8"?>​
 <​LinearLayout xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​ <​LinearLayout xmlns:​android="​http://​schemas.android.com/​apk/​res/​android"​
 +  xmlns:​app="​http://​schemas.android.com/​apk/​res-auto"​
   xmlns:​tools="​http://​schemas.android.com/​tools"​   xmlns:​tools="​http://​schemas.android.com/​tools"​
   android:​layout_width="​match_parent"​   android:​layout_width="​match_parent"​
   android:​layout_height="​match_parent"​   android:​layout_height="​match_parent"​
   android:​orientation="​vertical"​   android:​orientation="​vertical"​
-  tools:​context="​ro.pub.cs.systems.eim.practicaltest02.graphicuserinterface.PracticalTest02MainActivity"​ >+  tools:​context="​ro.pub.cs.systems.eim.practicaltest02.view.PracticalTest02MainActivity">​
  
   <​TextView   <​TextView
Line 163: Line 165:
     android:​textSize="​25sp"​     android:​textSize="​25sp"​
     android:​textStyle="​bold"​     android:​textStyle="​bold"​
-    android:​text="​@string/​server"​ /> +    android:​text="​@string/​server"/>​ 
-    +
   <​LinearLayout   <​LinearLayout
     android:​layout_width="​match_parent"​     android:​layout_width="​match_parent"​
     android:​layout_height="​wrap_content"​     android:​layout_height="​wrap_content"​
     android:​baselineAligned="​false">​     android:​baselineAligned="​false">​
-        ​+
     <​ScrollView     <​ScrollView
       android:​layout_width="​0dp"​       android:​layout_width="​0dp"​
       android:​layout_height="​wrap_content"​       android:​layout_height="​wrap_content"​
       android:​layout_weight="​1">​       android:​layout_weight="​1">​
-      ​+
       <​EditText       <​EditText
         android:​id="​@+id/​server_port_edit_text"​         android:​id="​@+id/​server_port_edit_text"​
- android:​layout_width="​match_parent"​ +        ​android:​layout_width="​match_parent"​ 
- android:​layout_height="​wrap_content"​ +        android:​layout_height="​wrap_content"​ 
- android:​hint="​@string/​server_port"​ /> +        android:​hint="​@string/​server_port"/>​ 
-        +
     </​ScrollView>​     </​ScrollView>​
-        ​+
     <​ScrollView     <​ScrollView
       android:​layout_width="​0dp"​       android:​layout_width="​0dp"​
       android:​layout_height="​wrap_content"​       android:​layout_height="​wrap_content"​
       android:​layout_weight="​1">​       android:​layout_weight="​1">​
-      ​+
       <Button       <Button
         android:​id="​@+id/​connect_button"​         android:​id="​@+id/​connect_button"​
- android:​layout_width="​wrap_content"​ +        ​android:​layout_width="​wrap_content"​ 
- android:​layout_height="​wrap_content"​ +        android:​layout_height="​wrap_content"​ 
- android:​layout_gravity="​center"​ +        android:​layout_gravity="​center"​ 
- android:​text="​@string/​connect"​ /> +        android:​text="​@string/​connect"/>​ 
-        +
     </​ScrollView>​     </​ScrollView>​
-        ​+
   </​LinearLayout>​   </​LinearLayout>​
-    ​+
   <Space   <Space
     android:​layout_width="​wrap_content"​     android:​layout_width="​wrap_content"​
     android:​layout_height="​10dp"​ />     android:​layout_height="​10dp"​ />
-    ​+
   <​TextView   <​TextView
     android:​layout_width="​wrap_content"​     android:​layout_width="​wrap_content"​
Line 209: Line 211:
     android:​textSize="​25sp"​     android:​textSize="​25sp"​
     android:​textStyle="​bold"​     android:​textStyle="​bold"​
-    android:​text="​@string/​client"​ /> +    android:​text="​@string/​client"/>​ 
-    +
   <​LinearLayout   <​LinearLayout
     android:​layout_width="​match_parent"​     android:​layout_width="​match_parent"​
     android:​layout_height="​wrap_content"​     android:​layout_height="​wrap_content"​
     android:​baselineAligned="​false">​     android:​baselineAligned="​false">​
-        ​+
     <​ScrollView     <​ScrollView
       android:​layout_width="​0dp"​       android:​layout_width="​0dp"​
       android:​layout_height="​wrap_content"​       android:​layout_height="​wrap_content"​
       android:​layout_weight="​1">​       android:​layout_weight="​1">​
-        ​+
       <​EditText       <​EditText
         android:​id="​@+id/​client_address_edit_text"​         android:​id="​@+id/​client_address_edit_text"​
         android:​layout_width="​match_parent"​         android:​layout_width="​match_parent"​
         android:​layout_height="​wrap_content"​         android:​layout_height="​wrap_content"​
-        android:​hint="​@string/​client_address"​ /> +        android:​hint="​@string/​client_address"/>​ 
-        +
     </​ScrollView>​     </​ScrollView>​
-        ​+
     <​ScrollView     <​ScrollView
       android:​layout_width="​0dp"​       android:​layout_width="​0dp"​
       android:​layout_height="​wrap_content"​       android:​layout_height="​wrap_content"​
       android:​layout_weight="​1">​       android:​layout_weight="​1">​
-        ​+
       <​EditText       <​EditText
         android:​id="​@+id/​client_port_edit_text"​         android:​id="​@+id/​client_port_edit_text"​
         android:​layout_width="​match_parent"​         android:​layout_width="​match_parent"​
         android:​layout_height="​wrap_content"​         android:​layout_height="​wrap_content"​
-        android:​hint="​@string/​client_port"​ /> +        android:​hint="​@string/​client_port"/>​ 
-        +
     </​ScrollView>​     </​ScrollView>​
-        ​ + 
-  </​LinearLayout> ​    +  </​LinearLayout>​ 
-    +
   <​GridLayout   <​GridLayout
     android:​layout_width="​match_parent"​     android:​layout_width="​match_parent"​
Line 249: Line 251:
     android:​rowCount="​2"​     android:​rowCount="​2"​
     android:​columnCount="​2">​     android:​columnCount="​2">​
-        ​+
     <​EditText     <​EditText
       android:​id="​@+id/​city_edit_text"​       android:​id="​@+id/​city_edit_text"​
Line 257: Line 259:
       android:​hint="​@string/​city"​       android:​hint="​@string/​city"​
       android:​layout_row="​0"​       android:​layout_row="​0"​
-      android:​layout_column="​0"​ /> +      android:​layout_column="​0"/>​ 
-        +
     <Spinner     <Spinner
       android:​id="​@+id/​information_type_spinner"​       android:​id="​@+id/​information_type_spinner"​
Line 265: Line 267:
       android:​entries="​@array/​information_types"​       android:​entries="​@array/​information_types"​
       android:​layout_row="​1"​       android:​layout_row="​1"​
-      android:​layout_column="​0"​ /> +      android:​layout_column="​0"/>​ 
-        +
     <Button     <Button
       android:​id="​@+id/​get_weather_forecast_button"​       android:​id="​@+id/​get_weather_forecast_button"​
-      android:​layout_width="​100dp"+      android:​layout_width="​wrap_content"
       android:​layout_height="​wrap_content"​       android:​layout_height="​wrap_content"​
       android:​layout_gravity="​center"​       android:​layout_gravity="​center"​
Line 275: Line 277:
       android:​layout_row="​0"​       android:​layout_row="​0"​
       android:​layout_rowSpan="​2"​       android:​layout_rowSpan="​2"​
-      android:​layout_column="​1"​ /> +      android:​layout_column="​1"/>​ 
-        +
   </​GridLayout>​   </​GridLayout>​
  
Line 282: Line 284:
     android:​layout_width="​match_parent"​     android:​layout_width="​match_parent"​
     android:​layout_height="​match_parent">​     android:​layout_height="​match_parent">​
-    ​ + 
-    <​TextView +  <​TextView 
-      android:​id="​@+id/​weather_forecast_text_view"​ +    android:​id="​@+id/​weather_forecast_text_view"​ 
-      android:​layout_width="​match_parent"​ +    android:​layout_width="​match_parent"​ 
-      android:​layout_height="​wrap_content"​ +    android:​layout_height="​wrap_content"​ 
-      ​android:​singleLine="​false"​ +    android:​maxLines="​10"/>​ 
-      ​android:​maxLines="​10"​ /> +
-    +
   </​ScrollView>​   </​ScrollView>​
  
Line 316: Line 317:
 </​note>​ </​note>​
  
-**5.** Implementarea serverului presupune:+**3.** Implementarea serverului presupune:
  
 **a)** un fir de execuție care gestionează solicitările de conexiune de la clienți: **a)** un fir de execuție care gestionează solicitările de conexiune de la clienți:
Line 423: Line 424:
   * în situația în care informațiile meteorologice se găsesc în obiectul gestionat de server, sunt preluate local;   * în situația în care informațiile meteorologice se găsesc în obiectul gestionat de server, sunt preluate local;
   * în situația în care informațiile meteorologice nu se găsesc în obiectul gestionat de server, sunt preluate prin interogarea serviciului Internet, la distanță:   * în situația în care informațiile meteorologice nu se găsesc în obiectul gestionat de server, sunt preluate prin interogarea serviciului Internet, la distanță:
-    * se realizează o cerere de tip ''​POST''​ la adresa Internet [[http://​www.wunderground.com/​cgi-bin/​findweather/​getForecast]];​ parametrul care trebuie precizat este ''​query''​ și are valoarea orașului pentru care se dorește să se obțină informațiile;​ acesta se atașează cererii de tip ''​POST'',​ folosind codificarea ''​UTF-8'';​ +    * o cerere de tip ''​GET''​ în care valoarea parametrului este inclusă în cadrul adresei Internet: [[http://api.openweathermap.org/data/2.5/weather?q=Bucharest&​appid=...]]);
-    * alternativ, se poate realiza ​o cerere de tip ''​GET''​ în care valoarea parametrului este inclusă în cadrul adresei Internet: [[https://www.wunderground.com/cgi-bin/findweather/getForecast?query=...]]);+
     * se obține răspunsul sub forma unui șir de caractere, reprezentând codul sursă al paginii Internet; ​     * se obține răspunsul sub forma unui șir de caractere, reprezentând codul sursă al paginii Internet; ​
     * folosind biblioteca Jsoup, se inspectează documentul în format HTML furnizat pentru a determina locația la care sunt disponibile informațiile necesare <code html>     * folosind biblioteca Jsoup, se inspectează documentul în format HTML furnizat pentru a determina locația la care sunt disponibile informațiile necesare <code html>
-<​script>​ +{ 
-  ​wui.asyncCityPage = true; +  "coord"
-  wui.bootstrapped.API = ""​+    "lon": ​26.11, 
-  wui.api_data = +    "lat": 44.43 
-  ​+  }
-    "response": ​+  "weather": ​[ 
-      "​version":​ "2.0", +    { 
-      "​units":​ "​metric",​ +      "id": ​804
-      "​location":​ { +      "main": "Clouds", 
-        "​name":​ "​Bucuresti",​ +      "description": "overcast clouds", 
-        "​neighborhood":​null,​ +      "icon": "04n"
-        "​city":​ "​Bucuresti",​ +
-        "​state":​ null, +
-        "​state_name":"​Romania",​ +
-        "​country":​ "​RO",​ +
-        "​country_iso3166":​null,​ +
-        "​country_name":"​Romania",​ +
-        "​zip":"​00000",​ +
-        "​magic":"​11"+
-        "wmo":"​15420",​ +
-        "​latitude":44.50000000, +
-        "​longitude":​26.12999916+
-        "elevation":91.00000000,​ +
-        "​l":​ "/​q/​zmw:​00000.11.15420"​ +
-      }, +
-      "date": ​+
- ... +
-      }+
-      "current_observation": ​+
-        ​"source":​ "PWS", +
-        "station": ​+
-          ...  +
-        }, +
-        ​"estimated": null+
-        "date": ​+
-          ... +
-        }, +
-        ​"metar": "AAXX 16161 15420 22997 80502 10201 20109 30072 40180 55008 8807/ 333 55300 0//// 20454",​ +
-        "​condition":"​Overcast",​ +
-        "​temperature":​ 21.5, +
-        "​humidity":​48,​ +
-        "​wind_speed":​6.9,​ +
-        ..., +
-        "​pressure":​ 1018, +
-        ..., +
-      }+
     }     }
-  ​}; +  ​], 
-</​script>​ +  "​base":​ "​stations",​ 
-</​code>​ Se observă faptul că informațiile necesare se regăsesc în cadrul unei etichete de tip ''<​script> ​... </​script>''​ care conține un obiect denumit ''​wui.api_dat''​ exprimat în format JSONÎn acest sensse obține lista tuturor etichetelor de tip ''​script''​ (se folosește metoda ''​getElementsByTag()''​)se preia conținutul acestora (prin intermediul metodei ''​data()''​ din cadrul clasei ''​Element''​) și se verifică dacă se regăsește șirul de caractere ''​wui.api_dat'';​+  "​main":​ { 
 +    "​temp":​ 284.65, 
 +    "​feels_like":​ 283.92, 
 +    "​temp_min":​ 283.15, 
 +    "​temp_max":​ 285.93, 
 +    "​pressure":​ 1016, 
 +    "​humidity":​ 81 
 +  }, 
 +  "​visibility":​ 10000, 
 +  "​wind":​ { 
 +    "​speed":​ 0.5, 
 +    "​deg":​ 310 
 +  }, 
 +  "​clouds":​ { 
 +    "​all":​ 88 
 +  }, 
 +  "​dt":​ 1588887122,​ 
 +  "​sys":​ { 
 +    "​type":​ 1, 
 +    "​id":​ 6911, 
 +    "​country":​ "​RO",​ 
 +    "​sunrise":​ 1588906577,​ 
 +    "​sunset":​ 1588958868 
 +  }, 
 +  "​timezone":​ 10800, 
 +  "​id":​ 683506, 
 +  "​name":​ "​Bucharest",​ 
 +  "​cod":​ 200 
 +
 +</​code> ​
     * se inspectează documentul în format JSON pentru a obține informațiile necesare: se obțin, succesiv, obiectele atașate ca valori pentru cheile ''​response''​ → ''​current_observation''​ și ulterior datele meteorologice,​ regăsite ca valori sub cheile ''​temperature'',​ ''​wind_speed'',​ ''​condition'',​ ''​pressure'',​ ''​humidity'';​     * se inspectează documentul în format JSON pentru a obține informațiile necesare: se obțin, succesiv, obiectele atașate ca valori pentru cheile ''​response''​ → ''​current_observation''​ și ulterior datele meteorologice,​ regăsite ca valori sub cheile ''​temperature'',​ ''​wind_speed'',​ ''​condition'',​ ''​pressure'',​ ''​humidity'';​
     * se construiește un obiect de tipul ''​WeatherForecastInformation''​ folosind informațiile furnizate și se transmite către server pentru ca acesta să fie utilizat ulterior pentru cereri provenite de la alți clienți, vizând același oraș.     * se construiește un obiect de tipul ''​WeatherForecastInformation''​ folosind informațiile furnizate și se transmite către server pentru ca acesta să fie utilizat ulterior pentru cereri provenite de la alți clienți, vizând același oraș.
Line 612: Line 606:
 </​code>​ </​code>​
  
-**6.** Implementarea clientului presupune un fir de execuție pe care sunt realizate următoarele operații:+**4.** Implementarea clientului presupune un fir de execuție pe care sunt realizate următoarele operații:
   * deschiderea unui canal de comunicație folosind parametrii de conexiune la server (adresa Internet, port);   * deschiderea unui canal de comunicație folosind parametrii de conexiune la server (adresa Internet, port);
   * obținerea unor obiecte de tip ''​BufferedReader''​ și ''​PrintWriter''​ (prin apelul metodelor statice din clasa ''​Utilities'':​ ''​getReader()''​ și ''​getWriter()''​),​ prin care se vor realiza operațiile de citire și scriere pe canalul de comunicație;​   * obținerea unor obiecte de tip ''​BufferedReader''​ și ''​PrintWriter''​ (prin apelul metodelor statice din clasa ''​Utilities'':​ ''​getReader()''​ și ''​getWriter()''​),​ prin care se vor realiza operațiile de citire și scriere pe canalul de comunicație;​
Line 723: Line 717:
  
 <​code>​ <​code>​
-student@eim2017:~$ nc 192.168.56.101 5000+student@eim:~$ nc 192.168.56.101 5000
 Bucuresti Bucuresti
 all all
Line 736: Line 730:
  
 <​code>​ <​code>​
-C:\Users\Eim2017> telnet 192.168.56.101 5000+C:\Users\Eim> telnet 192.168.56.101 5000
 Bucuresti Bucuresti
 all all
Line 749: Line 743:
 </​columns>​ </​columns>​
  
-**7.** Pentru încărcarea codului în contextul depozitului din cadrul contului Github personal:+**5.** Pentru încărcarea codului în contextul depozitului din cadrul contului Github personal:
   - se transferă modificările din zona de lucru în zona de lucru în zona de așteptare prin intermediul comenzii ''​git add'',​ indicându-se și fișierele respective (pot fi folosite șabloane pentru a desemna mai multe fișiere);   - se transferă modificările din zona de lucru în zona de lucru în zona de așteptare prin intermediul comenzii ''​git add'',​ indicându-se și fișierele respective (pot fi folosite șabloane pentru a desemna mai multe fișiere);
   - se consemnează modificările din zona de așteptare în directorul Git prin intermediul comenzii ''​git commit -m'',​ precizându-se și un mesaj sugestiv:   - se consemnează modificările din zona de așteptare în directorul Git prin intermediul comenzii ''​git commit -m'',​ precizându-se și un mesaj sugestiv:
Line 757: Line 751:
  
 <​code>​ <​code>​
-student@eim2017:​~/​PracticalTest02$ git add * +student@eim:​~/​PracticalTest02$ git add * 
-student@eim2017:​~/​PracticalTest02$ git commit -m "​finished tasks for PracticalTest02"​ +student@eim:​~/​PracticalTest02$ git commit -m "​finished tasks for PracticalTest02"​ 
-student@eim2017:​~/​PracticalTest02$ git push origin master+student@eim:​~/​PracticalTest02$ git push origin master
 </​code>​ </​code>​
  
Line 765: Line 759:
  
 <​code>​ <​code>​
-student@eim2017:​~/​PracticalTest02$ git config --global user.name "​Perfect Student"​ +student@eim:​~/​PracticalTest02$ git config --global user.name "​Perfect Student"​ 
-student@eim2017:​~/​PracticalTest02$ git config --global user.email perfectstudent@cs.pub.ro+student@eim:​~/​PracticalTest02$ git config --global user.email perfectstudent@cs.pub.ro
 </​code>​ </​code>​
- +<​hidden>​ 
-**8.** Protocolul SIP pornește de la o presupunere optimistă conform căreia atât sursa cât și destinația se găsesc în cadrul aceluiași sistem autonom, astfel încât nu sunt necesare credențiale pentru autentificare. Din acest model, o cerere de tip ''​REGISTER''​ se transmite inițial de către user agent fără aceste informații. În condițiile în care răspunsul furnizat de registration server este //Status: 401 Unauthorized//,​ mesajul este retransmis împreună cu informațiile necesare identificării (SIP Authorization ID, Password). Se poate observa că dimensiunile celor două pachete sunt diferite (mesajul fără credențiale 1095 octeți, mesajul cu credențiale 1249 octeți). În cazul în care informațiile de autentificare sunt valide, răspunsul va fi //Status: 200 OK//.+**6.** Protocolul SIP pornește de la o presupunere optimistă conform căreia atât sursa cât și destinația se găsesc în cadrul aceluiași sistem autonom, astfel încât nu sunt necesare credențiale pentru autentificare. Din acest model, o cerere de tip ''​REGISTER''​ se transmite inițial de către user agent fără aceste informații. În condițiile în care răspunsul furnizat de registration server este //Status: 401 Unauthorized//,​ mesajul este retransmis împreună cu informațiile necesare identificării (SIP Authorization ID, Password). Se poate observa că dimensiunile celor două pachete sunt diferite (mesajul fără credențiale 1095 octeți, mesajul cu credențiale 1249 octeți). În cazul în care informațiile de autentificare sunt valide, răspunsul va fi //Status: 200 OK//.
  
 {{ :​eim:​laboratoare:​laborator09:​wireshark01.png?​nolink&​800 }} {{ :​eim:​laboratoare:​laborator09:​wireshark01.png?​nolink&​800 }}
 +</​hidden>​
  
-**9.** Harta Google este implementată în SDK-ul Android: +**6.** Se configurează ''​avahi-daemon''​ (fișierul ''​/etc/avahi/services/chat.service''​) astfel: 
-  * prin intermediul unei componente grafice de tipul [[https://​developer.android.com/​reference/​com/​google/android/gms/maps/MapView.html|MapView]];​ +<code xml> 
-  ​* în cadrul unui fragment, de tipul [[http://developer.android.com/reference/com/google/android/gms/​maps/​MapFragment.html|MapFragment]].+<?xml version="​1.0"​ standalone='​no'?>​ 
 +<​!DOCTYPE service-group SYSTEM "​avahi-service.dtd">​ 
 +<​service-group>​ 
 +  ​<​name>​My desktop</name> 
 +  <​service>​ 
 +    <​type>​_myservice._tcp</type> 
 +    <​port>​5555<​/port> 
 +  </service>​ 
 +</service-group>​ 
 +</code>
  
-Referințele către aceste obiecte ​se obțin în mod obișnuit, prin intermediul metodelor ''​findViewById()'',​ respectiv ''​findFragmentById()''​.+    * se restarteaza demonul  
 +<code shell> ​  
 +root@eg106:​~#​ /​etc/​init.d/​avahi-daemon restart 
 +[ ok ] Restarting avahi-daemon ​(via systemctl): avahi-daemon.service. 
 +root@eg106:​~#​ </​code> ​
  
-Ambele componente grafice încapsulează un obiect ​de tipul ''​GoogleMap''​.+**7a.** Folosind utilitarul din linie de comandă ​''​avahi-browse'' ​cu parametrii ''​-rca''​ se capturează mesajele advertisment și se identifică interfețele raportate din output.
  
-În cazul folosirii unui control grafic ​de tipul ''​MapView'',​ evenimentele legate de ciclul de viață al aplicației Android vor trebui să fie gestionate manual de câtre programator (componenta va trebui să fie notificată atunci când un astfel de eveniment s-a produs).+Exemplu ​de output: 
 +<​code>​ 
 ++ vboxnet4 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 ++ vboxnet4 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 ++ vmnet8 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 ++ vmnet8 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 ++ vmnet1 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 ++ vmnet1 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 ++ docker0 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 ++   eno1 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 ++   eno1 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 += vboxnet4 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [fe80::​800:​27ff:​fe00:​4] 
 +   port = [5555] 
 +   txt = [] 
 += vboxnet4 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [192.168.60.1] 
 +   port = [5555] 
 +   txt = [] 
 += vmnet8 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [fe80::​250:​56ff:​fec0:​8] 
 +   port = [5555] 
 +   txt = [] 
 += vmnet8 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [192.168.207.1] 
 +   port = [5555] 
 +   txt = [] 
 += vmnet1 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [fe80::​250:​56ff:​fec0:​1] 
 +   port = [5555] 
 +   txt = [] 
 += vmnet1 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [172.16.238.1] 
 +   port = [5555] 
 +   txt = [] 
 += docker0 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [172.17.0.1] 
 +   port = [5555] 
 +   txt = [] 
 +=   eno1 IPv6 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [fe80::​ed2d:​c447:​8f31:​8128] 
 +   port = [5555] 
 +   txt = [] 
 +=   eno1 IPv4 My desktop ​                                   _myservice._tcp ​     local 
 +   ​hostname = [eg106-2.local] 
 +   ​address = [172.16.4.53] 
 +   port = [5555] 
 +   txt = [] 
 +</​code>​
  
-În cazul folosirii unui control grafic ​de tipul ''​MapFragment'', ​metodele de callback corespunzătoare evenimentelor care guvernează ciclul de viață al aplicației Android ​sunt deja implementate (ca în cazul oricărui fragmentde altfel)motiv pentru care programatorul nu are altceva de făcut decât să specifice comportamentul pentru fiecare situație în partedupă caz.+Numele ​de masina publicat este ''​eg106-2.local'', ​pe interfețele vmnet1, vmnet8, docker0, eno1, etc. IP-urile ​sunt respectiv: ''​192.168.207.1172.16.238.1172.17.0.1, ​ 172.16.4.53''​etc
  
-Pe baza controalelor grafice ''​MapView''​ sau ''​MapFragment'', ​se poate obține o instanță a unui obiect [[https://​developer.android.com/​reference/​com/​google/​android/​gms/​maps/​GoogleMap.html|GoogleMap]],​ prin intermediul metodei ''​getMapAsync()''​. Metoda de callback ''​onMapReady()''​ a clasei ascultător ''​OnMapReadyCallback''​ nu va fi apelată în situația în care serviciul Google Play Services nu este disponibil pe dispozitivul mobil sau obiectul este distrus imediat după ce a fost creat.+**7b.** Să se captureze în emulator publicarea serviciuluiCe adresă IPv4 este folosită în advertisement?​ Răspuns: ​
  
-<​code ​java+<​code ​shell
-if (googleMap == null{ +root@eg106:​~#​ adb shell  
-  ((MapFragment)getFragmentManager().findFragmentById(R.id.google_map)).getMapAsync(new OnMapReadyCallback() { +root@vbox86p:/​ # tcpdump -ni eth0 'udp port 5353'  
-    ​@Override +# atenție eth1 în configurația default este NAT-ul către internet, acolo nu este nimeni ​(din DNS-SD)! 
-    ​public void onMapReady(GoogleMap readyGoogleMap{ +...  
-      ​googleMap = readyGoogleMap;​ +06:​39:​44.024608 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0*- [0q] 2/​0/​0[|domain] 
-    } +06:​39:​44.207351 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0 [2n][|domain] 
-  }); +06:​39:​44.207385 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0 [2n] ANY (QM)? My desktop._myservice._tcp.local. ​(91) 
-}+06:​39:​44.458079 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0 [2n][|domain] 
 +06:​39:​44.458108 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0 [2n] ANY (QM)? My desktop._myservice._tcp.local. (91) 
 +06:39:44.708406 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0 [2n][|domain] 
 +06:​39:​44.708439 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0 [2n] ANY (QM)? My desktop._myservice._tcp.local. (91
 +06:​39:​44.909356 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0*- [0q] 6/​0/​0[|domain] 
 +06:​39:​44.909381 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0*- [0q] 5/​0/​0[|domain] 
 +06:​39:​45.156505 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0*- [0q] 2/​0/​0[|domain] 
 +06:​39:​45.156532 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0*- [0q] 1/0/0 (111
 +06:​39:​45.240427 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0 [2q] PTR (QM)? _ipp._tcp.local.[|domain] 
 +06:​39:​45.240458 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0 [2q] PTR (QM)? _ipp._tcp.local. PTR (QM)? _ipps._tcp.local. (45
 +06:​39:​46.041712 IP 192.168.60.1.5353 > 224.0.0.251.5353:​ 0*- [0q] 6/​0/​0[|domain] 
 +06:​39:​46.041740 IP6 fe80::​800:​27ff:​fe00:​4.5353 > ff02::​fb.5353:​ 0*- [0q] 5/​0/​0[|domain]
 </​code>​ </​code>​
 +
 +Se foloseste adresa ''​192.168.60.1'' ​
 +
eim/colocvii/colocviu02.1494827446.txt.gz · Last modified: 2017/05/15 08:50 by andrei.rosucojocaru
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