|
13 | 13 | #include <misc/printk.h> |
14 | 14 | #include <string.h> |
15 | 15 | #include <errno.h> |
| 16 | +#include <stdio.h> |
16 | 17 |
|
17 | 18 | #if defined(CONFIG_NET_L2_BLUETOOTH) |
18 | 19 | #include <bluetooth/bluetooth.h> |
|
24 | 25 |
|
25 | 26 | #define CLIENTID "zephyr_publisher" |
26 | 27 |
|
| 28 | +static bool bluemix_publisher; |
| 29 | + |
27 | 30 | /** |
28 | 31 | * @brief mqtt_client_ctx Container of some structures used by the |
29 | 32 | * publisher app. |
@@ -176,28 +179,58 @@ void malformed_cb(struct mqtt_ctx *mqtt_ctx, uint16_t pkt_type) |
176 | 179 | printk("[%s:%d] pkt_type: %u\n", __func__, __LINE__, pkt_type); |
177 | 180 | } |
178 | 181 |
|
179 | | -static const char topic[] = "sensors"; |
| 182 | +static |
| 183 | +char *get_payload(enum mqtt_qos qos) |
| 184 | +{ |
| 185 | + static char payload[30]; |
| 186 | + |
| 187 | + if (bluemix_publisher) { |
| 188 | + snprintf(payload, |
| 189 | + sizeof(payload), |
| 190 | + "{d:{temperature:%d}}", |
| 191 | + (uint8_t) sys_rand32_get()); |
| 192 | + } else { |
| 193 | + strncpy(payload, "DOORS:OPEN_QoSx", sizeof(payload)); |
| 194 | + payload[strlen(payload) - 1] = '0' + qos; |
| 195 | + } |
180 | 196 |
|
181 | | -char payload[] = "DOORS:OPEN_QoSx"; |
| 197 | + return payload; |
| 198 | +} |
182 | 199 |
|
183 | 200 | static |
184 | | -void prepare_mqtt_publish_msg(struct mqtt_publish_msg *pub_msg, |
185 | | - enum mqtt_qos qos) |
| 201 | +char *get_topic(void) |
186 | 202 | { |
187 | | - payload[strlen(payload) - 1] = '0' + qos; |
| 203 | + static char topic[50]; |
| 204 | + |
| 205 | + if (bluemix_publisher) { |
| 206 | + snprintf(topic, sizeof(topic), |
| 207 | + "iot-2/type/%s/id/%s/evt/%s/fmt/%s", |
| 208 | + "sensor", /* device type */ |
| 209 | + "carbon", /* device id */ |
| 210 | + "status", /* event type */ |
| 211 | + "json"); /* event format */ |
| 212 | + } else { |
| 213 | + strncpy(topic, "sensors", sizeof(topic)); |
| 214 | + } |
188 | 215 |
|
| 216 | + return topic; |
| 217 | +} |
| 218 | + |
| 219 | +static |
| 220 | +void prepare_mqtt_publish_msg(struct mqtt_publish_msg *pub_msg, |
| 221 | + enum mqtt_qos qos) |
| 222 | +{ |
189 | 223 | /* MQTT message payload may be anything, we we use C strings */ |
190 | | - pub_msg->msg = payload; |
| 224 | + pub_msg->msg = get_payload(qos); |
191 | 225 | /* Payload's length */ |
192 | 226 | pub_msg->msg_len = strlen(client_ctx.pub_msg.msg); |
193 | 227 | /* MQTT Quality of Service */ |
194 | 228 | pub_msg->qos = qos; |
195 | 229 | /* Message's topic */ |
196 | | - pub_msg->topic = (char *)topic; |
| 230 | + pub_msg->topic = get_topic(); |
197 | 231 | pub_msg->topic_len = strlen(client_ctx.pub_msg.topic); |
198 | 232 | /* Packet Identifier, always use different values */ |
199 | 233 | pub_msg->pkt_id = sys_rand32_get(); |
200 | | - |
201 | 234 | } |
202 | 235 |
|
203 | 236 | #define RC_STR(rc) ((rc) == 0 ? "OK" : "ERROR") |
@@ -464,5 +497,9 @@ int network_setup(struct net_context **net_ctx, const char *local_addr, |
464 | 497 |
|
465 | 498 | void main(void) |
466 | 499 | { |
| 500 | + |
| 501 | +#if ENABLE_BLUEMIX_TOPIC |
| 502 | + bluemix_publisher = true; |
| 503 | +#endif |
467 | 504 | publisher(); |
468 | 505 | } |
0 commit comments