STM32CubeMx + LWIP(实现UDP组播/MQTT/热插拔)系列 四 ----- MQTT的连接与使用

mqtt的全局变量

mqtt_client_t *lwip_mqtt;

mqtt的连接,不要直接复制粘贴哦,记得把参数设置成你项目中用到的数据

char LWIP_Connect(mqtt_client_t *client)
{
    struct mqtt_connect_client_info_t ci;
    err_t err;
    ip_addr_t my_ip_addr;

    memset(&ci, 0, sizeof(ci));
	
    ci.client_user = "user name";
    ci.client_pass = "user pwd";
    ci.client_id = "mqtt_topic@@@client_id";
    ci.keep_alive = 40;

    IP4_ADDR(&my_ip_addr,1,1,1,1);

    err = mqtt_client_connect(client, (const ip_addr_t *)&my_ip_addr, 1883,MQTT_connect_cb, 0, &ci);
    if(err != ERR_OK ) {
        if(err != ERR_ISCONN){
            printf("mqtt connect err,ecode %d",err);
            return -1;
	}
    }
    return 0;
}

该函数执行完之后只是告诉你是否可以进行连接。连接没连接上需要对回调函数MQTT_connect_cb()进行判断;

void MQTT_connect_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
{
    err_t err;

    if(status == MQTT_CONNECT_ACCEPTED){ //连接成功
        mqtt_set_inpub_callback(client, MQTT_incoming_subscribe_cb,MQTT_incoming_data_cb, arg);//传参两个函数指针需要使用自己定义的函数指针。第一个返回主题,第二个返回数据和数据长度
		
	err = mqtt_subscribe(client, "subscribe topic", 1, MQTT_sub_request_cb, arg);
	if(err != ERR_OK) {
            printf("mqtt connect callback error,ecode %d",err);
	}
        else{
            printf("subscribe topic success if  the subscribe callback is success");
        }
    } 
    else {
        printf("Login err,ecode %"PRId8"",err);
    }  
}

mqtt_subscribe()函数也是如此,如果订阅成功的话会执行下面的函数

void MQTT_sub_request_cb(void *arg, err_t result)
{
    if(result != ERR_OK){
        printf("subscribe topic fail");
    }
    else{
        printf("subscribe topic success");
    }
}

如果订阅的主题发布数据后:会执行下列两个函数


void MQTT_incoming_subscribe_cb(void *arg, const char *topic, u32_t tot_len)
{
    printf("topic %s is incoming data",topic);
}

void MQTT_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags)
{	
    if(flags & MQTT_DATA_FLAG_LAST) {
        printf("incoming data len %d",len);
        printf("incoming data is %s",data);
    } 
}

如果你想要给某个主题发送数据时,执行下面的函数,该函数并不是回调函数,而是需要发送数据时,自己主动调用的函数

void MQTT_publish(mqtt_client_t *client, void *arg)
{
    err_t err;

    //主题名字后面需要添加发送等级
    err = mqtt_publish(client, "public topic/qos0", "Moliam"/**你自己发送数据的数组*/, sizeof("Moliam")/**发送数据的长度*/ , 0, 0, MQTT_pub_request_cb, arg);

    if(err != ERR_OK){
        printf("Publish fail.\r\n");
    }
    else {
        printf("Publish success if MQTT_pub_request_cb success.\r\n");
    }
}

发布数据回调函数

void MQTT_pub_request_cb(void *arg, err_t result)
{
	
    if(result != ERR_OK ){
        printf("Publish fail,error code : %d\n", result);
    }
    else{
        printf("public success");
    }
	
}

lwip需要注意的是,当一个函数返回ERR_OK时,并不代表一定成功,只是代表该函数执行成功,是否真的成功还需要下次轮询到MX_LWIP_process();函数时,调用你填写的回调函数才能够进行判断是否为真的成功。

你可能感兴趣的:(STM32CUBE,lwip)