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();函数时,调用你填写的回调函数才能够进行判断是否为真的成功。