APUE Learning Example Source Code
guowenxue
2019-06-26 157be0b0d4c7d4809cfcafc76235cc18388378c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
'\" t
.\"     Title: libmosquitto
.\"    Author: [see the "Author" section]
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
.\"      Date: 06/18/2019
.\"    Manual: Library calls
.\"    Source: Mosquitto Project
.\"  Language: English
.\"
.TH "LIBMOSQUITTO" "3" "06/18/2019" "Mosquitto Project" "Library calls"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
libmosquitto \- MQTT version 3\&.1\&.1 client library
.SH "DESCRIPTION"
.PP
This is an overview of how to use libmosquitto to create MQTT aware client programs\&. There may be separate man pages on each of the functions described here in the future\&.
.PP
This man page is woefully incomplete, please see the comments in mosquitto\&.h for missing functions and a description of the functions\&.
.SH "LIBMOSQUITTO SYMBOL NAMES"
.PP
All public functions in libmosquitto have the prefix "mosquitto_"\&. Any other functions defined in the source code are to be treated as private functions and may change between any release\&. Do not use these functions!
.SH "FUNCTIONS"
.SS "Library version"
.HP \w'int\ mosquitto_lib_version('u
.BI "int mosquitto_lib_version(int\ *" "major" ", int\ *" "minor" ", int\ *" "revision" ");"
.PP
Obtain version information about the library\&. If any of major, minor or revision are not NULL they will return the corresponding version numbers\&. The return value is an integer representation of the complete version number (e\&.g\&. 1009001 for 1\&.9\&.1) that can be used for comparisons\&.
.SS "Library initialisation and cleanup"
.HP \w'int\ mosquitto_lib_init('u
.BI "int mosquitto_lib_init(void);"
.HP \w'int\ mosquitto_lib_cleanup('u
.BI "int mosquitto_lib_cleanup(void);"
.PP
Call mosquitto_lib_init() before using any of the other library functions and mosquitto_lib_cleanup() after finishing with the library\&.
.SS "Client constructor/destructor"
.HP \w'struct\ mosquitto\ *mosquitto_new('u
.BI "struct mosquitto *mosquitto_new(const\ char\ *" "id" ", bool\ " "clean_session" ", void\ *" "userdata" ");"
.PP
Create a new mosquitto client instance\&.
.HP \w'void\ mosquitto_destroy('u
.BI "void mosquitto_destroy(struct\ mosquitto\ *" "mosq" ");"
.PP
Use to free memory associated with a mosquitto client instance\&.
.HP \w'int\ mosquitto_reinitialise('u
.BI "int mosquitto_reinitialise(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "id" ", bool\ " "clean_session" ", void\ *" "userdata" ");"
.SS "Authentication and encryption"
.HP \w'int\ mosquitto_username_pw_set('u
.BI "int mosquitto_username_pw_set(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "username" ", const\ char\ *" "password" ");"
.HP \w'int\ mosquitto_tls_set('u
.BI "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)" ");"
.HP \w'int\ mosquitto_tls_opts_set('u
.BI "int mosquitto_tls_opts_set(struct\ mosquitto\ *" "mosq" ", int\ " "cert_reqs" ", const\ char\ *" "tls_version" ", const\ char\ *" "ciphers" ");"
.HP \w'int\ mosquitto_tls_insecure_set('u
.BI "int mosquitto_tls_insecure_set(struct\ mosquitto\ *" "mosq" ", bool\ " "value" ");"
.HP \w'int\ mosquitto_tls_psk_set('u
.BI "int mosquitto_tls_psk_set(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "psk" ", const\ char\ *" "identity" ", const\ char\ *" "ciphers" ");"
.SS "Wills"
.HP \w'int\ mosquitto_will_set('u
.BI "int mosquitto_will_set(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "topic" ", int\ " "payloadlen" ", const\ void\ *" "payload" ", int\ " "qos" ", bool\ " "retain" ");"
.HP \w'int\ mosquitto_will_clear('u
.BI "int mosquitto_will_clear(" "struct\ mosquitto\ *mosq" ");"
.SS "Connect/disconnect"
.HP \w'int\ mosquitto_connect('u
.BI "int mosquitto_connect(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "host" ", int\ " "port" ", int\ " "keepalive" ");"
.HP \w'int\ mosquitto_connect_bind('u
.BI "int mosquitto_connect_bind(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "host" ", int\ " "port" ", int\ " "keepalive" ", const\ char\ *" "bind_address" ");"
.HP \w'int\ mosquitto_connect_async('u
.BI "int mosquitto_connect_async(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "host" ", int\ " "port" ", int\ " "keepalive" ");"
.HP \w'int\ mosquitto_connect_bind_async('u
.BI "int mosquitto_connect_bind_async(struct\ mosquitto\ *" "mosq" ", const\ char\ *" "host" ", int\ " "port" ", int\ " "keepalive" ", const\ char\ *" "bind_address" ");"
.HP \w'int\ mosquitto_reconnect('u
.BI "int mosquitto_reconnect(struct\ mosquitto\ *" "mosq" ");"
.HP \w'int\ mosquitto_reconnect_async('u
.BI "int mosquitto_reconnect_async(struct\ mosquitto\ *" "mosq" ");"
.HP \w'int\ mosquitto_disconnect('u
.BI "int mosquitto_disconnect(struct\ mosquitto\ *" "mosq" ");"
.SS "Publish"
.HP \w'int\ mosquitto_publish('u
.BI "int mosquitto_publish(struct\ mosquitto\ *" "mosq" ", int\ *" "mid" ", const\ char\ *" "topic" ", int\ " "payloadlen" ", const\ void\ *" "payload" ", int\ " "qos" ", bool\ " "retain" ");"
.SS "Subscribe/unsubscribe"
.HP \w'int\ mosquitto_subscribe('u
.BI "int mosquitto_subscribe(struct\ mosquitto\ *" "mosq" ", int\ *" "mid" ", const\ char\ *" "sub" ", int\ " "qos" ");"
.HP \w'int\ mosquitto_unsubscribe('u
.BI "int mosquitto_unsubscribe(struct\ mosquitto\ *" "mosq" ", int\ *" "mid" ", const\ char\ *" "sub" ");"
.SS "Network loop"
.HP \w'int\ mosquitto_loop('u
.BI "int mosquitto_loop(struct\ mosquitto\ *" "mosq" ", int\ " "timeout" ", int\ " "max_packets" ");"
.HP \w'int\ mosquitto_loop_read('u
.BI "int mosquitto_loop_read(struct\ mosquitto\ *" "mosq" ", int\ " "max_packets" ");"
.HP \w'int\ mosquitto_loop_write('u
.BI "int mosquitto_loop_write(struct\ mosquitto\ *" "mosq" ", int\ " "max_packets" ");"
.HP \w'int\ mosquitto_loop_misc('u
.BI "int mosquitto_loop_misc(struct\ mosquitto\ *" "mosq" ");"
.HP \w'int\ mosquitto_loop_forever('u
.BI "int mosquitto_loop_forever(struct\ mosquitto\ *" "mosq" ", int\ " "timeout" ", int\ " "max_packets" ");"
.HP \w'int\ mosquitto_socket('u
.BI "int mosquitto_socket(struct\ mosquitto\ *" "mosq" ");"
.HP \w'bool\ mosquitto_want_write('u
.BI "bool mosquitto_want_write(struct\ mosquitto\ *" "mosq" ");"
.SS "Threaded network loop"
.HP \w'int\ mosquitto_loop_start('u
.BI "int mosquitto_loop_start(struct\ mosquitto\ *" "mosq" ");"
.HP \w'int\ mosquitto_loop_stop('u
.BI "int mosquitto_loop_stop(struct\ mosquitto\ *" "mosq" ", bool\ " "force" ");"
.SS "Misc client functions"
.HP \w'int\ mosquitto_max_inflight_messages_set('u
.BI "int mosquitto_max_inflight_messages_set(struct\ mosquitto\ *" "mosq" ", unsigned\ int\ " "max_inflight_messages" ");"
.HP \w'int\ mosquitto_reconnect_delay_set('u
.BI "int mosquitto_reconnect_delay_set(struct\ mosquitto\ *" "mosq" ", unsigned\ int\ " "reconnect_delay" ", unsigned\ int\ " "reconnect_delay_max" ", bool\ " "reconnect_exponential_backoff" ");"
.HP \w'int\ mosquitto_user_data_set('u
.BI "int mosquitto_user_data_set(struct\ mosquitto\ *" "mosq" ", void\ *" "userdata" ");"
.SS "Callbacks"
.HP \w'int\ mosquitto_connect_callback_set('u
.BI "int mosquitto_connect_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_connect)(struct\ mosquitto\ *,\ void\ *,\ int)" ");"
.HP \w'int\ mosquitto_disconnect_callback_set('u
.BI "int mosquitto_disconnect_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_disconnect)(struct\ mosquitto\ *,\ void\ *,\ int)" ");"
.HP \w'int\ mosquitto_publish_callback_set('u
.BI "int mosquitto_publish_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_publish)(struct\ mosquitto\ *,\ void\ *,\ int)" ");"
.HP \w'int\ mosquitto_message_callback_set('u
.BI "int mosquitto_message_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_message)(struct\ mosquitto\ *,\ void\ *,\ const\ struct\ mosquitto_message\ *)" ");"
.HP \w'int\ mosquitto_subscribe_callback_set('u
.BI "int mosquitto_subscribe_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_subscribe)(struct\ mosquitto\ *,\ void\ *,\ int,\ int,\ const\ int\ *)" ");"
.HP \w'int\ mosquitto_unsubscribe_callback_set('u
.BI "int mosquitto_unsubscribe_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_unsubscribe)(struct\ mosquitto\ *,\ void\ *,\ int)" ");"
.HP \w'int\ mosquitto_log_callback_set('u
.BI "int mosquitto_log_callback_set(struct\ mosquitto\ *" "mosq" ", void\ " "(*on_unsubscribe)(struct\ mosquitto\ *,\ void\ *,\ int,\ const\ char\ *)" ");"
.SS "Utility functions"
.HP \w'const\ char\ *mosquitto_connack_string('u
.BI "const char *mosquitto_connack_string(int\ " "connack_code" ");"
.HP \w'int\ mosquitto_message_copy('u
.BI "int mosquitto_message_copy(struct\ mosquitto_message\ *" "dst" ", const\ struct\ mosquitto_message\ *" "src" ");"
.HP \w'int\ mosquitto_message_free('u
.BI "int mosquitto_message_free(struct\ mosquitto_message\ **" "message" ");"
.HP \w'const\ char\ *mosquitto_strerror('u
.BI "const char *mosquitto_strerror(int\ " "mosq_errno" ");"
.HP \w'int\ mosquitto_sub_topic_tokenise('u
.BI "int mosquitto_sub_topic_tokenise(const\ char\ *" "subtopic" ", char\ ***" "topics" ", int\ *" "count" ");"
.HP \w'int\ mosquitto_sub_topic_tokens_free('u
.BI "int mosquitto_sub_topic_tokens_free(char\ ***" "topics" ", int\ " "count" ");"
.HP \w'int\ mosquitto_topic_matches_sub('u
.BI "int mosquitto_topic_matches_sub(const\ char\ *" "sub" ", const\ char\ *" "topic" ", bool\ *" "result" ");"
.SS "Helper functions"
.HP \w'int\ mosquitto_subscribe_simple('u
.BI "int mosquitto_subscribe_simple(struct\ mosquitto_message\ **" "message" ", int\ " "msg_count" ", bool\ " "want_retained" ", const\ char\ *" "topic" ", int" "qos" ", const\ char\ *" "host" ", int\ " "port" ", const\ char\ *" "client_id" ", int\ " "keepalive" ", bool\ " "clean_session" ", const\ char\ *" "username" ", const\ char\ *" "password" ", const\ struct\ libmosquitto_will\ *" "will" ", const\ struct\ libmosquitto_tls\ *" "tls" ");"
.HP \w'int\ mosquitto_subscribe_callback('u
.BI "int mosquitto_subscribe_callback(int\ " "(*callback)(struct\ mosquitto\ *,\ void\ *,\ const\ struct\ mosquitto_message\ *)" ", void\ *" "userdata" ", const\ char\ *" "topic" ", int\ " "qos" ", const\ char\ *" "host" ", int\ " "port" ", const\ char\ *" "client_id" ", int\ " "keepalive" ", bool\ " "clean_session" ", const\ char\ *" "username" ", const\ char\ *" "password" ", const\ struct\ libmosquitto_will\ *" "will" ", const\ struct\ libmosquitto_tls\ *" "tls" ");"
.SH "EXAMPLES"
.PP
.if n \{\
.RS 4
.\}
.nf
#include <stdio\&.h>
#include <mosquitto\&.h>
 
void my_message_callback(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
{
    if(message\->payloadlen){
        printf("%s %s\en", message\->topic, message\->payload);
    }else{
        printf("%s (null)\en", message\->topic);
    }
    fflush(stdout);
}
 
void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
    int i;
    if(!result){
        /* Subscribe to broker information topics on successful connect\&. */
        mosquitto_subscribe(mosq, NULL, "$SYS/#", 2);
    }else{
        fprintf(stderr, "Connect failed\en");
    }
}
 
void my_subscribe_callback(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos)
{
    int i;
 
    printf("Subscribed (mid: %d): %d", mid, granted_qos[0]);
    for(i=1; i<qos_count; i++){
        printf(", %d", granted_qos[i]);
    }
    printf("\en");
}
 
void my_log_callback(struct mosquitto *mosq, void *userdata, int level, const char *str)
{
    /* Pring all log messages regardless of level\&. */
    printf("%s\en", str);
}
 
int main(int argc, char *argv[])
{
    int i;
    char *host = "localhost";
    int port = 1883;
    int keepalive = 60;
    bool clean_session = true;
    struct mosquitto *mosq = NULL;
 
    mosquitto_lib_init();
    mosq = mosquitto_new(NULL, clean_session, NULL);
    if(!mosq){
        fprintf(stderr, "Error: Out of memory\&.\en");
        return 1;
    }
    mosquitto_log_callback_set(mosq, my_log_callback);
    mosquitto_connect_callback_set(mosq, my_connect_callback);
    mosquitto_message_callback_set(mosq, my_message_callback);
    mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);
 
    if(mosquitto_connect(mosq, host, port, keepalive)){
        fprintf(stderr, "Unable to connect\&.\en");
        return 1;
    }
 
    mosquitto_loop_forever(mosq, \-1, 1);
 
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();
    return 0;
}
        
.fi
.if n \{\
.RE
.\}
.SH "SEE ALSO"
\fBmosquitto\fR(8)\fBmqtt\fR(7)
.SH "AUTHOR"
.PP
Roger Light
<roger@atchoo\&.org>