前段时间做一个智能路由器的项目,要求使用MQTT,研究了几个相关的框架,还是选择MQTTClient,因为他的版本更新比较快!
项目应用场景
本地连接路由器WiFi,本地MQTT通信,配置路由器过程中路由器会重启,待路由器重启成功之后MQTT自动连接。如果没有本地连接路由器就使用MQTT远程通信。
项目中MQTT会有经常断开和自动连接的需求,在断开重连的时候各种崩溃,主要原因就是MQTTClient断开连接之后,某些类的数据没有释放完全,或者是对象内存释放时,所用内存并没有完全被擦除,仍有旧对象部分数据可用,重连的时候又使用到了这个类,导致crash。
如下关闭了MQTTClient:
但是马上重新连接就会crash:
这里self已经为nil,但是线程还是会走到这里,导致奔溃。
所以,我建立了两个MQTTClient管理的类,SQMQTTClientManager和SQMQTTClientLocationManager,一个管理远程通信,一个管理本地通信。这样可以解决本地与远程切换crash的问题。