Почтовый запрос HTTP в формате JSON с использованием модуля SIM900

Я попытался отправить HTTP-запросы на сервер в формате JSON с помощью модуля SIM900. Но код не публикует данные. При публикации данных я получаю ответ об ошибке при инициализации сервера с помощью команды:

{("AT+HTTPPARA=\"URL\",\"http://test.server/insert-path")}

Я не знаю, что это за ошибка и как ее исправить. Пожалуйста, помогите мне это исправить.

#include<SoftwareSerial.h>

SoftwareSerial client(2,3);

String testReading="{  \"testID\" : 1,  \"testLevel\" : 1, }";

void setup() {
  Serial.begin(9600);
  client.begin(9600);
  delay(1000);
  if(client.available()) {
    Serial.print("Connected");
  } else {
    Serial.print("Not Connected");
  }
  checkSignal();
  connectGPRS();
  postData();
  delay(1000);
}

void loop() {
  if(client.available()) {
    checkSignal();
    connectGPRS();
    postData();
    delay(1000);
  }
}

void connectGPRS() {
  client.println("AT+CGATT?");
  delay(1000);
  ShowSerialData();
  client.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  delay(1000);
  ShowSerialData();
  client.println("AT+SAPBR=3,1,\"APN\",\"www\"");
  //Использование индийской стандартной SIM-карты Vodafone, поэтому APN — это www
  delay(1000);
  ShowSerialData();

  client.println("AT+SAPBR=1,1");
  delay(1000);
  ShowSerialData();

  client.println("AT+SAPBR=2,1");
  delay(1000);
  ShowSerialData();
}

void checkSignal() {
  client.println("AT+CSQ");
  delay(1000);
  ShowSerialData();
}

void ShowSerialData() {
  while(client.available()!=0)
    Serial.write(client.read());
}

void postData() {
  client.println("AT+HTTPINIT");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPPARA=\"CID\",1");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPPARA=\"URL\",\"http://test.server/insert-path");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPPARA=\"CONTENT\",\"application/json");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPDATA=99,10000");
  delay(1000);
  ShowSerialData;

  client.println(testReading);
  delay(1000);
  ShowSerialData;

  client.println("AT+HTTPACTION=1");
  delay(10000);
  while(!client.available());
  ShowSerialData();
}

, 👍1

Обсуждение

Дайте нам подсказку - как далеко это заходит? Что оно делает?, @Mark Smith

Этот код отправит введенные вручную данные в Arduino на сервер. Это всего лишь пример кода. Я использую SIM-карту 900 для установки GPRS-соединения., @Chitraveer Akhil

Между SIM-картой и Arduino устанавливаются соединения, иногда GPRS подключается, но данные не отправляются на сервер., @Chitraveer Akhil

Можно ли публиковать на сервер с ПК (не в локальной сети сервера)? Вы уверены, что сервер работает и доступен? Журналы сервера показывают неудачные соединения? Мы ищем проблему с подключением или проблему с данными, которые он отправляет?, @Mark Smith

Стоит отметить, что если вы полагаетесь на свою функцию ShowSerialData(), чтобы знать, что происходит, она может быть ненадежной. Последовательные данные не появляются сразу. Ваш код основан на гонке — данные поступают достаточно быстро, чтобы всегда быть в буфере. Вы можете взломать его, добавив delay(1000) прямо в начале ShowSerialData()., @Mark Smith

Спасибо.. Я отложил это.. Ошибка при инициализации URL.. Когда я отправляю команду {("AT+HTTPPARA=\"URL\",\"http://test.server/insert-path" )}.. Я получаю ответ ERROR.. Я даже задержал время отправки данных и инициализации HTTP.. Но все равно получаю ответ ERROR.., @Chitraveer Akhil

Не могли бы вы отредактировать свой вопрос, чтобы включить эту информацию, пожалуйста? Я подозреваю, что не смогу решить его за вас, но чем яснее вы сформулируете вопрос, тем больше вероятность того, что это сделает кто-то другой., @Mark Smith

Спасибо, Марк, за вашу помощь. Если у вас есть идея решить эту проблему, пожалуйста, отправьте мне пинг., @Chitraveer Akhil


2 ответа


2

Привет всем, используйте этот код ниже для установки HTTP-соединения с сервером. И чтобы игнорировать ошибку 601 или 504, используйте правильный формат публикации. Здесь я использую формат JSON. Я просто дал ручные данные. Игнорируйте эти ошибки в HTTPINIT, AT+SAPBR=2,1. Данные будут отправлены на сервер

 #include<SoftwareSerial.h>

SoftwareSerial client(2,3);


String reading="{  \" : 1,  \"latitude\" : 12.983027,  \"longitude\" : 80.2594,  \"timestamp\" : 100,  }";

void setup()
{
  Serial.begin(9600);
  client.begin(9600);
  delay(500);

  if(client.available())
  {
    Serial.print("Connected");
  }
  else
  {
    Serial.print("NotConnected");
  }

  //инициализироватьSIM();
  connectGPRS();
  connectHTTP();
}

void loop()
{

}



void connectGPRS()
{ 
  client.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  delay(1000);
  ShowSerialData();

  client.println("AT+SAPBR=3,1,\"APN\",\"www\"");//APN
  delay(1000);
  ShowSerialData();

  client.println("AT+SAPBR=1,1");
  delay(1000);
  ShowSerialData();

  client.println("AT+SAPBR=2,1");
  delay(1000);
  ShowSerialData();
}

void connectHTTP()
{
  client.println("AT+HTTPINIT");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPPARA=\"CID\",1");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPPARA=\"URL\",\"http://xxx.xxx.xx/Listener/\"");//IP-адрес общедоступного сервера
  client.println("AT+HTTPPARA=\"URL\",\"http://testServer/Listener/\"");//Адрес общедоступного сервера
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPPARA=\"CONTENT\",\"application/json\"");
  delay(1000);
  ShowSerialData();


  client.println("AT+HTTPDATA=" + String(reading.length()) + ",100000");
  delay(1000);
  ShowSerialData();

  client.println(reading);
  delay(1000);
  ShowSerialData;

  client.println("AT+HTTPACTION=1");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPREAD");
  delay(1000);
  ShowSerialData();

  client.println("AT+HTTPTERM");
  delay(1000);
  ShowSerialData;
}

void ShowSerialData()
{
  while(client.available()!=0)
  {
  Serial.write(client.read());
  delay(100);
  }
}
,

1
client.println(reading);
delay(1000);
ShowSerialData;

Приведенная выше строка кода приведет к ошибке.

,