ARDUINO8266 + MQTT +STM32 阿里云设备上报下发 智能配网

之前对接了百度云,继百度云,载入阿里云alink写协议,也就是说mqtt,被阿里规定了 一种格式 首先准备 点击下载 [还有技小新的工具 个人感觉非常好用]点击下载(https://download..net/download/weixin_43233189/11560931) 下面说一下 阿里云端搭建 之后创建设备 配置产品 配置设备 之后打开mqtt编程工具 这个软件不只是阿里云能用 其他都可可以用 开启透传就行 非常暴力 下面说一下8266程序 智能配网

/*********************************智能配网**************************************/
void smartConfig()
{
          
   
  Serial.println("SmartConfig begin");
  WiFi.mode(WIFI_STA);
  WiFi.beginSmartConfig();
  while (1)
  {
          
   
    delay(200);
 
    Serial.print(".");
    digitalWrite(2, 0);
    delay(200);
    digitalWrite(2, 1);
    delay(200);
    if (WiFi.smartConfigDone())
    {
          
   
      EEPROM.begin(512);
      CONFIG buf;
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s
", WiFi.SSID().c_str());
      Serial.printf("PSW:%s
", WiFi.psk().c_str());
      strcpy(buf.ssid,  WiFi.SSID().c_str());
      strcpy(buf.password, WiFi.psk().c_str());
      EEPROM.put<CONFIG>(0, buf);
      EEPROM.commit();
      delay(1000);
      break;
    }
  }
}

连接wifi,拥有断电不用配置的功能 ···

数据处理

void mqttIntervalPost()
{
   

  strcpy(c,inputString.c_str());
     
    //sprintf(param, inputString.c_str());
    sprintf(jsonBuf, ALINK_BODY_FORMAT, c);
    Serial.println(jsonBuf);
    boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    Serial.print("publish:0失败;1成功");
     
    Serial.println(d);
    if(d==1){
      inputString = "";
     
      }
   
}
void serial() {
  if(stringComplete ==  false){
  while (mySerial.available()) {
    
    char inChar = (char)mySerial.read();
    inputString += inChar;
     
    if (inChar == 
) {
      stringComplete = true;
    }
  }
}
}

shuoyixia 原型:char strcpy(char dest, const char src); 功能:把src所指由’’结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回:指向dest的指针。 注意:当src串长度>dest串长度时,程序仍会将整个src串复制到dest区域,可是dest数组已发生溢出。因此会导致dest栈空间溢出以致产生崩溃异常。当达到最大尺寸时,它只是停止复制字符。 函数原型:char strcat(char des, char src), 函数功能:把src所指向的字符添加到dest结尾处(覆盖原dest结尾处的’’),并添加新的’’。 说明:des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。

而且 存字符的数组最好不要在loop里定义容易死机

(https://blog..net/MOU_IT/article/details/88975116)

回调函数json处理

void callback(char *topic, byte *payload, unsigned int length)
{
    //Serial.print("Message arrived [");
    //Serial.print(topic);
    //Serial.print("] ");
    payload[length] = ;
    //Serial.println((char *)payload);

 message= (char *)payload;
 /************************************json 数据处理********************************************/
 DynamicJsonBuffer jsonBuffer;
 JsonObject & root = jsonBuffer.parseObject(message);
String output =  root[String("params")];
 Serial.println(output);
}

之后就是主函数

void loop()
{
 serial();
    if (millis() - lastMs >= 5000)
    {
        lastMs = millis();
        mqttCheckConnect(); 

        /* 上报消息心跳周期 */
        mqttIntervalPost();
        
        stringComplete = false;
        ESP.wdtFeed();
    }

   client.loop();
    
  }

stm32那边只需要发过来一个字符串就好了 这种格式{“IndoorTemperature”:28,“CurrentHumidity”:50} 之后电脑端就是有数据了 之后生产app 要关联物联网 然后就是拖拽操作了 大致流成就是这 ,欢迎

经验分享 程序员 微信小程序 职场和发展