ESP8266在阿里云上线(arduino)

电脑连接上ESP8266的板子
在arduino编写代码(arduino按照之前的配置,已安装好esp的开发板和几个库ArduinoJson我选了5.的版本,PubSubclient,Crypto,AliyunIoTSDK并且修改pubsubclient的参数)
在项目,加载库,管理库中搜索安装即可
在这里插入图片描述
修改pubsubclient的参数,进入目录(不同安装环境可能稍有不同),用记事本打开C:\Users\Administrator\Documents\Arduino\libraries\PubSubClient\src\PubSubClient.h
找到此处进行更改,如果已经打开arduino,关闭重新打开一次

// MQTT_VERSION : Pick the version
//#define MQTT_VERSION MQTT_VERSION_3_1
#ifndef MQTT_VERSION
#define MQTT_VERSION MQTT_VERSION_3_1_1
#endif
// MQTT_MAX_PACKET_SIZE : Maximum packet size
#ifndef MQTT_MAX_PACKET_SIZE
#define MQTT_MAX_PACKET_SIZE 1024
#endif
// MQTT_KEEPALIVE : keepAlive interval in Seconds
#ifndef MQTT_KEEPALIVE
#define MQTT_KEEPALIVE 300
#endif
// MQTT_SOCKET_TIMEOUT: socket timeout interval in Seconds
#ifndef MQTT_SOCKET_TIMEOUT
#define MQTT_SOCKET_TIMEOUT 60
#endif

下面新建arduino的文件,代码如下,参考文章https://blog.csdn.net/dpjcn1990/article/details/117549363

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>

const char* WIFI_SSID     = "xxx"; // WiFi账号密码,注意wifi有时候5G频的不行要连24的
const char* WIFI_PASSWORD = "xxxx"; // WiFi密码

/******************产品/设备配置(每个人需要根据自己的产品设备信息去动态更换)**********************/
#define PRODUCT_KEY "a1hyxxxx"  //产品key  从产品详情获取
#define DEVICE_NAME "LEDxxxx"  //设备deviceName  从设备详情获取
// 服务端相关
#define MQTT_SERVER   PRODUCT_KEY ".iot-as-mqtt.cn-shanghai.aliyuncs.com" //阿里云MQTT服务地址
#define MQTT_PORT     1883                                               //MQTT服务端口
// 校验三元组
#define MQTT_CLIENT_ID  DEVICE_NAME "|securemode=2,signmethod=hmacsha1|" //mqtt clientid
#define MQTT_USERNAME   DEVICE_NAME "&" PRODUCT_KEY                      //mqtt username
#define MQTT_PASSWORD   "A223500DBC4xxxxxxxx"       //mqtt password 通过生成工具获得,工具中clientID就填DEVICE_NAME
// 相关主题 自定义一个主题
#define TOPIC1 "/a1hyxxxx/LEDxxxx/thing/service/OpenDevice"
/*************************************************************************************************/

void mqtt_callback (char* topic, byte* payload, unsigned int length);
void doWiFiTick();
void connect_wifi();
void connectToMqtt();
const __FlashStringHelper* connectErrorToString(int8_t code);

WiFiClient client;
PubSubClient mqttclient(MQTT_SERVER, MQTT_PORT, &mqtt_callback, client);

bool ICACHE_FLASH_ATTR connectHTTPS() {
  Serial.print("connecting to ");
  Serial.println(MQTT_SERVER);
  if (!client.connect(MQTT_SERVER, MQTT_PORT)) {
    Serial.println(F("connection failed"));
    return false;
  }
  else {
    Serial.println(F("connection succeed"));
    return true;
  }
}

void setup() {
  // put your setup code here, to run once:
  delay(2000);
  Serial.begin(115200);
//  Serial.print("MQTT_SERVER:");
//  Serial.println(MQTT_SERVER);
//  Serial.print("MQTT_CLIENT_ID:");
//  Serial.println(MQTT_CLIENT_ID);
//  Serial.print("MQTT_USERNAME:");
//  Serial.println(MQTT_USERNAME);
//  Serial.print("TOPIC1:");
//  Serial.println(TOPIC1);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.println("");
}

void loop() {
  // put your main code here, to run repeatedly:
  ESP.wdtFeed();
  doWiFiTick();
  if (WiFi.status() == WL_CONNECTED) {
    connectToMqtt();
    mqttclient.loop();
  }
  delay(2000);
}

/**
 * 功能:连接到WiFi热点
 */
void connect_wifi() {
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.print(F("\nWiFi connected to "));
  Serial.println(WIFI_SSID);
  Serial.print(F("IP address: "));
  Serial.println(WiFi.localIP());
}

/**
 * 功能:连接到Mqtt
 */
void connectToMqtt() {
  if (mqttclient.connected()) {
   return;
  }

  Serial.print(F("Connecting to MQTT... "));

  int8_t ret;
  uint8_t retries = 3;

  while (!mqttclient.connect(MQTT_CLIENT_ID, MQTT_USERNAME,MQTT_PASSWORD)) { // connect will return true for connected
      Serial.println(connectErrorToString(mqttclient.state()));
      Serial.println(F("Retrying MQTT connection in 5 seconds..."));
      mqttclient.disconnect();
      delay(5000);  // wait 5 seconds
      retries--;
      if (retries == 0) {
        // basically die and wait for WDT to reset me
        while (1);
      }
      yield();
  }
  Serial.println(F("Success!"));
  // 订阅主题
  mqttclient.subscribe(TOPIC1);

}

/**
 * 功能:连接路由心跳函数
 */
void doWiFiTick() {
  static bool taskStarted = false;
  static bool startSTAFlag = false;
  static uint32_t lastWiFiCheckTick = 0;

  if (!startSTAFlag) {
    startSTAFlag = true;

    Serial.print("connect to ap:");
    Serial.println(WIFI_SSID);
    WiFi.disconnect();
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap());
  }

  //未连接1s重连
  if ( WiFi.status() != WL_CONNECTED ) {
    if (millis() - lastWiFiCheckTick > 1000) {
      lastWiFiCheckTick = millis();
      Serial.print(".");
    }
  }
  //连接成功建立
  else {
    if (taskStarted == false) {
      taskStarted = true;
      Serial.print("\r\nGet IP Address: ");
      Serial.println(WiFi.localIP());
    }
  }
}

/**
 * 功能:MQTT回调
 * 参数:
 *   1. topic   主题
 *   2. payload 载体
 *   3. length  载体长度
 */
void mqtt_callback (char* topic, byte* payload, unsigned int length) {
  byte *end = payload + length;
  for (byte *p = payload; p < end; ++p) {
    Serial.print(*((const char *)p));
  }
  Serial.println("");
  parseMqttResponse((char *)payload);
}

/**
 * 解析mqtt数据
 */
void parseMqttResponse(char* payload){
   Serial.println("start parseOneNetMqttResponse");
   StaticJsonBuffer<100> jsonBuffer;
     // StaticJsonBuffer 在栈区分配内存   它也可以被 DynamicJsonBuffer(内存在堆区分配) 代替
     // DynamicJsonBuffer  jsonBuffer;
   JsonObject& root = jsonBuffer.parseObject(payload);

     // Test if parsing succeeds.
   if (!root.success()) {
       Serial.println("parseObject() failed");
       return ;
   }

   //String deviceName = root["dn"];
   //int status = root["s"];
   String method = root["method"];
   Serial.println(method);

//   if(strcmp(DEVICE_NAME,deviceName.c_str())== 0){
//        if (status == 1) {
//            digitalWrite(LED_BUILTIN, LOW);
//        } else {
//            digitalWrite(LED_BUILTIN, HIGH);
//        }
//    }
    if (method == "thing.service.CloseDevice") {
            digitalWrite(LED_BUILTIN, HIGH);
        } else {
            digitalWrite(LED_BUILTIN, LOW);
        }
}

/**
 * 功能:打印错误
 * 参数:
 *   1. code   错误码
 */
const __FlashStringHelper* connectErrorToString(int8_t code) {
   switch (code) {
      case 1: return F("The Server does not support the level of the MQTT protocol requested");
      case 2: return F("The Client identifier is correct UTF-8 but not allowed by the Server");
      case 3: return F("The MQTT service is unavailable");
      case 4: return F("The data in the user name or password is malformed");
      case 5: return F("Not authorized to connect");
      case 6: return F("Exceeded reconnect rate limit. Please try again later.");
      case 7: return F("You have been banned from connecting. Please contact the MQTT server administrator for more details.");
      case -1: return F("Connection failed");
      case -2: return F("Failed to subscribe");
      case -3: return F("Connection Lost");
      case -4: return F("Connection Timeout");
      default: return F("Unknown error");
   }
}

arduino代码中这一行信息,用此签名工具计算得出,双击sign的网页

#define MQTT_PASSWORD   "A223500DBC4xxxxxxxx"       //mqtt password 通过生成工具获得,工具中clientID就填DEVICE_NAME

在这里插入图片描述
其中productKey和devicename,devicSecret在阿里云的设备管理页面都可以获取,clientID和devicename一致,timestamp可以不填,生成即可
在这里插入图片描述
在这里插入图片描述
上传,编译验证就可以发现阿里云的网页上该设备上线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/675283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个通道,用友BIP获取全量九类电子凭证

在数字化时代&#xff0c;企业运营的效率和准确性已成为衡量竞争力的关键指标。用友BIP电子凭证3.0&#xff0c;作为企业数字化转型的得力助手&#xff0c;以其独特的全通道能力&#xff0c;为企业提供了一站式的电子凭证获取和管理解决方案。这一创新技术不仅简化了繁琐的凭证…

Linux【安全 02】OpenSSH漏洞修复(离线升级最新版本流程)网盘分享3个安装包+26个离线依赖

OpenSSH离线升级最新版本流程 1. 漏洞信息2. 环境说明3.依赖安装3.1 在线安装3.2 离线安装 4.备份卸载4.1 备份4.2 卸载旧版本 5.安装5.1 zlib5.2 ssl5.3 openssh5.3.1 安装5.3.2 配置 6.脚本整理7.文件资源 本文仅针对CentOS7.8版本&#xff0c;其他版本未测试&#xff0c;安装…

电脑的kernelbase.dll故障怎么处理?kernelbase.dll是什么文件

遇到由于“kernelbase.dll”文件出错导致的应用程序崩溃或系统不稳定的问题。这种情况不仅会影响工作效率&#xff0c;还可能导致数据损失或更严重的系统问题。kernelbase.dll是Windows操作系统中的一个关键系统文件&#xff0c;它包含了多个执行基础系统功能的程序代码。因此&…

千锋教育大优惠

IT全学科自学至尊卡&#xff08;3年卡&#xff09; Linux云计算运维、Python全栈、数据分析、人工智能、Java、大前端、网络安全、物联网、全媒体、影视剪辑等14大主流方向&#xff0c;300精品视频课程免费学。课程持续更新&#xff0c;电脑端手机APP小程序多平台无忧畅学&…

认购期权是什么?与认沽期权有何区别

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;交易两个方向认购期权做多&#xff0c;认沽期权做空&#xff0c;双向t0交易没了&#xff0c;跟期货一样&#xff0c;对的&#xff0c;玩的也是合约&#xff0c;唯一区别没有保证金不会爆仓&a…

【Python实战】使用postman测试flask api接口

cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求&#xff1a;用户需要先登陆&#xff0c;登陆之后&#xff0c;通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…

XYkeep健身小程序基于FastAdmin+ThinkPHP+UniApp

应用介绍 本文来自&#xff1a;XYkeep健身小程序基于FastAdminThinkPHPUniApp - 源码1688 基于FastAdminThinkPHPUniApp&#xff08;目前仅支持微信小程序和公众号&#xff09;开发的健身相关行业微信小程序&#xff0c;程序适用于健身房、瑜伽馆、游泳馆、篮球馆等健身培训场…

深度学习入门-第3章-神经网络

前面的待补充 3.6 手写数字识别 3.6.1 MNIST 数据集 本书提供了便利的 Python 脚本 mnist.py &#xff0c;该脚本支持从下载 MNIST 数据集到将这些数据转换成 NumPy 数组等处理&#xff08;mnist.py 在 dataset 目录下&#xff09;。 使用 mnist.py 时&#xff0c;当前目录必须…

Zabbix嵌入第三方页面遇到的沙盒sandbox问题,一招解决

Zabbix想要嵌入第三方的界面遇到的沙盒问题&#xff0c;一招解决sandbox 1 浏览器显示&#xff1a; Blocked script execution in ‘’ because the document’s frame is sandboxed and the ‘allow-scripts’ permission is not set.Understand this error quota.html:1 Blo…

轻松实现微信内下载,Xinstall让你的App推广更高效!

在微信中推广App&#xff0c;你是否遇到过这样的困扰&#xff1a;推广链接被微信拦截&#xff0c;用户需要手动复制链接到浏览器才能下载&#xff0c;大大降低了安装率&#xff1f;今天&#xff0c;我们要介绍的Xinstall&#xff0c;就是一款能够解决这一痛点的神器&#xff01…

千万不能踏入的SaaS合作伙伴计划三大误区!

启动一个非常基础的合作伙伴计划并不难……但这也使得人们很容易忽视启动真正成功的计划所需的一些最关键的步骤。在本文中&#xff0c;林叔将介绍在启动新合作伙伴计划时最常犯的错误。同时&#xff0c;我会教你如何避免每一个错误&#xff0c;并为你的计划设定成功的基础。 设…

百度百科人物百科修改注意事项

在修改百度百科人物百科时&#xff0c;百科优化网yajje分享需要注意以下几个方面&#xff1a; 参考资料的选择和使用 选择权威参考资料&#xff1a;在修改过程中&#xff0c;参考资料的选择至关重要。应尽可能从靠谱的来源寻找资料&#xff0c;如教科书、国家标准或公文、学术…

getway整合sentinel流控降级

3. 启动sentinel控制台增加流控规则&#xff1a; 根据API分组进行流控&#xff1a; 1.设置API分组&#xff1a; 2.根据API分组进行流控&#xff1a; 自定义统一异常处理&#xff1a; nginx负载配置&#xff1a;

gitee和github的协同

假设gitee上zhaodezan有一个开发库&#xff0c;但是从andeyeluguo上拉取最新的&#xff08;从github上同步过来最新的&#xff09; git remote add dbgpt_in_gitee https://gitee.com/andeyeluguo/DB-GPT.git remote -v git pull --rebase dbgpt_in_gitee main 有冲突可能需要…

用友NC pagesServlet SQL注入致RCE漏洞复现(XVE-2024-13067)

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /portal/pt/servlet/pagesServlet/doPost接口…

CV Method:经典CNN Backbone总结

文章目录 前言一、ResNet二、ResNeXt三、Res2Net四、SeNet五、ResNeSt六、DenseNet七、CSPNetPytorch Model Code总结 前言 Backbone作为一切深度学习任务的基础&#xff0c;不论是理论还是实际应用都有重要的意义&#xff0c;本文针对经典Backbone进行总结&#xff0c;这些Ba…

【QT5】<总览一> QT环境搭建、快捷键及编程规范

文章目录 前言 一、简单介绍QT 二、安装QT Creator 三、第一个QT项目 四、常用快捷键 五、QT中的编程规范 前言 在嵌入式Linux应用层开发时&#xff0c;经常使用QT作为图形化界面显示工具。为学习Linux下的QT编程&#xff0c;在Ubuntu和开发板中搭建QT开发环境&#xff…

纠偏控制比例换向阀放大器

纠偏控制比例换向阀放大器是一种用于提高工业自动化控制系统精度和可靠性的关键组件。在现代工业生产中&#xff0c;精确控制生产线上材料的运行轨迹对于确保产品质量和提高生产效率至关重要。伺服阀根据接收到的信号推动设备进行相应的移动&#xff0c;直到材料边缘回到目标位…

推荐低成本低功耗的纯数字现场可重构IC

CPLD采用CMOS EPROM、EEPROM、快闪存储器和SRAM等编程技术&#xff0c;从而构成了高密度、高速度和低功耗的可编程逻辑器件。 RAMSUN提供的型号LS98003是通用可配置的数字逻辑芯片&#xff0c;有体积小、超低功耗和高可靠性等特点。客户可以根据自己的功能需求设计芯片&#x…

中介模式实现聊天室

中介者模式的核心逻辑就是解耦对象‘多对多’的相互依赖关系。当遇到一大堆混乱的对象呈现“网状结构”&#xff0c;利用通过中介者模式解耦对象之间的通讯。 代码案例 抽象中介类 public abstract class AbstractChatRoom {public abstract void notice(String message , Us…