我最近学习MQTT协议,从入门到差点放弃,踩了很多坑,今天分享我的经历和学到的经验。
我,最近,因为,项目,需要,开始,学习,MQTT,协议,MQTT,是,物联网,领域,非常,流行,的,一个,轻量级,消息,传输,协议,广泛,应用,于,物联网,传感器,通信,移动,应用,即时,通讯,等,场景,我,以前,对,MQTT,只是,听说,过,没有,实际,用过,这次,因为,项目,需要,就,开始,认真,学习,MQTT。
从,最,基础,的,概念,开始,到,实际,搭建,Broker,写,客户端,代码,做,测试,整个,过程,踩,了,很多,坑,也,走,了,很多,弯路,甚至,一度,想,放弃,觉得,MQTT,怎么,这么,多,细节,这么,难,搞,但是,最后,还是,坚持,下来,了,也,对,MQTT,有,了,比较,深入,的,理解。
今天,这篇,文章,就,来,分享,一下,我,学习,MQTT,的,经历,从,入门,到,差点,放弃,再,到,掌握,整个,过程,中,踩,过,的,坑,学到,的,经验,以及,对,MQTT,的,理解。
一、为什么要学MQTT
先,说说,我,为什么,要,学,MQTT,我们,项目,最近,要,做,一个,物联网,相关,的,功能,需要,和,大量,的,设备,进行,通信,设备,会,频繁,上报,数据,服务端,也,需要,向,设备,下发,指令,一开始,我们,考虑,用,HTTP,协议,但是,很快,就,发现,HTTP,不,太,适合,这个,场景,首先,HTTP,是,请求,响应,模式,设备,要,上报,数据,需要,主动,发,HTTP,请求,服务端,要,下发,指令,就,比较,麻烦,需要,设备,轮询,或者,用,长连接,但是,HTTP,长连接,效率,不,高,而且,设备,一般,算力,和,网络,带宽,都,有限,HTTP,协议,头,比较,重,开销,大,不,适合,低功耗,低带宽,的,物联网,设备,另外,设备,数量,多,连接,数,大,HTTP,的,连接,管理,也,比较,麻烦。
后来,经过,调研,我们,发现,MQTT,协议,非常,适合,这个,场景,MQTT,是,一个,轻量级,的,发布,订阅,模式,的,消息,传输,协议,专门,为,低带宽,低功耗,不稳定,网络,环境,设计,的,非常,适合,物联网,场景,MQTT,用,发布,订阅,模式,设备,和,服务端,建立,长连接,设备,可以,向,主题,发布,消息,也,可以,订阅,感兴趣,的,主题,接收,消息,服务端,也,可以,向,主题,发布,消息,订阅,了,该,主题,的,设备,就,能,收到,这样,双向,通信,就,很,方便,而且,MQTT,协议,头,非常,小,最小,的,报文,只有,2个字节,开销,很小,适合,低带宽,低功耗,的,设备,另外,MQTT,还,支持,QoS,服务质量,等级,遗嘱,消息,保留,消息,等,特性,能,满足,不同,场景,的,需求,非常,灵活,所以,我们,最后,决定,用,MQTT,协议,来,做,设备,通信,我,也,因此,开始,学习,MQTT。
二、入门阶段:概念理解和环境搭建
开始,学习,MQTT,的,时候,我,先,从,基本,概念,开始,学,MQTT,的,核心,概念,其实,不,复杂,主要,就是,发布,订阅,模式,有,三个,角色,发布者,Broker,和,订阅者,发布者,负责,向,主题,发布,消息,Broker,是,消息,代理,服务器,负责,接收,发布者,的,消息,然后,转发,给,订阅,了,对应,主题,的,订阅者,订阅者,负责,向,Broker,订阅,感兴趣,的,主题,接收,Broker,转发,的,消息,发布者,和,订阅者,不需要,直接,通信,都,只,和,Broker,通信,解耦,了,发布者,和,订阅者,这,就是,发布,订阅,模式,的,核心,和,我,以前,熟悉,的,消息,队列,比如,RabbitMQ,Kafka,的,模式,类似,但是,MQTT,更,轻量,更,简单,专门,针对,物联网,场景,优化。
主题,Topic,是,MQTT,中,很,重要,的,概念,主题,是,一个,分层,的,字符串,用,斜杠,分隔,比如,sensors/temperature/room1,sensors/humidity/room2,等等,发布者,向,某个,主题,发布,消息,订阅者,可以,订阅,具体,的,主题,也,可以,用,通配符,订阅,一类,主题,通配符,有,两种,加号,+,匹配,单层,主题,井号,#,匹配,多层,主题,必须,放在,最后,比如,sensors/+/room1,匹配,sensors/temperature/room1,sensors/humidity/room1,等等,sensors/#,匹配,sensors,开头,的,所有,主题,主题,的,设计,很,重要,合理,的,主题,结构,能,让,消息,的,路由,更,清晰,更,灵活,我,最,开始,对,主题,的,设计,没,太,在意,随便,起,的,主题,名,后来,发现,主题,设计,不好,后面,维护,和,扩展,都,很,麻烦,这,是,后话,了。
了解,了,基本,概念,之后,我,就,开始,搭建,环境,做,测试,MQTT,的,Broker,有,很多,实现,比如,EMQX,Mosquitto,HiveMQ,等等,我,选,了,EMQX,因为,它,是,国产,的,开源,Broker,功能,强大,性能,好,文档,也,比较,全,中文,文档,对,国内,开发者,比较,友好,安装,也,简单,我,用,Docker,一键,就,启动,了,EMQX,非常,方便,然后,客户端,工具,我,用,了,MQTTX,也是,EMQX,官方,出,的,一个,跨平台,的,MQTT,客户端,工具,界面,友好,功能,齐全,能,方便,地,连接,Broker,发布,和,订阅,消息,做,测试,非常,方便,环境,搭建,好,之后,我,就,用,MQTTX,连接,EMQX,订阅,一个,主题,然后,用,另一个,连接,向,这个,主题,发布,消息,看到,订阅,的,那边,收到,了,消息,非常,有,成就感,觉得,MQTT,也,没,那么,难,很,简单,嘛,这,就是,我,入门,阶段,的,感受,觉得,MQTT,简单,易用,很快,就,上手,了。
三、进阶阶段:踩坑和差点放弃
但是,很快,我,就,进入,了,进阶,阶段,开始,遇到,各种,问题,踩,各种,坑,甚至,一度,想,放弃,觉得,MQTT,怎么,这么,多,细节,这么,难,搞。
第一个,大坑,就是,QoS,等级,的,理解,和,使用,MQTT,支持,三个,QoS,等级,QoS 0,最多,一次,消息,可能,丢失,QoS 1,至少,一次,消息,保证,到达,但是,可能,重复,QoS 2, exactly once,消息,保证,恰好,一次,到达,不,丢失,也,不,重复,我,最,开始,以为,QoS,越,高,越,好,所以,所有,消息,都,用,QoS 2,觉得,这样,最,可靠,但是,很快,就,发现,问题,了,首先,QoS 2,的,性能,很差,因为,需要,四次,握手,开销,大,吞吐量,低,延迟,高,设备,数量,多,的,时候,Broker,压力,很,大,其次,QoS 2,的,实现,比较,复杂,客户端,和,Broker,都,需要,维护,消息,状态,处理,不好,容易,出,问题,我,当时,就,遇到,了,消息,堆积,的,问题,因为,客户端,处理,慢,QoS 2,的,消息,都,堆积,在,Broker,和,客户端,的,队列,里,导致,内存,占用,越来越,高,最后,Broker,都,差点,挂,了,后来,查,了,很多,资料,才,明白,QoS,不是,越,高,越,好,要,根据,场景,选择,合适,的,QoS,对于,不,重要,的,数据,比如,传感器,频繁,上报,的,温度,数据,丢,一两个,没关系,用,QoS 0,就,行,性能,好,开销,小,对于,比较,重要,的,数据,比如,设备,状态,变更,用,QoS 1,保证,到达,就行,重复,的,消息,客户端,做,幂等,处理,就,好,对于,非常,重要,不能,丢,也,不能,重复,的,消息,比如,关键,指令,才,用,QoS 2,而且,要,控制,QoS 2,消息,的,频率,和,数量,不能,所有,消息,都,用,QoS 2,理解,了,这个,之后,我,把,大部分,消息,改,成,QoS 0,和,QoS 1,只,有,关键,指令,用,QoS 2,性能,问题,就,解决,了,消息,也,不,堆积,了,这个,坑,让,我,明白,技术,选型,要,根据,场景,不能,盲目,追求,最高,的,规格,适合,的,才,是,最好,的。
第二个,大坑,是,遗嘱,消息,和,保留,消息,的,使用,MQTT,有,两个,很,有用,的,特性,遗嘱,消息,和,保留,消息,遗嘱,消息,是,客户端,连接,Broker,的,时候,可以,设置,一个,遗嘱,消息,如果,客户端,异常,断开,连接,比如,网络,断了,设备,掉电,了,Broker,会,自动,发布,这个,遗嘱,消息,通知,其他,订阅者,这个,特性,非常,适合,做,设备,在线,状态,监测,设备,连接,的,时候,设置,遗嘱,消息,内容,是,离线,设备,正常,断开,的,时候,手动,发布,离线,消息,异常,断开,的,时候,Broker,自动,发布,遗嘱,离线,消息,这样,就能,实时,监测,设备,的,在线,状态,了,我,最,开始,用,遗嘱,消息,的,时候,没,太,理解,它,的,触发,机制,以为,只要,客户端,断开,就,会,触发,后来,发现,不是,的,只有,异常,断开,才,会,触发,正常,断开,不会,触发,而且,遗嘱,消息,是,在,连接,的,时候,设置,的,存在,Broker,上,连接,断开,后,就,失效,了,我,当时,因为,没,搞,清楚,这些,细节,导致,设备,状态,监测,经常,不准,有时候,设备,已经,离线,了,但是,状态,还是,在线,有时候,设备,在线,但是,状态,显示,离线,排查,了,很久,才,发现,是,遗嘱,消息,的,使用,不当,导致,的,后来,仔细,看,了,文档,搞,清楚,了,遗嘱,消息,的,机制,才,解决,了,这个,问题,保留,消息,也,类似,保留,消息,是,发布者,发布,消息,的,时候,可以,设置,保留,标志,Broker,会,保存,这个,主题,的,最新,一条,保留,消息,新,的,订阅者,订阅,这个,主题,的,时候,会,立即,收到,这条,保留,消息,不用,等,下,一条,消息,这个,特性,适合,做,最新,状态,的,获取,比如,设备,上报,当前,温度,设置,为,保留,消息,新,的,订阅者,一,订阅,就,能,收到,最新,的,温度,不用,等,设备,下,一次,上报,我,最,开始,也,没,搞,清楚,保留,消息,的,机制,以为,所有,消息,都,会,保留,后来,发现,只有,设置,了,保留,标志,的,消息,才,会,保留,而且,每个,主题,只,保留,最新,一条,新,的,保留,消息,会,覆盖,旧,的,搞,清楚,这些,细节,之后,才,用,对,了,保留,消息,这些,细节,虽然,不,复杂,但是,不,注意,的话,很,容易,踩,坑,而且,排查,起来,很,麻烦,因为,都是,隐蔽,的,逻辑,问题,不是,明显,的,报错。
第三个,大坑,是,连接,和,会话,的,管理,MQTT,客户端,连接,Broker,的,时候,可以,设置,clean session,标志,如果,clean session,为,true,连接,断开,后,Broker,会,清除,这个,客户端,的,所有,会话,信息,包括,订阅,关系,和,未,确认,的,消息,如果,clean session,为,false,连接,断开,后,Broker,会,保留,这个,客户端,的,会话,信息,包括,订阅,关系,和,未,确认,的,消息,等,客户端,重新,连接,的,时候,继续,接收,这些,消息,这个,特性,对于,网络,不稳定,的,设备,很,有用,设备,网络,断,了,重新,连接,后,能,继续,收到,断连,期间,的,消息,不会,丢,但是,我,最,开始,没,太,理解,这个,机制,clean session,随便,设置,的,有时候,用,true,有时候,用,false,导致,各种,奇怪,的,问题,比如,客户端,重新,连接,后,收不到,消息,或者,收到,很多,旧,的,重复,消息,或者,订阅,关系,丢失,了,要,重新,订阅,排查,了,很久,才,发现,是,clean session,设置,不当,导致,的,后来,搞,清楚,了,clean session,的,机制,根据,场景,合理,设置,对于,需要,可靠,接收,消息,的,设备,用,clean session false,并且,设置,固定,的,clientId,这样,断连,重连,后,会话,能,恢复,消息,不,丢,对于,临时,的,客户端,或者,不需要,接收,离线,消息,的,场景,用,clean session true,简单,方便,不会,有,会话,残留,的,问题,搞,清楚,这个,之后,连接,和,会话,的,问题,就,解决,了,这个,坑,也,让,我,明白,MQTT,的,很多,特性,都,是,为了,不同,场景,设计,的,要,理解,清楚,原理,再,使用,不能,想当然,随便,设置。
除了,这些,大坑,还有,很多,小坑,比如,clientId,必须,唯一,不,能,重复,不然后,连接,会,互相,踢,下线,比如,用户名,密码,认证,和,权限,控制,没,配置,好,导致,连接,不,上,或者,没,权限,发布,订阅,比如,TLS,加密,连接,的,证书,配置,很,麻烦,踩,了,很多,坑,比如,主题,通配符,的,使用,规则,没,搞,清楚,导致,订阅,不,到,消息,或者,订阅,到,不,想要,的,消息,等等,这些,坑,加,在,一起,让,我,那段,时间,非常,痛苦,每天,都,在,排查,各种,奇怪,的,问题,甚至,一度,想,放弃,觉得,MQTT,怎么,这么,多,细节,这么,难,搞,不如,还是,用,HTTP,算了,简单,省心,但是,后来,还是,坚持,下来,了,一个,一个,坑,地,踩,一个,一个,问题,地,解决,慢慢,对,MQTT,的,理解,越来越,深入,也,越来越,熟练,最后,终于,把,项目,的,MQTT,通信,部分,做,稳定,了,回头,看,其实,这些,坑,都,不是,什么,大,问题,都是,一些,细节,和,原理,理解,不到位,导致,的,只要,认真,看,文档,理解,原理,大部分,坑,都,能,避免,但是,当时,因为,急于,上手,没,仔细,看,文档,很多,细节,一知半解,就,开始,用,所以,踩,了,很多,坑,这,也,是,我,自己,的,问题,不能,怪,MQTT,MQTT,本身,设计,得,还是,很,合理,很,完善,的。
四、掌握阶段:深入理解和最佳实践
踩,了,很多,坑,之后,我,慢慢,进入,了,掌握,阶段,对,MQTT,的,理解,越来越,深入,也,总结,了,一些,最佳,实践,下面,分享,给,大家。
首先,是,主题,设计,的,最佳,实践,主题,是,MQTT,中,非常,重要,的,部分,合理,的,主题,设计,能,让,消息,路由,清晰,灵活,易维护,我,总结,了,几个,主题,设计,的,原则,第一,主题,要,分层,用,斜杠,分隔,从,大,到,小,比如,项目名/设备类型/设备ID/数据类型,这样,结构,清晰,方便,用,通配符,订阅,一类,消息,第二,主题,不要,太,深,也,不要,太,浅,一般,3到5层,比较,合适,太,深,了,管理,麻烦,太,浅,了,不够,灵活,第三,主题,名,要用,有意义,的,英文,单词,不要,用,中文,或者,无意义,的,缩写,方便,理解,和,维护,第四,不要,在,主题,里,放,动态,的,内容,比如,时间戳,随机数,等等,主题,应该,是,相对,固定,的,分类,第五,合理,使用,通配符,订阅,的,时候,尽量,用,具体,的,主题,少,用,通配符,尤其是,#,避免,收到,太多,不相关,的,消息,浪费,带宽,和,处理,资源,按照,这些,原则,设计,主题,基本,就,不会,有,太,大,问题,后期,维护,和,扩展,也,比较,方便。
其次,是,QoS,选择,的,最佳,实践,前面,说,过,QoS,不是,越,高,越,好,要,根据,场景,选择,我,总结,了,几个,原则,第一,QoS 0,适合,不,重要,的,频繁,上报,的,数据,比如,传感器,的,温度,湿度,数据,丢,一两个,没关系,而且,上报,频繁,QoS 0,性能,好,开销,小,第二,QoS 1,适合,比较,重要,的,消息,比如,设备,状态,变更,告警,信息,等等,保证,消息,到达,但是,可能,重复,客户端,需要,做,幂等,处理,QoS 1,是,最,常用,的,等级,平衡,了,可靠性,和,性能,第三,QoS 2,适合,非常,重要,不能,丢,也,不能,重复,的,消息,比如,关键,控制,指令,支付,消息,等等,但是,QoS 2,性能,差,开销,大,要,控制,使用,频率,和,数量,不能,滥用,另外,发布,和,订阅,的,QoS,可能,不一样,Broker,会,取,两者,的,最小值,来,传递,消息,这个,细节,也,要,注意,不然,可能,期望,的,QoS,和,实际,的,不一样,按照,这些,原则,选择,QoS,基本,就能,平衡,可靠性,和,性能,不会,出,太,大,问题。
再次,是,连接,管理,的,最佳,实践,MQTT,是,长连接,协议,连接,的,管理,很,重要,我,总结,了,几个,原则,第一,clientId,必须,唯一,每个,客户端,的,clientId,不能,重复,不然后,连接,会,互相,踢,下线,导致,连接,不稳定,建议,用,设备,唯一,标识,比如,MAC地址,设备序列号,作为,clientId,第二,合理,设置,keepalive,心跳,间隔,keepalive,是,客户端,和,Broker,约定,的,最大,消息,间隔,如果,超过,这个,时间,没有,消息,往来,客户端,会,发,PINGREQ,心跳,包,Broker,回复,PINGRESP,保持,连接,keepalive,设置,太,短,心跳,频繁,浪费,带宽,和,资源,设置,太,长,连接,断开,后,Broker,要,很久,才,能,检测,到,遗嘱,消息,触发,延迟,一般,设置,为,60到300秒,比较,合适,根据,场景,调整,第三,合理,设置,clean session,前面,说,过,需要,可靠,接收,离线,消息,的,设备,用,false,并且,固定,clientId,临时,客户端,用,true,第四,做好,连接,异常,处理,和,重连,机制,网络,不稳定,的,场景,连接,可能,会,断,客户端,要,能,检测,到,断开,并且,自动,重连,重连,后,恢复,订阅,和,会话,大部分,MQTT,客户端,库,都,自带,自动,重连,功能,要,合理,配置,第五,合理,使用,遗嘱,消息,做,设备,在线,状态,监测,前面,详细,说,过,遗嘱,消息,的,机制,这里,就,不,重复,了,按照,这些,原则,管理,连接,基本,就能,保证,连接,的,稳定,和,可靠。
最后,是,安全,的,最佳,实践,MQTT,的,安全,也,很,重要,我,总结,了,几个,原则,第一,启用,认证,不要,允许,匿名,连接,Broker,要,配置,用户名,密码,认证,或者,更,安全,的,客户端,证书,认证,避免,未授权,的,客户端,连接,第二,配置,权限,控制,不同,的,客户端,有,不同,的,发布,订阅,权限,比如,设备,只能,发布,自己,的,主题,订阅,自己,的,指令,主题,不能,发布,或,订阅,其他,设备,的,主题,避免,越权,操作,第三,敏感,数据,要用,TLS,加密,传输,避免,数据,被,窃听,或,篡改,TLS,虽然,有,一定,的,性能,开销,但是,对于,敏感,数据,是,必要,的,第四,定期,更新,Broker,和,客户端,库,的,版本,修复,安全,漏洞,第五,监控,Broker,的,运行,状态,和,连接,数,消息,数,等等,指标,及时,发现,异常,和,攻击,按照,这些,原则,做,安全,基本,就能,保证,MQTT,系统,的,安全,不会,出,太,大,的,安全,问题。
五、我的感悟和建议
回顾,整个,学习,MQTT,的,过程,从,入门,到,差点,放弃,再,到,掌握,我,有,很多,感悟,也,有,一些,建议,给,也,在,学习,MQTT,的,朋友。
第一个,感悟,是,不要,轻视,任何,技术,MQTT,看起来,简单,协议,小,概念,少,但是,实际,用,起来,细节,非常,多,很多,特性,和,机制,不,深入,理解,的话,很,容易,踩,坑,而且,排查,起来,很,麻烦,所以,不要,觉得,MQTT,简单,就,不,认真,学,随便,用,还是,要,认真,看,文档,理解,原理,搞,清楚,每个,特性,的,机制,和,使用,场景,这样,才能,用,好,MQTT,少,踩,坑。
第二个,感悟,是,技术,选型,要,根据,场景,没有,银弹,MQTT,虽然,适合,物联网,场景,但是,也,不是,所有,场景,都,适合,比如,大,文件,传输,高,吞吐量,的,日志,传输,等等,可能,其他,协议,更,合适,而且,MQTT,内部,的,各种,特性,比如,QoS,clean session,遗嘱,消息,等等,也,都,要,根据,场景,选择,不能,盲目,追求,最高,的,规格,适合,的,才,是,最好,的,这个,道理,不仅,适用,于,MQTT,也,适用,于,所有,技术,选型,要,根据,实际,场景,和,需求,选择,合适,的,技术,和,配置,不要,想当然,不要,盲目,跟风。
第三个,感悟,是,遇到,问题,不要,轻易,放弃,我,当时,踩,了,很多,坑,非常,痛苦,一度,想,放弃,但是,最后,还是,坚持,下来,了,一个,一个,问题,地,解决,最后,终于,掌握,了,MQTT,也,把,项目,做,稳定,了,回头,看,其实,那些,坑,都,不是,什么,跨不过去,的,难题,只要,认真,查,资料,看,文档,思考,原理,都,能,解决,很多,时候,我们,觉得,难,想,放弃,只是,因为,暂时,没,找到,思路,或者,踩,的,坑,太多,心态,崩,了,这时候,要,调整,心态,不要,急,一个,一个,问题,地,解决,坚持,下去,总能,突破,的,而且,踩,坑,的,过程,也是,学习,和,成长,的,过程,踩,过,的,坑,越多,对,技术,的,理解,越,深入,以后,再,遇到,类似,问题,就能,很快,解决,所以,不要,怕,踩,坑,不要,怕,遇到,问题,这些,都是,成长,的,机会。
给,也,在,学习,MQTT,的,朋友,的,建议,第一,先,认真,看,官方,文档,理解,基本,概念,和,原理,不要,急于,上手,写,代码,基础,打牢,了,后面,才,能,少,踩,坑,第二,从,简单,的,场景,开始,用,MQTTX,等,工具,做,测试,熟悉,基本,的,发布,订阅,流程,然后,再,写,代码,做,更,复杂,的,功能,第三,遇到,问题,多,查,文档,多,思考,原理,不要,盲目,试,很多,MQTT,的,问题,都是,因为,对,原理,理解,不到位,导致,的,理解,了,原理,问题,自然,就,解决,了,第四,多,做,测试,各种,异常,场景,都,要,测,到,比如,网络,断开,重连,Broker,重启,客户端,异常,退出,等等,确保,系统,在,各种,异常,场景,下,都,能,正常,工作,第五,关注,社区,和,最佳,实践,MQTT,社区,很,活跃,有,很多,经验,分享,和,最佳,实践,多,看看,能,少,走,很多,弯路。
六、写在最后
MQTT,是,一个,非常,优秀,的,轻量级,消息,传输,协议,特别,适合,物联网,低带宽,低功耗,的,场景,虽然,学习,过程,中,我,踩,了,很多,坑,一度,想,放弃,但是,最后,还是,坚持,下来,了,也,对,MQTT,有,了,比较,深入,的,理解,把,项目,的,MQTT,通信,部分,做,稳定,了,回头,看,这段,经历,还是,很,有,价值,的,不仅,学,会,了,MQTT,这个,技术,也,锻炼,了,自己,解决,问题,的,能力,和,心态,踩,坑,不可怕,可怕,的,是,遇到,坑,就,放弃,只要,坚持,下去,认真,解决,每个,问题,总能,掌握,的。
现在,MQTT,已经,成为,我,技术,栈,里,很,重要,的,一个,协议,做,物联网,相关,的,项目,都,会,优先,考虑,用,MQTT,它,确实,很,适合,这类,场景,能,帮,我们,解决,很多,设备,通信,的,问题,而且,随着,物联网,的,发展,MQTT,的,应用,会,越来越,广泛,掌握,MQTT,还是,很,有,价值,的。
希望,这篇,文章,能,给,也,在,学习,MQTT,的,朋友,一些,参考,和,启发,帮,大家,少,走,弯路,少,踩,坑,也,欢迎,大家,在,评论,区,分享,你们,学习,和,使用,MQTT,的,经验,和,踩,过,的,坑,一起,交流,一起,进步,谢谢,大家,的,阅读。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录