当前位置:网站首页>ESP8266_接入百度物联网核心套件、使用MQTT协议通信
ESP8266_接入百度物联网核心套件、使用MQTT协议通信
2022-06-11 09:14:00 【小老虎_IOT】
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_ON3.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灯熄灭;

边栏推荐
- 【软件】大企业ERP选型的方法
- Sed explanation of shell script (SED command, sed -e, sed s/ new / old /...)
- Openstack explanation (22) -- neutron plug-in configuration
- Talk about reading the source code
- 实现边充边OTG的PD芯片GA670-10
- Error [detectionnetwork (1)][warning]network compiled for 6 shapes, maximum available 10, compiling for 5 S
- Design of wrist sphygmomanometer based on sic32f911ret6
- What is WSGI?
- OpenCV CEO教你用OAK(四):创建复杂的管道
- [TiO websocket] III. The TiO websocket server can send messages to users anywhere
猜你喜欢

Before applying data warehouse ODBC, you need to understand these problems first

Modularnotfounderror: no module named 'find_ version’

OpenCV CEO教你用OAK(五):基于OAK-D和DepthAI的反欺骗人脸识别系统

Exclusive interview with PMC member Liu Yu: female leadership in Apache pulsar community

MSF adds back door to normal program

机器学习笔记 - 使用TensorFlow的Spatial Transformer网络

Openstack explanation (XXIII) -- other configurations, database initialization and service startup of neutron

MSF SMB based information collection

Redis source code analysis hash object (z\u hash)

Install jupyter in the specified environment
随机推荐
报错[error] input tesnor exceeds available data range [NeuralNetwork(3)] [error] Input tensor ‘0‘ (0)
机器学习笔记 - 深度学习技巧备忘清单
OpenSSL usage
Talk about reading the source code
报错Version mismatch between installed depthai lib and the required one by the scrip.
Sword finger offer II 041 Average value of sliding window
Success and failure of ERP software from the perspective of enterprise evaluation
Résumé de la méthode d'examen des mathématiques
Augmented reality experiment IV of Shandong University
Opencv oak-d-w wide angle camera test
The mobile terminal page uses REM for adaptation
Flask (I) - quick start
[ERP system] how much do you know about the professional and technical evaluation?
Output image is bigger (1228800b) than maximum frame size specified in properties (1048576b)
Flask (III) -- variable rules
Before applying data warehouse ODBC, you need to understand these problems first
MSF SMB based information collection
Flask (IV) -- URL construction
市场上的服装ERP体系到底是哪些类型?
Four data-driven behaviors of integral system