Подписаться на получение новых статей на почту:

Связь Android с web. Парсинг. Шаг №94

Всем привет. «Сегодня» мы с Вами расширим возможности Android – приложения smarthouse по передачи/приему данных, а именно считывание данных (температура, влажность ) непосредственно с web-ресурса, которые в свою очередь мы передаем на сайт используя модуль wi-fi.

Давайте рассмотрим методы общения с сайтом. Можем использовать два варианта. Первый, это установить связь между веб-сервером (сайт) и клиентом (браузер, android), используя протокол websocket. При этом у нас установиться соединение и будет производится обмен. Нам пока такой ресурсоемкий (в плане трафика и заряда батареи) способ не требуется.

Второй вариант – это использовать запросы с помощью class HttpURLConnection. С более детальным сравнением двух методов можно ознакомиться по ссылке: https://blogs.windows.com/buildingapps/2016/03/14/when-to-use-a-http-call-instead-of-a-websocket-or-http-2-0/.
Продолжим. Используем выше описанный класс по шаблону (см. источник https://developer.android.com):
1. Установим соединение.
HttpURLConnection c=(HttpURLConnection) url.openConnection ();
2. Подготовка запроса GET.
c.setRequestMethod («GET»);
3. Передача запроса.
c.connect ();
4. Читаем ответ в потоке.
reader=new BufferedReader (new InputStreamReader (c.getInputStream ()));
5. Как только ответ прочитан. Закрываем HttpURLConnection:
c.disconnect ();
Ниже весь код и результат на рисунке. Если в предыдущих записях мы осуществляли передачу данных используя сеть wi-fi. То в данном случае не имеет значения по какой сети мы передаем данные, то ли это будет WI-FI, то ли сотовая связь. Данное соединение создавать в вновь созданном потоке AsyncTask.

package com.example.smarthouse;
import android.Manifest;
...............
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  ...............
  //Создаем вспомогательные переменные для парсинга, запроса и чтения
  String[] split_str;
  String resultStr;
  String t, t1, h;
  ...............
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...............
    //Создаем кнопку для запроса
    Button request = findViewById(R.id.request);
    request.setOnClickListener(this); //Обработка запроса на веб-ресурс
    ...............
  }
  // И сама обработка события по нажатию
  public void onClick( View v) {
    switch (v.getId()) {
      ...............
      case R.id.request:
        textResponse.setText("Загрузка...");
        new WebRequest().execute("http://ap-impulse.ru/interface.php");
      ...............
    }
  }
  //Создаем поток, где производим запрос, читаем ответ и парсим страницу.
  private class WebRequest extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... path) {
    String content;
    try{
      content = getContent(path[0]);
    }
    catch (IOException ex){
      content = ex.getMessage();
    }
    return content;
  }
  protected void onPostExecute(String content) {
    textResponse.setText(content);
  }
  private String getContent(String path) throws IOException {
    BufferedReader reader=null;
    try {
      URL url=new URL(path);
      HttpURLConnection con=(HttpURLConnection)url.openConnection();
      con.setRequestMethod("GET");
      con.setReadTimeout(10000);
      con.connect();
      reader= new BufferedReader(new InputStreamReader(con.getInputStream()));
      StringBuilder buf=new StringBuilder();
      String line=null;
      while ((line=reader.readLine()) != null) {
        buf.append(line + "\n");
      }
      con.disconnect();
      return(buf.toString());
    }
    finally {
      if (reader != null) {
        reader.close();
      }
    }
  }
}

request_android

По правильному, что в дальнейшем обязательно мы сделаем, так это подготовим сайт чтоб он отдавал json или xml – ответ. Но на данном этапе достаточно и этого. На рисунке слева видим, что ответом приходит весь код страницы. Задачка – как нам вынуть данные, которые мы посылаем на сервак. Я не буду повторять предыдущие посты, просто напомню один момент, мы с Вами передавали параметры из php in javascript через DOM. Именно эта часть на рисунке обведена красным, вот отсюда мы и будем забирать данные. Теперь следующая задачка, как из этого мусора вытащить данные. И здесь нам на помощь приходит парсинг (синтаксический анализ информации). Нам необходимо парсить буфер, в который мы прочитали ответ ( buf.append (line + «\n»); ). Каждый решает задачу по своему, с помощью различных сторонних библиотек, пакета в java для регулярных выражений ( Matcher, Pattern, PatternSyntaxException ) либо используя простые методы для работы со строками. Я использовал: метод split для разделения строки вокруг регулярного выражения. В качестве выражения использовал «data-»; метод substring (), который возвращает строку, заданную с символа, заданного индексом, и до endIndex-1; в качестве индексов использовал метод indexOf (int ch), который возвращает индекс в данной строке первого вхождения указанного символа.
Ниже кусок дополненного кода по парсингу.

try{
  content = getContent(path[0]);
  split_str = content.split("data-");
  resultStr = split_str[2].substring(split_str[2].indexOf('\'') + 1, split_str[2].lastIndexOf('\''));
  resultStr += " " + split_str[3].substring(split_str[3].indexOf('\'') + 1, split_str[3].lastIndexOf('\''));
  resultStr +=" " + split_str[4].substring(3, 5);
  t = split_str[2].substring(split_str[2].indexOf('\'') + 1, split_str[2].lastIndexOf('\''));
  t1= split_str[3].substring(split_str[3].indexOf('\'') + 1, split_str[3].lastIndexOf('\''));
  h = split_str[4].substring(3, 5); }
catch (IOException ex){
  content = ex.getMessage();
}
return content;
}
protected void onPostExecute(String content) {
  textResponse.setText(resultStr);
  ResponseT.setText(t);
  ResponseT1.setText(t1);
  ResponseH.setText(h);
}

На рисунке ниже выводим данные с web на графику SVG. Привязав каждый параметр к конкретному месту + общую отсортированную строку в текстовый элемент.

get_web_android

get_request

 

 

 

На этом мы и остановимся. В следующей записи мы сделаем обзор проделанной работы, наметим дальнейшие цели, поговорим о чем мы пишем, чтоб далеко не уходить от реальности. Приведу области применения. И конечно же возможность применения в нашей жизни. Всем пока.

Просмотрено 166 раз.

Я на Google+

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting