我正在使用 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");
可能不对。尝试删除
最后,您可能还需要发送:
内容类型: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 的输出后,我没有更多要添加的了。
调制解调器没有(看起来)发送我提供的代码片段中概述的所有内容 如果你向下滚动输出直到你到达p>
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/