0

我正在尝试向弹性搜索服务器发出 POST http 请求,但我得到 603 状态和失败。这是我提出请求时的输出。芯片本身可以工作,示例中的 get 请求也可以工作。我可以发短信。问题出在代码本身,但我不知道在哪里。

---> AT+HTTPTERM
<--- OK
---> AT+HTTPINIT
<--- OK
---> AT+HTTPPARA="CID"
<--- OK
---> AT+HTTPPARA="UA"
<--- OK
---> AT+HTTPPARA="URL"
<--- OK
---> AT+HTTPPARA="CONTENT"
<--- OK
---> AT+HTTPDATA=150,100000
<--- DOWNLOAD
<--- OK
---> AT+HTTPACTION=1
<--- OK
Status: 603
Len: 0
    ---> AT+HTTPREAD
    <--- OK
Failed!

这是 arduino 代码,大部分是从 FONA 库中的 FONA 测试复制而来的。

#include "Adafruit_FONA.h"
#include "SoftwareSerial.h"

//FONA stuff
char replybuffer[255];
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
SoftwareSerial *fonaSerial = &fonaSS;
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0);

uint8_t type;


void setup() {
  while (!Serial);
  Serial.begin(115200);
  Serial.println(F("Initializing FONA"));
  Serial.println(F("Initializing....(May take 3 seconds)"));

  fonaSerial->begin(4800);
  if (! fona.begin(*fonaSerial)) {
    Serial.println(F("Couldn't find FONA"));
    while (1);
  }

  Serial.println(F("FONA is OK"));
  Serial.print(F("Found FONA 800H"));

  char imei[16] = {0}; // MUST use a 16 character buffer for IMEI!
  uint8_t imeiLen = fona.getIMEI(imei);
  if (imeiLen > 0) {
    Serial.print("Module IMEI: "); Serial.println(imei);
  }

  fona.setGPRSNetworkSettings(F("TM"));
  //fona.setHTTPSRedirect(true);

  fona.enableGPRS(false);
  while(!fona.enableGPRS(true));


  flushSerial();

  uint16_t vbat;  
  if (! fona.getBattPercent(&vbat)) {
    Serial.println(F("Failed to read Batt"));
  } else {
    Serial.print(F("VPct = ")); Serial.print(vbat); Serial.println(F("%"));
  }

}

void loop() {


  uint16_t vbat;  
  if (! fona.getBattPercent(&vbat)) {
    Serial.println(F("Failed to read Batt"));
  } else {
    Serial.print(F("VPct = ")); Serial.print(vbat); Serial.println(F("%"));
  }

  float humidityInside = dhtinside.readHumidity() -10;
  float temeratureInside = dhtinside.readTemperature();
  float humidityOutside = dhtoutside.readHumidity();
  float temeratureOutside = dhtoutside.readTemperature();

  uint16_t statuscode;
  int16_t length;
  char conversion[8];
  String data = "{\"outside.temperature\":" + 
              String(temeratureOutside) +
              "," + "\"outside.humidity\":" +
              String(humidityOutside) +
              "," + "\"inside.temperature\":" + 
              String(temeratureInside) + 
              "," + "\"inside.humidity\":" +
              String(humidityInside) + 
              "," + "\"timestamp\":" + 
              String(myRTC.year) + 
              "-0" +
              String(myRTC.month) + 
              "-" +
              String(myRTC.dayofmonth) +
              "T" + 
              String(myRTC.hours) +
              ":" + 
              String(myRTC.minutes) +
              ":" +
              String(myRTC.seconds) + 
              "\"," + "\"battery\":" +
              String(vbat) +
              "}";

  Serial.println(data); 

  char dataChar[152];

  data.toCharArray(dataChar, 151);

  flushSerial();

  Serial.println(F("****"));
  flushSerial();
  if (!fona.HTTP_POST_start("https://elastic:ZZFPKxXvZX1T@9195f7cad1252e0d4.eastus2.azure.elastic-cloud.com:9243/honeycomb/_doc", F("application/json"), (uint8_t *) dataChar, strlen(dataChar), &statuscode, (uint16_t *)&length)) {
    Serial.println("Failed!");
  }else{
    while (length > 0) {
    while (fona.available()) {
      char c = fona.read();

    #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
        loop_until_bit_is_set(UCSR0A, UDRE0); // Wait until data register empty. 
        UDR0 = c;
    #else
        Serial.write(c);
    #endif

        length--;
        if (! length) break;
      }
    }
    Serial.println(F("\n****"));
    fona.HTTP_POST_end();

  }

  delay(10000);
}

void flushSerial() {
  while (Serial.available())
    Serial.read();
}
4

1 回答 1

0

我不知道 c++,也不知道“Feather FONA”,但我的“TTgo t-call sim800 v1.3”micropython 板也遇到了类似的问题。

当我查看您发布的输出时,我会说您忘记启用 HTTPS。同样,我不知道 c++,但如果“ https://elastic:ZZFPKxXvZX1T@9195f7cad1252e0d4.eastus2.azure.elastic-cloud.com:9243/honeycomb/_doc ”是您发出请求的 URL,则必须启用首先是 HTTPS。

在您的输出中应该有一行:

AT+HTTPSSL=1
OK

如果您尝试启用 HTTPS,但您会收到如下错误:

AT+HTTPSSL=1
ERROR

您的调制解调器可能不支持 HTTPS。然后,您必须回退到 HTTP。

于 2020-03-20T19:30:56.540 回答