вторник, 13 июня 2017 г.

Работа с приборами Индивид-РМД компании "Саяны". Индивид Ридером (ЧАСТЬ 1 - Формирование Базы Данных)

Программное обеспечение ИндивидРеадер под ОС ANDROID компании  ИП Ратников С.И.  (В целях приобретения обращаться по e-mail или телефону ) предназначена для  оборудования завода САЯНЫ (для получение пробной версии обратитесь на завод), А именно для снятия
показаний тепловычислителей ИНДИВИД-РМД как напрямую через АРС так и через УСПД
Ретрансляторы.


Уважаемые коллеги, сегодня рассмотрим создание базы данных для снятия показаний с индивидуальных счетчиков тепла завода "Саяны" на базе программного обеспечения под операционную систему Android Индивид Ридер.
Для снятия показаний используется следующее оборудование: адаптер радиоинтерфейса сервера (АРС). 






На данный момент завод производит более компактные устройства в виде флеш-накопителя. Для начала работы с данным оборудованием первое что нужно - необходимо включить функцию USB-отладки в устройстве. Это делается в следующем пункте меню (см. картинку). В отдельных случаях для включения этой функции необходимо перейти в "режим разработчика". Так же хочу заметить, что работа с устройством АРС поддерживается ни всеми устройствами телефонов на базе ОС Android ранних версий. Поэтому перед приобретением программного обеспечения под телефон советую Вам проверить ваше устройство на совместимость с АРС по средством корректора Меркурий 23X, который находится в свободном доступе в GOOGLE Play. 


Приступаем к формированию базы данных объектов. 
При запуске программы мы видим меню выбора заказчиков, где мы можем сформировать нового заказчика или нажатием на конкретного заказчика перейти к выбору его объектов.
Рассмотрим создание нового заказчика.





Для этого необходимо нажать на кнопку "+". Переход к объектам уже существующих заказчиков происходит по средством клика на меню , где присутствует отображение заказчика.
При нажатии на "+" будет показан следующий экран:

Вы можете (при наличии доступа к интернету) ввести ИНН Заказчика и нажать клавишу - 1- 
при этом с сайта компании Ru.rus.company будут скачены данные о наименовании и нахождении организации. 
2- это поле должно быть обязательно заполнено для создания объектов заказчика, остальные поля необязательны к заполнению.
3- подтверждение действий.
4- отмена.

Ниже приведен пример заполнения:

При длительном нажатии на пункт меню конкретного заказчика появится следующий выбор:



Будьте внимательны, при удалении заказчика - удаляются все данные по этому заказчику.

При нажатии на Заказчика мы переходим непосредственно к объектам заказчика.



В данном случае мы можем добавить объект , нажав клавишу "+" (1)  либо удерживанием на объекте заказчика (2) можем  редактировать или удалить объект заказчика.


При нажатии на клавишу 1 появится следующее меню:


Где 1- поле, обязательное для ввода, без него объект не будет создан, о чем программа выдаст предупреждение. При нажатии на клавишу -2- в случае нахождения на объекте, программа определит текущие координаты и выдаст адрес местонахождения. 3- подтверждаем создание объекта, 4- отменяем.

После короткого "клика" на объект мы попадаем на следующий экран:



Первый "таб" с названием "База" - редактирование и создание базы непосредственно объекта , второй "таб" с названием "Чтение" - сьём показаний счетчиков Индивид РМД-1,2,
третий "таб" с названием "История" - история сьёма показаний счетчиков. Пункт 2,3 будет рассмотрен в следующей статье.

При "клике" на соответствующий пункт меню будут отображены помещения, находящиеся на данном этаже:


(Рисунок 1)

При применении клавиши "+" можем добавить дополнительно этаж (см. п.1 Редактировать), либо при длительном нажатии на конкретном этаже высветится следующее меню:


При выборе пунктов меню будет происходить следующие:
1) Редактировать - будет показан диалог:

В данном можно задать номер этажа и подьезд дома, а также дополнительные параметры связи прибора на этаже. При нажатии на клавишу "УСПД МОСТИК" будет происходить переключение типа соединения. В случае выбора "УСПД МОСТИК" может задать его номер или осуществить автоматический поиск.

Автоматизированный поиск при нажатии на клавишу в виде бинокля при этом найденные приборы отображаются в виде списка.

При установке в верхней части номера прибора и нажатия клавиши+ прибор с данным номером будет добавлен в список.

Для окончательного подтверждения выбора прибора  щелкните на нем, чтобы отобразился его номер в верхней части и нажмите "ОК".

2) При нажатии на пункт копировать этаж будет в точности скопирован со всеми помещениями и входящими приборами.

3) При нажатии на пункт копировать+ этаж будет скопирован следующим образом.
    а) Номер этажа будет увеличен на единицу.
    б) Номера квартир начнутся со следующей после после последней квартиры на копируемом         этаже.

4) При выборе удалить этаж будет удален со всеми помещениями и приборами.


При нажатии на "Добавить помещение" (рисунок 1.)  или длительном удержание помещения выбрав в меню редактировать Вы перейдете в диалог добавления/редактирования помещений.


 Вы можете задать номер, площадь приборы, квартиры , при нажатии клавиши "+" перейдём в следующее меню - Диалог - там будет происходить как ручное так и автоматическое задание приборов связи:

В вкладке приборы будут показаны все приборы относящиеся к этому помещению.
Задав номер прибора вверху и нажав клавишу +. Прибор будет добавлен к этому помещению.
Удаление приборов производить движением по нему пальцем вправо или влево. При щелчке на приборе вы можете задать коэффициенты для пересчета.



Рассмотрим автоматический поиск приборов:


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

В следующей части мы рассмотрим съем показаний, отправку, формирование отчетов по объекту , задание времени работы "Индивид" ,а также работа с историей снятия измерений и экспорт баз в Индивид Реадер Ligth.




пятница, 2 июня 2017 г.

Пример получения данных с ANDROID устройств о компаниях с сайта ru.rus.company.






В данной статье я расскажу как можно получить данные о компаниях через открытое API
сайта ru.rus.company зная ИНН компании.

Для начала добавим разрешения на использование интернет в AndrodManifest.xml.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ratnikoff.innreader">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Создадим layout для ввода ИНН:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/InnEditText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="5" />

        <Button
            android:id="@+id/InnSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Поиск" />
    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </ScrollView>
</LinearLayout>

Вот что у нас получилось.


И наконец сам код.

package com.ratnikoff.innreader;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button buttonSearch = (Button) findViewById(R.id.InnSearch);
        buttonSearch.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.InnSearch:
                ReadHttpInn readHttpInn = new ReadHttpInn();
                readHttpInn.execute();
                break;
        }
    }

    public class ReadHttpInn extends AsyncTask<Void, Void, Void> {
        private String urlINN = "https://ru.rus.company/%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1
%86%D0%B8%D1%8F/%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8/?%D0%B8%D0%BD%D0%BD=";
        private String urlID = "https://ru.rus.company/%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F/%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8/";
        String Inn;
        String inputLine;
        URL url;
        private JSONObject jObj;
        private JSONObject jObjFull;
        private JSONObject jObjAdress;

        @Override
        protected void onPreExecute() {
            EditText editText = (EditText) findViewById(R.id.InnEditText);
            Inn = String.valueOf(editText.getText());
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            StringBuilder stringBuilder = new StringBuilder();

            try {
                // Вычитывание данных по инн
                url = new URL(urlINN + Inn);
                BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                while ((inputLine = in.readLine()) != null) {
                    stringBuilder.append(inputLine);
                }
                in.close();
                String jsonString = stringBuilder.toString();
                jsonString = jsonString.substring(2, jsonString.length() - 2) + "";

                // Вычитывание данных по id
                jObj = new JSONObject(jsonString);
                stringBuilder = new StringBuilder();
                url = new URL(urlID + jObj.getString("id") + "/");
                in = new BufferedReader(new InputStreamReader(url.openStream()));
                while ((inputLine = in.readLine()) != null) {
                    stringBuilder.append(inputLine);
                }
                in.close();
                jsonString = stringBuilder.toString();
                jObjFull = new JSONObject(jsonString);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            TextView textView = (TextView) findViewById(R.id.text);
            String temp = null;
            try {
                temp = jObj.getString("shortName");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            textView.append("Наименование организации:" + temp + "\n");

            try {
                temp = jObjFull.getJSONObject("address").getString("fullHouseAddress");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            textView.append("Адрес организации:" + temp + "\n");
            super.onPostExecute(aVoid);
        }
    }
}

В резульате мы получаем следующие данные.


C Уважение Ратников С.И.