Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/106: Рейтинг темы: голосов - 106, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35

GPRS GET/POST-запросы через SIM900

02.04.2015, 22:33. Показов 21400. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, госпада.

Столкнулся со странностью:

Есть сервер, который прнимает GET-запросы.

http://m-ark.kps-dev.com/restw... d0aGZuamg=

Ваш браузер должен, пройдя по этой ссылке получить некий код авторизации.

Пробую отправить тот же GET-запрос через SIM900.

Использую такую "конструкцию" в надежде получить тот же ответ от сервера: numdata=inet.httpGET("www.m-ark.kps-dev.com", 80, "/restws/session/token/Authorization:Basic:cmVzdF91c3I6amd0aGZu amg=", msg, 50);

Но сервер отвечает ошибками 400 или 403. Связь с сервером есть, но запрос серверу не нравится.

Что же не нравится Ардуине?

Спасибо. Код прилагаю.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"
 
//To change pins for Software Serial, use the two lines in GSM.cpp.
 
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.
 
//Simple sketch to start a connection as client.
 
InetGSM inet;
//CallGSM call;
//SMSGSM sms;
 
char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
 
void setup()
{digitalWrite(9, HIGH);
  //Serial connection.
  Serial.begin(9600);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else
  digitalWrite(9, HIGH);
  Serial.println("\nstatus=IDLE");
 
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
      Serial.println("status=ATTACHED");
    else
     digitalWrite(9, HIGH);
      Serial.println("status=ERROR");
    delay(1000);
 
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();
 
    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpGET("www.m-ark.kps-dev.com", 80, "/restws/session/token/Authorization: base: cmVzdF91c3I6amd0aGZuamg=", msg, 50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
  }
};
 
void loop()
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
};
 
void serialhwread(){
  i=0;
  if (Serial.available() > 0){
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;
    }
 
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }
    inSerial[0]='\0';
  }
}
 
void serialswread(){
  gsm.SimpleRead();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.04.2015, 22:33
Ответы с готовыми решениями:

Sim900 vs SIM900 GSM/GPRS MINIMUM SYSTEM MODULE
Каково ваше мнение, стоит ли переплачивать за модуль 100% стоимости(MINIMUM SYSTEM MODULE примерно 1000, только Sim900 - примерно 500)? ...

Вопросы по GSM/GPRS модулю SIM900
Коллеги! приступаю к новой для себя теме, поэтому будут вполне детские вопросы. 1. Возможно ли передавать/принимать данные по HTTP...

SIM900. Как держать GPRS соединение?
Вопрос не касается какого-либо мк, но так как SIM900 сделан на ARM, решил задать вопрос здесь. Разрабатываю систему, в которой есть пульт...

50
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
30.05.2015, 17:41
Студворк — интернет-сервис помощи студентам
Что выводит в консоль? В IDE нажать клавиши ctrl+shift+M либо найти кнопку ""монитор порта"
1
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
30.05.2015, 17:50  [ТС]
Чтобы было понятнее, я переделал библиотеку, чтобы она в консоль печатала сообщение POST- запроса, которое формируется. Принт добавил после каждой исполняемой строчки.
Вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
gsm.SimpleWrite("POST ");
 Serial.print("POST ");
  gsm.SimpleWrite(path);
 Serial.print(path);
  gsm.SimpleWrite(" HTTP/1.1\n");
 Serial.print(" HTTP/1.1\n ");
  gsm.SimpleWrite("Content-Type: application/json\n");
 Serial.print("Content-Type: application/json\n");
  gsm.SimpleWrite("X-CSRF-Token: xxxxxxxxxxxxxxxxxxxxxxx\nHost: ");
 Serial.print("X-CSRF-Token: xxxxxxxxxxxxxxxxxxxxxx\nHost: ");
  gsm.SimpleWrite(server);
 Serial.print(server);
  gsm.SimpleWrite("\n");
 Serial.print("\n");
  //gsm.SimpleWrite("User-Agent: Arduino\n");
  gsm.SimpleWrite("Content-Length: ");
 Serial.print("Content-Length: ");
  itoa(strlen(parameters),itoaBuffer,10);
  gsm.SimpleWrite(itoaBuffer);
 Serial.print(itoaBuffer);
  gsm.SimpleWrite("\n\n");
 Serial.print("\n\n");
  gsm.SimpleWrite(parameters);
 Serial.print(parameters);
  gsm.SimpleWrite("\n\n");
 Serial.print("\n\n");
  gsm.SimpleWrite(end_c);
И в консоли выдаёт следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  GSM Shield testing.
 
status=READY
 
status=IDLE
status=ATTACHED
status=ERROR
 
10.88.19.147
 
POST /temperature  HTTP/1.1
 Content-Type: application/json
X-CSRF-Token: xxxxxxxxxxxxxxxxxxxxxxxxxx
Host: m-ark.kps-dev.com
Content-Length: 1
 
 
 
 
Number of data received:
50
 
Data received:
А когда строчка не пишется в буфер, а прямым текстом отправляется в параметры, получаем такой ответ в консоли:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GSM Shield testing.
 
status=READY
 
status=IDLE
status=ATTACHED
status=ERROR
 
10.93.81.207
POST /temperature  HTTP/1.1
 Content-Type: application/json
X-CSRF-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Host: m-ark.kps-dev.com
Content-Length: 106
 
{"title":"temp38", "temperature": "185", "latitude":"55.407749","longitude":"38.866600", "device_id":"28"}
 
 
Number of data received:
50
 
Data received:
Content-Length: 106 - Хороший признак,

C++
1
2
3
4
  gsm.SimpleWrite("Content-Length: ");
 Serial.print("Content-Length: ");
  itoa(strlen(parameters),itoaBuffer,10);
  gsm.SimpleWrite(itoaBuffer);
Content-Length: 1 - Плохой признак
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
30.05.2015, 18:00
Это хорошо, но что выведет следующая строчка?
C++
1
Serial.println((const char*)buf);
Добавлено через 1 минуту
А, вижу, там содержится один пробел.

Добавлено через 3 минуты
Попробуйте увеличить буфер у строки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  String str = "{\"title\":\"temp38\", \"temperature\": \"";
  str.changeBuffer(256);//вот
  str += 025;
  str += "\", \"latitude\":\"";
  str += ltd;
  str += "\",\"longitude\":\"";
  str += lnd;
  str += "\", \"device_id\":\"";
  str += 28;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;
1
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
31.05.2015, 17:21  [ТС]
Ругается на str.changeBuffer(256); //вот

Ошибку выдаёт:
This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Arduino: 1.0.6 (Windows NT (unknown)), Board: "Arduino Uno"
error: 'unsigned char String::changeBuffer(unsigned int)' is protected
GPRS_may10_1_loop_GPRS_sent_BUF:123: error: within this context

Добавлено через 1 минуту
Если так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
str.changeBuffer(256); //вот
 String str = "{\"title\":\"temp38\", \"temperature\": \"";
  str += 025;
  str += "\", \"latitude\":\"";
  str += ltd;
  str += "\",\"longitude\":\"";
  str += lnd;
  str += "\", \"device_id\":\"";
  str += 28;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;
Ругается: This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
Arduino: 1.0.6 (Windows NT (unknown)), Board: "Arduino Uno"
GPRS_may10_1_loop_GPRS_sent_BUF.ino: In function 'void serialswread()':
GPRS_may10_1_loop_GPRS_sent_BUF:121: error: 'str' was not declared in this scope

Объявил

String stl;

Опять ругается, как до этого:

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
error: 'unsigned char String::changeBuffer(unsigned int)' is protected
GPRS_may10_1_loop_GPRS_sent_BUF:122: error: within this context

Добавлено через 23 часа 13 минут
Ещё "приключение". Две платы GSM & GPS. Есть два кода для них, которые по отдельности исправно работают. Но когда объединяешь - не хотят уживаться. Если в код для GPS переносишь код из GPRS, только доходишь до первой команды для GPRS - сразу алгоритм нарушается, и ожидаемых результатов в консоли не дождаться. Вроде бы они через разные ножки общаются: GPS 5-6, GPRS 7-8. Пробую на одном BitRate их запускать, для обоих 9600 ставлю.
По отдельности работают. Вместе - никак.

GPS код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
   This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 5, TXPin = 6;
static const uint32_t GPSBaud = 9600;
double gpslat;
// The TinyGPS++ object
TinyGPSPlus gps;
 
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
 
void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);
 
  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}
 
void loop()
{  
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
      displayInfo();
 
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}
 
void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }
 
  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
 
  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
 
  Serial.println();
}

GPRS код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"
 
//To change pins for Software Serial, use the two lines in GSM.cpp.
 
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.
 
//Simple sketch to start a connection as client.
 
InetGSM inet;
//CallGSM call;
//SMSGSM sms;
 
char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
 
void setup()
{digitalWrite(9, HIGH);
  //Serial connection.
  Serial.begin(9600);
  
};
 
void loop()
{
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else
  digitalWrite(9, HIGH);
  Serial.println("\nstatus=IDLE");
 
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
      Serial.println("status=ATTACHED");
    else
     digitalWrite(9, HIGH);
      Serial.println("status=ERROR");
    delay(1000);
 
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();
 
    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", "{\"title\":\"temp38\", \"temperature\": \"925\", \"latitude\":\"55.407749\",\"longitude\":\"38.866600\", \"device_id\":\"28\"}",msg,50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
  }
};
 
void serialhwread(){
  i=0;
  if (Serial.available() > 0){
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;
    }
 
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }
    inSerial[0]='\0';
  }
}
 
void serialswread(){
  gsm.SimpleRead();
}
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
15.06.2015, 15:31  [ТС]
Самому удалось разобраться. Совместил вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include "SIM900.h"
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "inetGSM.h"
InetGSM inet;
/*
   This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 5, TXPin = 6;
static const uint32_t GPSBaud = 9600;
double gpslat;
 String double2string(double n, int ndec){
    String r = "";
    int v = n;
    r += v;     // whole number part
    r += '.';   // decimal point
    int i;
    for (i=0;i<ndec;i++) {
        // iterate through each decimal digit for 0..ndec 
        n -= v;
        n *= 10; 
        v = n;
        r += v;
    }
    return r;
};
String ltd, lnd; 
char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
 
  
 
// The TinyGPS++ object
TinyGPSPlus gps;
 
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);
 
void setup()
{digitalWrite(9, HIGH);
 Serial.begin(9600);
  ss.begin(GPSBaud);
 
  Serial.println(F("DeviceExample.ino"));
  Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
}
 
void loop()
{  
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
      displayInfo();
 
  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("No GPS detected: check wiring."));
    while(true);
  }
}
 
void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
   // ltd = (double2string (gps.location.lat(), 6));
   // lnd = (double2string (gps.location.lng(), 6));
    
   
     Serial.println(ltd);
     Serial.println(lnd);
  ltd = (double2string (44.391922, 5));
  lnd = (double2string (33.794126, 5));
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
 // serialhwread();
  //Read for new byte on NewSoftSerial.
 // serialswread();
 InetGSM inet;
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else
  digitalWrite(9, HIGH);
  Serial.println("\nstatus=IDLE");
 
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
      Serial.println("status=ATTACHED");
    else
     digitalWrite(9, HIGH);
      Serial.println("status=ERROR");
    delay(1000);
 
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();
 
 
 String str = "{\"title\":\"temp31\", \"temperature\": \"";
  str += 5;
  str += "\",\"latitude\":\"";
  str += 55;
  str += "\",\"longitude\":\"";
  str += 44;
  str += "\", \"device_id\":\"";
  str += 5;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  Serial.println((const char*)buf);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;
 
    //TCP Client GET, send a GET request to the server and
    //save the reply.
   // numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", "{\"title\":\"temp38\", \"temperature\": \"25\", \"latitude\":\"55.407749\",\"longitude\":\"38.866600\", \"device_id\":\"28\"}",msg,50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
  
    Serial.begin(9600);
  ss.begin(GPSBaud);
  digitalWrite(9, HIGH);
  }
    
    
  }
  else
  {
    Serial.print(F("INVALID"));
  }
 
  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
 
  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }
 
 
}
Добавлено через 3 минуты
Новая напасть. Вроде бы всё хорошо. Уже всё готово для отправки POST-запросом. И GPS работает, могу сформировать долгожданные параметры. Но как только добавляю в код только одну строку "TinyGPSPlus gps;" - запрос не формируется даже.
Взял чистый код для GSM POST-запроса всё рабоатет, только добавляю одну строчку: "TinyGPSPlus gps;" - сразу после этого POST-запрос не формируется. Может TinyGPSPlus перехватывает управление RX TX для SIM900 GSM? Хотя при этом SIM900 работает, а пытаюсь распечатать из буфера строчку с параметрами - ничего не выходит на экран консоли. Ну и в POST-запросе идёт строчка передаваемых параметров длинной "0".


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
[CPP]
#include "SIM900.h"
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include "inetGSM.h"
InetGSM inet;
 
//To change pins for Software Serial, use the two lines in GSM.cpp.
 
//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.
 
//Simple sketch to start a connection as client.
 
 
//CallGSM call;
//SMSGSM sms;
 //static const int RXPin = 5, TXPin = 6;
//static const uint32_t GPSBaud = 9600;
//double gpslat;
 
  String double2string(double n, int ndec){
    String r = "";
    int v = n;
    r += v;     // whole number part
    r += '.';   // decimal point
    int i;
    for (i=0;i<ndec;i++) {
        // iterate through each decimal digit for 0..ndec 
        n -= v;
        n *= 10; 
        v = n;
        r += v;
    }
    return r;
};
String ltd, lnd; 
char msg[50];
int numdata;
char inSerial[50];
int i=0;
boolean started=false;
 
 // The TinyGPS++ object
    TinyGPSPlus gps;
    
// The serial connection to the GPS device
//SoftwareSerial ss(RXPin, TXPin);
 
void setup()
{digitalWrite(9, HIGH);
Serial.begin(9600);
//ss.begin(GPSBaud);
  //Serial connection.
  
  
};
 
void loop()
{
  
  ltd = (double2string (44.391922, 5));
  lnd = (double2string (33.794126, 5));
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
 // serialhwread();
  //Read for new byte on NewSoftSerial.
 // serialswread();
 //SoftwareSerial ss(7,8);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else
  digitalWrite(9, HIGH);
  Serial.println("\nstatus=IDLE");
 
  if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("internet.beeline.ru", "", ""))
      Serial.println("status=ATTACHED");
    else
     digitalWrite(9, HIGH);
      Serial.println("status=ERROR");
    delay(1000);
 
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is emapty.
    gsm.WhileSimpleRead();
 
 
 String str = "{\"title\":\"temp31\", \"temperature\": \"";
  str += 5;
  str += "\",\"latitude\":\"";
  str += ltd;
  str += "\",\"longitude\":\"";
  str += lnd;
  str += "\", \"device_id\":\"";
  str += 5;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  Serial.println((const char*)buf);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;
 
    //TCP Client GET, send a GET request to the server and
    //save the reply.
   // numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", "{\"title\":\"temp38\", \"temperature\": \"25\", \"latitude\":\"55.407749\",\"longitude\":\"38.866600\", \"device_id\":\"28\"}",msg,50);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);
    Serial.println("\nData received:");
    Serial.println(msg);
 
  }
};
[/CPP]

Добавлено через 21 минуту
Рыжий Лис, посоветуй, пожалуйтста...
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
16.06.2015, 17:43  [ТС]
Кажется нащупал. Дело в размере буфера опять же... Передаётся либо вся строка с параметрами, если её записать прямым текстом в "кавычках", либо если мы формируем стоку таким вот образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 String str = "{\"title\":\"temp31\", \"temperature\": \"";
  str += 5;
  str += "\",\"latitude\":\"";
  str += 55;
  str += "\",\"longitude\":\"";
  str += 44;
  str += "\", \"device_id\":\"";
  str += 5;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  Serial.println((const char*)buf);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;
тогда передаётся только коротенькая.

Уточняю подробности.

Добавлено через 8 минут
Да, если сократить строчку до

C++
1
2
3
4
5
6
7
8
9
 String str = "{\"title\":\"";
  str += lnd;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  Serial.println((const char*)buf);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;
(где lnd - координаты взятые с GPS: 55.555555) передаетя {title:\55.55555}

Надо с буфером справиться или другой метод выбрать, в переменную другую писать...
Вот-вот финал, не терпится... Да и сроки.
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
17.06.2015, 20:02  [ТС]
Нужно увеличить буфер. Формируется строчка str, она записывается в буфер,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  String str = "{\"title\":\"temp38\", \"temperature\": \"";
  str += 25;
  str += "\", \"latitude\":\"";
  str += ltd;
  str += "\",\"longitude\":\"";
  str += lnd;
  str += "\", \"device_id\":\"";
  str += 28;
  str += "\"}";
  int len = str.length()+1;
  unsigned char* buf = new unsigned char[len];
  str.getBytes(buf, len, 0);
  numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", (const char*)buf, msg, 50);
  delete buf;

через который записываются параметры, передаваемые через POST-запрос: (const char*)buf.
Но в ходе работы буфера хватает только на половину необходимой строки:

{"title":"temp38", "temperature": "35", "latitude":"45.55555","longitude":"33.44 444", "device_id":"28"}.

Как можно увеличить этот буфер или почистить?
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
19.06.2015, 13:19  [ТС]
Мне посоветовали, и почти помогло:

Зачем Вам buf (удалите строки 10-12 и 14), выкиньте его и напишите просто (вместо 13 строки):

C++
1
numdata=inet.httpPOST("m-ark.kps-dev.com", 80, "/temperature ", str.c_str(), msg, 50);
Спасибо, совет дельный. Стало лучше, но только пропадает часть текста, причём как-то не последовательно. Видимо опять переполнение имеет место быть. Есть какая-то функция, что обнуляет память, куда строка записывается? Или что-то, что может помочь?

Эти проблемы с POST-запросом начались только после того, как GPS-приёмник в код включил. Сразу будто места на стало хватать.

Ответ: Если переменная часть ltd, lnd имеет фиксированную длину, проще выкинуть String и использовать глобальный буфер с фиксированным размером, тогда скетч не будет постоянно выделять и удалять память динамически. Если не забуду, попробую пример привести, сейчас на работу пора.
1
 Аватар для selevo
2 / 7 / 6
Регистрация: 13.10.2013
Сообщений: 249
04.10.2016, 23:13
чё,чем закончилась-то санта барбара ?
Меня аохоже тоже ждёт многосерийка
не хотелось бы
0
1 / 1 / 0
Регистрация: 02.04.2015
Сообщений: 35
05.10.2016, 02:00  [ТС]
Успешно, Сиси Кэпфл вышел из комы, когда Джина хотела сделать ему смертельную инъекцию. Хотя это была только середина сериала...
А серьёзно было так. Сервер который поинимает POST-запросы мне написали, в симуляторе показали, что он их принимает. На Ардуино UNO едва хватило ресурса, чтобы брать gps-координаты, температуру с термопары, и пост запрсом передавать {i:1;t:25,5;ld:45,4577;lt:34,5678}, это номер прибора, температура, долгота и широта. Если строчка была на пару символов длинее - Ардуино уже не тянуло. Помню, что где-то в gsm библиотеке нужно было прописать какие-то "позывные" POST-запроса типа кода доступа, пароля к серверу. Сам я не программист, поэтому так описываю неконкретно.
Кое-как получилось. Прибор плавал на борту судна, исправно работал, перезимовал. На следующий год подвёл лишь слот для симки, новая микросимка выпадала из рамки, контакт отходил и связь с сетью терялась. Обидно, всё обновил, а этот косяк на борту не устронил, ещё эта качка. Но за зиму сделаю и в новом сезоне будут он-лайн данные.
Может не по делу многое понаписал.
0
 Аватар для selevo
2 / 7 / 6
Регистрация: 13.10.2013
Сообщений: 249
05.10.2016, 08:47
Молодец, дошёл до цели, это важное мужское качество усиливающее мужество.
Ну выкладывай чё, пример-то рабочий.
Или ссылку на программиста.
Так и не понятно тайна длины буфера.
И как 32 кб с трудом хватило чтобы две строки АТ командами выслать.
Видимо библиотеки все зделаны нижним мозгом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2016, 08:47
Помогаю со студенческими работами здесь

SIM900 GPRS и СМС
Добрый день. На основе модема в качестве устройства связи организовал передачу данных по GPRS. Есть несколько вопросов в которых я...

GSM/GPRS SHIELD (SIM900) какой baudrate ставить
Собираюсь юзать шилд для GET запросов в основном (отправка информации на сервер с датчиков). Так вот курю примеры, везде по разному когда...

Post-запросы через Proxy
Вот код: import urllib import urllib2 import requests url = 'https://auth.mail.ru/cgi-bin/auth?from=splash' password = '*****'...

Как получить POST запросы через JS?
Всем привет! Есть файл, который несколько раз в минуту отправляет POST данные в другой файл. Вопрос: Как получить эти данные через JS?...

Запросы get и post через доступный прокси сервер
Привет всем.Дали задачу для получения работы. Суть. Есть доступный прокси сервер нужно зайти через него на сайт и авторизироватся. То...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru