MQTT测试工具:
MQTT Helper:http://mqtt-helper.mybluemix.net/
参考文章:
http://www.cfanz.cn/index.php?c=article&a=read&id=311967
C语言实现MQTT客户端
C/C++ MQTT Embedded Clients: https://www.eclipse.org/paho/clients/c/embedded/
MQTT使用标准端口吗?
TCP/IP的1833端口是IANA(互联网数字分配机构)为MQTT保留的端口号,同时也注册了8883端口用于MQTT在SSL上的传输。
MQTT支持安全传输吗?
可以在3.1版本的MQTT协议中在传输包中传输用户名和密码,使用SSL加密处理(显著增加网络开销)
SUBSCRIBE
client在成功建立TCP连接后,发送connect消息,得到Server授权允许建立连接的CONNACK消息后,client发送subscribe消息,订阅topic主题列表(至少一个主题)
订阅者的Topic name支持通配符 # 和 + :
1 #支持一个主题内任意级别话题
2 +只匹配一个主题级别的通配符
finance/stock/#
finance/sotkc/ibm/+
订阅部分,共有四个消息,分别一一对应。
命令 | 响应 | 备注 | 建议 |
---|---|---|---|
SUBSCRIBE | SUBACK | 协议没有涉及最多运行订阅TOPIC数目,隐藏的隐患 | 建议至多10个 |
UNSUBSCRIBE | UNSUBACK | 是否可以退订所有订阅,不详 | 建议保留至少一个Topic |
固定头部+可变头部+消息体
1) MessageType
public $operations=array(
"MQTT_CONNECT"=>1,//请求连接
"MQTT_CONNACK"=>2,//请求应答
"MQTT_PUBLISH"=>3,//发布消息
"MQTT_PUBACK"=>4,//发布应答
"MQTT_PUBREC"=>5,//发布已接收,保证传递1
"MQTT_PUBREL"=>6,//发布释放,保证传递2
"MQTT_PUBCOMP"=>7,//发布完成,保证传递3
"MQTT_SUBSCRIBE"=>8,//订阅请求
"MQTT_SUBACK"=>9,//订阅应答
"MQTT_UNSUBSCRIBE"=>10,//取消订阅
"MQTT_UNSUBACK"=>11,//取消订阅应答
"MQTT_PINGREQ"=>12,//ping请求
"MQTT_PINGRESP"=>13,//ping响应
"MQTT_DISCONNECT"=>14//断开连接
);
2) DUP flag
其是用来在保证消息传输可靠的,如果设置为1,则在下面的变长头部里多加MessageId,并需要回复确认,保证消息传输完成,但不能用于检测消息重复发送。
3) Qos
00表示最多一次 即<=1 ,无所谓消息丢失
01表示至少一次 即>=1, 确保消息到达,但可能出现消息重复
10表示一次,即==1 确保消息只到达一次,用于计费系统,消息丢失和重复都可能导致错误结果
11保留后用
4) Retain
主要用于PUBLISH(发布态)的消息,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它。如果不设那么推送至当前订阅的就释放了。
LWT(Last Will & Testament)最后遗嘱
MQTT本身就是为信号不稳定的网络设计的,所以难免一些客户端会无故的和Broker断开连接。
当客户端连接到Broker时,可以指定LWT,Broker会定期检测客户端是否有异常。
当客户端异常掉线时,Broker就往连接时指定的topic里推送当时指定的LWT消息。