Arduino MKR1000如何将消息发送到Azure IoT中心

时间:2019-03-19 01:40:52

标签: azure arduino iot azure-iot-hub arduino-mkr1000

我正在尝试设置一个从Arduino MKR1000向Azure IOT Event Hub发送消息的基本示例,但是似乎无法使任何在线示例正常工作,并且我是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进行调用),但是此示例项目相当大我希望可以建立一个简单的例子!

https://github.com/Azure/azure-iot-arduino

1 个答案:

答案 0 :(得分:0)

您在这里有一个随时可以使用的示例:https://github.com/firedog1024/mkr1000-iotc

请注意,它使用Azure IoT设备置备服务进行置备,因此您需要setup a DPS instance与IoT中心一起使用。