esp32单片机在arduino环境下,WIFI与阿里云数据传输

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

随着人工智能的不断发展,物联网这门技术也越来越重要,很多人都开启了物联网学习,本文就介绍了物联网的基础内容。

一、三元组是什么?

它是设备的钥匙。设备出厂的时候会将三元组信息放入设备中,在 MQTT 连接的时候通过三元组就可以与物联网平台进行连接、激活、鉴权

二、使用步骤

1.引入库

代码如下(示例):

#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include "PubSubClient.h"
#include "WiFi.h"
#include "Ticker.h"

2.读入数据

#include <Arduino.h>
#include <ArduinoJson.h>
#include <aliyun_mqtt.h>
#include "PubSubClient.h"
#include "WiFi.h"
#include "Ticker.h"

#define WIFI_SSID "naitekale"                //wifi名
#define WIFI_PASSWD "naitekale3366"          //wifi密码

#define PRODUCT_KEY "gul7nX3bSvX"                             //产品ID
#define DEVICE_NAME "RSJ202208041"                            //设备名
#define DEVICE_SECRET "c92d25160f2ef093b3570da55f8bf31b"      //设备key
#define REGION_ID "cn-shanghai"

//设备下发命令的set主题
#define ALINK_TOPIC_PROP_SET "/sys/gul7nX3bSvX/RSJ202208041/thing/service/property/set"
//设备上传数据的post主题
#define ALINK_TOPIC_PROP_POST "/sys/gul7nX3bSvX/RSJ202208041/thing/service/property/set"
//设备post上传数据要用到一个json字符串, 这个是拼接postJson用到的一个字符串
#define ALINK_METHOD_PROP_POST "thing.event.property.post"
//这是post上传数据使用的模板
#define ALINK_BODY_FORMAT "{\"id\":\"%u\",\"version\":\"1.0\",\"method\":\"%s\",\"params\":%s}"

#define LED_B 2 //定义LED灯的引脚

int postMsgId = 0;          //记录已经post了多少条
Ticker tim1;                //这个定时器是为了每5秒上传一次数据

/*------------------------------------------------------------------------------------------*/

WiFiClient espClient;                 //创建网络连接客户端
PubSubClient mqttClient(espClient);   //通过网络客户端连接创建mqtt连接客户端


// 初始化 wifi 连接
void wifiInit(const char *ssid, const char *passphrase)
{
    WiFi.mode(WIFI_STA);                                   //WIFI模式
    WiFi.begin(ssid, passphrase);                          //传入WIFI账户密码
    while (WiFi.status() != WL_CONNECTED)                  //等待连接完成
    {
        delay(1000);
        Serial.println("WiFi not Connect");                //等待连接
    }
    Serial.println("Wifi连接成功");                     //WIFI连接成功
}


//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
  while (!mqttClient.connected()) //再重连客户端
  {
    Serial.println("reconnect MQTT...");
    bool connected=connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
    if (connected)
    {
      Serial.println("connected");
    }
    else
    {
      Serial.println("failed");
      Serial.println(mqttClient.state());
      Serial.println("try again in 5 sec");
      delay(5000);
    }
  }
}
// //mqtt发布post消息(上传数据)
// void mqttPublish()
// {
//   if (mqttClient.connected())
//   {
//     //先拼接出json字符串
//     char param[82];
//     char jsonBuf[178];
//     sprintf(param, "{\"CurrentHumidity\":%.1f,\"CurrentTemperature\":%.1f,\"ESPLight_Pin2\":%d}", 22.2, 35.5, digitalRead(LED_B));     //我们把要上传的数据写在param里
//     postMsgId += 1;
//     sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param);
//     //再从mqtt客户端中发布post消息
//     if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf))
//     {
//       Serial.print("Post message to cloud: ");
//       Serial.println(jsonBuf);
//     }
//     else
//     {
//       Serial.println("Publish message to cloud failed!");
//     }
//   }
// }
//收到set主题的命令下发时的回调函数,(接收命令)
void callback(char *topic, byte *payload, unsigned int length)      //接收数据回调函数
{

  if (strstr(topic, ALINK_TOPIC_PROP_SET))           
  //如果收到的主题里包含字符串ALINK_TOPIC_PROP_SET(也就是收到/sys/a17lGhkKwXs/esp32LightHome/thing/service/property/set主题)
  {
    Serial.println("收到下发的命令主题:");
    Serial.println(topic);
    Serial.println("下发的内容是:");
    payload[length] = '\0'; //为payload添加一个结束附,防止Serial.println()读过了
    Serial.println((char *)payload);

    //接下来是收到的json字符串的解析
    DynamicJsonDocument doc(1024);
    DeserializationError error = deserializeJson(doc, payload);
    deserializeJson(doc, payload);
    int type=doc[String("protocol_type")];
    char *ssid = (char *)(doc["wifi_name"]).c_str();                    //解析接收过来的密码
        String sensor = doc["sensor"];
    switch(type)
    {
      case 1:break;
      case 2:break;
      case 3:break;
      case 4:break;
      case 5:break;
      case 6:break;
      case 7:break;
      case 8:
        
        // String password = doc["wifi_password"];            //解析接收过来的密码
        //wifiInit(ssid, password);
        Serial.println("longzitianzuiqiang");break;
      default:break;
    }



    //mqttPublish(); //由于将来做应用可能要获取灯的状态,所以在这里发布一下
  }
}

void setup()
{
  Serial.begin(115200);
  wifiInit(WIFI_SSID, WIFI_PASSWD);                        //连接WIFI
  bool connected=connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET);
  if (connected)
  {
    Serial.println("MQTT服务器连接成功!");
  };
  mqttClient.setCallback(callback);             //绑定收到set主题时的回调(命令下发回调)
  //tim1.attach(5, mqttPublish);                  //启动每5秒发布一次消息
}

void loop()
{
  //检测有没有断线
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    wifiInit(WIFI_SSID, WIFI_PASSWD);
  }
  else //如果WIFI连接了,
  {
    if (!mqttClient.connected())          //再看mqtt连接了没
    {
      Serial.println("mqtt disconnected!Try reconnect now...");
      Serial.println(mqttClient.state());
      clientReconnect();
    }
  }

  //mqtt客户端监听
  mqttClient.loop();
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了WIFI与阿里云数据传输的使用,而arduino提供了大量能使我们快速便捷地处理数据的函数和方法,可以直接调用。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: stm32是一种微控制器,可以通过wifi模块与阿里云进行数据通信。以下是使用stm32与阿里云进行数据发送的步骤: 1.准备工作:首先需要在阿里云IoT平台上创建一个设备,然后获取到设备的密钥和证书。还需要选择一种合适的wifi模块,并将其连接到stm32微控制器上。 2.连接wifi:利用wifi模块与stm32建立无线网络连接,以便与网络进行通信。 3.创建MQTT客户端:使用MQTT协议作为通信协议,创建一个MQTT客户端,并将其连接到阿里云IoT平台上。在连接成功后,客户端会接收与发送数据,并在需要时订阅和取消订阅某些主题。 4.发送数据:在连接成功后,可以通过MQTT客户端向阿里云IoT平台发送数据。数据格式可以根据不同的需求进行定制,例如JSON格式、XML格式等。可以在云平台上进行数据分析和可视化展示。 总之,stm32接入云平台,可以实现更加灵活和高效的数据采集、处理和管理。这样,用户可以更加便捷地进行物联网数据分析和控制,提高了物联网应用的智能化水平。 ### 回答2: STM32是一种嵌入式微控制器,它可以通过使用Wi-Fi模块来连接云端,此时可选择阿里云进行数据的发送。需要先在阿里云创建一个设备,然后使用该设备的认证信息来连接STM32。接着在STM32上设置Wi-Fi模块并通过TCP连接发送数据到阿里云。 在STM32上建立TCP连接时,需要先设置Wi-Fi连接,然后将连接信息提供给阿里云。在创建TCP连接时,必须提供设备的认证信息以进行验证。一旦认证成功,就可以将数据从STM32发送到阿里云平台。 阿里云提供了丰富的API以支持数据接收和处理。可以将接收到的数据发送到其他应用程序或通过阿里云的Web界面直接查看。同时,阿里云还提供了报警功能,可以根据预设的规则自动触发,提供更好的监管。 总之,STM32结合Wi-Fi模块可以实现连接阿里云平台进行数据发送。需在阿里云上先创建设备,然后在STM32上建立TCP连接发送数据。阿里云提供了各种API以方便接收和处理数据。 ### 回答3: STM32是一款非常流行的微控制器,可以用于许多嵌入式系统中。其中,WiFi和云服务成为业界最热门的技术,因为它们能够极大地提高嵌入式系统的交互性和可用性。 阿里云是中国领先的云服务提供商之一,它提供强大的云计算、数据库、存储、物联网等服务,可以让开发者轻松地拥有一个高效、可靠的云平台。 在STM32和阿里云的结合下,我们可以轻松地实现数据的发送。首先,需要在STM32上加入WiFi模块,将WiFi模块与STM32连接起来。然后,我们需要在阿里云上创建一个设备,设备的唯一标识符是设备名称。 接下来,我们需要开发一个STM32的固件,这个固件需要实现WiFi连接、数据的读取、数据的加密和数据的发送,以及断网重连等功能。例如,我们可以使用tls协议对数据进行加密,然后使用MQTT协议将数据发送到阿里云的指定Topic中。 最后,我们需要在阿里云上开发一个数据接收程序,这个程序需要订阅设备的Topic,然后将数据解密并处理。例如,我们可以将数据存储到数据库中,或者触发其他的业务逻辑。 总之,STM32和阿里云的结合,可以让我们开发高效、可靠的嵌入式系统,在物联网等领域发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值