1、参考链接 :http://www.nongnu.org/lwip/2_0_x/group__mqtt.html

2、首先移植好lwip,然后添加lwip-2.0.2\src\apps\mqtt  文件下 的 mqtt.c 文件,如果有头文件问题,清解决头文件问题!

3、根据参考链接,做一下修改

下面代码中的MQTT 服务器 是我自己搭建的,你也可以找一台Linux 主机搭建一个。。2017年4月24日09:10:19

/*
* MQTT client for lwIP * Author: Erik Andersson * Details of the MQTT protocol can be found at:
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
*
*/ #include "oneNet_MQTT.h" #include "string.h" ip_addr_t mqttServerIpAddr; //1. Initial steps, reserve memory and make connection to server: //1.1: Provide storage //Static allocation: //下面这两句转移到 MAIN.c 中
// mqtt_client_t static_client; // example_do_connect(&static_client); //Dynamic allocation:
// mqtt_client_t *client = mqtt_client_new();
// if(client != NULL) {
// example_do_connect(&client);
// } //1.2: Establish Connection with server void example_do_connect(mqtt_client_t *client)
{
struct mqtt_connect_client_info_t ci; err_t err; /* Setup an empty client info structure */
memset(&ci, , sizeof(ci)); /* Minimal amount of information required is client identifier, so set it here */
ci.client_id = "lwip_test"; // MQTT服务器地址为:59.110.142.105端口号为:1883
IP4_ADDR(&mqttServerIpAddr, , , , );//配置 MQTT 服务器地址 /* Initiate client and connect to server, if this fails immediately an error code is returned
otherwise mqtt_connection_cb will be called with connection result after attempting
to establish a connection with the server.
For now MQTT version 3.1.1 is always used */ //MQTT 服务器进行连接 ,并注册 “连接结果处理”的回调函数,2017年4月12日09:00:12 err = mqtt_client_connect(client, &mqttServerIpAddr, , mqtt_connection_cb, , &ci); /* For now just print the result code if something goes wrong */
if(err != ERR_OK)
{
printf("mqtt_connect return %d\n", err);
}
} //Connection to server can also be probed by calling mqtt_client_is_connected(client) //-----------------------------------------------------------------
//2. Implementing the connection status callback
//执行连接状态 的 回调函数
static void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)
{
err_t err;
if(status == MQTT_CONNECT_ACCEPTED)
{
printf("mqtt_connection_cb: Successfully connected\n"); /* Setup callback for incoming publish requests */
//注册 消息推送 回调函数 以及消息数据到来的处理函数
mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg); /* Subscribe to a topic named "subtopic" with QoS level 2, call mqtt_sub_request_cb with result */
err = mqtt_subscribe(client, "subtopic", , mqtt_sub_request_cb, arg); if(err != ERR_OK)
{
printf("mqtt_subscribe return: %d\n", err);
}
}
else
{
printf("mqtt_connection_cb: Disconnected, reason: %d\n", status); /* Its more nice to be connected, so try to reconnect */
example_do_connect(client);
}
} void mqtt_sub_request_cb(void *arg, err_t result)
{
/* Just print the result code here for simplicity,
normal behaviour would be to take some action if subscribe fails like
notifying user, retry subscribe or disconnect from server */
printf("Subscribe result: %d\n", result);
} //-----------------------------------------------------------------
//3. Implementing callbacks for incoming publish and data /* The idea is to demultiplex topic and create some reference to be used in data callbacks
Example here uses a global variable, better would be to use a member in arg
If RAM and CPU budget allows it, the easiest implementation might be to just take a copy of
the topic string and use it in mqtt_incoming_data_cb
*/ //这两个函数 一个 处理 消息头 一个 处理 具体的 数据 static int inpub_id;
static void mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len)
{ //消息来了之后,先进入这里用于判断 是什么主题 的,2017年4月20日09:25:51 printf("Incoming publish at topic \" %s \" with total length %u\r\n", topic, (unsigned int)tot_len); /* Decode topic string into a user defined reference */
if(strcmp(topic, "subtopic") == )
{
inpub_id = ;
}
else if(topic[] == 'A')
{
/* All topics starting with 'A' might be handled at the same way */
inpub_id = ;
}
else
{
/* For all other topics */
inpub_id = ;
}
} static void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags)
{
//消息来了之后先判断主题 上面那个函数,然后在这里是根据不同的主题,进行不同的处理 uint8_t tempBuff[]={}; uint8_t i; //数据复制到到缓冲区,并加 字符‘0’结尾,因为 发送工具只能发送 字符 不能发送字符串,2017年4月20日09:24:43
for(i=;i<len;i++)
{
tempBuff[i]=data[i];
}
tempBuff[i]=; printf("Incoming publish payload with length %d, flags %u\n", len, (unsigned int)flags); if(flags & MQTT_DATA_FLAG_LAST)
{
/* Last fragment of payload received (or whole part if payload fits receive buffer
See MQTT_VAR_HEADER_BUFFER_LEN) */ /* Call function or do action depending on reference, in this case inpub_id */
if(inpub_id == )
{
/* Don't trust the publisher, check zero termination */
if(tempBuff[len] == )
{
printf("mqtt_incoming_data_cb: %s\n", (const char *)data);
}
}
else if(inpub_id == )
{
/* Call an 'A' function... */
}
else
{
printf("mqtt_incoming_data_cb: Ignoring payload...\n");
}
}
else
{
/* Handle fragmented payload, store in buffer, write to file or whatever */
}
} //-----------------------------------------------------------------
//4. Using outgoing publish //使用 向外推送消息
//MQTT传输的消息分为:主题(Topic)和负载(payload)两部分 void example_publish(mqtt_client_t *client, void *arg)
{
const char *pub_payload= "Hello,MQTT!\r\n";//推送的有效数据(负载)
err_t err;
/*
* 最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1
* 至多一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
* 只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
*/
u8_t qos = ; /* 0 1 or 2, see MQTT specification */ //=0 的意思应该是不保留有效负载(有效数据)
u8_t retain = ; /* No don't retain such crappy payload... */ err = mqtt_publish(client, "pub_topic", pub_payload, strlen(pub_payload), qos, retain, mqtt_pub_request_cb, arg); if(err != ERR_OK)
{
printf("Publish err: %d.\r\n", err);
}
else
{
printf("Publish Success.\r\n");
}
} /* Called when publish is complete either with sucess or failure */
//推送消息完成后 的 回调函数
void mqtt_pub_request_cb(void *arg, err_t result)
{
if(result != ERR_OK)
{
printf("Publish result: %d\n", result);
}
} //-----------------------------------------------------------------
//5. Disconnecting //Simply call mqtt_disconnect(client)
    static_client.conn_state=;

    /* Initialize MQTT client */
example_do_connect(&static_client); while()
{ example_publish(&static_client,(void *)mqtt_pub_request_cb); /* vTaskDelayUntil是绝对延迟,vTaskDelay是相对延迟。*/
vTaskDelay();
}

上面 的服务器 地址 今天 已经 到期了 ,阿里 的 太贵了 没钱 续费了  哎 2017年6月26日17:15:40

LWIP2.0.2 & FreeRTOS & MQTT 客户端的 使用的更多相关文章

  1. MQTT客户端库-Paho GO

    为了加深理解,本文是翻译文章.原文地址 Paho GO Client   语言 GO 协议 EPL AND EDL 官网地址 http://www.eclipse.org/paho/ API类型 As ...

  2. 物联网架构成长之路(32)-SpringBoot集成MQTT客户端

    一.前言 这里虽然是说MQTT客户端.其实对于服务器来说,这里的一个具有超级权限的MQTT客户端,就可以做很多事情.比如手机APP或者网页或者第三方服务需要发送数据到设备,但是这些又不是设备,又不能让 ...

  3. MQTT Client library for C (MQTT客户端C语言库-paho)

    原文:http://www.eclipse.org/paho/files/mqttdoc/MQTTClient/html/index.html 来自我的CSDN博客   最近在使用Paho的MQTT客 ...

  4. oauth2.0服务端与客户端搭建

    oauth2.0服务端与客户端搭建 - 推酷 今天搭建了oauth2.0服务端与客户端.把搭建的过程记录一下.具体实现的功能是:client.ruanwenwu.cn的用户能够通过 server.ru ...

  5. elasticsearch 5.0 获取 TransportClient 操作客户端java API

    本文转载自:http://blog.csdn.net/likui1314159/article/details/53233881 elasticsearch 5.0 获取 TransportClien ...

  6. linux c MQTT客户端实现

    linux c MQTT客户端实现 摘自:https://www.jianshu.com/p/d309de966379 一.前言:mqtt协议是轻量级的消息订阅和发布(publish/subscrib ...

  7. MQTT客户端

    MQTT客户端 最近公司项目中使用到了一个MQTT的协议,用这个通讯协议将嵌入式端收集到的数据接入到物联网中,很是方便的解决了,嵌入式端存储空间小,也解决了用户需要自定义使用这些记录数据的需求.而且相 ...

  8. java在线聊天项目0.6版 解决客户端关闭后异常问题 dis.readUTF()循环读取已关闭的socket

    服务端对try catch finally重新进行了定义,当发生异常,主动提示,或关闭出现异常的socket 服务器端代码修改如下: package com.swift; import java.io ...

  9. (二)MQTT客户端模拟连接阿里云并上传数据

    本文主要讲述使用MQTT.fx接入物联网平台 一.下载MQTT.fx客户端 官网链接 二.设置相关参数 打开MQTT单片机编程工具,将三元组复制进去,生成所需要的信息 单片机工具下载地址 三元组还记得 ...

随机推荐

  1. 用Jq遍历一个div里面的所有input 并判断是否为空?

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 说说JSON和JSONP区别

    前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...

  3. git杂记-分支简介

    分支创建 //只创建分支不切换: $ git branch testing //创建并切换分支$ git checkout -b iss53 查看各个分支的指向对象 $ git log --oneli ...

  4. js 随机打乱数组

    假如有一个数组: var arr1=['a','b','c','d','e','f','g']; 需要将它进行随机打乱,网上好多都是用: arr1.sort(function(){ return 0. ...

  5. ArcGIS 地类净面积计算工具

    地类净面积计算工具可以自己定义图层.字段.地类代码计算任意图层的椭球面积.线状地物扣除.零星扣除和其他扣除,计算地类净面积计算:可以用于二调数据图斑地类.规划地块和基本农田等等需要计算净面积的都可以. ...

  6. Maximum Subarray 连续子数组最大和

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  7. ZABBIX 2.1.0 发布,分布式系统监控

    ZABBIX 2.1.0 发布了,这相当是 ZABBIX 2.2 的首个 Alpha 版本,包括了新的主要的功能和改进. 主要包括如下几个方面的提升: 性能提升 可加载模块 移除对未知事件的支持 应用 ...

  8. 【眼见为实】自己动手实践理解数据库REPEATABLE READ && Next-Key Lock

    [REPEATABLE READ] 首先设置数据库隔离级别为可重复读(REPEATABLE READ): set global transaction isolation level REPEATAB ...

  9. Vertical-Align: 关于inline,inline-block文本排版

    inline, inline-block元素在同行元素的排版布局中非常有用,但是时常会出现一些莫名奇妙的问题.要解决这些问题,深刻理解inline,inline-block元素的特征有非常重要的意义. ...

  10. 卸载Sharepoint2016后。重新安装提示 系统从以前的安装重新启动,或更新正在等待错误

    卸载Sharepoint2016 重启N遍,不停地重启.需要删除注册表项 下的 .将PendingFileRenameOperations键项删除,再重新安装就可以安装成功.