我是靠谱客的博主 欢呼冰淇淋,最近开发中收集的这篇文章主要介绍基于MQTT的数据采集系统,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基于MQTT的数据采集系统
1.实验目的
本次研究推出一款实用的轻量型智能家居系统,本系统采用STM32为主控芯片,将MQTT通信协议移植到STM32中,将其作为一个MQTTClient。该系统的核心为MQTT协议,该协议占用网络资源较少,十分适合家庭环境采集的长时间小数据的传输。
推出此轻量,低价,实用的智能家居数据采集系统是为提高人们对智能家居的认识,加强智能家居系统的实用性,刺激人们购买智能家居的欲望,从而推动智能家居产业的发展。

2.实验内容
1.下载MQTT;
2.编写STM32程序;
3.编译安装Ubuntu Mosquitto服务器;
4.手机端配置;
5.系统测试;
3.MQTT协议原理
3.1MQTT传输协议
MQTT即消息队列遥测传输(Message Queuing Telemetry Transport)是ISO 标准(ISO/IEC PRF 20922)下基于发布 (Publish)/订阅 (Subscribe)模型的消息协议,可视为“数据传递的桥梁”它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件,以解决当前繁重的数据传输协议,如:HTTP。
IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿兰·尼普于1999年撰写了该协议的第一个版本。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。
MQTT有着以下特点:
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接,Clients与Broker之间保持TCP长连接;
4、有三种消息发布服务质量:“至多一次”、“至少一次”、“只有一次”
5、小型传输,开销很小,协议交换最小化,以降低网络流量;
6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
3.2 MQTT通信协议流程
MQTT协议移植实际上是令STM32能按照MQTT协议通信规则发送相应的控制报文,使其成为MQTTClient。MQTT协议的连接、订阅、发布和心跳等控制报文的流程图如图3-1所示:
在这里插入图片描述
图3-1 MQTT控制报文流程图
物联网通信协议中MQTT协议的特色为:当STM32已经订阅MQTTServer的某个Topic时,微信小程序向该Topic发布了消息,此时STM32就能接收到MQTTServer发布的消息。这种通过主题转发消息的机制能够解除应用程序耦合,同时无需在消息中添加报头寻址,大大减少传输消息过程中报头的网络资源占比,提高了带宽利用率。具体流程如图3-2所示:
在这里插入图片描述
图3-2 MQTT消息通信流程
3.3 MQTT的控制报文格式
MQTT控制报文根据功能配置通常分成三个部分:固定报头,可变报头、有效载荷[13]。由预定义的MQTT控制报文完成不同的通信内容。报文内容如表3-1所示。
表3-1 控制报文的内容
固定报头 控制报文都包含
可变报头 部分控制报文包含
有效载荷 部分控制报文包含

根据报文发送方,可将本系统涉及的控制报文分成两类:
MQTTClient发送的控制报文:
CONNECT、UNSUBSCRIBE、DISCONNECT、UNSUBACK、SUBSCRIBE, PUBLISH/PUBACK。
MQTTServer发送的控制报文:
CONNACK、SUBACK、UNSUBACK、UNSUBACK,PUBLISH/PUBACK。
由于本系统中使用QoS0因此无需考虑发布等待报文。
在这里插入图片描述
图3-3 CONNACT报文内容
在这里插入图片描述
图3-4 PUBLISH报文内容
(1)固定报头
本系统的CONNECT报文如图3-3所示,固定报头的第一个字节,0-3位包含控制报文类型如CONNECT、PUBLISH、CONNECT等的特定标志。PUBLISH报文控制报文如图3-4所示,其中最高位3为重复分发标志,1-2位代表服务质量等级QoS。0位是报文的保留标志。

(2)可变报头
可变报头中可通过协议约定的连接标志告知MQTTServer有效载荷(payload)中包含的信息。例如CONNECT报文中的连接标志包含:
User Name Flag: 置0时有效载荷不包含用户名
Password Flag:置0时有效载荷不包含密码。
Clean Session:置0时MQTTServer恢复之前的通信,并在断开后保存置1时MQTTServer必须重新开始新的会话,丢弃之前的任 何会话。且该会话数据不能被重新使用。
Will Flag:置0时连接标志的Will QoS和Will Retain字段必须置0。置1时若服务端接收连接请求,遗嘱消息必须被储存在服务与该网络连接关联,该网络连接关闭时MQTTServer发布此遗嘱消息。
(3)有效载荷
有效载荷(payload)出现在CONNECT,PUBLISH,SUBSCRIBE、SUBACK消息中。CONNECT报文的有效载荷如图3-3所示,SUBSCRIBE报文中,有效载荷包括QoS等级和订阅信息。SUBACK报文中有效载荷由于使用QoS0,通常只返回0x00。
4.实验步骤
4.1.在STM32移植MQTT协议
4.1.1 ESP8266透传
Wi-Fi模块为ESP-8266无线模块,通过USART3的配置实现STM32与Wi-Fi之间的通信,Wi-Fi模块采用AT指令控制,由STM32主控芯片通过USART3向其发送AT指令进行控制。表4-1是本次实验使用到的AT指令:AT+CIFSRrn
表4-1 ESP8266指令表

AT测试指令
AT+CWMODE=1设置客户端模式
AT+CWJAP=“LKR”,“LKRPasswd”连接Wi-Fi
AT+CIFSR查询本地IP
AT+RSTESP8266复位
AT+CIPSTART=“TCP”,“Broker”,1883建立TCP连接
AT+CIPMUX=0设置单连接
AT+CIPMODE=1开启透传模式
AT+CIPSEND发送数据

串口需要发送AT指令以及接收判断是否符合预期,若不符合预期将等待或者重新发送指令直至收到预期指令回复。此部分采用ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ),为应付单指令有多种回复,此处设置多个预期接收。开启透传模式后调用MQTT协议客户端函数开始数据传输。

4.1.2 MQTT移植
需要通过eclipse的MQTT库编写控制报文,下载地址为:https://github.com/eclipse/paho.mqtt.embedded-c,通过该库改写部分接口函数以及客户端控制报文。
(1)transport.c文件修改,将sock协议改成串口传输协议

int MQTT_USART3_SendData(unsigned char* str,int counter)
{
	int i;
	for(i = 0;i<counter; i++)
	{
		USART_SendData(USART3,*str);
		while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);
		str++;
	}
	
	return 1;
}


int MQTT_USART3_getdata(unsigned char* buf, int count)
{

    memcpy(buf, (void*)&strEsp8266_Fram_Record .Data_RX_BUF, count);

    strEsp8266_Fram_Record .InfBit .FramLength += count;
    
    return count;
}

图4-1 transport.c文件修改

(2)MQTT客户端控制报文编写
MQTT连接报文,将客户端ID,用户名等信息组合,向服务器请求连接:

void MQTT_Connect(void)
{
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    int buflen = sizeof(buf);
    int len = 0;
    data.clientID.cstring = CLIENT_ID;                   //¿Í»§¶ËID
    data.keepAliveInterval = KEEPLIVE_TIME;         //±£³Ö»îÔ¾
    data.username.cstring = USER_NAME;              //̞
    data.password.cstring = PASSWORD;               //ÃØÔ¿
    data.MQTTVersion = MQTT_VERSION;                //3.11°æ±¾
    data.cleansession = 1;
    //×é×°ÏûÏ¢
    len = MQTTSerialize_connect((unsigned char *)buf, buflen, &data);
    //·¢ËÍÏûÏ¢
		MQTT_USART3_SendData(buf, len);
		printf(" next one");
    /* µÈ´ýÁ¬½ÓÏìÓ¦ */
    while(!strEsp8266_Fram_Record .InfBit.FramFinishFlag)
		{
			printf ( "rn waitting for connectrn" );
			Delay_ms(1000);
		}
		strEsp8266_Fram_Record .InfBit .FramFinishFlag =0;
		mqtt_success = 1;
		printf ( "rn connected rn" );
}

图4-2 MQTT客户端控制报文编写
MQTT发布报文,构造发布消息的报文:

int mqtt_publish(char *pTopic,char *pMessage,u8 mslen)
{
	uint8_t buf_pub[200];
	int32_t len;
	MQTTString topicString = MQTTString_initializer;
	int msglen = mslen;//¼ÆËã·¢²¼ÏûÏ¢µÄ³¤¶È
	int buflen = sizeof(buf_pub);
	memset(buf_pub,0,buflen);
	topicString.cstring = pTopic;//"É豸topicÁбíÖеĵÚÒ»Ìõ";
	len += MQTTSerialize_publish(buf_pub+len, buflen-len, 0, 0, 0, 0, topicString, (unsigned char*)pMessage, msglen); /*2 ¹¹Ôì·¢²¼ÏûÏ¢µÄ±¨ÎÄ*/
	MQTT_USART3_SendData(buf_pub,len);//·¢ËÍÏûÏ¢
	return 0;
//	UART1_SendString((u8*)pMessage,mslen);
}

图4-3 MQTT发布报文
4.2.测试服务器搭建
在本地Ubuntu系统下搭建Mosquitto MQTT服务器,Mosquitto 能够实现MQTT的消息代理,能够通过mosquitto_sub和mosquitto_pub 命令进行订阅和发布消息,使设备间的MQTT通信更简单。
4.2.1.Mosquitto 安装
首先使用wget http://mosquitto.org/files/source/mosquitto-1.6.9.tar.gz获取安装包,tar -zxfv 解压压缩包,此时进到文件夹中make发现报错,需要安装以下编译环境:
make工具(报错信息:make、gcc工具缺失):
apt-get install build-essential
openssl安装(fatal error: openssl/ssl.h: No such file or directory):
apt-get install libssl-dev
ares库(fatal error:ares.h: No such file or directory) :apt-get install libc-ares-dev
uuid-dev(fatal error: uuid/uuid.h: No such file or directory):apt-get install uuid-dev
最后输入make生成可执行文件后make install安装到系统目录。最后可修改MQTT服务器配置文件 /etc/mosquitto/mosquitto.conf。MQTT服务默认的端口号为1883本系统不做修改。
4.3 百度天工服务器搭建
手机远程连接时需要一个拥有公网IP的服务器,因为云服务器价格昂贵因此不考虑采用,此时寻找到百度智能云拥有一站式的物联网服务平台,最关键的是它成本极低,并能提供Websockets方式连接和MQTT协议的消息传输。当消息数小于100万时该服务免费。并且提供外网IP供用户测试和使用。
在登陆百度智能云后进入IoT Hub接入服务进行创建一个数据型项目,完整的项目创建流程如图4-4所示。
根据流程图首先进行策略的创建,即定义相关主题的收发权限,若客户端发布在未定义的主题,服务器将会主动断开连接。随后创建身份,在创建时需要进行策略配置,以及在设备连接时的身份认证方式,在本系统设计中选择密码认证,随后保存系统提供的秘钥。最后进行用户创建,在本系统中有STM32和微信小程序两个MQTTClient,因此需要两个用户。最后创建完成后关键信息记录如图4-5所示。

在这里插入图片描述
图4-4 百度天工物联网创建流程
在这里插入图片描述
图 4-8 服务器参数记录

5.手机小程序配置
PC端下载微信开发者工具,并在微信公众号平台注册一个微信小程序。需要取得注册的微信小程序的开发者ID才可以进行开发。
在这里插入图片描述
图5-1 注册开发者ID
在微信开发者工具中导入项目,导入时须输入开发者ID。
在这里插入图片描述
图5-2 微信开发者工具导入项目
编译通过后可使用真机调试进行项目测试,也可用模拟器模拟如图5-3所示。
在这里插入图片描述
图5-3 项目调试
6.系统测试
经过传感器采集测试与MQTT协议通信测试后,最后STM32与手机微信小程序通过百度智能云的MQTT服务器同时工作,进行联合调试。在手机微信小程序进行连接服务器,订阅主题等操作后就能通过webSocket接收MQTT服务器传来的数据。首次测试时,手机无法接收STM32传出的数据,观察调试助手发现STM32中配置Wi-Fi模块的host地址并未修改为百度天工的地址,经修改后手机微信小程序能够实时接收STM32传出的温湿度数据如图6-2所示,随后查看是否能实时接收,当STM32传出环境温湿度改变时,微信小程序也能接收到变化后的数据。整个嵌入式系统完成了数据的采集,系统联调结束。
在这里插入图片描述在这里插入图片描述
图6-1 STM32发送数据 图6-2 微信小程序接收数据

最后

以上就是欢呼冰淇淋为你收集整理的基于MQTT的数据采集系统的全部内容,希望文章能够帮你解决基于MQTT的数据采集系统所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部