我正在尝试设置一个从 Arduino MKR1000 向 Azure IOT 事件中心发送消息的基本示例,但似乎无法让任何在线示例正常工作,而且我是 Arduino 新手。
一个简单的工作示例的任何指针?
我尝试了这个示例并稍微更改为发布消息而不是接收但没有运气。我可以毫无问题地连接到 Wifi,它只是在发布 HTTP 请求时出错,出现“HTTP 错误 411。请求必须分块或具有内容长度”。它似乎也不是最干净的方法,但我只是想暂时启动并运行一些基本的东西来玩:)
代码示例:
#include <SPI.h>
#include <WiFi101.h>
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
const int MKR1000_LED = 6 ;
///*** Azure IoT Hub Config ***///
//see: http://mohanp.com/ for details on getting this right if you are not sure.
char hostname[] = "*****.azure-devices.net"; // host name address for your Azure IoT Hub
char feeduri[] = "/devices/MKR1000/messages/events?api-version=2018-06-30"; //feed URI
char authSAS[] = "SharedAccessSignature sr=******.azure-devices.net%2Fdevices%2FMKR1000&sig=*****&se=******";
///*** Azure IoT Hub Config ***///
unsigned long lastConnectionTime = 0;
const unsigned long pollingInterval = 5L * 1000L; // 5 sec polling delay, in milliseconds
int status = WL_IDLE_STATUS;
WiFiSSLClient client;
void setup() {
Serial.println("setup...");
pinMode(MKR1000_LED, OUTPUT);
//check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
// don't continue:
while (true);
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Wifi connected...");
}
void loop()
{
String response = "";
char c;
///read response if WiFi Client is available
while (client.available()) {
c = client.read();
response.concat(c);
}
if (!response.equals(""))
{
Serial.println(response);
//if there are no messages in the IoT Hub Device queue, Azure will return 204 status code.
if (response.startsWith("HTTP/1.1 204"))
{
//turn off onboard LED
digitalWrite(MKR1000_LED, LOW);
}
else
{
//turn on onboard LED
digitalWrite(MKR1000_LED, HIGH);
}
}
// polling..if pollingInterval has passed
if (millis() - lastConnectionTime > pollingInterval) {
digitalWrite(MKR1000_LED, LOW);
azureHttpRequest("{TEST MESSAGE!}");
}
}
// this method makes an HTTPS connection to the Azure IOT Hub Server:
void azureHttpRequest(String data) {
// close any connection before send a new request.
// This will free the socket on the WiFi shield
client.stop();
// if there's a successful connection:
if (client.connect(hostname, 443)) {
//make the GET request to the Azure IOT device feed uri
client.print("POST "); //Do a GET
client.print(feeduri); // On the feedURI
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(hostname); //with hostname header
client.print("Authorization: ");
client.println(authSAS); //Authorization SAS token obtained from Azure IoT device explorer
//client.println("Connection: close");
client.println("Content-Type: application/json");
client.println("Content-Length: " + data.length());
client.println("\r\n\r\n" + data);
// note the time that the connection was made:
lastConnectionTime = millis();
}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
}
}
编辑:我已经看到有一个完整的 Azure IOT 库和一个简单的 HTTP 示例,但这也没有运行(它通过了 wifi 连接并且调用 azure 失败)但是这个示例项目相当大,我是希望有一个简单的例子可以建立!