ESP8266_接入百度物联网核心套件、使用MQTT协议通信

1、跟着“快速入门” 快速入门

1.1、操作流程

搜索百度智能云,注册账号,实名认证;

进入“产品”→“物联网”→“物联网核心套件”,有创建实例的界面,但是不知道怎么使用;

于是先看下文档,“文档”→“物联网核心套件”,很多关于此的描述,操作指南、开发指南、API等;

发现需要了解的信息:

  • “核心概念”,在“物联网核心套件”中所使用的一些基本概念;
  • 系统限制”,有MQTT相关的限制值说明
  • 快速入门”,跟着这部分内容操作,就可以新建出一个实例,新增设备,添加模板,并且通过mqtt.fx 1.7.1订阅和发布信息;

1.2、操作中了解的概念——模板

操作的过程中要添加模板,模板是个什么东西呢?那就看看模板里有什么?

观察这个界面,模板里有“主题名称”,“描述”,“权限”

MQTT是需要发布和订阅主题的,自然就要设置主题名,模板就是添加设备时设置主题名用的;

模板test有两个默认的主题名、一个新增的主题名:

  • "$iot/{device Name}/msg":订阅,云端向客户端发送消息;
    • 在使用mqtt.fx的时候,只可以使用此主题名来订阅消息,不可以发布;
  • "$iot/{device Name}/events":发布,客户端向云端发送消息;
    • 在使用mqtt.fx的时候,只可以使用此主题名来发布消息,不可以订阅;
  • "$iot/{device Name}/user/both":订阅、发布
    • 在使用mqtt.fx的时候,可以使用此主题名来订阅和发布消息;


 1.3、操作中了解的技巧——用户名、密码设置

虽然创建设备的时候有了用户名和密钥,但是这并不能直接作为连接MQTT的用户名和密码,要经过加密计算,下面的链接就是一个在线的加密计算器,待输入的信息都可以在设备详情里找到,然后点击“获取当前时间戳”、“点击计算”下面就自动生成了。

但是,由于我还不太了解MQTT,弄错个信息就直接断开连接,而且还不能再次重连,重连就显示用户名密码错误,还得再获取时间戳生成新的用户名密码,很麻烦,然后我发现时间戳直接填0生成的用户名和密码也是可以建立MQTT连接的,并且在断开后可以再次连接

MQTT 连接信息计算器 - 百度天工 IoT Core (bcebos.com)


1.4、遇到的问题

mqtt.fx使用1.7.1版本

mqtt.fx 1.7.0版本确实有bug,可以连上云,但是无法订阅、发布消息,请使用1.7.1版本;

错误的主题名导致MQTT断开连接

一开始以为是连接不稳定、或者mqtt.fx版本的问题,毕竟刚才使用1.7.0的时候确实有bug嘛,其实是我还不了解MQTT协议,所以主题名填写错误导致,也顺便发现了上面1.3中用户名和密码的设置,具体例子如下;

比如设备名是"mqttfx",在mqtt.fx上成功连接了以后:

在subscribe界面,可以订阅"$iot/mqttfx/user/both"和"$iot/mqttfx/msg",订阅其他的不会生效(列表),无反应就是了;

在publish界面,可以通过"$iot/mqttfx/events"、"$iot/mqttfx/user/both"来发布消息,一旦主题名选择错误会立刻断开MQTT连接;

 


 

2、创建两个设备、添加规则,实现两个MQTT客户端的通信

2.1、简要说明下思路

esp8266就是受控设备,比如控灯;mqtt.fx是模拟用户使用的客户端,比如手机app上可以发送控制灯亮灭的界面。

从MQTT协议的角度上看,esp8266和mqtt.fx都是MQTT客户端,百度智能云是MQTT服务器;

esp8266发送的消息,mqtt.fx可以收到;

mqtt.fx发送的消息,esp8266可以收到;

这样受控设备和用户,也就是esp8266和mqtt.fx好像可以直接通讯,而并没有通过云平台一样。


2.2、创建两个设备

在云上创建两个设备,对应着ESP8266和mqtt.fx,都是test模板,也就是主题名为"$iot/{device Name}/user/both",既能订阅也能发布;


2.3、添加规则

即便在同一个实例下,不同的设备不可以通过订阅相同的主题,来进行通信,要添加规则;

规则,就是数据转发的配置,选择数据从主题1转发到主题2;

刚才不是创建了两个设备嘛,我开始以为同一个实例下设备可以直接通信,想着设备“mqttfx”通过"$iot/mqttfx/user/both"来发布消息,设备“esp8266”订阅主题"$iot/mqttfx/user/both",就可以通信了,实际测试是不可以的哦。

所以我们想要两个设备之间可以相互通信,需要设置两个规则,一个将设备“mqttfx”的消息转发到设备“”esp8266”,另一个将设备”esp8266”的消息转发到设备“mqttfx”;


配置内部的规则,记得启用 

比如mqttfx_to_esp8266,数据来源选择"$iot/mqttfx/user/both",数据目的地选择"$iot/esp8266/user/both";

就可以将mqttfx通过主题"$iot/mqttfx/user/both" 发布的数据转发给"$iot/esp8266/user/both";


2.4、两个MQTT客户端通信

至此,已经可以用mqtt.fx模拟在两个MQTT客户端之间实现数据的传输了,下一步,就是把云实例中设备"esp8266"替换真正的ESP8266,然后仍然用mqtt.fx模拟另一个客户端。


3、ESP8266使用MQTT协议通信

3.1、代码移植

本来想直接使用例程的,但是发现连不上wifi,一直打印"no 402 found, reconnect after 1s",于是替换之前写的能连上wifi的代码,并且把例程中其他部分暂时注释掉,还是不行,弄了很久最后放弃直接用例程,而是把例程需要的代码全部移植到之前的工程框架中,之前有一集关于makefile的,教怎么新建文件夹保存源文件和头文件的,我压根没放在心上.....现在就得回过头再看看把配置makefile的知识补上,没学习的内容就是一个坑,不填上迟早要掉进去。

3.1.1、在app文件夹下,新增子文件夹modules和mqtt,并添加.c文件如下

 3.1.2、在app/include文件夹下,新增子文件夹modules和mqtt,并添加.h文件如下

我把mqtt_config.h也放在app/include/mqtt下了,因为都是mqtt相关的配置,我想放在一起;

 3.1.3、复制app/user下的Makefile,粘贴到app/modules和app/mqtt目录下

 3.1.4、修改app/modules/Makefile和app/mqtt/Makefile,替换为libxxx.a

 3.1.5、修改app/Makefile,有3处,指明新增源文件和头文件的位置,还有.a静态库 

3.1.6、复制user_main.c的内容

P.S. 因为注意到user_rf_cal_sector_set的内容与之前不一致,而这个函数与MQTT也不相关所以并没复制这个函数,复制了应该也没事,但没亲自试过所以备注在这里喽;

移植工作到此结束,总结一下,就是复制了mqtt和modules下的源文件和头文件,以及user_main.c


 3.2、配置mqtt_config.h

我打马赛克的地方,是要根据百度智能云实际申请的内容修改的;


 3.3、修改user_main.c中要发布和订阅的主题名为"$iot/esp8266/user/both"

 


 3.4、开启debug.h中的打印

我也是下载完才发现这个问题,debug.h中默认是不开启的INFO,所以程序中INFO打印的信息都不会显示,记得添加以下宏定义:

#define GLOBAL_DEBUG_ON

3.4、编译、下载,验证

打开mqtt.fx,将设备"mqttfx"连上云,订阅"$iot/mqttfx/user/both";

复位esp8266,设备"esp8266"连上云,发送了"ESP8266_Online",可在mqttfx端可以收到,又因为"$iot/esp8266/user/both"的权限是既发布又订阅,所以esp8266自己也收到了"ESP8266_Online";


设备"mqttfx"在主题"$iot/mqttfx/user/both"下发送"LED_ON",设备"esp8266"收到主题"$iot/esp8266/user/both"的"LED_ON",且灯被点亮;

同理,发送"LED_OFF",esp8266灯熄灭;

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值