#include "wm_include.h"
#include "libemqtt.h"
#include "HTTPClientWrapper.h"
#include <time.h>
#include "wm_rtc.h"
#include "wm_ntp.h"
#include "cJSON.h"
#define MQTT_BUFF_SIZE 1024
#define MQTT_PUBACK_SIZE 1024
#define MQTT_OK 0
#define MQTT_ERR -1
#define MQTT_READ_TIMEOUT (-1000)
#define MQTT_DEBUG_EN 1
#if MQTT_DEBUG_EN
#define mqtt_debug printf
#else
#define mqtt_debug
#endif
#define MQTT_TASK_SIZE 1024
#define MQTT_USE_SSL (1 && TLS_CONFIG_HTTP_CLIENT_SECURE)
#define MQTT_SERVER_NAME "49.4.93.xx"
#define MQTT_SERVER_PORT 8883
#define DEVICE_ID "21d081dd-2762-4ad2-9715-3120be5cc89b"
#define PASSWORD "89f69ba0bccfd0fd77da"
#define MQTT_CLIENT_ID (DEVICE_ID##"_0_1_%s")
#define MQTT_USER_NAME DEVICE_ID
#define SUB_TOPIC "/huawei/v1/devices/"##DEVICE_ID##"/command/json"
#define PUB_TOPIC "/huawei/v1/devices/"##DEVICE_ID##"/data/json"
#define MQTT_RECV_TASK_PRIO 63
#define MQTT_PING_INTERVAL 45
#define BEBUG_BYTES 0
#define DEBUG_PUBLISH 1
typedef struct _mqtt_para{
char clientid[64+8];
char username[64];
char userkey[64+8];
char timestamp[16];
} mqtt_para;
typedef enum _mqtt_state{
WAIT_WIFI_OK = 0,
CONNECT_SERVER,
RECV_FROM_SERVER,
SEND_HEARTBEAT,
} mqtt_state;
static mqtt_broker_handle_t mqtt_broker;
static tls_ssl_t *ssl;
static char packet_buffer[MQTT_BUFF_SIZE] = { 0 };
static OS_STK DemoMqttRecvStk[MQTT_TASK_SIZE];
static mqtt_para loginPara = { 0 };
static void getConnectKey(u8 *hash)
{
u32 keyLen = 0;
u32 psdLen = strlen(PASSWORD);
unsigned char hash_hex[32+1] = { 0 };
struct tm *tblock;
u32 t = tls_ntp_client();
mqtt_debug("Time: %s\r\n", ctime(&t));
tblock=localtime(&t); //把日历时间转换成本地时间,已经加上与世界时间8小时的偏差,以1900为基准
sprintf(loginPara.timestamp, "%04d%02d%02d%02d", tblock->tm_year+1900, tblock->tm_mon+1, tblock->tm_mday, tblock->tm_hour);
keyLen = strlen(loginPara.timestamp);
tls_set_rtc(tblock);
psHmacSha2(loginPara.timestamp, keyLen, PASSWORD, psdLen, hash_hex, loginPara.timestamp, &keyLen, SHA256_HASH_SIZE);
for(int i=0, j=0; i<SHA256_HASH_SIZE; i+=1, j+=2) {
sprintf((hash+j), "%02x", *(hash_hex+i));
}
mqtt_debug("hash: %s\r\n", hash);
}
static int mqtt_send(int socket_info, unsigned char *buf, unsigned int count)
{
int fd = socket_info;
#if BEBUG_BYTES
mqtt_debug("mqtt_send %d:\r\n", count);
for(int i=0; i<count; i++) {
mqtt_debug("%x ", *(buf+i));
}
mqtt_debug("\r\n");
#endif
#if MQTT_USE_SSL
return HTTPWrapperSSLSend(ssl, fd, buf, count, 0);
#else
return send(fd, buf, count, 0);
#endif
}
static void mqtt_close(void)
{
#if MQTT_USE_SSL
mqtt_disconnect(&mqtt_broker);
closesocket(mqtt_broker.socketid);
HTTPWrapperSSLClose(ssl, mqtt_broker.socketid);
#else
mqtt_disconnect(&mqtt_broker);
closesocket(mqtt_broker.socketid);
#endif
}
/* Socket safe API,do not