1 /*
2  * Copyright (C) 2015-2019 Alibaba Group Holding Limited
3  */
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 
9 #include "uagent_config.h"
10 #include "uagent_inner_api.h"
11 #include "aos/kernel.h"
12 #include "aos/errno.h"
13 #include "core_mqtt.h"
14 
15 static char mqtt_topic_up[UAGENT_TOPIC_MAX_LEN];
16 static char mqtt_topic_dn[UAGENT_TOPIC_MAX_LEN];
17 static char mqtt_topic_up_reply[UAGENT_TOPIC_MAX_LEN];
18 static on_recv_handler recv_handler = NULL;
19 static char mqtt_comm_init = 0;
20 static void *mqtt_client = NULL;
21 
22 
uagent_up_reply_handler(void * handle,const aiot_mqtt_recv_t * packet,void * userdata)23 static void uagent_up_reply_handler(void *handle, const aiot_mqtt_recv_t *packet, void *userdata)
24 {
25 
26 }
27 
uagent_handler(void * handle,const aiot_mqtt_recv_t * packet,void * userdata)28 static void uagent_handler(void *handle, const aiot_mqtt_recv_t *packet, void *userdata)
29 {
30      switch (packet->type) {
31         case AIOT_MQTTRECV_PUB: {
32             /* print topic name and topic message */
33             UAGENT_DEBUG("Topic: '%.*s' (Length: %d)",
34                 packet->data.pub.topic_len,
35                 packet->data.pub.topic,
36                 packet->data.pub.topic_len);
37             UAGENT_DEBUG("Payload: '%.*s' (Length: %d)",
38                 packet->data.pub.payload_len,
39                 packet->data.pub.payload,
40                 packet->data.pub.payload_len);
41                 if (NULL != packet->data.pub.payload) {
42                     recv_handler(packet->data.pub.payload_len , packet->data.pub.payload);
43                 }
44         }
45         break;
46         default: {
47         }
48         break;
49     }
50 
51 }
52 
uagent_ext_comm_init(const char pk[12],const char dn[36],on_recv_handler handler)53 int uagent_ext_comm_init(const char pk[12], const char dn[36], on_recv_handler handler)
54 {
55     int rc = -EINVAL;
56     /* todo retry if construct fail or subscribe fail */
57     if (0==mqtt_comm_init && NULL != pk && NULL != dn) {
58         UAGENT_INFO("[uA]prepare start uagent comm %s %s\n", pk, dn);
59         /* Construct a MQTT client with default parameter */
60         if (mqtt_client != NULL) {
61             snprintf(mqtt_topic_up, UAGENT_TOPIC_MAX_LEN, TOPIC_AGENT_INFO, pk, dn);
62             snprintf(mqtt_topic_dn, UAGENT_TOPIC_MAX_LEN, TOPIC_AGENT_MAN, pk, dn);
63             snprintf(mqtt_topic_up_reply, UAGENT_TOPIC_MAX_LEN, TOPIC_AGENT_POST_REPLY, pk, dn);
64 #ifdef SP_BROADCAST_TOPIC
65             char broadcast_topic_dn[UAGENT_TOPIC_MAX_LEN];
66             snprintf(broadcast_topic_dn, UAGENT_TOPIC_MAX_LEN, "/broadcast/%s/deviceman", pk);
67 #endif
68             recv_handler = handler;
69             UAGENT_INFO("[uA]Subsrcibe TOPIC %s\r\n", mqtt_topic_dn);
70             /* Subscribe the specific topic */
71             rc = aiot_mqtt_sub(mqtt_client, mqtt_topic_dn , uagent_handler, CORE_MQTT_QOS0, NULL);
72             if (rc < 0) {
73                 UAGENT_ERR("[uA]IOT_MQTT_Subscribe(%s) failed, rc = %d\r\n", mqtt_topic_dn, rc);
74             } else {
75                 UAGENT_INFO("[uA]IOT_MQTT_Subscribe(%s) success\r\n", mqtt_topic_dn);
76                 rc = 0;
77             }
78 
79             /* Subscribe the specific topic */
80             rc = aiot_mqtt_sub(mqtt_client, mqtt_topic_up_reply, uagent_up_reply_handler, CORE_MQTT_QOS0 , NULL);
81             if (rc < 0) {
82                 UAGENT_ERR("[uA]IOT_MQTT_Subscribe(%s) failed, rc = %d\r\n", mqtt_topic_up_reply, rc);
83             } else {
84                 UAGENT_INFO("[uA]IOT_MQTT_Subscribe(%s) success\r\n", mqtt_topic_up_reply);
85                 rc = 0;
86             }
87 #ifdef SP_BROADCAST_TOPIC
88             UAGENT_INFO("[uA]Subsrcibe TOPIC %s", broadcast_topic_dn);
89          //   rc = IOT_MQTT_Subscribe(NULL, broadcast_topic_dn, IOTX_MQTT_QOS1, uagent_handler, NULL);
90             rc = aiot_mqtt_sub(mqtt_client, broadcast_topic_dn, uagent_handler, CORE_MQTT_QOS1 , NULL);
91             if (rc < 0) {
92                 UAGENT_ERR("[uA]IOT_MQTT_Subscribe() failed, rc = %d\r\n", rc);
93             } else {
94                 UAGENT_INFO("[uA]IOT_MQTT_Subscribe(%s) success\r\n", broadcast_topic_dn);
95             }
96 #endif
97             mqtt_comm_init = 1;
98         } else {
99             UAGENT_ERR("[uA]### MQTT construct Fail");
100         }
101 
102     } else {
103         UAGENT_ERR("[uA]invalid argument or uagent_comm already build");
104     }
105     return rc;
106 
107 }
108 
uagent_ext_comm_publish(const unsigned short len,void * data,const bool conn_orient)109 int uagent_ext_comm_publish(const unsigned short len, void* data, const bool conn_orient)
110 {
111 
112     int rc = 0;
113     if (mqtt_client != NULL) {
114         rc = aiot_mqtt_pub(mqtt_client, mqtt_topic_up, data, len, conn_orient ? CORE_MQTT_QOS1 : CORE_MQTT_QOS0);
115     } else {
116         UAGENT_ERR("[uA]mqtt client not init");
117         rc = -1;
118     }
119     return rc;
120 }
121 
check_connect()122 char check_connect()
123 {
124     char rc = 0;
125     if (NULL != mqtt_client) {
126         core_mqtt_handle_t *mqtt_handle = mqtt_client;
127         if (mqtt_handle->disconnected == 0 && mqtt_handle->has_connected == 1) {
128             rc = 1;
129         } else {
130             rc = 0;
131         }
132     }
133     return rc;
134 }
135 
uagent_mqtt_client_set(void * mqtt_client_handle)136 int uagent_mqtt_client_set(void *mqtt_client_handle)
137 {
138     int rc = 0;
139     if (NULL != mqtt_client_handle) {
140         mqtt_client = mqtt_client_handle;
141         rc = 0;
142     } else {
143         UAGENT_ERR("[uA] mqtt client is NULL");
144         rc = -1;
145     }
146     return rc;
147 }
148