mosquitto 客户端的开发流程
mosquitto 客户端的开发流程
1、mosquitto资源的初始化
int mosquitto_lib_init(void);
注意事项:
(1) 必须在使用 mosquitto functions之前调用.
(2) 这个函数时非线程安全的
返回值:
*MOSQ_ERR_SUCCESS - on success.
*MOSQ_ERR_UNKNOWN - on Windows, if sockets couldn't be initialized.
2、创建mosquitto客户端实例对象
struct mosquitto *mosquitto_new(const char *id, bool clean_session, void *obj);
(1)id - 用唯一的字符串表示客户端的id. 如果为NULL,则clean_session 参数必须设置为true,才会自动生成一个id。
id是用于区分mosquitto客户端的唯一标识,如果两个或多个mosquitto客户端设置相同的id连接到服务器,会导致客户端彼此资源竞争,反复重连到服务器端,从而出现频繁上下线/或者无法上线的问题;反过来思考,如果我们需要一个仅知道id的远程mqtt客户端从服务器端断开,同样只需要在本地一个具有相同id的mqtt客户端连接到服务器即可(为什么会这样做?后续的实战篇我们就具体讲到)
(2)clean_session 设置为true指示代理在断开连接时清除所有消息和订阅,设置为false指示代理保留它们。客户机永远不会在断开连接时丢弃自己的传出消息。而且,当调用mosquitto 客户端重新连接到服务器是,发送失败的消息会被重新发送出去
(3) obj - 一个数据结构的指针对象,该对象结构可以在mosquitto的回调函数中使用(非必要设置,可以为NULL,但是在实际项目开发中还是相当有用的)
*3、配置mosquitto连接服务器用户名和密码
int mosquitto_username_pw_set(struct mosquitto *mosq, const char *username, const char *password);
注意事项:
(1)如果此函数不被调用,即默认用户名和密码为空
(2)如果函数被调用,同时用户名为空,则密码也将被忽略
*4、配置SSL方案
1、设置加密协议版本
int mosquitto_tls_opts_set(struct mosquitto *mosq, int cert_reqs, const char *tls_version, const char *ciphers);
2、配置SSL加密证书(证书的制作必须和服务器端匹配,具体如何生成,我们在后续的项目中来说一说)
int mosquitto_tls_set(struct mosquitto *mosq,
const char *cafile, const char *capath,
const char *certfile, const char *keyfile,
int (*pw_callback)(char *buf, int size, int rwflag, void *userdata));
5、配置mosquitto事件回调
(1)连接回调
void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int));
(2)断开连接回调
void mosquitto_disconnect_callback_set(struct mosquitto *mosq, void (*on_disconnect)(struct mosquitto *, void *, int));
(3)主题订阅回调
void mosquitto_subscribe_callback_set(struct mosquitto *mosq, void (*on_subscribe)(struct mosquitto *, void *, int, int, const int *));
(4)消息回调
void mosquitto_message_callback_set(struct mosquitto *mosq, void (*on_message)(struct mosquitto *, void *, const struct mosquitto_message *));
(5)日志信息回调
void mosquitto_log_callback_set(struct mosquitto *mosq, void (*on_log)(struct mosquitto *, void *, int, const char *));
6、mosquitto客户端连接到服务器
int mosquitto_connect(struct mosquitto *mosq, const char *host, int port, int keepalive);
(1)指定mosquitto目标服务器的ip和端口
(2)指定心跳时间,当客户端产生异常,达到keepalive时间时,服务器端会认定当前客户端已经断线;
所以,如果使用客户端使用了自动重连设置(如下),这里的超时设置一定要谨慎,keepalive的时间应该大于服务器端设置的超时,否则容易出现设备频繁上下线的问题
*7、重连设置
(1)阻塞重连
int mosquitto_loop_forever(struct mosquitto *mosq, int timeout, int max_packets);
此函数在无限阻塞循环中为您调用loop()。对于只希望在程序中运行MQTT客户机循环的情况,它非常有用。
(2)异步重连
int mosquitto_loop_start(struct mosquitto *mosq);
这是线程化客户端接口的一部分。调用此函数一次以启动一个新线程来处理mqtt网络连接。这为您自己反复调用<mosquitto_loop>提供了另一种选择。
重连选项设置:
int mosquitto_reconnect_delay_set(struct mosquitto *mosq, unsigned int reconnect_delay, unsigned int reconnect_delay_max, bool reconnect_exponential_backoff);
可设置重连延时时间,包含两种模式:
(1)固定延时发起重连请求
(2)按照设定的起止时间以及间隔时间,发起重连请求(这一套逻辑更加符合实际项目开发)
* Example 1:
* delay=2, delay_max=10, exponential_backoff=False
* Delays would be: 2, 4, 6, 8, 10, 10, ...
*
* Example 2:
* delay=3, delay_max=30, exponential_backoff=True
* Delays would be: 3, 6, 12, 24, 30, 30, ...
8、mosquito退出和库相关资源释放
int mosquitto_lib_cleanup(void);
按照上面的流程来,轻轻松松就可以构建一个mosquitto的客户端程序框架了。
页:
[1]