搜索百度智能云,注册账号,实名认证;
进入“产品”→“物联网”→“物联网核心套件”,有创建实例的界面,但是不知道怎么使用;
于是先看下文档,“文档”→“物联网核心套件”,很多关于此的描述,操作指南、开发指南、API等;
发现需要了解的信息:
操作的过程中要添加模板,模板是个什么东西呢?那就看看模板里有什么?
观察这个界面,模板里有“主题名称”,“描述”,“权限”;
MQTT是需要发布和订阅主题的,自然就要设置主题名,模板就是添加设备时设置主题名用的;
模板test有两个默认的主题名、一个新增的主题名:
- "$iot/{device Name}/msg":订阅,云端向客户端发送消息;
- 在使用mqtt.fx的时候,只可以使用此主题名来订阅消息,不可以发布;
- "$iot/{device Name}/events":发布,客户端向云端发送消息;
- 在使用mqtt.fx的时候,只可以使用此主题名来发布消息,不可以订阅;
- "$iot/{device Name}/user/both":订阅、发布
- 在使用mqtt.fx的时候,可以使用此主题名来订阅和发布消息;
虽然创建设备的时候有了用户名和密钥,但是这并不能直接作为连接MQTT的用户名和密码,要经过加密计算,下面的链接就是一个在线的加密计算器,待输入的信息都可以在设备详情里找到,然后点击“获取当前时间戳”、“点击计算”下面就自动生成了。
但是,由于我还不太了解MQTT,弄错个信息就直接断开连接,而且还不能再次重连,重连就显示用户名密码错误,还得再获取时间戳生成新的用户名密码,很麻烦,然后我发现时间戳直接填0生成的用户名和密码也是可以建立MQTT连接的,并且在断开后可以再次连接。
MQTT 连接信息计算器 - 百度天工 IoT Core (bcebos.com)
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连接;
esp8266就是受控设备,比如控灯;mqtt.fx是模拟用户使用的客户端,比如手机app上可以发送控制灯亮灭的界面。
从MQTT协议的角度上看,esp8266和mqtt.fx都是MQTT客户端,百度智能云是MQTT服务器;
esp8266发送的消息,mqtt.fx可以收到;
mqtt.fx发送的消息,esp8266可以收到;
这样受控设备和用户,也就是esp8266和mqtt.fx好像可以直接通讯,而并没有通过云平台一样。
在云上创建两个设备,对应着ESP8266和mqtt.fx,都是test模板,也就是主题名为"$iot/{device Name}/user/both",既能订阅也能发布;
即便在同一个实例下,不同的设备不可以通过订阅相同的主题,来进行通信,要添加规则;
规则,就是数据转发的配置,选择数据从主题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";
至此,已经可以用mqtt.fx模拟在两个MQTT客户端之间实现数据的传输了,下一步,就是把云实例中设备"esp8266"替换真正的ESP8266,然后仍然用mqtt.fx模拟另一个客户端。
本来想直接使用例程的,但是发现连不上wifi,一直打印"no 402 found, reconnect after 1s",于是替换之前写的能连上wifi的代码,并且把例程中其他部分暂时注释掉,还是不行,弄了很久最后放弃直接用例程,而是把例程需要的代码全部移植到之前的工程框架中,之前有一集关于makefile的,教怎么新建文件夹保存源文件和头文件的,我压根没放在心上.....现在就得回过头再看看把配置makefile的知识补上,没学习的内容就是一个坑,不填上迟早要掉进去。
我把mqtt_config.h也放在app/include/mqtt下了,因为都是mqtt相关的配置,我想放在一起;
P.S. 因为注意到user_rf_cal_sector_set的内容与之前不一致,而这个函数与MQTT也不相关所以并没复制这个函数,复制了应该也没事,但没亲自试过所以备注在这里喽;
移植工作到此结束,总结一下,就是复制了mqtt和modules下的源文件和头文件,以及user_main.c
我打马赛克的地方,是要根据百度智能云实际申请的内容修改的;
我也是下载完才发现这个问题,debug.h中默认是不开启的INFO,所以程序中INFO打印的信息都不会显示,记得添加以下宏定义:
#define GLOBAL_DEBUG_ON
打开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灯熄灭;