基于联盛德w600的mqtt客户端程序示例

#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 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值