【MQTT】Mosquitto库函数常见API函数

1.初始化和清理

(1)mosquitto_lib_init()

mosquitto_lib_init();

功能:初始化Mosquitto库,必须在使用Mosquitto库其他函数之前调用

(2)mosquitto_lib_cleanup()

mosquitto_lib_cleanup();

功能:清理Mosquitto库相关资源,必须在程序结束时调用

2.客户端的创建和销毁

(1)mosquitto_new()

struct mosquitto *mosquitto_new(const char *id, bool clean_session, void *userdata);

功能:创建一个Mosquitto客户端实例
参数:
id:客户端ID字符串
clean_session:一个布尔值,表示是否启用清理会话
userdata:指向用户自定义数据的指针
返回值:指向新创建的Mosquitto客户端实例的指针

(2)mosquitto_destroy()

void mosquitto_destroy(struct mosquitto *mosq);

功能:销毁Mosquitto客户端实例,并释放相关资源
参数:指向Mosquitto客户端实例的指针

3.客户端用户名和密码

(1)mosquitto_username_pw_set

int mosquitto_username_pw_set(struct  mosquitto  *mosq, const  char  *username, const char  *password)

功能:为 mosquitto 实例配置用户名和密码。默认情况下,不会发送用户名或密码。对于 v3.1 和 v3.1.1 客户端,如果 username 为 NULL,则忽略密码参数。这必须在调用mosquitto_connect之前调用。

参数:
mosq:一个有效的mosquitto实例
username:要作为字符串发送的用户名,或 NULL 以禁用身份验证。
password:作为字符串发送的密码。当用户名有效时设置为 NULL,以便仅发送用户名。

返回值:
MOSQ_ERR_SUCCESS:关于成功。
MOSQ_ERR_INVAL:如果输入参数无效。
MOSQ_ERR_NOMEM:如果发生内存不足的情况。

4.与MQTT代理服务器的连接、重新连接与断开连接

(1)mosquitto_connect()

int mosquitto_connect(struct mosquitto *mosq, const char *host, int port, int keepalive);

功能:连接到MQTT代理服务器
参数:
mosq:指向Mosquitto客户端实例的指针
host:代理服务器的主机名和IP地址
port:代码服务器的端口号
keepalive:保持连接的时间间隔(以秒为单位)
返回值:连接结果,成功返回0,失败返回错误码

(2)mosquitto_disconnect()

int mosquitto_disconnect(struct mosquitto *mosq);

功能:断开与MQTT代理服务器的连接
参数:指向Mosquitto客户端实例的指针
返回值:
MOSQ_ERR_SUCCESS:关于成功。
MOSQ_ERR_INVAL:如果输入参数无效。
MOSQ_ERR_NO_CONN:如果客户端未连接到代理

(3)mosquitto_reconnect()

int mosquitto_reconnect(struct mosquitto *mosq);

功能:重新连接到代理。此功能提供了一种在连接丢失后重新连接到代理的简单方法。它使用mosquitto_connect调用中提供的值。但不能在mosquitto_connect之前调用它。
参数:指向Mosquitto客户端实例的指针
返回值:
MOSQ_ERR_SUCCESS:关于成功。
MOSQ_ERR_INVAL:如果输入参数无效。
MOSQ_ERR_NOMEM:如果发生内存不足的情况。
MOSQ_ERR_ERRNO:如果系统调用返回错误。变量 errno 包含错误代码,即使在 Windows 上也是如此。在Linux下可使用 strerror(errno) 或在 Windows 上使用 FormatMessage()获取错误。

5.发布、订阅与取消订阅

(1)mosquitto_publish()

mosquitto_publish(struct mosquitto *mosq, int *mid, const char *topic, int payloadlen, const void *payload qos, bool retain);

功能:向MQTT代理服务器发布消息
参数:
mosq:指向Mosquitto客户端实例的指针
mid:用于存储消息ID的整数指针
topic:消息的主题
payloadlen:消息负载的字节数
payload:指向消息负载数据的指针
qos:消息的服务质量(0、1、2)
retain:指定是否保留消息
返回值:
MOSQ_ERR_SUCCESS:成功
MOSQ_ERR_INVAL:如果输入参数无效。
MOSQ_ERR_NOMEM:如果发生内存不足的情况。
MOSQ_ERR_NO_CONN:如果客户端未连接到代理。
MOSQ_ERR_PROTOCOL:如果与代理通信时出现协议错误。
MOSQ_ERR_PAYLOAD_SIZE:如果 payloadlen 太大。
MOSQ_ERR_MALFORMED_UTF8:如果主题不是有效的 UTF-8
MOSQ_ERR_QOS_NOT_SUPPORTED:如果 QoS 大于代理所支持的。
MOSQ_ERR_OVERSIZE_PACKET:如果生成的数据包比代理支持的大。

(2)mosquitto_subscribe()

mosquitto_subscribe(struct mosquitto *mosq, int *mid, const char *sub, int qos);

功能:向MQTT代理服务器订阅主题
参数:
mosq:指向Mosquitto客户端实例的指针
mid:用于存储消息ID的整数指针
sub:订阅的主题
qos:订阅的服务质量(0、1、2)
返回:
MOSQ_ERR_SUCCESS:成功。
MOSQ_ERR_INVAL:如果输入参数无效。
MOSQ_ERR_NOMEM:如果发生内存不足的情况。
MOSQ_ERR_NO_CONN:如果客户端未连接到代理。
MOSQ_ERR_MALFORMED_UTF8:如果主题不是有效的 UTF-8
MOSQ_ERR_OVERSIZE_PACKET:如果生成的数据包比代理支持的大。

(3)mosquitto_unsubscribe()

int mosquitto_unsubscribe(struct mosquitto  *mosq, int *mid, const char *sub);

功能:退订主题
参数:
mosq:指向Mosquitto客户端实例的指针
mid:用于存储消息ID的整数指针
sub:要取消订阅的主题
返回值:
MOSQ_ERR_SUCCESS:成功
MOSQ_ERR_INVAL:如果输入参数无效
MOSQ_ERR_NOMEM:如果发生内存不足的情况
MOSQ_ERR_NO_CONN:如果客户端未连接到代理
MOSQ_ERR_MALFORMED_UTF8:如果主题不是有效的 UTF-8
MOSQ_ERR_OVERSIZE_PACKET:如果生成的数据包比代理支持的大

6.网络循环

(1)mosquitto_loop()

int mosquitto_loop(struct mosquitto *mosq, int timeoutm,  int max_packets);

功能:循环处理Mosquitto客户端实例的网络流量
参数:
mosq:指向Mosquitto客户端实例的指针
timeout:超时时间(以毫秒为单位)
max_packets:处理的最大数据包数量
返回值:

7.回调函数

(1)mosquitto_connect_callback_set()

void mosquitto_connect_callback_set(struct 	mosquitto  *mosq, void (*on_connect)(struct mosquitto *mosq, void *obj, int rc))

功能:设置连接回调,这在代理发送 CONNACK 消息以响应连接时调用。
回调函数:

void (*on_connect)(struct mosquitto *mosq, void *obj, int rc;

参数:
mosq:有效的mosquitto实例,mosquitto_new()返回的mosq
obj:创建客户端时的回调函数(mosquitto_new中提供的用户数据)
rc:0表示连接成功,其他表示rc连接相应的返回码,其中有:
1-连接被拒绝(版本协议不可接受)
2-连接被拒绝(通识符被拒绝)
3-连接被拒绝(经纪人不可用)
4-255(保留供将来使用)

(2)mosquitto_disconnect_callback_set()

void mosquitto_disconnect_callback_set(struct mosquitto *mosq, void(*on_disconnect)(struct mosquitto *mosq, void *obj, int rc));

功能:断开连接回调函数,当代理收到DISCONNECT命令并断开与客户端的连接,将调用此方法
回调函数:

void (*on_disconnect )(struct mosquitto *mosq, void *obj, int rc)

参数:
mosq:有效的mosquitto实例,mosquitto_new()返回的mosq
obj:创建客户端时的回调函数
rc:0表示客户端已经调用mosquitto_disconnect,其他值表示连接时意外断开

(3)mosquitto_message_callback_set()

void mosquitto_message_callback_set(struct mosquitto *mosq, void (*on_message)(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message))

功能:消息回调函数,收到订阅的消息后调用
回调函数:

void (*on_message)(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message)

mosq:有效的mosquitto实例,mosquitto_new()返回的mosq
obj:mosquitto_new()中提供的用户数据
message:消息数据。回调完成后,mosquitto库将释放此变量和内存的关联,客户应复制其所需的任何数据

struct mosquitto_message{
int mid; //消息序号ID
char *topic; //主题
void *payload; //主题内容, MQTT中有效载荷
int payloadlen; //消息的长度,单位是字节
int qos;//服务质量
bool retain;//是否保留消息
};

(4)mosquitto_subscribe_callback_set()

void mosquitto_subscribe_callback_set( struct mosquitto * mosq, void (*on_subscribe)(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos) )

功能:设置订阅回调。当代理响应订阅,将调用此方法
回调函数:

void (*on_subscribe)(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos)

参数:
mosq:有效的mosquitto实例,mosquitto_new()返回的mosq
obj:创建客户端时的回调函数(mosquitto_new中提供的用户数据)
mid:订阅消息的消息ID
qos_count:授予的订阅数(grant_qos大小)
granted:数据数组,指示每个订阅的已授予QoS

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Ubuntu上使用mosquitto库函数发布主题可以使用以下函数: ```c #include <mosquitto.h> int mosquitto_publish(struct mosquitto *mosq, int *mid, const char *topic, int payloadlen, const void *payload, int qos, bool retain); ``` 该函数可以向MQTT broker发布一个消息,其中参数含义如下: - `mosq`:指向mosquitto实例的指针。 - `mid`:指向一个整数的指针,用于存储消息ID。如果不需要存储,则可以传递NULL。 - `topic`:一个以NULL结尾的字符串,表示主题名称。 - `payloadlen`:整数,表示消息的长度(字节数)。 - `payload`:指向消息载荷的指针。 - `qos`:整数,表示服务质量。可以是0(最多一次), 1(至少一次)或2(只有一次)。 - `retain`:bool类型,表示是否需要保留消息。 调用成功时,返回0。如果出现错误,则返回相应的错误代码。 以下是一个简单的例子: ```c #include <mosquitto.h> int main() { struct mosquitto *mosq = NULL; int rc; mosquitto_lib_init(); mosq = mosquitto_new(NULL, true, NULL); if(!mosq){ printf("创建 mosquitto 对象失败!\n"); return 1; } rc = mosquitto_connect(mosq, "localhost", 1883, 60); if(rc != MOSQ_ERR_SUCCESS){ printf("连接 broker 失败: %s\n", mosquitto_strerror(rc)); mosquitto_destroy(mosq); return 1; } const char *topic = "my/topic"; const char *payload = "Hello, world!"; int payloadlen = strlen(payload); int qos = 0; bool retain = false; int mid; rc = mosquitto_publish(mosq, &mid, topic, payloadlen, payload, qos, retain); if(rc != MOSQ_ERR_SUCCESS){ printf("发布消息失败: %s\n", mosquitto_strerror(rc)); mosquitto_destroy(mosq); return 1; } mosquitto_disconnect(mosq); mosquitto_destroy(mosq); mosquitto_lib_cleanup(); return 0; } ``` 这个例子中,我们创建了一个mosquitto实例,连接到本地的MQTT broker,发布了一个主题为“my/topic”的消息,然后断开连接并清理mosquitto实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗朗克21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值