SIM800H,Feather FONA尝试进行http POST

问题描述 投票:-1回答:1

我正在尝试向弹性搜索服务器发出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:[email protected]: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();
}
arduino adafruit sim800
1个回答
0
投票

我不了解c ++,也不了解“羽毛FONA”,但是我的“ TTgo t-call sim800 v1.3” micropython开发板一直面临类似的问题。

[当我查看您发布的输出时,我会说您忘记启用HTTPS。同样,我不懂c ++,但是如果“ https://elastic:[email protected]:9243/honeycomb/_doc”是您向其发出请求的URL,必须首先启用HTTPS。

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

AT+HTTPSSL=1
OK

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

AT+HTTPSSL=1
ERROR

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

© www.soinside.com 2019 - 2024. All rights reserved.