• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Не работает Thingspeak при подключении через 3G

Pilnikov

Active member
Прошу помощи уважаемые. подскажите как пнуть Опсоса "МТС" чтобы заработал thingspeak. Проект на 100% рабочий при подключении к интернету по оптике. При попытке запустиь все через мобильный wifi роутер от МТС работает только NTP клиент. При этом на компе с Win 10 в Chrom мои каналы отображаются и можно вносить изменения (с компа). Ни передатчик, ни приемник (оба на есп07) не конектятся именно к thingspeak, при этом к сети они оба подключены и пингуются.
 

Vitlay_E

New member
Присоединюсь к вопросу. Все прекрасно работает через наземный интеренет и не работает через мобильный. Проболвал МТС и Билайн.
Подскажите куда копать.
 

Izzm

New member
Пробовали смотреть, приходит ли какой то код ошибки от сервера? При запросах с esp.
 

Vitlay_E

New member
Здравствуйте, спасибо , что откликнулись.

В С++ я ноль. С ардуиной начал общение 2 мес, с ESPпару недель. В ESPскетчи заливаю через ардуиновский IDE. Взял скетч из примеров “WriteMultipleVoltages” для ThingSpeak, он не подразумевает ответы от сервера.
Код:
/*
  WriteMultipleVoltages
  Reads analog voltages from pins 0-7 and writes them to the 8 fields of a channel on ThingSpeak every 20 seconds.
  ThingSpeak ( https://www.thingspeak.com ) is a free IoT service for prototyping
  systems that collect, analyze, and react to their environments.
  Copyright 2015, The MathWorks, Inc.
  Documentation for the ThingSpeak Communication Library for Arduino is in the extras/documentation folder where the library was installed.
  See the accompaning licence file for licensing information.
*/

#ifdef SPARK
    #include "ThingSpeak/ThingSpeak.h"
#else
    #include "ThingSpeak.h"
#endif

/// ***********************************************************************************************************
// This example selects the correct library to use based on the board selected under the Tools menu in the IDE.
// Yun, Wired Ethernet shield, wi-fi shield, esp8266, and Spark are all supported.
// With Uno and Mega, the default is that you're using a wired ethernet shield (http://www.arduino.cc/en/Main/ArduinoEthernetShield)
// If you're using a wi-fi shield (http://www.arduino.cc/en/Main/ArduinoWiFiShield), uncomment the line below
// ***********************************************************************************************************
//#define USE_WIFI_SHIELD
#ifdef ARDUINO_ARCH_AVR

  #ifdef ARDUINO_AVR_YUN
    #include "YunClient.h"
    YunClient client;
  #else

    #ifdef USE_WIFI_SHIELD
      #include <SPI.h>
      // ESP8266 USERS -- YOU MUST COMMENT OUT THE LINE BELOW.  There's a bug in the Arduino IDE that causes it to not respect #ifdef when it comes to #includes
      // If you get "multiple definition of `WiFi'" -- comment out the line below.
      #include <WiFi.h>
      char ssid[] = "<YOURNETWORK>";          //  your network SSID (name)
      char pass[] = "<YOURPASSWORD>";   // your network password
      int status = WL_IDLE_STATUS;
      WiFiClient  client;
    #else
      // Use wired ethernet shield
      #include <SPI.h>
      #include <Ethernet.h>
      byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
      EthernetClient client;
    #endif
  #endif
  // On Arduino:  0 - 1023 maps to 0 - 5 volts
  #define VOLTAGE_MAX 5.0
  #define VOLTAGE_MAXCOUNTS 1023.0
#endif

#ifdef ARDUINO_ARCH_ESP8266
  #include <ESP8266WiFi.h>
  char ssid[] = "<YOURNETWORK>";          //  your network SSID (name)
  char pass[] = "<YOURPASSWORD>";   // your network password
  int status = WL_IDLE_STATUS;
  WiFiClient  client;
  // On ESP8266:  0 - 1023 maps to 0 - 1 volts
  #define VOLTAGE_MAX 1.0
  #define VOLTAGE_MAXCOUNTS 1023.0
#endif

#ifdef SPARK
    TCPClient client;
    #define VOLTAGE_MAX 3.3
    #define VOLTAGE_MAXCOUNTS 4095.0
#endif

/*
  *****************************************************************************************
  **** Visit https://www.thingspeak.com to sign up for a free account and create
  **** a channel.  The video tutorial http://community.thingspeak.com/tutorials/thingspeak-channels/
  **** has more information. You need to change this to your channel, and your write API key
  **** IF YOU SHARE YOUR CODE WITH OTHERS, MAKE SURE YOU REMOVE YOUR WRITE API KEY!!
  *****************************************************************************************/
unsigned long myChannelNumber = 31461;
const char * myWriteAPIKey = "LD79EOAAWRVYF04Y";

void setup() {
  #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_ESP8266)
    #ifdef ARDUINO_AVR_YUN
      Bridge.begin();
    #else
      #if defined(USE_WIFI_SHIELD) || defined(ARDUINO_ARCH_ESP8266)
        WiFi.begin(ssid, pass);
      #else
        Ethernet.begin(mac);
      #endif
    #endif
  #endif
  ThingSpeak.begin(client);
}

void loop() {
  // Read the input on each pin, convert the reading, and set each field to be sent to ThingSpeak.
  // On Arduino:  0 - 1023 maps to 0 - 5 volts
  // On ESP8266:  0 - 1023 maps to 0 - 1 volts
  // On Particle: 0 - 4095 maps to 0 - 3.3 volts
  float pinVoltage = analogRead(A0) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
  ThingSpeak.setField(1,333);
  #ifndef ARDUINO_ARCH_ESP8266
    // The ESP8266 only has one analog input, so skip this
    pinVoltage = analogRead(A1) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(2,pinVoltage);
    pinVoltage = analogRead(A2) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(3,pinVoltage);
    pinVoltage = analogRead(A3) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(4,pinVoltage);
    pinVoltage = analogRead(A4) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(5,pinVoltage);
    pinVoltage = analogRead(A5) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(6,pinVoltage);
    pinVoltage = analogRead(A6) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(7,pinVoltage);
    pinVoltage = analogRead(A7) * (VOLTAGE_MAX / VOLTAGE_MAXCOUNTS);
    ThingSpeak.setField(8,pinVoltage);
  #endif

  // Write the fields that you've set all at once.
  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

  delay(20000); // ThingSpeak will only accept updates every 15 seconds.
}

Данные передаются на сервер прекрасно если инет по земле.

Если инет через сотового оператора (модем к маршрутизатору, модем в пк, расшаренный с телефона) ничего не проходит. Операторов пробовал мтс и билайн. Хотя черз тот же инет запросом из браузера вида http://api.thingspeak.com/update?key=6392A70IUOVWMT&field1=9999 данные до сервера доходят и приходит ответ от сервера.

Еще ставил 6 разных прошивок на esp, результат то-же.

Если скажете, как увидеть ответ от сервера, то сделаю.

Заранее благодарен за ответ.

Виталий.
 
Последнее редактирование:

Pilnikov

Active member
Я поковырял библиотеку тингспика - там именно отсутствует ответ от сервера, т.е. запросы уходят, а ответа нет. Пробовал по разному обращаться к серверу - и по имени и по IP - результат один и тот же - превышение времени ожидания ответа от сервера. Обращался к МТС - там уверяют, что ни каких блокировок у них на тингспик нет. Короче проблема до сих пор не решена.
 
Последнее редактирование:

Izzm

New member
Если инет через сотового оператора (модем к маршрутизатору, модем в пк, расшаренный с телефона) ничего не проходит. Операторов пробовал мтс и билайн. Хотя черз тот же инет запросом из браузера вида http://api.thingspeak.com/update?key=6392A70IUOVWMT&field1=9999 данные до сервера доходят и приходит ответ от сервера.
Как вариант, попробовать выполнить тот же запрос с помощью этой библиотеки Arduino/libraries/ESP8266HTTPClient at master · esp8266/Arduino · GitHub
Библиотека базовая, отдельно ставить не требуется.
Она возвращает код ответа сервера. Так же в ней можно настроить TCP timeout.
void setTimeout(uint16_t timeout); по умолчанию стоит 5 секунд.
 

Victor

Administrator
Команда форума
Лучшее средство диагностики - telnet
для debian
Код:
sudo apt-get update
sudo apt-get install telnet
telnet api.thingspeak.com 443
для Windows тоже есть
если соединение устанавливается и вы можете что-то туда послать (по протоколу SSL трудновато будет вручную, но нам это и не нужно - главное увидеть что отправка возможна если есть [inline]connected[/inline])
Код:
Trying 52.200.157.52...
Connected to api.thingspeak.com.
Escape character is '^]'.
Если сервер не позволяет подключиться или сразу сбрасывает соединение, то проблема может оказаться в том, что сотовые операторы очень любят экономить IP адреса и пропускают весь трафик через несколько (а иногда и один) публичный адрес. А бесплатные сервисы часто ограничивают количество соединений (или количество подключений в секунду) с одного IP адреса - тут уже нужно связываться с thingspeak и объяснять им ситуацию.
 

Vitlay_E

New member
to Izzm - ОГРОМНОЕ человеческое спасибо, + в репу.

to Pilnikov - отказался от библиотеки ThingSpeak. тут ESP8266 on NodeMCU board + DS18B20 + ArduinoIDE + ThingSpeak есть пример
Код:
// ESP8266 DS18B20 ArduinoIDE Thingspeak IoT Example code
// http://vaasa.hacklab.fi
//
// https://github.com/milesburton/Arduino-Temperature-Control-Library
// https://gist.github.com/jeje/57091acf138a92c4176a


#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D1


const char* host = "api.thingspeak.com"; // Your domain  
String ApiKey = "THINGSPEAK_API_KEY";
String path = "/update?key=" + ApiKey + "&field1=";  


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

const char* ssid = "WIFIAP";
const char* pass = "WIFIKEY";


char temperatureString[6];

void setup(void){
  Serial.begin(115200);
  Serial.println("");
 
  WiFi.begin(ssid, pass);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
  delay(100);
  Serial.print(".");
  }
 
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  DS18B20.begin();
   

}

float getTemperature() {
  float temp;
  do {
  DS18B20.requestTemperatures();
  temp = DS18B20.getTempCByIndex(0);
  delay(100);
  } while (temp == 85.0 || temp == (-127.0));
  return temp;
}


void loop() {

  float temperature = getTemperature();

  dtostrf(temperature, 2, 2, temperatureString);
  // send temperature to the serial console
  Serial.println(temperatureString);

  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
  Serial.println("connection failed");
  return;
  }

  client.print(String("GET ") + path + temperatureString + " HTTP/1.1\r\n" +
  "Host: " + host + "\r\n" +
  "Connection: keep-alive\r\n\r\n");
  delay(500);

}
По такому же принципу:
String path = "/update?key=" + ApiKey + "&field1=";
client.print(String("GET ") + path + temperatureString + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
написал апдейт нескольких каналов,
Запрос должен получится что-то типа
http://api.thingspeak.com/update?key=XXXBACXXXXXXXX&field1=111&field2=222&field3=333

Все работает сейчас.
Еще раз всем больее спасибо .
 

Pilnikov

Active member
дошли таки руки проверить Спасибо всем огромное! Все работает!
Вставлю свой кусок кода
Код:
void send_Ts_2 (char api[17])
{
  const char* host = "api.thingspeak.com"; // Your domain

  String postStr = "/update?key=" + String(api);;
  if (eeprom_data.use_ts_i)
  {
    postStr += "&field1=";
    postStr += String(sr_data.t1);
    postStr += "&field3=";
    postStr += String(sr_data.h1);
  }
  if (eeprom_data.use_ts_e)
  {
    postStr += "&field2=";
    postStr += String(sr_data.t2);
    postStr += "&field4=";
    postStr += String(sr_data.h2);
  }
  postStr += "&field5=";
  postStr += String(sr_data.p);
  postStr += "\r\n\r\n";

  WiFiClient client;

  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  Serial.println(String("GET ") + postStr + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: keep-alive\r\n\r\n");

  client.print(String("GET ") + postStr + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: keep-alive\r\n\r\n");
  client.stop();

  //# ifdef _debug
  Serial.print("Temperature inside: ");
  Serial.print(sr_data.t1);
  Serial.print(" degrees Celcius Humidity inside: ");
  Serial.print(sr_data.h1);
  Serial.println("%");
  Serial.print("Temperature outside: ");
  Serial.print(sr_data.t2);
  Serial.print(" degrees Celcius Humidity outside: ");
  Serial.print(sr_data.h2);
  Serial.println("%");
  Serial.print("Pressure: ");
  Serial.print(sr_data.p);
  Serial.println("mm rt. st.");
  //# endif _debug
}
 

Pilnikov

Active member
По ходу пьесы возник следующий вполне себе логичный вопрос - как провернуть обратную операцию (прием данных) по аналогии?
 

Pilnikov

Active member
По ходу пьесы возник следующий вполне себе логичный вопрос - как провернуть обратную операцию (прием данных) по аналогии?
Сам себе и отвечу
api.thingspeak.com/channels/[Channel_ID]/feed/last?key=[Read_API_Keys] для private каналов
api.thingspeak.com/channels/[Channel_ID]/feed/last.json для public

Если кому интересно могу выложить мой код реализации обмена для ардуины вместе с парсером. Работает кстати в 3 раза быстрее, чем при пользовании либой TS. + полный отказ от либ.
 

Yurdel

New member
Привет всем от новичка-старичка!
Прошу помощи уважаемые. подскажите как пнуть Опсоса "МТС" чтобы заработал thingspeak. Проект на 100% рабочий при подключении к интернету по оптике. При попытке запустиь все через мобильный wifi роутер от МТС работает только NTP клиент. При этом на компе с Win 10 в Chrom мои каналы отображаются и можно вносить изменения (с компа). Ни передатчик, ни приемник (оба на есп07) не конектятся именно к thingspeak, при этом к сети они оба подключены и пингуются.
Та же проблема у меня при работе через Esplorer, через conn::send. Тут товарищ решил через ардуино, а как это реализовать через lua, не подскажете?
 

Yurdel

New member
Пришлось через Arduino IDE все таки, на исходную прошивку AI, залить скетч отправки температуры на сам wifi-модуль и только тогда заработал прием данных на ThingSpeak. На свежую прошивку nodemcu ардуино никак не заливал, висел, может что не так сделал. Посылку данных в api.thingspeak через lua-файлы на Esplorer никак не смог сделать.
Спасибо за полезный форум!
 

Вложения

Сверху Снизу