基于MQTT百度天工服务器,实现微信小程序控制ESP8266,完成遥控小车的简单控制



前言

基于MQTT协议借助百度天工物联网平台,通过Arduino IDE烧录程序,实现微信小程序下发指令到ESP8266 Node MCU,从而简单控制小车的前进、后退、左右转。

作为一个实打实的新手,自己对这方面可以说是完全不了解。我在看了B站的视频以及很多博客之后,最后选择跟着安信可科技发布的B站视频一步步来做:【直播回放】微信小程序MQTT远程控制安信可NodeMCU ESP8266。(上)_哔哩哔哩_bilibili

当然,这个视频的发布也在一年前了,现在会有一些内容上的更新,我会在下面提及。我在跟着安装安信可IDE环境的时候并未成功,最后在Arduino IDE上烧录的程序。另外还有一些我遇到的问题和坑都会在下文中进行说明。



一、准备工具


二、百度天工物联网平台的搭建

在打开物接入平台的功能后,进入控制台。

 创建项目,选择地域,填写自己的项目名称以及描述,选择项目类型为数据型。

创建完项目之后,点击蓝色项目名称进入项目列表

 

 创建策略,如果需要微信端下发指令到ESP8266端,同时需要微信端接受8266的反馈信息,则创建两个主题分别由微信端和8266端订阅和发布,这里要注意的是:微信端订阅的主题是8266端要发布的主题,同样8266端订阅的主题是微信端发布的主题。

创建身份,选择密码验证,点击下一步,选择刚刚创建的策略,点击下一步完成身份的创建。保存好身份密匙,这是8266和微信小程序连接MQTT服务器的密码。

 

 

 点击用户列表创建用户,首先创建微信小程序端用户,选择身份为刚刚创建的身份以及刚刚创建的策略。同样,创建8266端用户。

 

 至此,服务器基本搭建完成。

三、Arduino IDE 环境的搭建和代码

由于要实现微信小程序远程遥控小车的功能需要WIFI功能的参与,所以需要对Arduino配置WiFi环境。

打开Arduino IDE,点击工具——>开发板——>开发板管理器,输入ESP8266,然后下载出现的8266库。需要注意的是由于这里是在Arduino的后台官网下载,所以下载可能会失败,而且不止一次,我的解决办法是当下载失败,就是出现红色错误的时候,断开无线网,连接自己的手机热点,即只要下载不动了,就在WiFi和手机热点之间来回切换,反复横跳。所用流量大概在300M左右。

 下载完成后,点击工具——>开发板,选择NodeMcu 1.0即可。

 接着,下载连接MQTT服务器的相关库,点击项目——加载库——管理库,输入PubSubClient下载。

 这样就基本完成了IDE的配置。

然后在IDE环境中编写代码,烧录进8266中。

其中百度天工中创建的服务器地址

 要订阅和发布的主题

 服务器的用户名

 用户列表中8266端的用户名,点击连接测试为用户ID

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

const char* STA_SSID = "8266连接WiFi名称";
const char* PSD = "WiFi密码";
const char *mqtt_server = "百度天工中创建的服务器地址";                                
const char *subTopic = "要订阅的主题"; 
const char *pubTopic = "要发布的主题";
const char *client_id = "用户列表中8266端的用户名"; 
const char *mqtt_username = "服务器的用户名";
const char *mqtt_password = "创建身份时记下用来连接MQTT的密码";

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient); //定义MQTT客户端

void setup() {
  
  Serial.begin(9600);
  WiFi.begin(STA_SSID, PSD);                  // 启动网络连接
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(STA_SSID); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的 
                                                  WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读 
                                                  秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。                                             
  Serial.println("");                          // WiFi连接成功后
  Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信 
                                                  息。
  Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通 
                                                  过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值 
                                                  即NodeMCU的IP地址。


  mqttClient.setServer(mqtt_server, 1883); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
  mqttClient.setCallback(callback);        //设定回调方式,当ESP8266收到订阅消息时会调用此方法
  delay(1500);
}
//这里就开始进行MQTT的回调,就是当收到服务器传来的信息之后可以对ESP8266执行相应的动作,
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  Serial.println();
  Serial.println(String(length));
  for (int i = 0; i < length; i++)
  {
Serial.print((char)payload[i]);
 }
  Serial.println();
}

void reconnect()            //为防止MQTT服务器下线,当断开服务时尝试重新连接/
{
  while (!mqttClient.connected())
  {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqttClient.connect(client_id, mqtt_username, mqtt_password))
    {
      Serial.println("connected");
                                                                       
      if (mqttClient.subscribe(subTopic, 1))
      {
        Serial.println("subscribe success");
      }
      else
      {
        Serial.println("subscribe fail");
      }
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

 进行烧录的时候,用串口线将8266接在电脑上,通过设备管理器——

端口查看COM端口号,设置Arduino中接入的为相应的端口。

然后进行烧录,烧录成功后按下8266上的复位按键,可以在串口检测器上看到WiFi连接成功和服务器连接成功。

 

四、微信小程序的搭建和代码

打开微信开发者工具,我这里使用的是测试号。自己修改项目名称,定义目录,其他不做修改点击确定。

接着下载连接MQTT服务器的第三方库,打开下面的链接,右键另存为一个mqtt文件,将次此文件复制放在你创建的小程序目录的utils中。

https://unpkg.com/mqtt@2.18.8/dist/mqtt.js

 微信小程序界面的代码,请自行在网上寻找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值