Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用MQTT和ESP8266订阅Azure设备双胞胎_Azure_Mqtt_Azure Iot Hub_Arduino Esp8266_Azure Management Api - Fatal编程技术网

无法使用MQTT和ESP8266订阅Azure设备双胞胎

无法使用MQTT和ESP8266订阅Azure设备双胞胎,azure,mqtt,azure-iot-hub,arduino-esp8266,azure-management-api,Azure,Mqtt,Azure Iot Hub,Arduino Esp8266,Azure Management Api,在过去的一个月里,我一直在研究Azure设备双胞胎。主要目标是订阅三个设备双路径,以便所需属性的任何更改都会导致在串行监视器上显示通知,并且所需属性将被解析并作为报告属性提供。我正在NodeMCU上运行代码,我面临的问题是,设备连接到IoTHub并发布数据,但未显示或解析设备中的任何更改。当MQTT用户名中添加了api version=2016-11-14时,设备孪生会工作,只要我在用户名中添加了api版本,它就会给出错误failed rc=-1。下面给出了我正在使用的代码 #include &

在过去的一个月里,我一直在研究Azure设备双胞胎。主要目标是订阅三个设备双路径,以便所需属性的任何更改都会导致在串行监视器上显示通知,并且所需属性将被解析并作为报告属性提供。我正在NodeMCU上运行代码,我面临的问题是,设备连接到IoTHub并发布数据,但未显示或解析设备中的任何更改。当MQTT用户名中添加了api version=2016-11-14时,设备孪生会工作,只要我在用户名中添加了api版本,它就会给出错误failed rc=-1。下面给出了我正在使用的代码

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <WiFiClientSecure.h>
const char mqtt_client[] = "test-device1";
const char mqtt_server[] = "HyperNet-IoTHub-Azure-Sphere.azure-devices.net";
const int mqtt_port = 8883;
const char mqtt_user[] = "HyperNet-IoTHub-Azure-Sphere.azure-devices.net/test-device1/api-version=2016-11-14";


void callback(char* topic, byte* payload, unsigned int length);

WiFiClientSecure WiFiclient;
PubSubClient client(WiFiclient);
void callback(char* topic, byte* payload, unsigned int length);
void parseDesiredProperties(byte* payload);

unsigned long previousMillis = 0;
long interval = 5000;
void reconnect();

void setup(){
  Serial.begin(9600);
  delay(250);
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);
  WiFi.disconnect();
  delay(100);
  WiFi.mode(WIFI_STA);
  Serial.println("Connecting To Wi-Fi: " + String(ssid));
  WiFi.begin(ssid,pass);
  while(WiFi.status() !=WL_CONNECTED){
    delay(500);
    Serial.print("..");
  }
  Serial.println(" ");
  Serial.println("Wi-Fi Connected");
}

void loop(){
  if(!client.connected()){
    reconnect();
  }
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= interval){
    previousMillis = currentMillis;
    float value1 = 12.3;
    float value2 = 13.6;
    String postData = "{\"testvalue1\":" + String(value1) + ",\"testvalue2\":" + String(value2) +"}";
    char postBuffer[postData.length()+1];
    postData.toCharArray(postBuffer, postData.length()+1);
    Serial.println(postBuffer);
    client.publish("devices/test-device1/messages/events/", postBuffer);
  }

  client.loop();

}

void reconnect(){
  WiFiclient.setInsecure();
  while(!client.connected()){
    Serial.println("Attempting MQTT Connection");
    if (client.connect(mqtt_client, mqtt_user, mqtt_pass)) {
      Serial.println("connected");
      client.subscribe("devices/test-device1/messages/devicebound/#");
      // subscribe to operation responses
      client.subscribe("$iothub/twin/res/#");
      // subscribe to desired property updates
      client.subscribe("$iothub/twin/PATCH/properties/desired/#");
    } 
    else {
     Serial.print("failed, rc=");
     Serial.print(client.state());
     Serial.println(" try again in 5 seconds");
     delay(5000);
    }  
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("MQTT message arrived on topic: ");
  Serial.println(topic);
  if (String(topic).startsWith("$iothub/twin/PATCH/properties/desired")) {
    parseDesiredProperties(payload);  
  }   
}

void parseDesiredProperties(byte* payload) {

  JsonObject& root = jsonDesiredProperties.parseObject(payload);
  if(root.success()) {
    Serial.println("Parsed desired properties");
    int newMillis=root["reportInterval"];
    if(newMillis > 2999 && newMillis < 120001) {
      interval = newMillis;
      String postProperty = "{\"reportInterval\":" + String(newMillis) + "}";
      char postBuffer[postProperty.length()+1];
      postProperty.toCharArray(postBuffer, postProperty.length()+1);
      client.publish("$iothub/twin/PATCH/properties/reported/?$rid=1", postBuffer);
      Serial.print("Set new interval to: ");
      Serial.println(newMillis);
    }
   } 
   else {
    Serial.println("Could not parse desired properties");
   }
}
#包括
#包括
#包括
#包括
const char mqtt_客户端[]=“测试设备1”;
const char mqtt_server[]=“HyperNet IoTHub Azure Sphere.Azure devices.net”;
常量int mqtt_port=8883;
const char mqtt_user[]=“HyperNet IoTHub Azure Sphere.Azure devices.net/test-device1/api version=2016-11-14”;
无效回调(字符*主题,字节*有效负载,无符号整数长度);
WiFiClientSecure WiFiclient;
PubSubClient客户端(WiFiclient);
无效回调(字符*主题,字节*有效负载,无符号整数长度);
无效parseDesiredProperties(字节*有效负载);
无符号long-previousMillis=0;
长间隔=5000;
无效重新连接();
无效设置(){
Serial.begin(9600);
延迟(250);
设置服务器(mqtt_服务器,8883);
client.setCallback(callback);
WiFi.disconnect();
延迟(100);
WiFi.模式(WiFi_STA);
Serial.println(“连接到Wi-Fi:+字符串(ssid));
WiFi.begin(ssid,pass);
while(WiFi.status()!=WL_已连接){
延迟(500);
连续打印(“…”);
}
Serial.println(“”);
Serial.println(“Wi-Fi连接”);
}
void循环(){
如果(!client.connected()){
重新连接();
}
无符号长电流毫秒=毫秒();
if(当前毫秒-先前毫秒>=间隔){
前一毫秒=当前毫秒;
浮动值1=12.3;
浮动值2=13.6;
String postData=“{\'testvalue1\”:“+String(value1)+”,“testvalue2\”:“+String(value2)+”}”;
char postBuffer[postData.length()+1];
toCharArray(postBuffer,postData.length()+1);
Serial.println(postBuffer);
发布(“设备/test-device1/messages/events/”,postBuffer);
}
client.loop();
}
void重新连接(){
WiFiclient.setunsecure();
而(!client.connected()){
Serial.println(“尝试MQTT连接”);
if(client.connect(mqtt_客户端、mqtt_用户、mqtt_过程)){
Serial.println(“已连接”);
client.subscribe(“设备/test-device1/messages/devicebound/#”);
//订阅操作响应
client.subscribe($iothub/twin/res/#”);
//订阅所需的属性更新
client.subscribe(“$iothub/twin/PATCH/properties/desired/#”);
} 
否则{
Serial.print(“失败,rc=”);
Serial.print(client.state());
Serial.println(“5秒后重试”);
延迟(5000);
}  
}
}
无效回调(字符*主题,字节*有效负载,无符号整数长度){
打印(“MQTT消息到达主题:”);
序列号println(主题);
if(字符串(主题).startsWith(“$iothub/twin/PATCH/properties/desired”)){
解析所需属性(有效载荷);
}   
}
无效parseDesiredProperties(字节*有效负载){
JsonObject&root=jsonDesiredProperties.parseObject(有效负载);
if(root.success()){
Serial.println(“解析的所需属性”);
int newMillis=root[“reportInterval”];
如果(新密利斯>2999&&newMillis<120001){
间隔=新毫秒;
String postProperty=“{\“reportInterval\”:“+String(newMillis)+”}”;
字符后缓冲区[postProperty.length()+1];
postProperty.toCharArray(postBuffer,postProperty.length()+1);
发布(“$iothub/twin/PATCH/properties/reported/?$rid=1”,postBuffer);
Serial.print(“将新间隔设置为:”);
序列号.println(newMillis);
}
} 
否则{
Serial.println(“无法分析所需的属性”);
}
}

您发布的代码片段似乎不完整。例如,它缺少
jsonDesiredProperties
。您可能遗漏了其他一些内容,但缺少的一个重要内容是证书指纹。IoT Hub只接受安全的MQTT连接,为此,您需要包括的SHA1指纹

您可以下载证书并将其放入文件中,然后使用openssl检索指纹:

openssl x509 -noout -fingerprint -sha1 -inform pem -in [certificate-file.crt]
然后,您的设置方法可以包括指纹:

static const char *fingerprint PROGMEM = "D4 DE 20 D0 5E 66 FC 53 FE 1A 50 88 2C 78 DB 28 52 CA E4 74";

    void setup(){
          Serial.begin(9600);
          delay(250);
          WiFiclient.setFingerprint(fingerprint);
        
          client.setServer(mqtt_server, 8883);
          client.setCallback(callback);
          WiFi.disconnect();
          delay(100);
          WiFi.mode(WIFI_STA);
          Serial.println("Connecting To Wi-Fi");
          WiFi.begin("<REDACTED>","<REDACTED>");
          while(WiFi.status() !=WL_CONNECTED){
            delay(500);
            Serial.print("..");
          }
          Serial.println(" ");
          Serial.println("Wi-Fi Connected");
        }
static const char*fingerprint PROGMEM=“D4 DE 20 D0 5E 66 FC 53 FE 1A 50 88 2C 78 DB 28 52 CA E4 74”;
无效设置(){
Serial.begin(9600);
延迟(250);
WiFiclient.setFingerprint(指纹);
设置服务器(mqtt_服务器,8883);
client.setCallback(callback);
WiFi.disconnect();
延迟(100);
WiFi.模式(WiFi_STA);
Serial.println(“连接到Wi-Fi”);
WiFi.begin(“,”);
while(WiFi.status()!=WL_已连接){
延迟(500);
连续打印(“…”);
}
Serial.println(“”);
Serial.println(“Wi-Fi连接”);
}
我所做的另一个更改是MQTT用户名中包含的API版本。您可以使用
?api version=2018-06-30
,而不是
api version=2016-11-14

我在我的NodeMCU上测试了这些更改,更新报告的twin属性工作得很好!让我知道这是否适合你

dynamicjsonbufferjsondesiredproperties;
DynamicJsonBuffer jsonDesiredProperties;
char ssid[] = "Imran's Phone";
char pass[] = "1234567890";
int status = WL_IDLE_STATUS;

const char mqtt_client[] = "test-device1";
const char mqtt_server[] = "Hypernet-IOF.azure-devices.net";
const int mqtt_port = 8883;
const char mqtt_user[] = "HyperNet-IoF.azure-devices.net/test-device1/2018-06-30";

static const char *fingerprint PROGMEM = "D4 DE 20 D0 5E 66 FC 53 FE 1A 50 88 2C 78 DB 
28 52 CA E4 74";
void callback(char* topic, byte* payload, unsigned int length);

WiFiClientSecure WiFiclient;
PubSubClient client(WiFiclient);
void callback(char* topic, byte* payload, unsigned int length);
void parseDesiredProperties(byte* payload);

unsigned long previousMillis = 0;
long interval = 5000;
void reconnect();

void setup(){
  Serial.begin(9600);
  delay(250);
  WiFiclient.setFingerprint(fingerprint);
  client.setServer(mqtt_server, 8883);
  client.setCallback(callback);
  WiFi.disconnect();
  delay(100);
  WiFi.mode(WIFI_STA);
  Serial.println("Connecting To Wi-Fi: " + String(ssid));
  WiFi.begin(ssid,pass);
  while(WiFi.status() !=WL_CONNECTED){
    delay(500);
    Serial.print("..");
  }
  Serial.println(" ");
  Serial.println("Wi-Fi Connected");
}

void loop(){
  if(!client.connected()){
    reconnect();
  }
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= interval){
    previousMillis = currentMillis;
    float value1 = 12.3;
    float value2 = 13.6;
    String postData = "{\"testvalue1\":" + String(value1) + ",\"testvalue2\":" + 
String(value2) +"}";
    char postBuffer[postData.length()+1];
    postData.toCharArray(postBuffer, postData.length()+1);
    Serial.println(postBuffer);
    client.publish("devices/test-device1/messages/events/", postBuffer);
  }

  client.loop();

}

 void reconnect(){
  WiFiclient.setInsecure();
  while(!client.connected()){
    Serial.println("Attempting MQTT Connection");
    if (client.connect(mqtt_client, mqtt_user, mqtt_pass)) {
      Serial.println("connected");
      client.subscribe("devices/test-device1/messages/devicebound/#");
      // subscribe to operation responses
       client.subscribe("$iothub/twin/res/#");
      // subscribe to desired property updates
      client.subscribe("$iothub/twin/PATCH/properties/desired/#");
    } 
    else {
     Serial.print("failed, rc=");
     Serial.print(client.state());
     Serial.println(" try again in 5 seconds");
     delay(5000);
    }  
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("MQTT message arrived on topic: ");
  Serial.println(topic);
  if (String(topic).startsWith("$iothub/twin/PATCH/properties/desired")) {
    parseDesiredProperties(payload);  
  }   
}

void parseDesiredProperties(byte* payload) {

  JsonObject& root = jsonDesiredProperties.parseObject(payload);
  if(root.success()) {
    Serial.println("Parsed desired properties");
    int newMillis=root["reportInterval"];
    if(newMillis > 2999 && newMillis < 120001) {
  interval = newMillis;
  String postProperty = "{\"reportInterval\":" + String(newMillis) + "}";
  char postBuffer[postProperty.length()+1];
  postProperty.toCharArray(postBuffer, postProperty.length()+1);
  client.publish("$iothub/twin/PATCH/properties/reported/?$rid=1", postBuffer);
  Serial.print("Set new interval to: ");
  Serial.println(newMillis);
}
   } 
   else {
    Serial.println("Could not parse desired properties");
   }
}
char ssid[]=“Imran的手机”; char pass[]=“1234567890”; int状态=WL\U空闲\U状态; const char mqtt_客户端[]=“测试设备1”; const char mqtt_server[]=“Hypernet IOF.azure devices.net”; 常量int mqtt_port=8883; const char mqtt_user[]=“HyperNet IoF.azure devices.net/test-device1/2018-06-30”; 静态常量字符*指纹程序=“D4 DE 20 D0 5E 66 FC 53 FE 1A 50 88 2C 78 DB 28 52 CA E4