Arduino MKGSM 中的 HTTP POST 到 Eventhub

标签 http post https arduino azure-eventhub

我正在使用 Arduino 库 MKGSM 向我的 Azure Eventhub 发送 HTTP POST。我对提供的参数充满信心,因为我已经用 curl 手动尝试过它们并且 HTTP POST 确实有效,所以问题肯定在我的 Android 语法中。这是我的方法:

#include <MKRGSM.h>

#include "arduino_secrets.h" 
// Please enter your sensitive data in the Secret tab or arduino_secrets.h
// PIN Number
const char PINNUMBER[]     = SECRET_PINNUMBER;
// APN data
const char GPRS_APN[]      = SECRET_GPRS_APN;
const char GPRS_LOGIN[]    = SECRET_GPRS_LOGIN;
const char GPRS_PASSWORD[] = SECRET_GPRS_PASSWORD;

// initialize the library instance
GSMSSLClient client;
GPRS gprs;
GSM gsmAccess;

// URL, path and port (for example: arduino.cc)
char server[] = "<namespace>.servicebus.windows.net";
char path[] = "/<myeventhubname>/messages";
int port = 443; // port 443 is the default for HTTPS

void setup() {

  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("Starting Arduino web client.");

  // connection state

  boolean connected = false;

  // After starting the modem with GSM.begin()
  // attach the shield to the GPRS network with the APN, login and password
  while (!connected) {
    if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &&
        (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
      connected = true;
    } else {
      Serial.println("Not connected");
      delay(1000);
    }
  }

  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, port)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.print("POST ");
    client.print(server);
    client.print(path);
    client.println(" HTTP/1.1");
    client.println("Authorization: SharedAccessSignature sr=https%3A%2F%2F<namespace>.servicebus.windows.net%2F<myeventhubname>&sig=<mysig>&se=<myse>&skn=RootManageSharedAccessKey");
    client.println();
    client.println("{\"HELLO\"}");
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.available() && !client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for (;;)
      ;
  }
}

基本上,原始示例是获取 Arduino 的 ascii 符号的 GET,我猜测是否可以使用相同的代码来发布 http 帖子(在我的例子中,发布到 Eventhub)。

更新: 将 GSM gsmAccess 更改为 GSM gsmAccess(true) 后,我开始收到无法读取的输出。我附在下面:

AT

OK
AT+IPR=921600

OK
AT

OK
AT+UPSV=3

OK
AT+CPIN?

ERROR
AT+CPIN?

ERROR
AT+CPIN?

ERROR
AT+CPIN?

+CPIN: READY

OK
AT+CMGF=1

OK
AT+UDCONF=1,1

OK
AT+CTZU=1

OK
AT+UDTMFD=1,2

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK

+UMWI: 0,1

+UMWI: 0,2

+UMWI: 0,3

+UMWI: 0,4
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,0

OK
AT+CREG?

+CREG: 0,1

OK
AT+UCALLSTAT=1

OK
AT+CGATT=1

OK
AT+UPSD=0,1,""

OK
AT+UPSD=0,6,3

OK
AT+UPSD=0,2,""

OK
AT+UPSD=0,3,""

OK
AT+UPSD=0,7,"0.0.0.0"

OK
AT+UPSDA=0,3

OK
AT+UPSND=0,8

+UPSND: 0,8,1

OK
AT+USOCR=6

+USOCR: 0

OK
AT+USOCO=0,"<server>.servicebus.windows.net",443

OK
connected
AT+USOWR=0,5,"504F535420"

+USOWR: 0,5

OK
AT+USOWR=0,60,"2F6D796576656E746875622F6D657373616765733F74696D656F75743D3630266170692D76657273696F6E3D323031342D303120485454502F312E31"

+USOWR: 0,60

OK
AT+USOWR=0,193,"417574686F72697A6174696F6E3A205368617265644163636573735369676E61747572652073723D687474707325334125324625324665666F7230312E736572766963656275732E77696E646F77732E6E65742532466D796576656E74687562267369673D683977624C78673467306E50764E6E347977696F462532426C623244446E6556306863353833757A496B7462302533442673653D3135373633313930323826736B6E3D526F6F744D616E6167655368617265644163636573734B6579"

+USOWR: 0,193

OK
AT+USOWR=0,59,"436F6E74656E742D547970653A206170706C69636174696F6E2F61746F6D2B786D6C3B747970653D656E7472793B636861727365743D7574662D38"

+USOWR: 0,59

OK
AT+USOWR=0,2,"0D0A"

+USOWR: 0,2

OK
AT+USOWR=0,35,"486F73743A2065666F7230312E736572766963656275732E77696E646F77732E6E6574"

+USOWR: 0,35

OK
AT+USOWR=0,2,"0D0A"

+USOWR: 0,2

OK
AT+USOWR=0,2,"0D0A"

+USOWR: 0,2

OK
AT+USOWR=0,2,"0D0A"

+USOWR: 0,2

OK
AT+USOWR=0,22,"7B2276616C7565223A2048656C6C6F20576F726C647D"

+USOWR: 0,22

OK
AT+USOWR=0,2,"0D0A"

+USOWR: 0,2

OK
disconnecting.
AT+USOCL=0

OK

最佳答案

免责声明 - 这只是一个建议。我没有设备或帐户来测试/验证这一点。

您是否尝试过在 POST 和服务器之间添加“https://”?

“HTTP/1.1”之前可能还需要一些参数 即

?timeout=60&api-version=2014-01

还有,

client.println("Authorization: SharedAccessSignature sr=https%3A%2F%2F<namespace>.servicebus.windows.net%2F<myeventhubname>&sig=<mysig>&se=<myse>&skn=RootManageSharedAccessKey");

可能不对。尝试删除 前面的 https%3A%2F%2F

最后,您可能还需要发送:

内容类型:application/atom+xml;type=entry;charset=utf-8
主机:你的命名空间.servicebus.windows.net

总的来说:

// Make a HTTP request:
  client.print("POST ");
  client.print("https://");
  client.print(server);
  client.print(path);
  client.print("?timeout=60&api-version=2014-01");
  client.println(" HTTP/1.1");
  client.println("Authorization: SharedAccessSignature sr=<namespace>.servicebus.windows.net/<myeventhubname>&sig=<mysig>&se=<myse>&skn=RootManageSharedAccessKey");
  client.println("Content-Type: application/atom+xml;type=entry;charset=utf-8");
  client.println("Host: <namespace>.servicebus.windows.net");
  client.println();
  client.println("{\"HELLO\"}");
} else {
.......

干杯


添加了 qwerty 的输出后,我没有更多要添加的了。

调制解调器没有(看起来)发送我提供的代码片段中概述的所有内容 如果你向下滚动输出直到你到达

AT+USOCO=0,"<server>.servicebus.windows.net",443

POST 序列接下来开始。

AT+USOWR=0,5,"504F535420"

发送“POST”

调制解调器的下一个输出会跳过“https://”和服务器(即好像代码中缺少以下两行)

client.print("https://");
client.print(server);

而是跳到发送路径、超时和 HTTP/1.1。输出的其余部分也缺少几行的 CR/LF。 它的行为就好像代码实际上是

// Make a HTTP request:
client.print("POST ");
client.print(path);
client.print("?timeout=60&api-version=2014-01");
client.print(" HTTP/1.1");
client.print("Authorization: SharedAccessSignature sr=<namespace>.servicebus.windows.net/<myeventhubname>&sig=<mysig>&se=<myse>&skn=RootManageSharedAccessKey");
client.println("Content-Type: application/atom+xml;type=entry;charset=utf-8");
client.println("Host: <namespace>.servicebus.windows.net");
client.println();
client.println();
client.println("{\"value\": Hello World}");

我不确定是什么导致了这种行为,但引入延迟可能会有所帮助

(此外,如果服务器和路径是常量字符串,不太可能为您的应用程序更改,您可以连接前 6 个 client.print() 语句)

给你:

  // Make a HTTP request:
  client.print("POST https://<myserver>/<mypath>/?timeout=60&api-version=2014-01 HTTP/1.1");
  client.println();
  delay(5);
  client.print("Authorization: SharedAccessSignature sr=<namespace>.servicebus.windows.net/<myeventhubname>&sig=<mysig>&se=<myse>&skn=RootManageSharedAccessKey");
  client.println();
  delay(5);
  client.print("Content-Type: application/atom+xml;type=entry;charset=utf-8");
  client.println();
  delay(5);
  client.print("Host: <namespace>.servicebus.windows.net");
  client.println();
  delay(5);
  client.println();
  delay(5);
  client.print("{\"value\": Hello World}");
  client.println();
}

关于Arduino MKGSM 中的 HTTP POST 到 Eventhub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52327088/

相关文章:

http - 仅将一个文件夹重定向到 HTTPS,将所有其他文件夹重定向到 HTTP

javascript - 调用多个 Google Cloud Run 请求是否会调用容器的新实例

xml - 在 HTTP 中,提示保存和 XML 文件而不是呈现

javascript - 如何使用 JavaScript 向后端发送很长的文本?

javascript - 从具有多个变量的表单构建一个帖子数据结构

ajax - 保护 (ssl) nodejs/express web 服务并使用 $.ajax() 跨域调用它

java - 如何使用 Spring Boot 使用 HTTPS GET 服务

javascript - 如何保护 HTTP POST 请求不被批准的 JavaScript 客户端接收?

c++ - C++ 中的 HttpListener 类?

php - 如何使用 HttpUrlConnection 通过 POST 传递参数