赞
踩
欢迎扫码关注本人微信公众号:公众号上分享更多嵌入式知识和资料,分享个人学习嵌入式的心得体会。欢迎大家一起来玩呀。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)由IBM在1999年发布。可以简单理解为给应用层使用的一种传输协议比如我们常见的http、tftp等,为什么会有多种传输协议,就是为了满足不同的使用场景,比如http是一种超文本协议,主要是运用在网页,文件传输上,如果要使用这种协议,需要比较大的数据量传输。但是我们的iot设备不需要传输那么多的数据量,而且http协议不能通过服务端发起传输到客户端,只能客户端发起传输到服务端,在我们的真实案例中比如智能灯泡,灯泡肯定是需要接收手机的控制的,也需要将当前灯泡的亮灭状态传输给用户的,所以在iot的场景上需要双向传输,所以使用http就不是很合适了。在iot的场景里,iot设备一般只需要上传一些状态值比如说灯泡,只需要上传当前灯泡的开关值,或者接受手机远程控制的开关值,这些开关值不需要大量的数据传输,所以也不需要使用一些现在很臃肿的传输协议。mqtt的底层协议使用的也是tcp协议。总结来说mqtt是一种适合于物联网使用场景的一个轻量级传输协议。
MQTT是基于一种CS架构,就是说有客户端(client)和服务端(server)组成。在真实的案例中客户端有灯泡、手机,服务端就是后台服务器。在使用场景一下用户想通过手机app控制家里的灯泡开关,在mqtt下需要进行下面的流程。首先手机app发起一个指令发送到后台服务器,后台服务器将这个控制指令发送到用户家的灯泡,然后实现灯泡的开或者关。
在上面的图片我们可以看到有发布方(Publisher)、订阅方(Subscriber)、服务端(Brober)其中我们已经很熟悉了服务端为Brober。那什么是订阅方和发布方?让我们想象一个场景我们的灯泡灯灭了灯泡想向服务器发送一个灯泡熄灭的状态,所以灯泡想发送数据,那灯泡就是发布方。我们知道灯泡不只需要发送灯泡状态的数据,还需要接收手机app传递过来的控制指令,所以灯泡也是订阅方。所以在iot设备上灯泡可以是一个发布方也可以是一个订阅方。
一台服务器每天都要接收很多设备的数据,但是服务器是怎么知道传递过来的数据是那个设备发过来的?然后需要转给谁?这时候就需要引出来一个概念了,那就是主题(Topic),我们知道设备可以是发布方也可以是订阅方。那么设备在那里订阅和发布?那就是在主题上订阅和发布。比如灯泡名字叫Dev1的灯泡在一个主题为“iot/dev1/user/event”上发布灯泡的状态,一个设备Dev2订阅这个主题。灯泡Dev1往主题“iot/dev1/user/event”上发布消息,Brober接收到消息后会转发给订阅这个主题的设备Dev2,如果这时候设备Dev2如果不在线那么Brober会保存这个消息在队列中,当设备Dev2上线后Brober会将这个消息发送给设备Dev2。
在我们要进行的实验里,百度智能云在这个实验中的角色就是Brober,我们的硬件设备esp8266开发板当成一个智能灯泡设备,esp8266定时5s上传一次状态到百度云,我们使用MQTT.fx这个客户端模拟手机app发送命令控制灯光的亮和灭。
我们实验现象应该是MQTT.fx每5秒回收到esp8266开发板发送上来的灯泡状态消息。然后我们通过MQTT.fx发送一个命令关闭灯泡,这时候esp8266传递上来的就是灯泡灭的状态。
我们这个实验不无硬件外设连接,我们使用nodeMCU开发板进行实验,如果手机关闭灯泡的消息的时候打印一条语句“printf(“led off \n\r”)”当成灯泡关闭的硬件控制,反之打印一条语句“printf(“led on \n\r”)”当成灯泡打开的硬件控制。
在实验中我们使用IBM的mqtt开源库进行实验,对于使用使用这个开源库主要有如下几个API进行调用。
//为了tcp连接而初始化的结构体 Network network; //描述mqtt client的结构体 MQTTClient client; //初始化tcp连接使用的一些参数 NetworkInit(&network); //初始化mqtt client的结构体一些参数,将network和client绑定起来,这样就可以使用network里面的tcp收发函数进行数据的收发。 MQTTClientInit(&client, &network, 0, NULL, 0, NULL, 0); //建立tcp连接,用来连接tcp服务器 NetworkConnect(&network, CONFIG_MQTT_BROKER, CONFIG_MQTT_PORT); //建立mqtt连接,mqtt连接Brober MQTTConnect(&client, &connectData); //用来订阅一个主题,并注册收到主题消息后的回调函数messageArrived MQTTSubscribe(&client, CONFIG_MQTT_SUB_TOPIC, CONFIG_DEFAULT_MQTT_SUB_QOS, messageArrived)) //用来发布消息,消息结构体为message MQTTPublish(&client, CONFIG_MQTT_PUB_TOPIC, &message)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。