首页 > 其他分享 >【VsCode+PIO+ESP32+OneNet】你能看到的最简介优雅的物联网开发

【VsCode+PIO+ESP32+OneNet】你能看到的最简介优雅的物联网开发

时间:2024-12-03 21:57:48浏览次数:10  
标签:OneNet PIO VsCode pubid ONENET mqtt client println Serial

环境配置

代码环境

VsCode+PIO构造基于Arduinio的ESP32开发框架

在VsCode拓展中搜索PlatformIO IDE并下载

在这里插入图片描述

打开PIO主界面,新建工程

在这里插入图片描述
在这里插入图片描述

命名,选择对应的ESP32开发板,Framework不必理会

OneNet云平台

硬件平台

ESP32-WROOM-32E/D

软件开发

文件结构

在这里插入图片描述

项目代码示例WIFI+MQTT云连接

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

 
//uFire_SHT20 sht20;
 
const char* ssid = "P60";              //wifi名
const char* password = "1111111111";      //wifi密码
const char* mqtt_server = "mqtts.heclouds.com"; //onenet 的 IP地址 mqtts.heclouds.com 183.230.40.96
const int port = 1883;                    //端口号

#define mqtt_pubid "5eWJ8HJe2M"    //产品ID
#define mqtt_devid "esp32"       //设备名称
//鉴权信息
#define mqtt_password "version=2018-10-31&res=products%2F5eWJ8HJe2M%2Fdevices%2Fesp32&et=4860891272&method=md5&sign=25Bi7pf997c1PWg20soHpA%3D%3D"       //鉴权信息

WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端
Ticker tim1;                    //定时器,用来循环上传数据
Ticker tim2;                    //定时器,用来循环上传数据
float temp;
float humi;
float dis;

//设备上传数据的post主题
#define ONENET_TOPIC_PROP_POST "$sys/" mqtt_pubid "/" mqtt_devid "/dp/post/json" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/post"
//接收下发属性设置主题
#define ONENET_TOPIC_PROP_SET  "$sys/" mqtt_pubid "/" mqtt_devid "/dp/post/json/+" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/set"
//接收下发属性设置成功的回复主题
#define ONENET_TOPIC_PROP_SET_REPLY "$sys/" mqtt_pubid "/" mqtt_devid "/dp/post/accepted" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/set_reply"
 
//接收设备属性获取命令主题
#define ONENET_TOPIC_PROP_GET "$sys/" mqtt_pubid "/" mqtt_devid "/cmd/request/+" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/get"
//接收设备属性获取命令成功的回复主题
#define ONENET_TOPIC_PROP_GET_REPLY "$sys/" mqtt_pubid "/" mqtt_devid "/cmd/response/+/+" //"$sys/" mqtt_pubid "/" mqtt_devid "/thing/property/get_reply"
 
//这是post上传数据使用的模板
#define ONENET_POST_BODY_FORMAT "{\"id\":%d,\"dp\":%s}"
//#define ONENET_POST_BODY_FORMAT
int postMsgId = 0; //记录已经post了多少条


//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("connect WIFI");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi connected!");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

}


//向主题发送模拟的温湿度数据
void sendTempAndHumi()
{
  if (client.connected())
  {
    //先拼接出json字符串
    char param[82];
    char jsonBuf[178];
    sprintf(param, "{ \"temp\":[{\"v\":%.2f}],\"humi\":[{\"v\":%.2f}] }", temp, humi); //我们把要上传的数据写在param里
    postMsgId += 1;
    sprintf(jsonBuf, ONENET_POST_BODY_FORMAT, postMsgId, param);
    //再从mqtt客户端中发布post消息
    if (client.publish(ONENET_TOPIC_PROP_POST, jsonBuf))
    {
      Serial.print("Post message to cloud: ");
      Serial.println(jsonBuf);
    }
    else
    {
      Serial.println("Publish message to cloud failed!");
    }
  }

}


//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
  while (!client.connected()) //再重连客户端
  {
    Serial.println("reconnect MQTT...");
    if ( client.connect(mqtt_devid, mqtt_pubid, mqtt_password) )
    {
      Serial.println("connected");
    }
    else
    {
      Serial.println("failed");
      Serial.println(client.state());
      Serial.println("try again in 5 sec");
      delay(5000);
    }
  }
}


void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.println("message rev:");
  Serial.println(topic);
  for (size_t i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
 
  if (strstr(topic, ONENET_TOPIC_PROP_SET))
  {
    DynamicJsonDocument doc(100);
    DeserializationError error = deserializeJson(doc, payload);
    if (error)
    {
      Serial.println("parse json failed");
      return;
    }
    JsonObject setAlinkMsgObj = doc.as<JsonObject>();
    serializeJsonPretty(setAlinkMsgObj, Serial);
    String str = setAlinkMsgObj["id"];
    Serial.println(str);
    char sendbuf[100];
    sprintf(sendbuf, "{\"id\": \"%s\",\"code\":200,\"msg\":\"success\"}", str.c_str());
    Serial.println(sendbuf);
    client.publish(ONENET_TOPIC_PROP_SET_REPLY, sendbuf);
  }
  if (strstr(topic, ONENET_TOPIC_PROP_GET))
  {
    DynamicJsonDocument doc(100);
    DeserializationError error = deserializeJson(doc, payload);
    if (error)
    {
      Serial.println("parse json failed");
      return;
    }
    JsonObject setAlinkMsgObj = doc.as<JsonObject>();
    serializeJsonPretty(setAlinkMsgObj, Serial);
    String str = setAlinkMsgObj["id"];
    Serial.println(str);
    char sendbuf[100];
    //sprintf(sendbuf, "{\"id\": \"%s\",\"code\":200,\"msg\":\"success\",\"data\":{\"temp\":%.2f,\"humi\":%.2f}}", str.c_str(), temp, humi);
    sprintf(sendbuf, "{\"id\": \"%s\",\"code\":200,\"msg\":\"success\",\"data\":{\"dis\":%.2f }}", str.c_str(), temp);
    Serial.println(sendbuf);
    client.publish(ONENET_TOPIC_PROP_GET_REPLY, sendbuf);
  }
}


void update_date(void)
{
  temp++;
  humi++;
  dis++;
  }

 
 

void setup() {
  // put your setup code here, to run once:


  Serial.begin(115200); //初始化串口
  //Wire.begin();
  //sht20.begin();
  delay(3000);
  setupWifi();                                           //调用函数连接WIFI
  client.setServer(mqtt_server, port);                   //设置客户端连接的服务器,连接Onenet服务器, 使用1883端口
  delay(2000);
  Serial.println("setServer Init!"); 
  //client.setCallback(callback);
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  delay(2000);
  Serial.println("connect Init!"); 
  
  if (client.connected())
  {
    Serial.println("OneNet is connected!"); //判断以下是不是连好了.
  }
  client.subscribe(ONENET_TOPIC_PROP_SET);
  client.subscribe(ONENET_TOPIC_PROP_GET);
  client.setCallback(callback);
  tim1.attach(8, sendTempAndHumi); //定时每20秒调用一次发送数据函数sendTempAndHumi
  tim2.attach(4, update_date);
  temp =10;
  humi =20;
  dis = 100;
}
int count = 0;

void loop() {
  // put your main code here, to run repeatedly:

  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
    delay(100);
  }
  client.loop(); //客户端循环检测

 
 
}



标签:OneNet,PIO,VsCode,pubid,ONENET,mqtt,client,println,Serial
From: https://blog.csdn.net/SUDaivis/article/details/144224824

相关文章

  • VSCode中配置 C/C++ 环境
    1.下载编译器MinGW并解压官网页面:https://www.mingw-w64.org/下载页面:https://sourceforge.net/projects/mingw-w64/files/下载页面中选择x86_64-win32-seh下载(目前已经更新,页面中没有,需要找很麻烦)MinGW直接下载地址https://wwn.lanzouh.com/iLOip031ku6b密码......
  • 分享一个纯Python开发的系统程序,基于VSCode + WxPython开发的跨平台应用系统
    本项目是基于wxPython开发的GUI应用,主要用于管理基础框架内容,包括用户、角色、机构、权限、日志、菜单、字典、附件、通用编码规则、配置管理等基础框架内容。愿景是构建一个基于Python后端WebAPI或者本地多种数据库操作的通用应用系统,为各类企业提供一站式的管理系统解决......
  • 解决vscode连接远程服务器,连接不上问题
    1.在vscode安装ssh-remote插件。2.在windows安装openssh,参考https://blog.csdn.net/nl9788/article/details/131653284。3.通过ssh生成秘钥:(1)可以使用GitBash、PowerShell或CMD终端。如,在windows打开powershell,输入ssh-keygen-trsa-b4096-C"your_email@example.com......
  • vscode上传已有的代码到git仓库以及解决ssh验证报错教程方法
    本文介绍了如何使用vscode推送已有的代码到git仓库方法教程,以及解决ssh验证报错的问题的方法。步骤一:新建一个仓库然后在vscode终端进入你要传的项目,使用命令初始化gitinit步骤二:输入命令绑定你在git上新建的空仓库也就是你需要上传代码的仓库,例如:gitremote......
  • vscode连接远程服务器vscode 未能下载vscode服务器(XHR failed)
    前言全局说明一直使用Vscode连接服务器调试代码,今天突然连接不上了,网上搜索了好多,都是没有效果。一、说明1.1环境:Windows11家庭版23H222631.3737VScode版本:1.91.0(usersetup)Ubuntu18.04.6LTS(Linuxqt-vm5.4.0-150-generic#167~18.04.1-UbuntuSMP......
  • 【汇总】VScode最新下载连接
    前言全局说明VScode下载默认都在国外,国内下载慢,收集一些国内镜像,方便下载一、说明1.1环境:Windows11家庭版23H222631.3737二、新链接2.1链接http://vscode.download.prss.microsoft.com2.2下载测试https://vscode.download.prss.microsoft.com/dbazure/do......
  • [VSCode] vscode下载安装及安装中文插件详解(附下载文件)
      前言vscode链接:https://pan.quark.cn/s/3acbb8aed758提取码:dSytVSCode是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。通过上面的连接下载得到压缩包,解压得到exe文......
  • VSCode:代码格式化插件
    settings.json文件中添加如下配置并保存 {"workbench.sideBar.location":"left","cssrem.rootFontSize":80,"git.ignoreWindowsGit27Warning":true,"eslint.codeAction.showDocumentation":{"ena......
  • VSCode修改资源管理器文件目录树缩进(VSCode目录结构、目录缩进、文件目录外观)workbenc
    文章目录方法点击左下角小齿轮点击设置点击工作台,点击外观,找到Tree:Indent设置目录树的缩进方法点击左下角小齿轮点击设置点击工作台,点击外观,找到Tree:Indent设置目录树的缩进"workbench.tree.indent"默认值为8,我给改成40了:"workbench.tree.indent":40......
  • 用VsCode优雅写MarkDown
    插件推荐MarkdownAllinOne快捷键作用Ctrl+B加粗Ctrl+I斜体Alt+S删除线Ctrl+]增加缩进Ctrl+[减少缩进Ctrl+Shift+]标题升级Ctrl+Shift+[标题降级Alt+C勾选/取消勾选任务列表Ctrl+M数学环境Alt+Shif......