|
|
@@ -6,7 +6,9 @@
|
|
|
#include "mongoose.h"
|
|
|
#include "elog.h"
|
|
|
#include "lock.h"
|
|
|
+#include "sys.h"
|
|
|
#include "cfg.h"
|
|
|
+#include "xlist.h"
|
|
|
|
|
|
#if 0
|
|
|
#define LOGD log_d
|
|
|
@@ -23,8 +25,8 @@
|
|
|
|
|
|
char *topic_sub[MQTT_SUB_MAX]={
|
|
|
"/pdu/%d/control/power/all_channel",
|
|
|
- "/pdu/%d/control/power/%d",
|
|
|
- "/pdu/%d/control/sensor/%d",
|
|
|
+ "/pdu/%d/control/power/+",
|
|
|
+ "/pdu/%d/control/sensor/+",
|
|
|
"/pdu/%d/control/device/restart",
|
|
|
"/pdu/%d/control/device/reset",
|
|
|
"/PDU/%d/control/service",
|
|
|
@@ -45,9 +47,14 @@ typedef struct mg_mgr mgr_t;
|
|
|
typedef struct mg_mqtt_opts mg_opts_t;
|
|
|
typedef struct mg_connection mg_conn_t;
|
|
|
|
|
|
+typedef struct {
|
|
|
+ char topic[256];
|
|
|
+ char content[2048];
|
|
|
+}mqtt_pkt_t;
|
|
|
typedef struct _mqtt_conn_t{
|
|
|
mg_conn_t *c;
|
|
|
mqtt_server_t ser;
|
|
|
+ mg_opts_t opts;
|
|
|
}mqtt_conn_t;
|
|
|
typedef struct {
|
|
|
int inited;
|
|
|
@@ -57,6 +64,8 @@ typedef struct {
|
|
|
mgr_t mgr;
|
|
|
mg_opts_t opts;
|
|
|
mqtt_conn_t conn[MQTT_SER_MAX];
|
|
|
+
|
|
|
+ handle_t list;
|
|
|
}mqtt_handle_t;
|
|
|
static mqtt_handle_t mqHandle={0};
|
|
|
static int my_recv(char *topic, char *data);
|
|
|
@@ -88,6 +97,12 @@ static int get_id(mqtt_handle_t *h, mqtt_server_t *ser)
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
+static char *get_str(int n)
|
|
|
+{
|
|
|
+ static char tmp[32];
|
|
|
+ snprintf(tmp, sizeof(tmp), "%d", n);
|
|
|
+ return tmp;
|
|
|
+}
|
|
|
static mqtt_conn_t* get_conn(mqtt_handle_t *h, mg_conn_t *c)
|
|
|
{
|
|
|
int i;
|
|
|
@@ -114,7 +129,7 @@ static int my_sub(mg_conn_t *c, int prod_id)
|
|
|
int i;
|
|
|
char topic[1024];
|
|
|
|
|
|
- for(i=0; topic_sub[i]; i++) {
|
|
|
+ for(i=0; i<MQTT_SUB_MAX; i++) {
|
|
|
snprintf(topic, sizeof(topic), topic_sub[i], prod_id);
|
|
|
sub_one(c, topic);
|
|
|
}
|
|
|
@@ -157,18 +172,39 @@ static int my_disconn(mqtt_handle_t *h)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+static char *get_url(mqtt_server_t *ser)
|
|
|
+{
|
|
|
+ char *url=ser->server[0]?ser->server:(ser->ip[0]?ser->ip:NULL);
|
|
|
+ return url;
|
|
|
+}
|
|
|
static int my_conn(mqtt_handle_t *h, mqtt_info_t *info)
|
|
|
{
|
|
|
int i,j,r=-1;
|
|
|
+ char *url=NULL;
|
|
|
mqtt_server_t *ser=info->ser;
|
|
|
|
|
|
for(i=0; i<MQTT_SER_MAX; i++) {
|
|
|
- for(j=0; j<MQTT_SER_MAX; j++) {
|
|
|
- if(h->conn[j].c==NULL) {
|
|
|
- h->conn[j].c = mg_mqtt_connect(&h->mgr, ser[i].server, &h->opts, mqtt_fn, &h->conn[j]);
|
|
|
- if(h->conn[j].c) {
|
|
|
- h->conn[j].ser = ser[i];
|
|
|
- my_sub(h->conn[j].c, h->prod_id);
|
|
|
+ url = get_url(&ser[i]);
|
|
|
+ if(url) {
|
|
|
+ if(h->conn[i].c==NULL) {
|
|
|
+ mg_opts_t opts={
|
|
|
+ .clean = true,
|
|
|
+ .qos = 1,
|
|
|
+ .version = 4,
|
|
|
+ .keepalive = 60,
|
|
|
+ //.topic = mg_str("hello"),
|
|
|
+ //.message = mg_str("bye"),
|
|
|
+ .client_id = mg_str(ser[i].cid),
|
|
|
+ .user = mg_str(ser[i].user),
|
|
|
+ .pass = mg_str(ser[i].password),
|
|
|
+ };
|
|
|
+ char *url=get_url(&ser[i]);
|
|
|
+
|
|
|
+ h->conn[i].c = mg_mqtt_connect(&h->mgr, url, &opts, mqtt_fn, &h->conn[i]);
|
|
|
+ if(h->conn[i].c) {
|
|
|
+ h->conn[i].ser = ser[i];
|
|
|
+ h->conn[i].opts = opts;
|
|
|
+ my_sub(h->conn[i].c, h->prod_id);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -179,20 +215,33 @@ static int my_conn(mqtt_handle_t *h, mqtt_info_t *info)
|
|
|
static int my_check(mqtt_handle_t *h)
|
|
|
{
|
|
|
int i,r=-1;
|
|
|
+ char *url=NULL;
|
|
|
mqtt_server_t *ser=h->dm->mqttInfo.ser;
|
|
|
|
|
|
for(i=0; i<MQTT_SER_MAX; i++) {
|
|
|
- if(h->conn[i].ser.server[0] && h->conn[i].c==NULL) {
|
|
|
- h->conn[i].c = mg_mqtt_connect(&h->mgr, h->conn[i].ser.server, &h->opts, mqtt_fn, &h->conn[i]);
|
|
|
+ url = get_url(&h->conn[i].ser);
|
|
|
+ if(h->conn[i].c==NULL && url) {
|
|
|
+ h->conn[i].c = mg_mqtt_connect(&h->mgr, url, &h->conn[i].opts, mqtt_fn, &h->conn[i]);
|
|
|
+ if(h->conn[i].c) {
|
|
|
+ my_sub(h->conn[i].c, h->prod_id);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
-static void my_poll(mqtt_handle_t *h, int ms)
|
|
|
+static int my_send(mqtt_handle_t *h)
|
|
|
{
|
|
|
- my_check(h);
|
|
|
- mg_mgr_poll(&h->mgr, ms);
|
|
|
+ int r=-1;
|
|
|
+ list_node_t *ln=NULL;
|
|
|
+
|
|
|
+ r = xlist_get_node(h->list, &ln, 0);
|
|
|
+ if(r==0) {
|
|
|
+ mqtt_pkt_t *pkt=(mqtt_pkt_t*)ln->data.buf;
|
|
|
+ my_pub(h, pkt->topic, pkt->content);
|
|
|
+ }
|
|
|
+
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
|
|
|
@@ -200,37 +249,64 @@ static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
|
|
|
mqtt_handle_t *h=&mqHandle;
|
|
|
mqtt_conn_t *mc=get_conn(h,c);
|
|
|
|
|
|
- if (ev == MG_EV_OPEN) {
|
|
|
- // c->is_hexdumping = 1;
|
|
|
- } else if (ev == MG_EV_CONNECT) {
|
|
|
- if (mg_url_is_ssl(mc->ser.server)) {
|
|
|
- struct mg_tls_opts opts = {.ca = mg_unpacked("/certs/ca.pem"),
|
|
|
- .name = mg_url_host(mc->ser.server)};
|
|
|
- mg_tls_init(c, &opts);
|
|
|
+ switch(ev) {
|
|
|
+ case MG_EV_OPEN:
|
|
|
+ {
|
|
|
+ // c->is_hexdumping = 1;
|
|
|
}
|
|
|
- } else if (ev == MG_EV_ERROR) {
|
|
|
- // On error, log error message
|
|
|
- MG_ERROR(("%p %s", c->fd, (char *) ev_data));
|
|
|
- } else if (ev == MG_EV_MQTT_OPEN) {
|
|
|
- mg_opts_t opts={
|
|
|
- .client_id = mg_str(mc->ser.cid),
|
|
|
- .user = mg_str(mc->ser.user),
|
|
|
- .pass = mg_str(mc->ser.password),
|
|
|
- };
|
|
|
- size_t len=c->send.len;
|
|
|
-
|
|
|
- mg_mqtt_login(c, &opts);
|
|
|
- mg_ws_wrap(c, c->send.len - len, WEBSOCKET_OP_BINARY);
|
|
|
- } else if (ev == MG_EV_MQTT_MSG) {
|
|
|
- // When we receive MQTT message, print it
|
|
|
- struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
|
|
|
- //MG_INFO(("Received on %.*s : %.*s", (int) mm->topic.len, mm->topic.buf, (int) mm->data.len, mm->data.buf));
|
|
|
- my_recv(mm->topic.buf, mm->data.buf);
|
|
|
- }
|
|
|
+ break;
|
|
|
|
|
|
- if (ev == MG_EV_ERROR || ev == MG_EV_CLOSE) {
|
|
|
- MG_INFO(("got event %d, stopping...", ev));
|
|
|
- ((mqtt_conn_t *)(c->fn_data))->c = NULL; // Signal that we're done
|
|
|
+ case MG_EV_CONNECT:
|
|
|
+ {
|
|
|
+ char path[200];
|
|
|
+ sys_get_path(path, "emqxsl-ca.crt");
|
|
|
+ if (mg_url_is_ssl(mc->ser.server)) {
|
|
|
+ struct mg_tls_opts opts = {.ca = mg_str(path),
|
|
|
+ //.cert = mg_str(path),
|
|
|
+ //.key = mg_str(path),
|
|
|
+ .name = mg_url_host(mc->ser.server)};
|
|
|
+ mg_tls_init(c, &opts);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MG_EV_MQTT_OPEN:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MG_EV_POLL:
|
|
|
+ {
|
|
|
+ my_send(h);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MG_EV_MQTT_MSG:
|
|
|
+ {
|
|
|
+ if(ev_data) {
|
|
|
+ // When we receive MQTT message, print it
|
|
|
+ struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
|
|
|
+ if(mm->topic.buf && mm->data.buf) {
|
|
|
+ MG_INFO(("Received on %.*s : %.*s", (int) mm->topic.len, mm->topic.buf, (int) mm->data.len, mm->data.buf));
|
|
|
+ my_recv(mm->topic.buf, mm->data.buf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MG_EV_ERROR:
|
|
|
+ {
|
|
|
+ MG_ERROR(("___MG_EV_ERROR, %p %s", c->fd, (char *) ev_data));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case MG_EV_CLOSE:
|
|
|
+ {
|
|
|
+ LOGD("____ MG_EV_CLOSE\n");
|
|
|
+ ((mqtt_conn_t *)(c->fn_data))->c = NULL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
static void* mqtt_thread(void *arg)
|
|
|
@@ -238,14 +314,15 @@ static void* mqtt_thread(void *arg)
|
|
|
int r;
|
|
|
thread_handle_t *th=(thread_handle_t*)arg;
|
|
|
mqtt_handle_t *h=(mqtt_handle_t*)th->arg;
|
|
|
-
|
|
|
+ mqtt_info_t *info=&h->dm->mqttInfo;
|
|
|
+
|
|
|
+ my_conn(h, info);
|
|
|
while(th->quit==0) {
|
|
|
- if(h->inited) {
|
|
|
- lock_s_hold(LOCK_ID_MQTT);
|
|
|
- my_poll(h, 300);
|
|
|
- lock_s_release(LOCK_ID_MQTT);
|
|
|
- }
|
|
|
+ my_check(h);
|
|
|
+ mg_mgr_poll(&h->mgr, 500);
|
|
|
}
|
|
|
+ my_disconn(h);
|
|
|
+
|
|
|
pthread_exit(NULL);
|
|
|
}
|
|
|
#endif
|
|
|
@@ -264,18 +341,22 @@ int mqtt_init(void)
|
|
|
|
|
|
h->dm = &__globalDeviceManage;
|
|
|
h->prod_id = h->dm->_globalDevInfo.product_id;
|
|
|
+ h->mgr.dns4.url = "udp://114.114.114.114:53";
|
|
|
+ //h->mgr.dns6.url = "udp://114.114.114.114:53";
|
|
|
|
|
|
- h->opts.clean = true,
|
|
|
- h->opts.qos = 1,
|
|
|
- h->opts.version = 4,
|
|
|
- h->opts.topic = mg_str(""),
|
|
|
- h->opts.message = mg_str("bye");
|
|
|
+ list_cfg_t lc;
|
|
|
+ lc.mode = LIST_FULL_FIFO;
|
|
|
+ lc.max = 100;
|
|
|
+ lc.log = 0;
|
|
|
+ h->list = xlist_init(&lc);
|
|
|
|
|
|
thread_start(THREAD_ID_MQTT, mqtt_thread, h, 4*MB, 0);
|
|
|
h->inited = 1;
|
|
|
r = 0;
|
|
|
#endif
|
|
|
|
|
|
+ mqtt_test();
|
|
|
+
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
@@ -289,6 +370,7 @@ int mqtt_deinit(void)
|
|
|
|
|
|
thread_stop(THREAD_ID_MQTT);
|
|
|
mg_mgr_free(&h->mgr);
|
|
|
+ xlist_free(h->list);
|
|
|
h->inited = 0;
|
|
|
r = 0;
|
|
|
#endif
|
|
|
@@ -297,54 +379,16 @@ int mqtt_deinit(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
-int mqtt_conn(void)
|
|
|
-{
|
|
|
- int r=0;
|
|
|
-
|
|
|
-#ifdef USE_MQTT
|
|
|
- mqtt_handle_t *h=&mqHandle;
|
|
|
-
|
|
|
- lock_s_hold(LOCK_ID_MQTT);
|
|
|
- if(h->inited) {
|
|
|
- r = my_conn(h, &h->dm->mqttInfo);
|
|
|
- }
|
|
|
- lock_s_release(LOCK_ID_MQTT);
|
|
|
-#endif
|
|
|
-
|
|
|
- return r;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-int mqtt_disconn(void)
|
|
|
-{
|
|
|
- int r=-1;
|
|
|
-
|
|
|
-#ifdef USE_MQTT
|
|
|
- mqtt_handle_t *h=&mqHandle;
|
|
|
-
|
|
|
- lock_s_hold(LOCK_ID_MQTT);
|
|
|
- if(h->inited) {
|
|
|
- r = my_disconn(h);
|
|
|
- }
|
|
|
- lock_s_release(LOCK_ID_MQTT);
|
|
|
-#endif
|
|
|
-
|
|
|
- return r;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-int mqtt_send(int type, int id, void *data)
|
|
|
+int mqtt_post(int type, int id, void *data)
|
|
|
{
|
|
|
int r=-1;
|
|
|
- int datalen=0;
|
|
|
-
|
|
|
|
|
|
#ifdef USE_MQTT
|
|
|
char topic[512];
|
|
|
- char content[4096];
|
|
|
+ char* content=NULL;
|
|
|
mqtt_handle_t *h=&mqHandle;
|
|
|
|
|
|
- if(!h->inited || type<0 || type>=MQTT_PUB_MAX || !data) {
|
|
|
+ if(!h->inited || type<0 || type>=MQTT_PUB_MAX) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
@@ -358,49 +402,216 @@ int mqtt_send(int type, int id, void *data)
|
|
|
switch(type) {
|
|
|
case MQTT_PUB_INFO_DEVICE:
|
|
|
{
|
|
|
- //
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ cJSON_AddStringToObject(data,"id", get_str(id));
|
|
|
+ cJSON_AddStringToObject(data,"name", "Gowone smartPDU");
|
|
|
+ cJSON_AddStringToObject(data,"type", "smartPDU AC");
|
|
|
+ cJSON_AddStringToObject(data,"firmware", VERSION);
|
|
|
+ cJSON_AddStringToObject(data,"channel_num", "8");
|
|
|
+ cJSON_AddStringToObject(data,"sensor_num", "10");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case MQTT_PUB_STAT_NETWORK:
|
|
|
{
|
|
|
+ NetworkInfo_t nw4,nw6;
|
|
|
+ int r4 = sys_get_net(&nw4, IP_V4);
|
|
|
+ int r6 = sys_get_net(&nw6, IP_V6);
|
|
|
+
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ if(r4==0) {
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv4_link", nw4.mode?"1":"0");
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv4_address", nw4.ip_address);
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv4_mask", nw4.mask);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv4_link", "");
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv4_address", "");
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv4_mask", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(r4==0) {
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv6_link", nw6.mode?"1":"0");
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv6_address", nw6.ip_address);
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv6_subnet_length", nw6.mask);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv6_link", "");
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv6_address", "");
|
|
|
+ cJSON_AddStringToObject(data,"lan_ipv6_subnet_length", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(0) {
|
|
|
+ cJSON_AddStringToObject(data,"wifi_ipv4_link", "");
|
|
|
+ cJSON_AddStringToObject(data,"wifi_ipv4_address", "");
|
|
|
+ cJSON_AddStringToObject(data,"wifi_ipv4_mask", "");
|
|
|
+
|
|
|
+ cJSON_AddStringToObject(data,"wifi_ipv6_link", "");
|
|
|
+ cJSON_AddStringToObject(data,"wifi_ipv6_address", "");
|
|
|
+ cJSON_AddStringToObject(data,"wifi_ipv6_mask", "");
|
|
|
+ }
|
|
|
+
|
|
|
+ cJSON_AddStringToObject(data,"modbus_address", get_str(h->dm->_globalDevInfo._gmodbus_info.product_modbus_addr));
|
|
|
+ cJSON_AddStringToObject(data,"modbus_baud", get_str(h->dm->_globalDevInfo._gmodbus_info.product_modbus_baud));
|
|
|
+ cJSON_AddStringToObject(data,"modbus_mode", get_str(h->dm->_globalDevInfo._gmodbus_info.product_modbus_type));
|
|
|
+ cJSON_AddStringToObject(data,"vpn_enable", "0");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case MQTT_PUB_STAT_POWER_ALL:
|
|
|
{
|
|
|
-
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ cJSON_AddStringToObject(data,"voltage", "");
|
|
|
+ cJSON_AddStringToObject(data,"current", "");
|
|
|
+ cJSON_AddStringToObject(data,"power", "");
|
|
|
+ cJSON_AddStringToObject(data,"consumption", "");
|
|
|
+ cJSON_AddStringToObject(data,"pactive_power", "");
|
|
|
+ cJSON_AddStringToObject(data,"reactive_power", "");
|
|
|
+ cJSON_AddStringToObject(data,"apparent_power", "");
|
|
|
+ cJSON_AddStringToObject(data,"date", "");
|
|
|
+ cJSON_AddStringToObject(data,"time", "");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case MQTT_PUB_STAT_POWER_CHN:
|
|
|
{
|
|
|
-
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ cJSON_AddStringToObject(data,"name", "app server channel");
|
|
|
+ cJSON_AddStringToObject(data,"status", "1");
|
|
|
+ cJSON_AddStringToObject(data,"voltage", "");
|
|
|
+ cJSON_AddStringToObject(data,"current", "");
|
|
|
+ cJSON_AddStringToObject(data,"power", "");
|
|
|
+ cJSON_AddStringToObject(data,"power_freq", "");
|
|
|
+ cJSON_AddStringToObject(data,"consumption", "");
|
|
|
+ cJSON_AddStringToObject(data,"power_factor", "");
|
|
|
+ cJSON_AddStringToObject(data,"pactive_power", "");
|
|
|
+ cJSON_AddStringToObject(data,"reactive_power", "");
|
|
|
+ cJSON_AddStringToObject(data,"apparent_power", "");
|
|
|
+ cJSON_AddStringToObject(data,"date", "");
|
|
|
+ cJSON_AddStringToObject(data,"time", "");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case MQTT_PUB_STAT_SENSOR:
|
|
|
{
|
|
|
-
|
|
|
- }
|
|
|
- break;
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ cJSON_AddStringToObject(data,"name", "temp sensor");
|
|
|
+ cJSON_AddStringToObject(data,"type", "0");
|
|
|
+ cJSON_AddStringToObject(data,"modbus_address", "");
|
|
|
+ cJSON_AddStringToObject(data,"node", "-1");
|
|
|
+ cJSON_AddStringToObject(data,"status", "1");
|
|
|
+ cJSON_AddStringToObject(data,"value_num", "");
|
|
|
+ cJSON_AddStringToObject(data,"value1", "");
|
|
|
+ cJSON_AddStringToObject(data,"value2", "");
|
|
|
+ cJSON_AddStringToObject(data,"date", "");
|
|
|
+ cJSON_AddStringToObject(data,"time", "");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
|
|
|
- case MQTT_PUB_ALARM_NETWORK:
|
|
|
- {
|
|
|
-
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
- case MQTT_PUB_ALARM_POWER:
|
|
|
+ case MQTT_PUB_STAT_SERVICE:
|
|
|
{
|
|
|
-
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ cJSON_AddStringToObject(data,"telnet", "0");
|
|
|
+ cJSON_AddStringToObject(data,"smtp", "1");
|
|
|
+ cJSON_AddStringToObject(data,"snmp_v1", "1");
|
|
|
+ cJSON_AddStringToObject(data,"snmp_v2c", "1");
|
|
|
+ cJSON_AddStringToObject(data,"snmp_v3", "1");
|
|
|
+ cJSON_AddStringToObject(data,"snmp_trap", "1");
|
|
|
+ cJSON_AddStringToObject(data,"message", "");
|
|
|
+ cJSON_AddStringToObject(data,"mqtt", "1");
|
|
|
+ cJSON_AddStringToObject(data,"cloud", "1");
|
|
|
+ cJSON_AddStringToObject(data,"ntp", "1");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case MQTT_PUB_ALARM_NETWORK:
|
|
|
case MQTT_PUB_ALARM_SENSOR:
|
|
|
+ case MQTT_PUB_ALARM_POWER:
|
|
|
{
|
|
|
-
|
|
|
+ cJSON* root=cJSON_CreateObject();
|
|
|
+ if(root) {
|
|
|
+ cJSON_AddStringToObject(root,"Topic", topic);
|
|
|
+ cJSON* data=cJSON_CreateObject();
|
|
|
+ if(data) {
|
|
|
+ cJSON_AddStringToObject(data,"num", "temp sensor");
|
|
|
+ cJSON_AddStringToObject(data,"context", "");
|
|
|
+ cJSON_AddStringToObject(data,"action", "1");
|
|
|
+ cJSON_AddStringToObject(data,"action_para", "7");
|
|
|
+ cJSON_AddStringToObject(data,"date", "");
|
|
|
+ cJSON_AddStringToObject(data,"time", "");
|
|
|
+
|
|
|
+ cJSON_AddItemToObject(root, "Data", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ content = cJSON_Print(root);
|
|
|
+ cJSON_Delete(root);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -408,9 +619,11 @@ int mqtt_send(int type, int id, void *data)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- lock_s_hold(LOCK_ID_MQTT);
|
|
|
- r = my_pub(h, topic, content);
|
|
|
- lock_s_release(LOCK_ID_MQTT);
|
|
|
+ mqtt_pkt_t pkt;
|
|
|
+ snprintf(pkt.topic, sizeof(pkt.topic), "%s", topic);
|
|
|
+ snprintf(pkt.content, sizeof(pkt.content), "%s", content);
|
|
|
+ r = xlist_append(h->list, 0, &pkt, sizeof(pkt));
|
|
|
+ cJSON_free(content);
|
|
|
#endif
|
|
|
|
|
|
return r;
|
|
|
@@ -487,7 +700,7 @@ static int my_recv(char *topic, char *data)
|
|
|
int i,r,cmd;
|
|
|
|
|
|
#ifdef USE_MQTT
|
|
|
- char temp[2000];
|
|
|
+ char temp[512];
|
|
|
mqtt_handle_t *h=&mqHandle;
|
|
|
|
|
|
for(i=0; i<MQTT_SUB_MAX; i++) {
|
|
|
@@ -548,3 +761,53 @@ static int my_recv(char *topic, char *data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+int mqtt_test(void)
|
|
|
+{
|
|
|
+#ifdef USE_MQTT
|
|
|
+ int cnt=0;
|
|
|
+ mqtt_handle_t *h=&mqHandle;
|
|
|
+ mqtt_info_t mInfo={0};
|
|
|
+ mqtt_server_t ser={
|
|
|
+ .id = 0,
|
|
|
+ .mode = 1,
|
|
|
+#if 0
|
|
|
+ .server = "mqtts://gaae4d7b.ala.cn-hangzhou.emqxsl.cn:8883",
|
|
|
+ .ip = "",
|
|
|
+ .port = "8883",
|
|
|
+ .cid = "mqtlx_e92334545",
|
|
|
+ .user = "AABB123",
|
|
|
+ .password = "asdfasd3225",
|
|
|
+#else
|
|
|
+ .server = "192.168.1.12:1883",
|
|
|
+ .ip = "",
|
|
|
+ .port = "1883",
|
|
|
+ .cid = "mqtlx_asdjflsd",
|
|
|
+
|
|
|
+ .user = "gowone100",
|
|
|
+ .password = "gowone100",
|
|
|
+
|
|
|
+ //.user = "gowone101",
|
|
|
+ //.password = "gowone101",
|
|
|
+#endif
|
|
|
+
|
|
|
+ //.user = "adsg33434",
|
|
|
+ //.password = "aafweertzv",
|
|
|
+ };
|
|
|
+
|
|
|
+ mInfo.ser[0] = ser;
|
|
|
+
|
|
|
+ h->dm->mqttInfo = mInfo;
|
|
|
+ //mg_log_set(MG_LL_VERBOSE);
|
|
|
+
|
|
|
+ while(1) {
|
|
|
+ mqtt_post(MQTT_PUB_INFO_DEVICE, 0, 0);
|
|
|
+ sleep(2);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|