1、esp32(arduino)接入阿里云MQTT及数据处理

esp32(arduino)接入阿里云MQTT服务器

    • 1、遇到的问题和需求
    • 2、解决方案
      • 2.1、系统框图
      • 2.2、待测产品
      • 2.3、采集器
      • 2.3、网关
      • 2.4、服务器
      • 2.5、数据库
      • 2.6、客户端
    • 3、阿里云设置
    • 4、MQTT.fx模拟硬件接入阿里云
    • 5、采集器配置
    • 6、客户端

1、遇到的问题和需求

工作中如果产品在异地,会遇到无法实时获取数据的问题。
在一些特定设备中,有获取实时数据的需求,并自动报警等服务。
这两类需求的特点是:
1、目标明确
2、需长时间监控
3、数据实时监控和服务
4、数据存储和查看
很容易想到物联网模式来满足以上需求

2、解决方案

2.1、系统框图

1、esp32(arduino)接入阿里云MQTT及数据处理_第1张图片
1、数据从采集器-网关-服务器-数据库
2、客户端访问服务器获取数据库内的数据
3、服务器设置门限,根据数据对采集器做出相应调整:报警、开关等

2.2、待测产品

适用于大部分长期监测的电子属性产品。
使用场景如批量老化监测、运行监测、无人值守运行等。

2.3、采集器

ESP32s及传感器。

2.3、网关

暂无,采集设备直接接入阿里云目前来看并没有劣势。有明显缺点时再改进

2.4、服务器

阿里云
详细介绍请看官网:
https://help.aliyun.com/document_detail/125800.html
红线目前用到的部分
1、esp32(arduino)接入阿里云MQTT及数据处理_第2张图片

2.5、数据库

不懂。暂用阿里云自带的,后期可以开发。
1、esp32(arduino)接入阿里云MQTT及数据处理_第3张图片

2.6、客户端

不懂。暂用阿里云自带的web界面。但发布流程繁琐。
1、esp32(arduino)接入阿里云MQTT及数据处理_第4张图片

3、阿里云设置

从注册到创建产品、功能定义、创建设备,这3项操作参考教程。
创建产品 https://help.aliyun.com/document_detail/73728.html?spm=a2c4g.11186623.6.571.134d6151QxieXC
创建设备 https://help.aliyun.com/document_detail/73729.html?spm=a2c4g.11186623.6.573.34d17b7bxnxTze
这部分网络资源很多,多点点会发现一些妙用,自己探索。

4、MQTT.fx模拟硬件接入阿里云

1、esp32(arduino)接入阿里云MQTT及数据处理_第5张图片
官网的教程如下:
https://help.aliyun.com/document_detail/86706.html?spm=a2c4g.11186623.2.13.1098102bCu4RjV#concept-d3l-fw3-p2b

这里123456耐心阅读教程填写即可,7需要运算工具,下载官方的工具算出一串大写十六进制密码。填入即可。若参数错误,可以查看Log标签页的提示。
2020-02-17更正:似乎教程中的Password生成小工具生成的密码有误。我转发一个可靠的。
链接:https://pan.baidu.com/s/1sGLjzK8u5J-G_szsHR_1_A
提取码:gi62

1、esp32(arduino)接入阿里云MQTT及数据处理_第6张图片
1、esp32(arduino)接入阿里云MQTT及数据处理_第7张图片
登录成功后,在Subscribe页面订阅我们的topic,
默认属性设置/sys/a1f6TiEmfUj/esp32001/thing/service/property/set

fx设置好后,我们登录阿里云,在在线调试中主动下发一条配置信息。
1、esp32(arduino)接入阿里云MQTT及数据处理_第8张图片
发送成功后,回到fx的Subscribe页面,可以见到已收到的消息,模仿其格式。
params之后的内容为必要的属性参数,后面我们增加参数可用同样的方式,先fx登录,订阅,再阿里云发布,就可以得到格式。
1、esp32(arduino)接入阿里云MQTT及数据处理_第9张图片
复制红括号内的信息至Publish页面,顺便改个值。填入订阅的topic:/sys/a1f6TiEmfUj/esp32001/thing/event/property/post,粘贴发送内容,点击publish,就模拟了一次硬件上传信息。
1、esp32(arduino)接入阿里云MQTT及数据处理_第10张图片
在阿里云设备中可以看到数据已刷新。
1、esp32(arduino)接入阿里云MQTT及数据处理_第11张图片
我们实现了信息上传,希望服务器来统一设置阈值和报警措施,如温度超过50就亮一颗LED灯。需要在场景联动中设置触发条件,和执行动作。可以参考教程。https://help.aliyun.com/document_detail/85231.html?spm=5176.11485173.0.0.242e59af5FJ8hG
1、esp32(arduino)接入阿里云MQTT及数据处理_第12张图片

5、采集器配置

这是一个温度5秒上传一次的demo,超过50都就亮灯。
硬件:esp32s
环境:arduino 1.8.10
库:PubSubClient.h (需要参数修改)
ArduinoJson.h (V5版)
WiFi.h 等

		ArduinoJson.h    (V5版)的解读可以参考
https://blog.csdn.net/weixin_30376083/article/details/96227469
#include <PubSubClient.h>
/* 依赖 PubSubClient 2.4.0 */
#include <ArduinoJson.h>
/* 依赖 ArduinoJson 5.13.4 */


#include <ETH.h>
#include <WiFi.h>
#include <WiFiAP.h>
#include <WiFiClient.h>
#include <WiFiGeneric.h>
#include <WiFiMulti.h>
#include <WiFiScan.h>
#include <WiFiServer.h>
#include <WiFiSTA.h>
#include <WiFiType.h>
#include <WiFiUdp.h>
#define LED_BUILTIN    2

/* 连接您的WIFI SSID和密码 */
#define WIFI_SSID        "TP-LINK_3C89BC"//替换自己的WIFI
#define WIFI_PASSWD      "12345678"//替换自己的WIFI

/* 设备证书信息*/
#define PRODUCT_KEY       "a1f6TdEmfUj"
#define DEVICE_NAME       "esp32001"
#define DEVICE_SECRET     "emrzGojShykbth6fICoU01fTuYRtopex"
#define REGION_ID         "cn-shanghai"

/* 线上环境域名和端口号,不需要改 */
#define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT         1883
#define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY

#define CLIENT_ID         "B4E62DFB29AD|securemode=3,signmethod=hmacsha1|"
// 请使用以上说明中的加密工具或参见MQTT-TCP连接通信文档加密生成password。
// 加密明文是参数和对应的值(clientIdesp8266deviceName${deviceName}productKey${productKey}timestamp1234567890)按字典顺序拼接
// 密钥是设备的DeviceSecret
#define MQTT_PASSWD       "8E7F4227E9FF4C23673A479C617047AB1DEAF3E3"

#define ALINK_BODY_FORMAT         "{\"id\":\"laohuajia-001\",\"version\":\"1.0.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"

unsigned long lastMs = 0;
int LEDsw  = 1;
int wendu = 0;
WiFiClient espClient;
PubSubClient  client(espClient);

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

  StaticJsonBuffer<400> jsonBuffer1;
  JsonObject& root1 = jsonBuffer1.parseObject((char *)payload);
  if (!root1.success()) {
    Serial.println("parseObject()1 failed");
    Serial.println("END");
    return;
  }
  const char* mmethod = root1["method"];
  Serial.println(mmethod);
  long mid = root1["id"];
  Serial.println(mid);
  String message = root1["params"];
  Serial.println(message);

  StaticJsonBuffer<400> jsonBuffer2;
  JsonObject& root2 = jsonBuffer2.parseObject(message);
  if (!root2.success()) {
    Serial.println("parseObject()2 failed");
    Serial.println("END");
    return;
  }
  int mLightSwitch = root2["LightSwitch"];
  Serial.println(mLightSwitch);
  LEDsw = mLightSwitch;
}

void wifiInit()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWD);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("WiFi not Connect");
  }

  Serial.println("Connected to AP");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("espClient [");
  client.setServer(MQTT_SERVER, MQTT_PORT);   /* 连接WiFi之后,连接MQTT服务器 */
  client.setCallback(callback);
}

void mqttCheckConnect()
{
  while (!client.connected())
  {
    Serial.println("Connecting to MQTT Server ...");
    if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))
    {
      Serial.println("MQTT Connected!");
    }
    else
    {
      Serial.print("MQTT Connect err:");
      Serial.println(client.state());
      delay(5000);
    }
  }
}

void mqttIntervalPost()
{
  char param[32];
  char jsonBuf[128];
  sprintf(param, "{\"CurrentTemperature\":%d}", wendu);
  sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
  Serial.println(jsonBuf);
  boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
  Serial.print("publish:0=失败;1=成功    publish:");
  Serial.println(d);
  if (wendu<100){
    wendu = wendu +5;
  }
}

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  //  pinMode(SENSOR_PIN,  OUTPUT);
  /* initialize serial for debugging */
  Serial.begin(115200);
  Serial.println("Start");
  wifiInit();
}

// the loop function runs over and over again forever
void loop()
{
  if (millis() - lastMs >= 5000)
  {
    lastMs = millis();
    mqttCheckConnect();
    /* 上报消息心跳周期 */
    mqttIntervalPost();
  }

  client.loop();
  if (LEDsw == 0) {
    Serial.println("led_off");
    Serial.println(LEDsw);
    digitalWrite(LED_BUILTIN, LOW);
  } else  if (LEDsw == 1) {
    Serial.println(LEDsw);
    Serial.println("led_on");
    digitalWrite(LED_BUILTIN, HIGH);
  }
  delay(5000);
}

将自己账户的参数和发送的信息写入文本中。剩下的就是数据利用,阿里云提供了大量范例

6、客户端

阿里云自带的自制WEB可视化界面。入口在
1、esp32(arduino)接入阿里云MQTT及数据处理_第13张图片

简单的显示效果,网址发布比较困难。
1、esp32(arduino)接入阿里云MQTT及数据处理_第14张图片
1、esp32(arduino)接入阿里云MQTT及数据处理_第15张图片
大规模应用可以套用已有的范例,可以自己探索。
1、esp32(arduino)接入阿里云MQTT及数据处理_第16张图片

你可能感兴趣的:(ESP32,arduino,mqtt,物联网,阿里云,arduino)