thermferm/mqtt.c

changeset 598
363dc36d2450
parent 591
95cf33f8021f
child 602
ca795b871158
equal deleted inserted replaced
597:93667d842c9b 598:363dc36d2450
54 int keepalive = 60; 54 int keepalive = 60;
55 unsigned int max_inflight = 20; 55 unsigned int max_inflight = 20;
56 struct mosquitto *mosq = NULL; 56 struct mosquitto *mosq = NULL;
57 char *state = NULL; 57 char *state = NULL;
58 char my_hostname[256]; 58 char my_hostname[256];
59
60
61 #ifndef HAVE_WIRINGPI_H
62
63 /*
64 * Code from wiringPi written by Gordon Henderson.
65 * Copied here to have some sort of hardware detection without wiringPi.
66 */
67 const char *piModelNames [20] =
68 {
69 "Model A", // 0
70 "Model B", // 1
71 "Model A+", // 2
72 "Model B+", // 3
73 "Pi 2", // 4
74 "Alpha", // 5
75 "CM", // 6
76 "Unknown07", // 07
77 "Pi 3", // 08
78 "Pi Zero", // 09
79 "CM3", // 10
80 "Unknown11", // 11
81 "Pi Zero-W", // 12
82 "Pi 3B+", // 13
83 "Pi 3A+", // 14
84 "Unknown15", // 15
85 "CM3+", // 16
86 "Unknown17", // 17
87 "Unknown18", // 18
88 "Unknown19", // 19
89 };
90 const char *piRevisionNames [16] =
91 {
92 "00",
93 "01",
94 "02",
95 "03",
96 "04",
97 "05",
98 "06",
99 "07",
100 "08",
101 "09",
102 "10",
103 "11",
104 "12",
105 "13",
106 "14",
107 "15",
108 } ;
109 const char *piMakerNames [16] =
110 {
111 "Sony", // 0
112 "Egoman", // 1
113 "Embest", // 2
114 "Unknown", // 3
115 "Embest", // 4
116 "Unknown05", // 5
117 "Unknown06", // 6
118 "Unknown07", // 7
119 "Unknown08", // 8
120 "Unknown09", // 9
121 "Unknown10", // 10
122 "Unknown11", // 11
123 "Unknown12", // 12
124 "Unknown13", // 13
125 "Unknown14", // 14
126 "Unknown15", // 15
127 } ;
128 const int piMemorySize [8] =
129 {
130 256, // 0
131 512, // 1
132 1024, // 2
133 0, // 3
134 0, // 4
135 0, // 5
136 0, // 6
137 0, // 7
138 } ;
139
140 void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty)
141 {
142 FILE *cpuFd ;
143 char line [120] ;
144 char *c ;
145 unsigned int revision ;
146 int bRev, bType, bProc, bMfg, bMem, bWarranty ;
147
148 *model = -1; // Mark no info
149 if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) {
150 syslog(LOG_NOTICE, "Unable to open /proc/cpuinfo") ;
151 return;
152 }
153
154 while (fgets (line, 120, cpuFd) != NULL)
155 if (strncmp (line, "Revision", 8) == 0)
156 break ;
157
158 fclose (cpuFd) ;
159
160 if (strncmp (line, "Revision", 8) != 0) {
161 syslog(LOG_NOTICE, "No \"Revision\" line");
162 return;
163 }
164
165 // Chomp trailing CR/NL
166
167 for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
168 *c = 0 ;
169
170 if (debug)
171 fprintf(stdout, "piBoardId: Revision string: %s\n", line) ;
172
173 // Need to work out if it's using the new or old encoding scheme:
174
175 // Scan to the first character of the revision number
176
177 for (c = line ; *c ; ++c)
178 if (*c == ':')
179 break ;
180
181 if (*c != ':') {
182 syslog(LOG_NOTICE, "Bogus \"Revision\" line (no colon)") ;
183 return;
184 }
185
186 // Chomp spaces
187
188 ++c ;
189 while (isspace (*c))
190 ++c ;
191
192 if (!isxdigit (*c))
193 syslog(LOG_NOTICE, "Bogus \"Revision\" line (no hex digit at start of revision)") ;
194
195 revision = (unsigned int)strtol (c, NULL, 16) ; // Hex number with no leading 0x
196
197 // Check for new way:
198
199 if ((revision & (1 << 23)) != 0) { // New way
200 if (debug)
201 fprintf(stdout, "piBoardId: New Way: revision is: %08X\n", revision) ;
202
203 bRev = (revision & (0x0F << 0)) >> 0 ;
204 bType = (revision & (0xFF << 4)) >> 4 ;
205 bProc = (revision & (0x0F << 12)) >> 12 ; // Not used for now.
206 bMfg = (revision & (0x0F << 16)) >> 16 ;
207 bMem = (revision & (0x07 << 20)) >> 20 ;
208 bWarranty = (revision & (0x03 << 24)) != 0 ;
209
210 *model = bType ;
211 *rev = bRev ;
212 *mem = bMem ;
213 *maker = bMfg ;
214 *warranty = bWarranty ;
215
216 if (debug)
217 fprintf(stdout, "piBoardId: rev: %d, type: %d, proc: %d, mfg: %d, mem: %d, warranty: %d\n", bRev, bType, bProc, bMfg, bMem, bWarranty) ;
218 } else { // Old way
219 if (debug)
220 fprintf(stdout, "piBoardId: Old Way: revision is: %s\n", c) ;
221
222 if (!isdigit (*c)) {
223 syslog(LOG_NOTICE, "Bogus \"Revision\" line (no digit at start of revision)") ;
224 return;
225 }
226
227 // Make sure its long enough
228
229 if (strlen (c) < 4) {
230 syslog(LOG_NOTICE, "Bogus \"Revision\" line (not long enough)") ;
231 return;
232 }
233
234 // If longer than 4, we'll assume it's been overvolted
235
236 *warranty = strlen (c) > 4 ;
237
238 // Extract last 4 characters:
239
240 c = c + strlen (c) - 4 ;
241
242 // Fill out the replys as appropriate
243
244 /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
245 else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
246
247 else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; }
248 else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
249 else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
250
251 else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
252 else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; ; }
253 else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
254
255 else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; }
256 else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; }
257 else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; }
258
259 else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; }
260 else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; }
261 else if (strcmp (c, "0016") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; }
262 else if (strcmp (c, "0019") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; }
263 else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; }
264 else if (strcmp (c, "0014") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; }
265 else if (strcmp (c, "0017") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; }
266 else if (strcmp (c, "001a") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; }
267
268 else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; }
269 else if (strcmp (c, "0015") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; }
270 else if (strcmp (c, "0018") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; }
271 else if (strcmp (c, "001b") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; }
272
273 else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; }
274 }
275 }
276 #endif
59 277
60 278
61 279
62 char *payload_header(void) 280 char *payload_header(void)
63 { 281 {
1166 void publishNData(bool birth, int flag) 1384 void publishNData(bool birth, int flag)
1167 { 1385 {
1168 char *topic = NULL, *payload = NULL, sidx[10], buf[64]; 1386 char *topic = NULL, *payload = NULL, sidx[10], buf[64];
1169 struct utsname ubuf; 1387 struct utsname ubuf;
1170 bool comma = false; 1388 bool comma = false;
1389 int model, rev, mem, maker, warranty;
1171 1390
1172 payload = payload_header(); 1391 payload = payload_header();
1173 payload = xstrcat(payload, (char *)"{"); 1392 payload = xstrcat(payload, (char *)"{");
1174 1393
1175 if (birth) { 1394 if (birth) {
1178 payload = xstrcat(payload, (char *)"\","); 1397 payload = xstrcat(payload, (char *)"\",");
1179 #ifdef HAVE_WIRINGPI_H 1398 #ifdef HAVE_WIRINGPI_H
1180 /* 1399 /*
1181 * Get the info from the WiringPi libary 1400 * Get the info from the WiringPi libary
1182 */ 1401 */
1183 int model, rev, mem, maker, warranty;
1184 piBoardId (&model, &rev, &mem, &maker, &warranty); 1402 piBoardId (&model, &rev, &mem, &maker, &warranty);
1185 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\"Raspberry Pi "); 1403 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\"Raspberry Pi ");
1186 payload = xstrcat(payload, (char *)piMakerNames[maker]); 1404 payload = xstrcat(payload, (char *)piMakerNames[maker]);
1187 payload = xstrcat(payload, (char *)"\",\"hardwaremodel\":\""); 1405 payload = xstrcat(payload, (char *)"\",\"hardwaremodel\":\"");
1188 payload = xstrcat(payload, (char *)piModelNames[model]); 1406 payload = xstrcat(payload, (char *)piModelNames[model]);
1189 payload = xstrcat(payload, (char *)" rev "); 1407 payload = xstrcat(payload, (char *)" rev ");
1190 payload = xstrcat(payload, (char *)piRevisionNames[rev]); 1408 payload = xstrcat(payload, (char *)piRevisionNames[rev]);
1191 payload = xstrcat(payload, (char *)"\""); 1409 payload = xstrcat(payload, (char *)"\"");
1192 #else 1410 #else
1193 if (uname(&ubuf) == 0) { 1411 /*
1412 * Get the info from the internal function
1413 */
1414 piBoardId (&model, &rev, &mem, &maker, &warranty);
1415 if (model != -1) {
1416 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\"Raspberry Pi ");
1417 payload = xstrcat(payload, (char *)piMakerNames[maker]);
1418 payload = xstrcat(payload, (char *)"\",\"hardwaremodel\":\"");
1419 payload = xstrcat(payload, (char *)piModelNames[model]);
1420 payload = xstrcat(payload, (char *)" rev ");
1421 payload = xstrcat(payload, (char *)piRevisionNames[rev]);
1422 payload = xstrcat(payload, (char *)"\"");
1423 } else if (uname(&ubuf) == 0) {
1194 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\""); 1424 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\"");
1195 payload = xstrcat(payload, ubuf.machine); 1425 payload = xstrcat(payload, ubuf.machine);
1196 payload = xstrcat(payload, (char *)"\",\"hardwaremodel\":\"Unknown\""); 1426 payload = xstrcat(payload, (char *)"\",\"hardwaremodel\":\"Unknown\"");
1197 } else { 1427 } else {
1198 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\"Unknown\",\"hardwaremodel\":\"Unknown\""); 1428 payload = xstrcat(payload, (char *)"\"properties\":{\"hardwaremake\":\"Unknown\",\"hardwaremodel\":\"Unknown\"");

mercurial