192 lines
5.9 KiB
C
192 lines
5.9 KiB
C
/***********************************MQTT 测试说明*******************************************
|
||
*说明:
|
||
* 通过MQTT协议连接阿里云, 向阿里云订阅主题和发布温度,湿度消息
|
||
*********************************************************************************************/
|
||
#include "mqtt/MQTTClient.h"
|
||
#include "system/includes.h"
|
||
#include "wifi/wifi_connect.h"
|
||
#include "app_config.h"
|
||
|
||
#ifdef USE_MQTT_TEST
|
||
|
||
#define COMMAND_TIMEOUT_MS 30000 //命令超时时间
|
||
#define MQTT_TIMEOUT_MS 10000 //接收阻塞时间
|
||
#define MQTT_KEEPALIVE_TIME 30000 //心跳时间
|
||
#define SEND_BUF_SIZE 1024 //发送buf大小
|
||
#define READ_BUF_SIZE 1024 //接收buf大小
|
||
static char send_buf[SEND_BUF_SIZE]; //发送buf
|
||
static char read_buf[READ_BUF_SIZE]; //接收buf
|
||
|
||
//接收回调,当订阅的主题有信息下发时,在这里接收
|
||
static void messageArrived(MessageData *data)
|
||
{
|
||
char temp[128] = {0};
|
||
|
||
strncpy(temp, data->topicName->lenstring.data, data->topicName->lenstring.len);
|
||
temp[data->topicName->lenstring.len] = '\0';
|
||
printf("Message arrived on topic (len : %d, topic : %s)\n", data->topicName->lenstring.len, temp);
|
||
|
||
memset(temp, 0, sizeof(temp));
|
||
strncpy(temp, data->message->payload, data->message->payloadlen);
|
||
temp[data->message->payloadlen] = '\0';
|
||
printf("message (len : %d, payload : %s)\n", data->message->payloadlen, temp);
|
||
}
|
||
|
||
static int mqtt_start(void)
|
||
{
|
||
Client client;
|
||
Network network;
|
||
MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;
|
||
MQTTMessage message;
|
||
int err;
|
||
int loop_cnt = 0;
|
||
int temperature = 0;
|
||
int humidity = 0;
|
||
|
||
char sendbuf[256];
|
||
char payload[256] = "{\"id\":\"161848123\",\"version\":\"1.0\",\"params\":{\"temperature\":%d,\"Humidity\":%d},\"method\":\"thing.event.property.post\"}";
|
||
char *address = "a1mhUx5m6Uq.iot-as-mqtt.cn-shanghai.aliyuncs.com";
|
||
char *username = "iot-001&a1mhUx5m6Uq";
|
||
char *password = "083dc23c92b1aad822c7c1f1a3c687dda022089b";
|
||
char *subscribeTopic = "/a1mhUx5m6Uq/iot-001/user/get"; //订阅的主题
|
||
char *publishTopic = "/sys/a1mhUx5m6Uq/iot-001/thing/event/property/post"; //发布消息的主题
|
||
char *clientID = "12345|securemode=3,signmethod=hmacsha1|";
|
||
|
||
_reconnect:
|
||
//初始化网络接口
|
||
NewNetwork(&network);
|
||
|
||
SetNetworkRecvTimeout(&network, 1000);
|
||
|
||
//初始化客户端
|
||
MQTTClient(&client, &network, COMMAND_TIMEOUT_MS, send_buf, sizeof(send_buf), read_buf, sizeof(read_buf));
|
||
|
||
//tcp层连接服务器
|
||
err = ConnectNetwork(&network, address, 1883);
|
||
if (err != 0) {
|
||
printf("ConnectNetwork fail\n");
|
||
return -1;
|
||
}
|
||
|
||
connectData.willFlag = 0;
|
||
connectData.MQTTVersion = 3; //mqtt版本号
|
||
connectData.clientID.cstring = clientID; //客户端id
|
||
connectData.username.cstring = username; //连接时的用户名
|
||
connectData.password.cstring = password; //连接时的密码
|
||
connectData.keepAliveInterval = MQTT_KEEPALIVE_TIME / 1000; //心跳时间
|
||
connectData.cleansession = 1; //是否使能服务器的cleansession,0:禁止, 1:使能
|
||
|
||
//mqtt层连接,向服务器发送连接请求
|
||
err = MQTTConnect(&client, &connectData);
|
||
if (err != 0) {
|
||
network.disconnect(&network);
|
||
printf("MQTTConnect fail, err : 0x%x\n", err);
|
||
return -1;
|
||
}
|
||
|
||
//订阅主题
|
||
err = MQTTSubscribe(&client, subscribeTopic, QOS1, messageArrived);
|
||
if (err != 0) {
|
||
MQTTDisconnect(&client);
|
||
network.disconnect(&network);
|
||
printf("MQTTSubscribe fail, err : 0x%x\n", err);
|
||
return -1;
|
||
}
|
||
|
||
//取消主题订阅
|
||
//MQTTUnsubscribe(&client, subscribeTopic);
|
||
|
||
message.qos = QOS1;
|
||
message.retained = 0;
|
||
|
||
while (1) {
|
||
if (0 == loop_cnt % 2) {
|
||
sprintf(sendbuf, payload, temperature, humidity);
|
||
message.payload = sendbuf;
|
||
message.payloadlen = strlen(sendbuf) + 1;
|
||
|
||
temperature += 1;
|
||
humidity += 2;
|
||
|
||
if (temperature > 100) {
|
||
temperature = 0;
|
||
}
|
||
|
||
if (humidity > 100) {
|
||
humidity = 0;
|
||
}
|
||
|
||
//发布消息
|
||
err = MQTTPublish(&client, publishTopic, &message);
|
||
if (err != 0) {
|
||
printf("MQTTPublish fail, err : 0x%x\n", err);
|
||
}
|
||
|
||
printf("MQTTPublish payload:(%s)\n", sendbuf);
|
||
}
|
||
|
||
loop_cnt += 1;
|
||
|
||
err = MQTTYield(&client, MQTT_TIMEOUT_MS);
|
||
if (err != 0) {
|
||
if (client.isconnected) {
|
||
//断开mqtt层连接
|
||
err = MQTTDisconnect(&client);
|
||
if (err != 0) {
|
||
printf("MQTTDisconnect fail\n");
|
||
}
|
||
|
||
//断开tcp层连接
|
||
network.disconnect(&network);
|
||
}
|
||
|
||
printf("MQTT : Reconnecting\n");
|
||
|
||
//重新连接
|
||
goto _reconnect;
|
||
}
|
||
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
static void aliyun_mqtt_example(void)
|
||
{
|
||
if (thread_fork("mqtt_start", 10, 2 * 1024, 0, NULL, mqtt_start, NULL) != OS_NO_ERR) {
|
||
printf("thread fork fail\n");
|
||
}
|
||
}
|
||
|
||
static void mqtt_test(void *priv)
|
||
{
|
||
int err;
|
||
enum wifi_sta_connect_state state;
|
||
while (1) {
|
||
printf("Connecting to the network...\n");
|
||
state = wifi_get_sta_connect_state();
|
||
if (WIFI_STA_NETWORK_STACK_DHCP_SUCC == state) {
|
||
printf("Network connection is successful!\n");
|
||
break;
|
||
}
|
||
|
||
os_time_dly(1000);
|
||
}
|
||
|
||
aliyun_mqtt_example();
|
||
}
|
||
|
||
//应用程序入口,需要运行在STA模式下
|
||
int c_main(void)
|
||
{
|
||
if (thread_fork("mqtt_test", 10, 512, 0, NULL, mqtt_test, NULL) != OS_NO_ERR) {
|
||
printf("thread fork fail\n");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
late_initcall(c_main);
|
||
|
||
#endif//USE_MQTT_TEST
|