Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Отправка данных на народный мониторинг

Тема в разделе "Раздел для начинающих", создана пользователем DDD81, 4 мар 2019.

  1. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    Добрый день, возникла проблема с отправкой данных на народный мониторинг при назначении
    постоянного ip, в таком виде все работает, но адрес динамический 50 строчка закоментирована.
    Устанавливаю постоянный ip, перестают отправляться данные на народный мониторинг.
    Подскажите решение проблемы.
    Код (Text):
    1. // подключаем библиотеку «ESP8266WiFi»:
    2. #include <ESP8266WiFi.h>
    3. #include <OneWire.h>
    4. #include <DallasTemperature.h>
    5. #include <WiFiClient.h>
    6. #include <ESP8266WebServer.h>
    7. #include <ESP8266WiFiMulti.h>
    8. #include <ESP8266mDNS.h>
    9. #include <Ticker.h>
    10. #include <WiFiUdp.h>
    11. #include <ESP8266HTTPClient.h>
    12. // вписываем здесь SSID и пароль для вашей WiFi-сети:
    13. const char* ssid = "**";
    14. const char* password = "**";
    15. IPAddress ip(192,168,0,61);  //статический IP
    16. IPAddress gateway(192,168,0,1);
    17. IPAddress subnet(255,255,255,0);
    18. // контакт для передачи данных подключен к D1 на ESP8266 12-E (GPI07):
    19. #define ONE_WIRE_BUS D7
    20. Ticker sender;
    21. bool sendtonm;
    22. // создаем экземпляр класса oneWire; с его помощью
    23. // можно коммуницировать с любыми девайсами, работающими
    24. // через интерфейс 1-Wire, а не только с температурными датчиками
    25. // от компании Maxim/Dallas:
    26. OneWire oneWire(ONE_WIRE_BUS);
    27. // передаем объект oneWire объекту DS18B20:
    28. DallasTemperature DS18B20(&oneWire);
    29. char temperatureCString[6];
    30. char temperatureFString[6];
    31.  
    32. const char* host = "narodmon.ru";
    33. const int httpPort = 8283;
    34.  
    35.  
    36. // веб-сервер на порте 80:
    37. WiFiServer server(80);
    38. ESP8266WiFiMulti WiFiMulti;
    39. // блок setup() запускается только один раз – при загрузке:
    40. void setup() {
    41.   // инициализируем последовательный порт (для отладочных целей):
    42.   Serial.begin(115200);
    43.   delay(10);
    44.    // подключаемся к WiFi-сети:
    45.   Serial.println();
    46.   Serial.print("Connecting to "); // "Подключаемся к "
    47.   Serial.println(ssid);
    48.   WiFi.mode(WIFI_STA);
    49.   WiFi.begin(ssid, password);  
    50. // WiFi.config(ip,gateway,subnet);
    51.   while (WiFi.status() != WL_CONNECTED) {
    52.     delay(500);
    53.     Serial.print(".");
    54.   }
    55.   Serial.println("");
    56.   Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
    57.   // запускаем веб-сервер:
    58.   server.begin();
    59.   Serial.println("Web server running. Waiting for the ESP IP...");
    60.               // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
    61.        
    62.   delay(10000);
    63.   // печатаем IP-адрес ESP:
    64.   Serial.println(WiFi.localIP());
    65.  
    66. // Здесь настройки ВАШЕГО WIFI
    67.    while (WiFi.status() != WL_CONNECTED) {
    68.     delay(500);
    69.      Serial.print(".");}
    70.      Serial.println(WiFi.localIP());
    71.       // выводим мощность принимаемого сигнала:
    72.   long rssi = WiFi.RSSI();
    73.   Serial.print("RSSI:");
    74.   Serial.println(rssi);
    75.  
    76.     sender.attach(305, STM); // Создаем событие отправки данных каждые 305 сек (5 мин + 5 сек, чтобы народный мониторинг не ругался если мы на секунду раньше отправили)
    77.     DS18B20.begin(); //Запуск DS18B20
    78. }
    79. void STM() {sendtonm = true;} // Отправка данных разрешена
    80. void getTemperature() {
    81.   float tempC;
    82.   float tempF;
    83.   do {
    84.     DS18B20.requestTemperatures();
    85.     tempC = DS18B20.getTempCByIndex(0);
    86.     dtostrf(tempC, 2, 2, temperatureCString);
    87.     tempF = DS18B20.getTempFByIndex(0);
    88.     dtostrf(tempF, 3, 2, temperatureFString);
    89.     delay(100);
    90.   } while (tempC == 85.0 || tempC == (-127.0));
    91. }
    92. // блок loop() будет запускаться снова и снова:
    93. void loop() {
    94.  
    95.     // начинаем прослушку входящих клиентов:
    96.   WiFiClient client = server.available();
    97.   long rssi = WiFi.RSSI();
    98.   if (client) {
    99.     Serial.println("New client");  //  "Новый клиент"
    100.    
    101.     // создаем переменную типа «boolean»,
    102.     // чтобы определить конец HTTP-запроса:
    103.     boolean blank_line = true;
    104.     while (client.connected()) {
    105.       if (client.available()) {
    106.         char c = client.read();
    107.      
    108.         if (c == '\n' && blank_line) {
    109.             getTemperature();
    110.             client.println("HTTP/1.1 200 OK");
    111.             client.println("Content-Type: text/html; charset=utf-8\r\n");
    112.   client.println(""); //  do not forget this one
    113.   client.println("<!DOCTYPE HTML>");
    114.   client.println("<html>");
    115.    client.println("<h1 style='color:#0ea6f2'>Метеостанция</h1");
    116.             // веб-страница с данными о температуре:
    117.             client.println("<!DOCTYPE HTML>");
    118.             client.println("<html>");
    119.             client.println("<head></head><body><h1>Wemos D1</h1><h3>Температура: ");
    120.             client.println(temperatureCString);
    121.             client.println(" *C");
    122.             client.println("</h1>Уровень Wi-FI сигнала: ");
    123.             client.println (rssi);
    124.             client.println(" dB");
    125.             break;
    126.         }
    127.         if (c == '\n'){                                 // Если "с" равен символу новой строки                                            
    128.          blank_line = true;                             // Тогда начинаем новую строку
    129.         }                                        
    130.          else if (c != '\r'){                           // Если "с" не равен символу возврата курсора на начало строки                                      
    131.           blank_line = false;                           // Тогда получаем символ на текущей строке
    132.         // закрываем соединение:
    133.           }}}}
    134.  
    135.  
    136.        
    137.       if (sendtonm) { // Если прошло 5 минут, и можно отправлять - работаем.
    138.       sendtonm = false; // отключаем флаг отправки данных
    139.       DS18B20.requestTemperatures(); // Команда на замер температуры.
    140.       delay(1000); // Задержка для того чтобы датчик успел провести замер.
    141.        
    142.       DeviceAddress tempDeviceAddress; // Переменная для получения адреса датчика
    143.       String buf; // Буфер для отправки на NarodMon
    144.       buf="#" + WiFi.macAddress() + "#ESP" + "\r\n"; //формируем заголовок
    145.       DS18B20.getAddress(tempDeviceAddress, 0); // Получаем уникальный адрес датчика
    146.       buf = buf + "#";
    147.       for (uint8_t i = 0; i < 8; i++) {if (tempDeviceAddress[i] < 16) buf = buf + "0"; buf = buf + String(tempDeviceAddress[i], HEX);} // адрес датчика в буфер
    148.       buf = buf + "#" + String(DS18B20.getTempCByIndex(0))+ "\r\n"; //и температура
    149.       buf = buf + "##\r\n"; // закрываем пакет
    150.       Serial.println("Sending...");
    151.       Serial.println("buf");
    152.         if (!client.connect("narodmon.ru", 8283)) {
    153.         Serial.println("Connection to host failed");
    154.         delay(1000);
    155.         return;}
    156.        
    157.         client.connect("narodmon.ru", 8283); //Подключаемся
    158.         Serial.println("Connect narodmon...");
    159.         client.print(buf); // И отправляем данные
    160.       }
    161.      
    162.      }
    163.    
     
  2. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    Строчки 50 и 49 поменять местами.
    Вы, что нормально описать не можете.
    Если делаю так то работает, если сделал так то это стало так, это так, а это так.
     
  3. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    Код (Text):
    1. // подключаем библиотеку «ESP8266WiFi»:
    2. #include <ESP8266WiFi.h>
    3. #include <OneWire.h>
    4. #include <DallasTemperature.h>
    5. #include <WiFiClient.h>
    6. #include <ESP8266WebServer.h>
    7. #include <ESP8266WiFiMulti.h>
    8. #include <ESP8266mDNS.h>
    9. #include <Ticker.h>
    10. #include <WiFiUdp.h>
    11. #include <ESP8266HTTPClient.h>
    12. // вписываем здесь SSID и пароль для вашей WiFi-сети:
    13. const char* ssid = "**";
    14. const char* password = "**";
    15. IPAddress ip(192,168,0,61);  //статический IP
    16. IPAddress gateway(192,168,0,1);
    17. IPAddress subnet(255,255,255,0);
    18. // контакт для передачи данных подключен к D1 на ESP8266 12-E (GPI07):
    19. #define ONE_WIRE_BUS D7
    20. Ticker sender;
    21. bool sendtonm;
    22. // создаем экземпляр класса oneWire; с его помощью
    23. // можно коммуницировать с любыми девайсами, работающими
    24. // через интерфейс 1-Wire, а не только с температурными датчиками
    25. // от компании Maxim/Dallas:
    26. OneWire oneWire(ONE_WIRE_BUS);
    27. // передаем объект oneWire объекту DS18B20:
    28. DallasTemperature DS18B20(&oneWire);
    29. char temperatureCString[6];
    30. char temperatureFString[6];
    31.  
    32. const char* host = "narodmon.ru";
    33. const int httpPort = 8283;
    34.  
    35.  
    36. // веб-сервер на порте 80:
    37. WiFiServer server(80);
    38. ESP8266WiFiMulti WiFiMulti;
    39. // блок setup() запускается только один раз – при загрузке:
    40. void setup() {
    41.   // инициализируем последовательный порт (для отладочных целей):
    42.   Serial.begin(115200);
    43.   delay(10);
    44.    // подключаемся к WiFi-сети:
    45.   Serial.println();
    46.   Serial.print("Connecting to "); // "Подключаемся к "
    47.   Serial.println(ssid);
    48.   WiFi.mode(WIFI_STA);
    49.   WiFi.config(ip,gateway,subnet);
    50.   WiFi.begin(ssid, password);  
    51.  
    52.   while (WiFi.status() != WL_CONNECTED) {
    53.     delay(500);
    54.     Serial.print(".");
    55.   }
    56.   Serial.println("");
    57.   Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
    58.   // запускаем веб-сервер:
    59.   server.begin();
    60.   Serial.println("Web server running. Waiting for the ESP IP...");
    61.               // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
    62.        
    63.   delay(10000);
    64.   // печатаем IP-адрес ESP:
    65.   Serial.println(WiFi.localIP());
    66.  
    67. // Здесь настройки ВАШЕГО WIFI
    68.    while (WiFi.status() != WL_CONNECTED) {
    69.     delay(500);
    70.      Serial.print(".");}
    71.      Serial.println(WiFi.localIP());
    72.       // выводим мощность принимаемого сигнала:
    73.   long rssi = WiFi.RSSI();
    74.   Serial.print("RSSI:");
    75.   Serial.println(rssi);
    76.  
    77.     sender.attach(305, STM); // Создаем событие отправки данных каждые 305 сек (5 мин + 5 сек, чтобы народный мониторинг не ругался если мы на секунду раньше отправили)
    78.     DS18B20.begin(); //Запуск DS18B20
    79. }
    80. void STM() {sendtonm = true;} // Отправка данных разрешена
    81. void getTemperature() {
    82.   float tempC;
    83.   float tempF;
    84.   do {
    85.     DS18B20.requestTemperatures();
    86.     tempC = DS18B20.getTempCByIndex(0);
    87.     dtostrf(tempC, 2, 2, temperatureCString);
    88.     tempF = DS18B20.getTempFByIndex(0);
    89.     dtostrf(tempF, 3, 2, temperatureFString);
    90.     delay(100);
    91.   } while (tempC == 85.0 || tempC == (-127.0));
    92. }
    93. // блок loop() будет запускаться снова и снова:
    94. void loop() {
    95.  
    96.     // начинаем прослушку входящих клиентов:
    97.   WiFiClient client = server.available();
    98.   long rssi = WiFi.RSSI();
    99.   if (client) {
    100.     Serial.println("New client");  //  "Новый клиент"
    101.    
    102.     // создаем переменную типа «boolean»,
    103.     // чтобы определить конец HTTP-запроса:
    104.     boolean blank_line = true;
    105.     while (client.connected()) {
    106.       if (client.available()) {
    107.         char c = client.read();
    108.      
    109.         if (c == '\n' && blank_line) {
    110.             getTemperature();
    111.             client.println("HTTP/1.1 200 OK");
    112.             client.println("Content-Type: text/html; charset=utf-8\r\n");
    113.   client.println(""); //  do not forget this one
    114.   client.println("<!DOCTYPE HTML>");
    115.   client.println("<html>");
    116.    client.println("<h1 style='color:#0ea6f2'>Метеостанция</h1");
    117.             // веб-страница с данными о температуре:
    118.             client.println("<!DOCTYPE HTML>");
    119.             client.println("<html>");
    120.             client.println("<head></head><body><h1>Wemos D1</h1><h3>Температура: ");
    121.             client.println(temperatureCString);
    122.             client.println(" *C");
    123.             client.println("</h1>Уровень Wi-FI сигнала: ");
    124.             client.println (rssi);
    125.             client.println(" dB");
    126.             break;
    127.         }
    128.         if (c == '\n'){                                 // Если "с" равен символу новой строки                                            
    129.          blank_line = true;                             // Тогда начинаем новую строку
    130.         }                                        
    131.          else if (c != '\r'){                           // Если "с" не равен символу возврата курсора на начало строки                                      
    132.           blank_line = false;                           // Тогда получаем символ на текущей строке
    133.         // закрываем соединение:
    134.           }}}}
    135.  
    136.  
    137.        
    138.       if (sendtonm) { // Если прошло 5 минут, и можно отправлять - работаем.
    139.       sendtonm = false; // отключаем флаг отправки данных
    140.       DS18B20.requestTemperatures(); // Команда на замер температуры.
    141.       delay(1000); // Задержка для того чтобы датчик успел провести замер.
    142.        
    143.       DeviceAddress tempDeviceAddress; // Переменная для получения адреса датчика
    144.       String buf; // Буфер для отправки на NarodMon
    145.       buf="#" + WiFi.macAddress() + "#ESP" + "\r\n"; //формируем заголовок
    146.       DS18B20.getAddress(tempDeviceAddress, 0); // Получаем уникальный адрес датчика
    147.       buf = buf + "#";
    148.       for (uint8_t i = 0; i < 8; i++) {if (tempDeviceAddress[i] < 16) buf = buf + "0"; buf = buf + String(tempDeviceAddress[i], HEX);} // адрес датчика в буфер
    149.       buf = buf + "#" + String(DS18B20.getTempCByIndex(0))+ "\r\n"; //и температура
    150.       buf = buf + "##\r\n"; // закрываем пакет
    151.       Serial.println("Sending...");
    152.       Serial.println("buf");
    153.         if (!client.connect("narodmon.ru", 8283)) {
    154.         Serial.println("Connection to host failed");
    155.         delay(1000);
    156.         return;}
    157.        
    158.         client.connect("narodmon.ru", 8283); //Подключаемся
    159.         Serial.println("Connect narodmon...");
    160.         client.print(buf); // И отправляем данные
    161.       }
    162.      
    163.      }
    164.    
    Спасибо за ответ. Это пробовал раньше.
    В этом и есть суть проблемы. На сервер по ip 192.168.0.61 захожу, но данные не отправляются
    на народный мониторинг.
     
  4. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    Если убираю строку(49)
    WiFi.config(ip,gateway,subnet);
    все прекрасно работает, но адрес устройства в сети динамический
    добавляю
    WiFi.config(ip,gateway,subnet);
    адрес становится статическим, на сервер в сети захожу, а данные на народный мониторинг не отправляются
    не понимаю в каком направлении искать ошибку


    данные из порта

    11:59:19.103 -> WiFi connected
    11:59:19.103 -> Web server running. Waiting for the ESP IP...
    11:59:29.105 -> 192.168.0.61
    11:59:29.105 -> 192.168.0.61
    11:59:29.105 -> RSSI:-50
    11:59:29.172 -> New client
    12:04:35.332 -> Sending...
    12:04:35.332 -> buf
    12:04:35.332 -> Connection to host failed
    12:09:40.323 -> Sending...
    12:09:40.323 -> buf
    12:09:40.323 -> Connection to host failed
     
  5. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    Какаю версию плат есп используете? если 2.5.0, то попробуйте 2.4.2
     
  6. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    плата ESP-12E Wemos D1
    Не очень понял насчет версии esp. Где это посмотреть?
    Думал проблема в скетче, так как сам собирал его из разных вариантов.
     
  7. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    Посмотрите в AduinoIDE в Board Manager, там же ее и поменяйте.
    esp.png
    Выберите 2.4.2 и нажмите инстал.
     
    Последнее редактирование: 4 мар 2019
  8. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    Сделал как рекомендовали, пришлось почистить часть библиотек установленных вручную.
    Пока все аналогично
    с постоянным ip
    15:24:39.328 -> Connecting to DP
    15:24:39.804 -> .
    15:24:39.804 -> WiFi connected
    15:24:39.804 -> Web server running. Waiting for the ESP IP...
    15:24:49.826 -> 192.168.0.61
    15:24:49.826 -> 192.168.0.61
    15:24:49.826 -> RSSI:-52
    15:24:49.826 -> New client
    15:25:02.933 -> New client
    15:25:16.160 -> New client
    15:25:21.729 -> New client
    15:25:23.592 -> New client
    15:25:25.631 -> New client
    15:25:26.922 -> New client
    15:25:27.908 -> New client
    15:25:29.469 -> New client
    15:25:31.203 -> New client
    15:29:55.959 -> Sending...
    15:29:55.959 -> buf
    15:29:55.959 -> Connection to host failed
    15:30:37.699 -> New client
    15:30:47.337 -> New client
    15:31:42.358 -> New client
    15:31:44.597 -> New client
    15:31:54.823 -> New client
    15:32:01.581 -> New client
    15:35:00.983 -> Sending...
    15:35:00.983 -> buf
    15:35:00.983 -> Connection to host failed

    Если убираю строку
    //WiFi.config(ip,gateway,subnet);
    15:40:42.135 -> Connecting to DP
    15:40:42.644 -> ..
    15:40:43.153 -> WiFi connected
    15:40:43.153 -> Web server running. Waiting for the ESP IP...
    15:40:53.133 -> 192.168.0.3
    15:40:53.133 -> 192.168.0.3
    15:40:53.133 -> RSSI:-49
    15:40:56.733 -> New client
    15:45:59.391 -> Sending...
    15:45:59.391 -> buf
    15:45:59.424 -> Connect narodmon...

    все работает, но адрес ip динамический


    12.gif
     
  9. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    @DDD81 что мешает зафиксировать ip на роутере?
     
  10. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
  11. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    Вызывает похоже, что правильно Station Class — ESP8266 Arduino Core 2.5.0-42-g82da5c7 documentation
    вопрос в том, готов ли роутер выдать этот адрес.
    Покажите скриншоты настройки роутера.

    Я свой проект пере собрал с 2.4.2 на 2.5.0 и получилось похоже как у ТС.
    Если включить полную отладку - работает.
    Тут есть вопрос по 2.5.0 WiFi.config(fixedIP, fixedGateway, fixedNetmask) disconnects ESP on 2.5.0 (regression from 2.4.2) · Issue #5839 · esp8266/Arduino
     
  12. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.135
    Симпатии:
    226
    @CodeNameHawk как правильно? три параметра - это WiFi.config(ip, dns, gateway);
    А ТС подставляет WiFi.config(ip, gateway, subnet);
    Я не помню, когда это поменялось. Надо смотреть исходники, как вызывать.
     
  13. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    Сергей_Ф, по ссылке выше
    WiFi.config(staticIP, gateway, subnet);
    Есть расширенная версия WiFi.config(ip, ip_gate, ip_subnet, ip_dns1, ip_dns2); и у меня так работает.
    Ваш вариант для Arduino, а вот для какой платы не знаю.
     
  14. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    DDD81, попробуйте добавить dns
    Код (Text):
    1. IPAddress ip_dns1(8, 8, 8, 8);
    2. IPAddress ip_dns2(8, 8, 4, 4);
     
  15. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    Если и это не поможет, посмотрите что роутер назначает, это когда автоматом
    Код (Text):
    1. Serial.print("Subnet mask: ");
    2. Serial.println(WiFi.subnetMask());
    3. Serial.printf("Gataway IP: %s\n", WiFi.gatewayIP().toString().c_str());
    это из Station Class — ESP8266 Arduino Core 2.5.0-42-g82da5c7 documentation
     
  16. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    Спасибо ОГРОМНОЕ всем за решение и помощь.
    Проблема решена. Все дело было именно в DNS.
    Роутер автоматом их выдавал, я же их не указывал, поэтому и не отправлялись данные.
    Можно было сразу догадаться. :oops:
    Еще раз спасибо.
     
  17. CodeNameHawk

    CodeNameHawk Moderator Команда форума

    Сообщения:
    1.502
    Симпатии:
    174
    С версией 2.5.0 работает?
     
  18. DDD81

    DDD81 Новичок

    Сообщения:
    11
    Симпатии:
    1
    Да
     
    Bekar нравится это.
  19. Bekar

    Bekar Новичок

    Сообщения:
    4
    Симпатии:
    0
    Я скомпилировал твою программу залил в NodeMcu V3 и у меня в монитор приходят следующие данные

    Connecting to Telnet_home
    ....
    WiFi connected
    Web server running. Waiting for the ESP IP...
    192.168.1.15
    192.168.1.15
    RSSI:-51
    Sending...
    buf
    Connect narodmon...
    Sending...
    buf
    Connect narodmon...

    проблема в том что на народный мониторинг приходят нули вместо температуры от DS1820
     
  20. Bekar

    Bekar Новичок

    Сообщения:
    4
    Симпатии:
    0
    Программа отлично работает проблем нет. Подскажите пожалуйста как сделать опрос двух датчиков DS18B20, серийные номера известны. Функция ds18b20.getTempCBylndex(0) не подходит нужно использовать ds18b20.getTempC(sensor1) и ds18b20.getTempC(sensor2). Но как это все грамотно в имеющуюся программу вживить я не знаю.
    Буду рад любой помощи. За ранее спасибо!
     

Поделиться этой страницей