准备做一个智能插座,想要达到的目的:能实时获取插座的状态,通过手机对插座的通电与断电进行操作。
这样无法实现,因为插座订阅的主题必须是已有的,如果都去订阅同一个主题,发送的消息,订阅了的都能收到,也不知道是谁发的。服务器也无法监听MQTT服务器收到的消息。
后来我就换了一个想法:插座采用ESP8266芯片进行通讯管理,首先通过手机对ESP8266芯片进行配网。配网成功后,芯片请求HTTP API接口,像服务器发送 插座和用户信息。服务器添加用户和插座信息,然后服务器调取EMQX提供的API接口,添加对应的主题。添加主题成功后,服务器将主题名称返回给芯片,芯片链接MQTT服务器,订阅对应的主题。实现服务器对插座的指令操作,也可以通过MQTT服务器获取插座的状态。
这个也遇到问题,我采用的是EMQX5.2,它没有提供添加主题的API。
参考GPT和自己的思路:
首先,针对你的第一个想法,你的困惑确实是有合理性的,因为MQTT通信的确是基于不同主题的消息传递,而不能通过订阅相同主题的方式实现一对一通信。针对这个问题,你可以考虑使用MQTT的QoS(服务质量)特性,通过将消息的QoS设为1或2来确保消息的可靠传送,并通过消息标识(Message Identifier)来区分不同的消息,实现一对一通信。但是,这种方式可能需要你自己实现一些额外的逻辑。
针对你的第二个想法,使用HTTP API接口来实现插座与服务器的交互确实是一种可行的思路。但是,你提到了服务器需要通过EMQX的API接口来添加主题。虽然EMQX提供了比较丰富的API接口,但是确实不包括添加主题的功能。不过,你可以考虑使用EMQX的Webhook功能,通过配置Webhook来实现自定义添加主题的逻辑。具体来说,你可以将插座和用户信息以及需要订阅的主题信息都发送给服务器,然后服务器根据这些信息创建对应的主题和订阅关系,并通过Webhook发送到EMQX,完成主题添加的操作。这个解决方案需要你对EMQX和Webhook有一定的了解,但是实现起来应该也不是很困难。
总之,无论采用哪种方案,对于一个初学者来说,芯片和服务器的交互逻辑都是比较复杂的,需要一定的技术功底和实践经验。建议你可以先了解一下MQTT和HTTP通信的基本原理,然后根据具体的需求和技术条件选择适合自己的方案。同时,多查阅一些相关的资料和开源代码,可以帮助你更好地理解和实践。