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