谷动谷力

标题: mosquitto 客户端的开发流程 [打印本页]

作者: 鸣涧    时间: 2024-3-19 15:37
标题: 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的客户端程序框架了。






欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2