赞
踩
目录
MQTT通信模型示意图如下:
使用电视台、记者、观众三个角色来类比更容易理解:
还是以日常生活为例,提几个问题:
这个过程中,引入两个概念:
具体的流程是这样的:
整个过程中,电视台和记者、电视台和观众直接的电话要保持连接状态,还要时不时确认一下:
安装这2个APP:
使用DOS命令行,进入mosquitto-2.0.14-install-windows-x64的安装目录,执行命令:
- cd "c:\Program Files\mosquitto"
- .\mosquitto.exe -v
在下面的实验中,无论是使用MQTTX还是使用mosquitto_pub/mosquitto_sub,都要保持mosquitto.exe在运行。
运行MQTTX后,如下图操作:
建立连接后,如下图操作:
如下操作:
可见客户订阅的主题,当发布者发布对应主题及内容时,服务器会接收到内容并转发给客户。
参数说明:
- mosquitto_pub 命令参数说明
- 1. -d 打印debug信息
- 2. -f 将指定文件的内容作为发送消息的内容
- 3. -h 指定要连接的域名 默认为localhost
- 4. -i 指定要给哪个clientId的用户发送消息
- 5. -I 指定给哪个clientId前缀的用户发送消息
- 6. -m 消息内容
- 7. -n 发送一个空(null)消息
- 8. -p 连接端口号
- 9. -q 指定QoS的值(0,1,2)
- 10. -t 指定topic
- 11. -u 指定broker访问用户
- 12. -P 指定broker访问密码
- 13. -V 指定MQTT协议版本
- 14. --will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
- 15. --will-qos Will的QoS值。该参数需要与--will-topic一起使用
- 16. --will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
- 17. --will-topic 用户发送Will消息的topic
使用DOS命令行,进入mosquitto-2.0.14-install-windows-x64的安装目录,执行命令:
- cd "c:\Program Files\mosquitto"
- .\mosquitto_pub.exe -h 127.0.0.1 -p 1883 -t "100ask" -m "test"
参数说明:
- mosquitto_sub 命令参数说明
- 1. -c 设定‘clean session’为无效状态,这样一直保持订阅状态,即便是已经失去连接,如果再次连接仍旧能够接收的断开期间发送的消息。
- 2. -d 打印debug信息
- 3. -h 指定要连接的域名 默认为localhost
- 4. -i 指定clientId
- 5. -I 指定clientId前缀
- 6. -k keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒。
- 7. -q 指定希望接收到QoS为什么的消息 默认QoS为0
- 8. -R 不显示陈旧的消息
- 9. -t 订阅topic
- 10. -v 打印消息
- 11. --will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
- 12. --will-qos Will的QoS值。该参数需要与--will-topic一起使用
- 13. --will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
- 14. --will-topic 用户发送Will消息的topic
使用DOS命令行,进入mosquitto-2.0.14-install-windows-x64的安装目录,执行命令:
几条代码使用MQTT:
- void my_message_handler_t(void* client, message_data_t* msg)
- {
- }
-
- int main(void)
- {
- int err;
- mqtt_client_t *client = NULL;
-
- err = mqtt_connect(client);
-
- err = mqtt_subscribe(client, "100ask-topic", QOS0, my_message_handler_t);
-
- while (1);
- }
从上述代码中,提2个问题:
答案:
kawaii-mqtt内部处理都是使用mqtt_yield_thread线程来处理:
主要函数是mqtt_yield:
mqtt_yield里的核心函数是对数据包的处理:mqtt_packet_handle
mqtt_client结构体里有2个链表:
MQTT Client向Broker发出某些数据包时,期待得到回应(ACK):会启动一个定时器。如果定时器超时表示没有收到ACK:
对于ACK包,一般无需提供处理函数
要订阅某个主题时,MQTT Client会发出SUBCRIBE包,期待得到回应的数据包:SUBACK包。代码如下:
- mqtt_subscribe
- msg_handler = mqtt_msg_handler_create(topic_filter, qos, handler);
- rc = mqtt_ack_list_record(c, SUBACK, packet_id, len, msg_handler);
- /* create a ack handler node */
- ack_handler = mqtt_ack_handler_create(c, type, packet_id, payload_len, handler);
- platform_timer_cutdown(&ack_handler->timer, c->mqtt_cmd_timeout);
- mqtt_list_add_tail(&ack_handler->list, &c->mqtt_ack_handler_list);
如果在指定时间里没有收到SUBACK包,那么就会在mqtt_ack_handler_list中删除该handler。
如果收到队列SUBACK包,那么要做两件事:
参考资料:
kawaii-mqtt源码:
博客
APP
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。