thermometers/main.c

Wed, 23 Apr 2014 14:25:09 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Wed, 23 Apr 2014 14:25:09 +0200
changeset 7
d74b26b2f217
parent 6
9db76e20e21e
child 8
e584bc0177df
permissions
-rw-r--r--

Added library

1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
1 /*****************************************************************************
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
2 * Copyright (C) 2014
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
3 *
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
4 * Michiel Broek <mbroek at mbse dot eu>
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
5 *
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
6 * This file is part of the mbsePi-apps
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
7 *
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
8 * This is free software; you can redistribute it and/or modify it
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
9 * under the terms of the GNU General Public License as published by the
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
10 * Free Software Foundation; either version 2, or (at your option) any
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
11 * later version.
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
12 *
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
13 * mbsePi-apps is distributed in the hope that it will be useful, but
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
16 * General Public License for more details.
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
17 *
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
19 * along with EC-65K; see the file COPYING. If not, write to the Free
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
20 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
21 *****************************************************************************/
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
22
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
23 #include <stdio.h>
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
24 #include <stdlib.h>
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
25 #include <unistd.h>
3
e854e3d704de Basic package is complete
Michiel Broek <mbroek@mbse.eu>
parents: 1
diff changeset
26 #include <getopt.h>
e854e3d704de Basic package is complete
Michiel Broek <mbroek@mbse.eu>
parents: 1
diff changeset
27 #include <sys/types.h>
e854e3d704de Basic package is complete
Michiel Broek <mbroek@mbse.eu>
parents: 1
diff changeset
28 #include <signal.h>
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
29 #include <string.h>
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
30 #include <errno.h>
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
31
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
32 #include <mosquitto.h>
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
33
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
34
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
35 #include "main.h"
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
36
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
37
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
38 #define STATUS_CONNECTING 0
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
39 #define STATUS_CONNACK_RECVD 1
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
40 #define STATUS_WAITING 2
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
41
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
42 /* Global variables for use in callbacks. See sub_client.c for an example of
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
43 * using a struct to hold variables for use in callbacks. */
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
44 static char *topic = NULL;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
45 //static char *message = NULL;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
46 //static long msglen = 0;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
47 static int qos = 0;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
48 //static int retain = 0;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
49 static int status = STATUS_CONNECTING;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
50 static int mid_sent = 0;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
51 static int last_mid = -1;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
52 static int last_mid_sent = -1;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
53 static bool connected = true;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
54 //static char *username = NULL;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
55 //static char *password = NULL;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
56 static bool disconnect_sent = false;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
57 static bool quiet = false;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
58 static bool debug = false;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
59 static bool shutdown = false;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
60
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
61
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
62
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
63 void help(void)
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
64 {
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
65 fprintf(stdout, "Usage: thermomeneters [-d] [-h]\n");
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
66 fprintf(stdout, " -d --debug Debug on\n");
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
67 fprintf(stdout, " -h --help Display this help\n");
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
68 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
69
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
70
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
71
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
72 void die(int onsig)
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
73 {
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
74 switch (onsig) {
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
75 case SIGHUP: fprintf(stdout, "[main] Hangup detected\n");
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
76 break;
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
77 case SIGINT: fprintf(stdout, "[main] Interrupt from keyboard\n");
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
78 break;
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
79 case SIGTERM: fprintf(stdout, "[main] Termination signal received\n");
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
80 break;
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
81 default: fprintf(stdout, "[main] die on signal %d\n", onsig);
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
82 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
83
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
84 shutdown = true;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
85 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
86
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
87
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
88
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
89 void my_connect_callback(struct mosquitto *mosq, void *obj, int result)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
90 {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
91 int rc = MOSQ_ERR_SUCCESS;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
92
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
93 fprintf(stdout, (char *)"my_connect_callback result=%d\n", result);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
94 if (!result) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
95 status = STATUS_CONNACK_RECVD;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
96 } else {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
97 fprintf(stderr, "%s\n", mosquitto_connack_string(result));
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
98 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
99 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
100
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
101
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
102
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
103 void my_disconnect_callback(struct mosquitto *mosq, void *obj, int rc)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
104 {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
105 fprintf(stdout, (char *)"my_disconnect_callback\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
106 connected = false;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
107 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
108
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
109
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
110
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
111 void my_publish_callback(struct mosquitto *mosq, void *obj, int mid)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
112 {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
113 fprintf(stdout, (char *)"my_publish_callback mid=%d\n", mid);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
114
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
115 last_mid_sent = mid;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
116 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
117
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
118
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
119
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
120 void my_log_callback(struct mosquitto *mosq, void *obj, int level, const char *str)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
121 {
7
d74b26b2f217 Added library
Michiel Broek <mbroek@mbse.eu>
parents: 6
diff changeset
122 printf("log: %s\n", str);
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
123 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
124
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
125
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
126
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
127 int main(int argc, char *argv[])
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
128 {
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
129 int i, c, len, rc, rc2;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
130 char *id = NULL;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
131 char *host = (char *)"lx02.mbse.ym";
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
132 int port = 1883;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
133 struct mosquitto *mosq = NULL;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
134 char hostname[256], buf[1024];
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
135 int keepalive = 60;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
136 unsigned int max_inflight = 20;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
137 char err[1024];
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
138
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
139 while (1) {
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
140 int option_index = 0;
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
141 static struct option long_options[] = {
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
142 {"debug", 0, 0, 'c'},
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
143 {"help", 0, 0, 'h'},
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
144 {0, 0, 0, 0}
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
145 };
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
146
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
147 c = getopt_long(argc, argv, "dh", long_options, &option_index);
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
148 if (c == -1)
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
149 break;
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
150
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
151 switch (c) {
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
152 case 'd': debug = true;
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
153 break;
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
154 case 'h': help();
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
155 return 1;
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
156 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
157 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
158
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
159 /*
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
160 * Catch all the signals we can, and ignore the rest. Note that SIGKILL can't be ignored
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
161 * but that's live. This daemon should only be stopped by SIGTERM.
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
162 * Don't catch SIGCHLD.
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
163 */
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
164 for (i = 0; i < NSIG; i++) {
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
165 if ((i != SIGCHLD) && (i != SIGKILL) && (i != SIGSTOP))
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
166 signal(i, (void (*))die);
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
167 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
168
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
169 /*
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
170 * Initialize mosquitto communication
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
171 */
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
172 mosquitto_lib_init();
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
173 hostname[0] = '\0';
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
174 gethostname(hostname, 256);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
175 hostname[255] = '\0';
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
176 len = strlen("thermometers/") + 1 + strlen(hostname);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
177 id = malloc(len);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
178 if(!id) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
179 if (!quiet)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
180 fprintf(stderr, "Error: Out of memory.\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
181 mosquitto_lib_cleanup();
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
182 return 1;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
183 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
184 snprintf(id, len, "thermometers/%s", hostname);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
185 if(strlen(id) > MOSQ_MQTT_ID_MAX_LENGTH) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
186 /*
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
187 * Enforce maximum client id length of 23 characters
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
188 */
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
189 id[MOSQ_MQTT_ID_MAX_LENGTH] = '\0';
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
190 }
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
191
6
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
192 fprintf(stdout, "id: %s\n", id);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
193
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
194 mosq = mosquitto_new(id, true, NULL);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
195 if(!mosq) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
196 switch(errno) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
197 case ENOMEM:
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
198 if (!quiet)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
199 fprintf(stderr, "Error: Out of memory.\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
200 break;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
201 case EINVAL:
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
202 if (!quiet)
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
203 fprintf(stderr, "Error: Invalid id.\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
204 break;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
205 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
206 mosquitto_lib_cleanup();
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
207 return 1;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
208 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
209
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
210 if(debug) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
211 mosquitto_log_callback_set(mosq, my_log_callback);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
212 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
213
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
214 /*
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
215 * Set our will
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
216 */
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
217 topic = malloc(28 + strlen(hostname));
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
218 sprintf(topic, "clients/%s/thermometers/state", hostname);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
219 sprintf(buf, "0");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
220 rc = mosquitto_will_set(mosq, topic, strlen(buf), buf, qos, true);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
221 if (rc) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
222 if (rc == MOSQ_ERR_INVAL) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
223 fprintf(stderr, "Input parameters invalid\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
224 } else if (rc == MOSQ_ERR_NOMEM) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
225 fprintf(stderr, "Out of Memory\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
226 } else if (rc == MOSQ_ERR_PAYLOAD_SIZE) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
227 fprintf(stderr, "Invalid payload size\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
228 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
229 mosquitto_lib_cleanup();
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
230 return rc;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
231 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
232
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
233 mosquitto_max_inflight_messages_set(mosq, max_inflight);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
234 mosquitto_connect_callback_set(mosq, my_connect_callback);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
235 mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
236 mosquitto_publish_callback_set(mosq, my_publish_callback);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
237
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
238 rc = mosquitto_connect(mosq, host, port, keepalive);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
239 if (rc) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
240 if (rc == MOSQ_ERR_ERRNO) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
241 strerror_r(errno, err, 1024);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
242 fprintf(stderr, "Error: %s\n", err);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
243 } else {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
244 fprintf(stderr, "Unable to connect (%d).\n", rc);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
245 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
246 mosquitto_lib_cleanup();
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
247 return rc;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
248 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
249
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
250 /*
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
251 * Initialise is complete, report our presence state
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
252 */
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
253 mosquitto_loop_start(mosq);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
254
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
255 // topic = malloc(28 + strlen(hostname));
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
256 sprintf(topic, "clients/%s/thermometers/state", hostname);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
257 sprintf(buf, "1");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
258 rc2 = mosquitto_publish(mosq, &mid_sent, topic, strlen(buf), buf, qos, 1);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
259 free(topic);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
260
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
261
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
262 fprintf(stdout, (char *)"Enter loop, connected %d\n", connected);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
263 do {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
264 if (status == STATUS_CONNACK_RECVD) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
265 // fprintf(stdout, (char *)"Ok\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
266 // if(fgets(buf, 1024, stdin)){
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
267 // buf[strlen(buf)-1] = '\0';
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
268 // rc2 = mosquitto_publish(mosq, &mid_sent, topic, strlen(buf), buf, qos, retain);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
269 // if(rc2){
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
270 // if(!quiet) fprintf(stderr, "Error: Publish returned %d, disconnecting.\n", rc2);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
271 // mosquitto_disconnect(mosq);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
272 // }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
273 // } else
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
274 if (shutdown) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
275 fprintf(stdout, (char *)"Shutdown\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
276 topic = malloc(28 + strlen(hostname));
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
277 sprintf(topic, "clients/%s/thermometers/state", hostname);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
278 sprintf(buf, "0");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
279 rc2 = mosquitto_publish(mosq, &mid_sent, topic, strlen(buf), buf, qos, true);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
280 free(topic);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
281 last_mid = mid_sent;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
282 status = STATUS_WAITING;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
283 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
284 } else if (status == STATUS_WAITING) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
285 fprintf(stdout, (char *)"Waiting\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
286 if (last_mid_sent == last_mid && disconnect_sent == false) {
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
287 mosquitto_disconnect(mosq);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
288 disconnect_sent = true;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
289 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
290 usleep(100000);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
291 }
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
292 rc = MOSQ_ERR_SUCCESS;
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
293
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
294 } while(rc == MOSQ_ERR_SUCCESS && connected);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
295 fprintf(stdout, (char *)"Out of loop\n");
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
296
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
297 mosquitto_loop_stop(mosq, false);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
298
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
299 mosquitto_destroy(mosq);
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
300 mosquitto_lib_cleanup();
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
301
9db76e20e21e Can connect and disconnect
Michiel Broek <mbroek@mbse.eu>
parents: 3
diff changeset
302 fprintf(stdout, (char *)"Bye Bye\n");
1
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
303 return 0;
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
304 }
91065eba8e1b Added two sources
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
305

mercurial