ApolloStudio高手之路(11):使用MQTT协议无缝对接NodeMCU(ESP8266)构建物联网生态链(ApolloStudio作MQTT Broker服务端/Client客户端使用)

讲到物联网,就不得不提耳熟能详的MQTT协议,作为当下被物联网领域广范围应用的标准协议,这一诞生于IBM实验室的“古老”产物(第一个版本诞生于1999年)已作为ISO国际标准越来越多的被广大应用商所支持,同样的,在ApolloStudio中,这一标准协议也已被完整的集成在一起,使得ApolloStudio既可以作为MQTT Broker来提供MQTT数据交互中转站,也可以作为MQTT Client去订阅或推送所需节点的信息(在ApolloStudio中MQTT Broker模式与MQTT Client模式可以并存同时使用)。

NodeMCU是一个开源的物联网平台, 它使用可以使用Lua脚本语言编程(在本文中将使用Arduino IDE结合8266驱动库使用C/C++进行讲解)。NodeMCU包含了可以运行在 esp8266 Wi-Fi SoC芯片之上的固件,以及基于ESP-12模组的硬件。

准备开始

我们将在Arduino IDE中对NodeMCU进行操作,所以我们需要先在Arduino IDE中添加所需要的驱动固件以及对应的开发库(这里我们使用的Arduino IDE版本为1.8.8),首先我们先在Arduino IDE中的 文件 》 首选项》 附加开发板管理器网址中添加以下资源库路径:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

如下图所示: 

然后打开 Arduino IDE 的工具》开发板》开发板管理器:

在搜索框内搜索“8266”,然后安装开发板固件包:

 然后我们打开Arduino IDE中的工具》管理库,搜索“pubsub”,安装图示两个库文件:EspMQTTClient以及PubSubClient即可。

相关准备工作到此结束。

流程与编码

NodeMCU配置

首先我们先解释下上文准备过程中安装的两个库的功用:PubSubClient是一个基于MQTT协议实现的客户端库函数,而EspMQTTClient则是对PubSubClient库的更进一步的封装,让接口更简洁,同时也提供了更多的功能,比如一个HTTP端用来更新数据,两者更多的功能不在本文的探讨范畴,有兴趣的读者可以自行探索使用。

使用之初,我们需要设定我们所使用的NodeMCU板卡调取对应的驱动固件,这里我们选择了NodeMCU 1.0(ESP-12E Module):

之后选择正确的端口号,这里我们使用了默认的COM3(NodeMCU开发板连接的实际端口),然后我们打开文件》示例》EspMQTTClient》examples》Esp8266MQTTClient:

#include "EspMQTTClient.h"

void onConnectionEstablished();

EspMQTTClient client(
  "ssid",           // Wifi ssid
  "pass",           // Wifi password
  "192.168.1.101",  // MQTT broker ip
  1883,             // MQTT broker port
  "usr",            // MQTT username
  "mqttpass",       // MQTT password
  "test1",          // Client name
  onConnectionEstablished, // Connection established callback
  true,             // Enable web updater
  true              // Enable debug messages
);

void setup()
{
  Serial.begin(115200);
}

void onConnectionEstablished()
{
  client.subscribe("mytopic/test", [] (const String &payload)
  {
    Serial.println(payload);
  });
  
  client.publish("mytopic/test", "This is a message");

  client.executeDelayed(5 * 1000, []() {
    client.publish("mytopic/test", "This is a message sent 5 seconds later");
  });
}

void loop()
{
  client.loop();
}

 其中,我们修改代码中的ssid为自己的路由器WIFI名,pass为路由器WIFI登录密码,192.168.1.106改为局域网中安装有ApolloStudio的PC主机上,1883为默认端口可以不改,usr改为ApolloStudio中设定的MQTT的用户登录名(后文中有提及如何设置这些用户参数),mqttpass改为ApolloStudio中设定的MQTT用户登录密码(后文中有提及如何设置这些用户参数),test1改为ApolloStudio中设定的MQTT用户实例名既可(后文中有提及如何设置这些用户参数),修改后如下图所示:

#include "EspMQTTClient.h"

void onConnectionEstablished();

EspMQTTClient client(
  "MI_LINK",           // 路由器WIFI名
  "12345678",           // WIFI登录密码
  "192.168.31.236",  // MQTT broker ip(MQTT服务器IP地址)
  1883,             // MQTT broker port(MQTT服务器端口号)
  "admin",            // MQTT用户名
  "admin",       // MQTT登录密码
  "Client001",          // 用户实例名
  onConnectionEstablished, // Connection established callback
  true,             // Enable web updater
  true              // Enable debug messages
);

void setup()
{
  Serial.begin(115200);
}

void onConnectionEstablished()
{
  client.subscribe("mytopic/test", [] (const String &payload)
  {
    Serial.println(payload);
  });
  
  client.publish("mytopic/test", "This is a message");

  client.executeDelayed(5 * 1000, []() {
    client.publish("mytopic/test", "This is a message sent 5 seconds later");
  });
}

void loop()
{
  client.loop();
}

 上面的程序中,NodeMCU订阅了一个名为“mytopic/test”的主题,并发布了“This is a message”,5秒之后又更新该主题节点数据为“This is a message sent 5 seconds later”。

我们编译下载该程序到我们的NodeMCU芯片里面,至此NodeMCU端的工作也就完成了。

ApolloStudio配置

我们先来看下ApolloStudio给我们提供了哪些功能接口:

我们先在任务项中添加MQTT通讯单元模块,右键选择配置:

在ApolloStudio中根据需要不同分为客户端配置以及客户端配置,如果需要可以启用对应的模式,两种模式彼此独立,可以同时开启,在服务端中,我们可以在“登录用户管理器”中对用户进行修改(双击源数据中已有数据即可进入编辑模式):

在这里我们就看到了在NodeMCU篇中我们提及的实例名,登录名以及登录密码,三者需一一对应,否则将登录失败,在NodeMCU篇中我们使用的Client001/admin/admin由此而来。

客户端模式同样的,只需要输入对应的 信息即可:

综合实验 

这里我们结合两者进行实验,在NodeMCU篇中,我们提及NodeMCU订阅了一个名为“mytopic/test”的主题,这里我们在ApolloStudio中进行显示,并每次推送数据 到节点,通过Arduino IDE的串口调试工具对其进行监视。

我们可以这么写ApolloStudio脚本:

#-*- coding: UTF-8 -*-
#加载内嵌模块
import clr,sys,time,datetime

n = 0#初始化变量
#循环函数体
while True:
	#显示在线客户端数据
	AS.Func_SysInfoAdd("在线客户端数量:" + str(AS.Func_MQTT_Server_GetClientsCount()))
	#显示节点数据
	AS.Func_SysInfoAdd("'mytopic/test'节点数据:" + AS.Func_MQTT_Server_GetTopicData("mytopic/test"))
	#显示完成后再发布新数据
	AS.Func_MQTT_Server_Publish("mytopic/test", "data" + str(n))
	#每次循环自动加1
	n+=1
	#三秒刷新一次数据
	time.sleep(3)

在ApolloStudio中执行该脚本(我们默认只启用了ApolloStudio服务端):

我们可以看到左边是ApolloStudio显示推送的数据以及在线客户端数量,右侧则显示了NodeMCU获得MQTT服务器所推送的主题信息数据,至此得到了我们预期的效果!我们这里只是通过简单的例子进行抛砖引玉,欢迎大家分享自己的精彩应用!

***********************************************************************************************************************************************

ApolloStudio最新版下载地址(网盘有交流群号):

(点击跳转至首页文章,见文章最底部下载链接)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值