赞
踩
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();函数时,调用你填写的回调函数才能够进行判断是否为真的成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。