0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于MQTT协议设计的实时图传系统(阿里云物联网平台)

DS小龙哥-嵌入式技术 ? 来源:DS小龙哥-嵌入式技术 ? 作者:DS小龙哥-嵌入式技 ? 2023-04-27 09:16 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、项目功能介绍

当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B负责接收设备A上传的数据然后解析显示出来。在阿里云服务器上需要配置云产品流转,让设备A的数据上传后自动发送给设备B。这样就完成了视频画面数据的流转。不过因为阿里云的最大数据限制,每次最大发送10240字节的数据。

当前的项目是采用MQTT协议实现,那么先来了解一下什么是MQTT协议。

软件采用Qt设计,QT版本是5.12.6

设备A的功能:获取摄像头的数据---》缩放成240*320---》编码成JPEG格式---》转码成base64---》组合成MQTT报文---》上传到服务器。

设备B的功能:订阅设备A上传的数据,得到数据后解析出源格式数据---》将图像画面渲染显示出来。

软件运行效果:

image-20230306174129599

总结软件运行的体验效果:

(1) 非常流畅。两个窗口肉眼感觉不到延迟。

(2)服务器不要钱。

这个方案验证之后,可以衍生出很多实际的例子了: 比如, 单片机+摄像头+MQTT协议 也可以做为图传发送端。 联网可以使用:WIFI或者4G模块5G模块。

1.1 MQTT协议

MQTT (Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅的消息传输协议,它可以在客户端和服务器之间进行双向通信。MQTT被设计为适用于低带宽、不稳定网络连接的物联网设备通信。

MQTT具有以下主要特点:

(1)发布/订阅模型:客户端可以选择订阅一个或多个主题(topic),并接收与这些主题相关的消息;同时,客户端也可以发布消息到一个或多个主题上。

(2)轻量级:MQTT的协议头非常小,最小只有2字节,这使得它非常适合于传输数据量较小的IoT设备。

(3)QoS(服务质量)支持:MQTT支持三种不同的QoS级别,分别是“至多一次”、“至少一次”和“恰好一次”,可以根据应用场景的需要进行选择。

(4)保留消息:MQTT服务器可以将最新的消息保留在主题中,并让新的订阅者能够读取先前发布的消息。

(5)遗嘱消息:当客户端与服务器连接异常断开时,服务器可以向其他订阅了该主题的客户端发送遗嘱消息,以实现更可靠的消息传输。

总之,MQTT是一种非常适合物联网设备通信的协议,它具有轻量级、灵活性高、易于实现、可靠性强等优点,已经被广泛地应用于各种物联网场景中。

1.2 MQTT协议载体

MQTT协议是基于TCP协议传输报文的。MQTT使用TCP/IP协议栈来实现通信,因此它具有TCP协议的一些特性,如可靠性、流控制和建立持久连接等特点。

在MQTT连接建立时,客户端需要通过TCP连接到MQTT服务器,并进行握手协商,包括协议版本、客户端标识符、遗嘱消息、QoS级别等信息,以确保双方能够正确地交换数据。一旦握手成功,客户端和服务器之间就建立了一个持久化的TCP连接,可以随时进行消息传输。

由于TCP协议本身已经提供了一定程度的可靠性保证,因此MQTT协议只需要在TCP的基础上实现发布/订阅机制、QoS级别控制、保留消息等特性即可,从而使得它成为一种轻量级且高效的物联网通信协议。

1.3 JSON里如何保存图片数据?

在JSON中保存图片数据通常需要将图片转换为二进制数据,并将其编码成Base64字符串,然后将该字符串作为JSON对象的属性值进行传输。

Base64编码是一种将二进制数据转换为ASCII字符的方法,它使用64个字符来表示任意序列的二进制数据。Base64编码后的数据长度会比原始二进制数据略长,但可以方便地被转换为文本格式并在网络上进行传输。

以下是一个示例JSON对象,其中包含了一个Base64编码后的图片数据:

{
  "imageData": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBD...",
  "imageName": "my_image.png"
}

在这个示例中,imageData属性表示图片数据的Base64编码字符串,imageName属性表示图片文件名。在接收到JSON对象后,可以通过解码Base64字符串并将其保存为二进制数据,再将其写入磁盘或者显示在应用程序中。

需要注意的是,由于Base64编码后的数据量相对较大,因此在实际应用中,如果需要传输大量的图片数据,建议使用其他更适合的数据传输方式,如MQTT协议、WebSocket等。

1.4 MQTT协议最大能传多少有效字节的数据?

MQTT协议本身没有限制数据包的大小,但是它需要遵循底层传输协议(TCP/IP)的限制和约束。在实际应用中,MQTT协议能够传输的有效数据量是受多种因素影响的,如网络带宽、QoS级别、MQTT消息头部信息等。

一般来说,在默认情况下,MQTT协议对于单个消息的有效载荷有一个限制,即不超过256MB。这个限制主要由MQTT协议的消息长度字段决定,该字段的最大值是4字节,因此最大能表示2^32-1个字节的消息长度,即约为4GB。然而,在实际应用中,由于网络带宽和设备性能等方面的限制,很难实现传输如此巨大的消息。

另外,需要注意的是,如果使用较高级别的QoS,如“至少一次”或“恰好一次”,则MQTT协议会对每条消息进行确认和重传,这可能会导致更多的网络流量和延迟。因此,在选择QoS级别时,需要根据应用场景和网络环境的实际情况进行优化和调整,以充分利用MQTT协议的特点和优势。

三、阿里云服务器创建

官网地址: https://iot.console.aliyun.com/lk/summary/new

3.1 创建产品

image-20230306113613895image-20230306113750686

3.2 添加设备

image-20230306113816237image-20230306113833075image-20230306113911268image-20230306114010720
{
 "ProductKey": "a12qAqNZg3i",
 "DeviceName": "video_de1",
 "DeviceSecret": "206a4bc03642930542a9bcb8925b9a0f"
}

创建完成。

image-20230306114032472

3.3 创建自定义属性

在产品页面的,找到功能定义。

image-20230306114136047image-20230306114207135

最大一次只能传递10KB。

image-20230306114342884image-20230306114406663image-20230306114443212image-20230306114459123

3.4 MQTT服务器地址和端口

关于MQTT协议登录所需要的参数官方说明文档: https://help.aliyun.com/document_detail/140507.html?spm=a2c4g.11186623.6.571.1e417544OGPj2y

阿里云物联网服务器的域名规则如下:

物联网平台的域名格式为:productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com,其中productKey是您在物联网平台上创建的产品的标识符,cn-shanghai表示物联网服务器所在的地区。
?
MQTT协议的域名格式为:productKey.iot-as-mqtt.cn-shanghai.aliyuncs.com,其中productKey是您在物联网平台上创建的产品的标识符,cn-shanghai表示物联网服务器所在的地区。
?
HTTPS协议的域名格式为:productKey.iot-as-http.cn-shanghai.aliyuncs.com,其中productKey是您在物联网平台上创建的产品的标识符,cn-shanghai表示物联网服务器所在的地区。
?
需要注意的是,以上的域名规则中,productKey需要替换成你在物联网平台上创建产品时生成的实际productKey。
下面是阿里云国内的服务器地域和可用区详情:
 
地域名称    所在城市    Region ID   可用区数量
华北 1    青岛  cn-qingdao    2
华北 2    北京  cn-beijing    10
华北 3    张家口 cn-zhangjiakou  3
华北 5    呼和浩特    cn-huhehaote    2
华北 6    乌兰察布    cn-wulanchabu   3
华东 1    杭州  cn-hangzhou   8
华东 2    上海  cn-shanghai     8
华南 1    深圳  cn-shenzhen    6
华南 2    河源  cn-heyuan     2
华南 3    广州  cn-guangzhou    2
西南 1    成都  cn-chengdu    2
?
端口号是:1883
?
我的设备参数:
{
 "ProductKey": "a12qAqNZg3i",
 "DeviceName": "video_de1",
 "DeviceSecret": "206a4bc03642930542a9bcb8925b9a0f"
} 
?
  
经过上面的格式解释,我的阿里云服务器登录的域名就是(选择的是上海服务器):
a12qAqNZg3i.iot-as-mqtt.cn-shanghai.aliyuncs.com
?
image-20230306114927615

解析域名对应的IP地址:

image-20230306122242242
Microsoft Windows [版本 10.0.19044.2604]
(c) Microsoft Corporation。保留所有权利。
?
C:Users11266>ping a12qAqNZg3i.iot-as-mqtt.cn-shanghai.aliyuncs.com
?
正在 Ping vpc-sh-prod.mqtt.iotgds.aliyuncs.com.gds.alibabadns.com [47.103.191.238] 具有 32 字节的数据:
来自 47.103.191.238 的回复: 字节=32 时间=40ms TTL=88
来自 47.103.191.238 的回复: 字节=32 时间=40ms TTL=88
来自 47.103.191.238 的回复: 字节=32 时间=40ms TTL=88
来自 47.103.191.238 的回复: 字节=32 时间=40ms TTL=88
?
47.103.191.238 的 Ping 统计信息:
  数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
  最短 = 40ms,最长 = 40ms,平均 = 40ms
?
C:Users11266>

3.5 MQTT三元组格式

下载密码生成小工具:https://help.aliyun.com/document_detail/292635.htm?spm=a2c4g.11186623.0.0.5aaf635b3zgveM#section-jx3-u57-pmm

image-20230306122624092

打开密码生成工具:

image-20230306130203946

生成MQTT登录的密匙: 填入的参数就是前面创建设备得到信息。

image-20230306130404897
mqttClientId: 
video_de1|securemode=2,signmethod=hmacsha1,timestamp=1678078910527|
?
username: 
video_de1&a12qAqNZg3i
?
password: 
02F7190BE8C33C1A8009EDBAF824BFDC6784FC67
?

3.6 主题发布与订阅的格式

在产品页面可以看到主题格式: https://iot.console.aliyun.com/product/productDetail/a1cMlEwEwjg/func?current=2

image-20230306130758247

总结:

发布主题:
/sys/a12qAqNZg3i/video_de1/thing/event/property/post
上报属性消息的格式: 
{"method":"thing.event.property.post","params":{"image":"1234567890"}}
?
订阅主题:
/sys/a12qAqNZg3i/video_de1/thing/service/property/set

3.7 MQTT设备登录

利用MQTT客户端完成设备登录测试。

IP地址:47.103.191.238
?
端口号:1883
?
mqttClientId: video_de1|securemode=2,signmethod=hmacsha1,timestamp=1678078910527|
?
username: video_de1&a12qAqNZg3i
?
password: 02F7190BE8C33C1A8009EDBAF824BFDC6784FC67
?
?
发布主题:
/sys/a12qAqNZg3i/video_de1/thing/event/property/post
上报属性消息的格式: 
{"method":"thing.event.property.post","params":{"image":"1234567890"}}
?
订阅主题:
/sys/a12qAqNZg3i/video_de1/thing/service/property/set

对号入座填入参数,测试主题订阅,主题发布:

image-20230306131329613

数据接收成功:

image-20230306131432858

到此服务器创建成功。

3.8 继续创建设备2

监控设备有两个,1个设备为摄像头图片发送端,一个设备是图片接收显示端。

image-20230306131839215image-20230306132047490image-20230306132104624
{
  "ProductKey": "a12qAqNZg3i",
  "DeviceName": "video_dev2",
  "DeviceSecret": "30ebb8ffc4316fbe957fcfb13bdaec01"
}

创建成功。

image-20230306132134761

接下来生成设备2的MQTT三元组密匙,和前面一样的方法。

image-20230306132253055
mqttClientId: 
video_dev2|securemode=2,signmethod=hmacsha1,timestamp=1678078910527|

username: 
video_dev2&a12qAqNZg3i

password: 
15D2C020586E165E6A35BB2FA4DEB9DD59F3E73E

参数总结:

IP地址:47.103.191.238

端口号:1883

mqttClientId: video_dev2|securemode=2,signmethod=hmacsha1,timestamp=1678078910527|

username:  video_dev2&a12qAqNZg3i

password:  15D2C020586E165E6A35BB2FA4DEB9DD59F3E73E


发布主题:
/sys/a12qAqNZg3i/video_dev2/thing/event/property/post

上报属性消息的格式:  
{"method":"thing.event.property.post","params":{"image":"abcdefg"}}

订阅主题:
/sys/a12qAqNZg3i/video_dev2/thing/service/property/set

四、云产品流转

4.1 创建解析器

image-20230306132830597image-20230306133146823image-20230306133212059image-20230306133249338

创建完成。

image-20230306133516015

4.2 创建规则

image-20230306133538634image-20230306133602219image-20230306133617940

添加主题:

image-20230306134006727

设置数据目的:

image-20230306134049922image-20230306134122524image-20230306134244172image-20230306134257318

编写解析器脚本:

image-20230306135159656

帮助文档地址:https://help.aliyun.com/document_detail/270937.html

image-20230306141216413image-20230306141259610

下面编写代码,获取设备1上传的数据,转发给设备2。

//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
//直接流转物模型上报数据。
writeIotTopic(1000, "/a12qAqNZg3i/video_dev2/user/get", data)
image-20230306143714795

写好解析器就发布。

在云产品流转的首页启动解析器。

image-20230306143415348image-20230306143126331

4.3 测试两个设备的订阅

设备1的参数:

IP地址:47.103.191.238
端口号:1883
mqttClientId:  video_de1|securemode=2,signmethod=hmacsha1,timestamp=1678078910527|
username: video_de1&a12qAqNZg3i
password: 02F7190BE8C33C1A8009EDBAF824BFDC6784FC67

设备1发布主题:
主题格式:/a12qAqNZg3i/video_de1/user/update
数据内容:{"method":"thing.event.property.post","params":{"image":"1234567890"}}

设备2的参数:

IP地址:47.103.191.238
端口号:1883
mqttClientId: video_dev2|securemode=2,signmethod=hmacsha1,timestamp=1678078910527|
username:  video_dev2&a12qAqNZg3i
password:  15D2C020586E165E6A35BB2FA4DEB9DD59F3E73E

设备2订阅主题:
主题格式:/a12qAqNZg3i/video_dev2/user/get
image-20230306144506256

五、项目开发

5.1 base64编码和解码实现

摄像头采集图像数据之后会编码 成base64格式的字符串,再通过MQTT协议上传到物联网服务器。 下面就是base64编码和解码的实现代码。

const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

//进行base64编码
//bindata:进行编码的图片数据
//base64:转换后的base64编码
//binlength:图片大小
char * base64_encode(  u8 * bindata, char * base64, u32 binlength )
{
    u32 i, j;
    u8 current;

    for ( i = 0, j = 0 ; i < binlength ; i += 3 )
    {
        current = (bindata[i] >> 2) ;
        current &= (u8)0x3F;
        base64[j++] = base64char[(int)current];

        current = ( (u8)(bindata[i] << 4 ) ) & ( (u8)0x30 ) ;
        if ( i + 1 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            base64[j++] = '=';
            break;
        }
        current |= ( (u8)(bindata[i+1] >> 4) ) & ( (u8) 0x0F );
        base64[j++] = base64char[(int)current];

        current = ( (u8)(bindata[i+1] << 2) ) & ( (u8)0x3C ) ;
        if ( i + 2 >= binlength )
        {
            base64[j++] = base64char[(int)current];
            base64[j++] = '=';
            break;
        }
        current |= ( (u8)(bindata[i+2] >> 6) ) & ( (u8) 0x03 );
        base64[j++] = base64char[(int)current];

        current = ( (u8)bindata[i+2] ) & ( (u8)0x3F ) ;
        base64[j++] = base64char[(int)current];
    }
    base64[j] = '?';
    return base64;
}

//解码base64
//base64:base64编码
//bindata:图片数据
int base64_decode( const char * base64, u8 * bindata )
{
    u32 i, j;
    u8 k;
    u8 temp[4];
    for ( i = 0, j = 0; base64[i] != '?' ; i += 4 )
    {
        memset( temp, 0xFF, sizeof(temp) );
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i] )
                temp[0]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+1] )
                temp[1]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+2] )
                temp[2]= k;
        }
        for ( k = 0 ; k < 64 ; k ++ )
        {
            if ( base64char[k] == base64[i+3] )
                temp[3]= k;
        }

        bindata[j++] = ((u8)(((u8)(temp[0] << 2))&0xFC)) |
                ((u8)((u8)(temp[1]>>4)&0x03));
        if ( base64[i+2] == '=' )
            break;

        bindata[j++] = ((u8)(((u8)(temp[1] << 4))&0xF0)) |
                ((u8)((u8)(temp[2]>>2)&0x0F));
        if ( base64[i+3] == '=' )
            break;

        bindata[j++] = ((u8)(((u8)(temp[2] << 6))&0xF0)) |
                ((u8)(temp[3]&0x3F));
    }
    return j;
}

5.3 软件设计

image-20230306173701272

5.4 运行效果

image-20230306173632696image-20230306174123211


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2933

    文章

    46463

    浏览量

    395598
  • 服务器
    +关注

    关注

    13

    文章

    9859

    浏览量

    88424
  • 摄像头
    +关注

    关注

    61

    文章

    4999

    浏览量

    99132
  • 阿里云
    +关注

    关注

    3

    文章

    1017

    浏览量

    44402
  • MQTT
    +关注

    关注

    5

    文章

    697

    浏览量

    23857
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    联网工程师为什么要学Linux?

    联网工程师需要掌握Linux的主要原因可以从技术生态、开发需求、行业应用及就业竞争力四个角度来分析: 一、技术生态与行业适配性 1)嵌入式开发的主流平台
    发表于 05-26 10:32

    MQTT为何成为联网协议

    MQTT(Message Queuing Telemetry Transport)即消息队列遥测传输协议,已成为联网领域广泛应用的协议,这
    的头像 发表于 05-20 09:54 ?260次阅读

    工业智能网关与MQTT联网平台的关系

    工业智能网关与 MQTT 联网平台联网架构中
    的头像 发表于 03-21 09:44 ?484次阅读

    《DNESP32S3使用指南-IDF版_V1.6》第五十五章 基于MQTT协议连接阿里服务器

    进行相应的修改。55.4 下载验证程序下载成功后,打开阿里平台联网平台设备管理,可以看到此
    发表于 03-18 09:22

    MQTT联网平台有哪些?有哪些功能?

    (IoT)。关于MQTT联网平台及其功能,可以归纳如下: MQTT
    的头像 发表于 03-15 14:23 ?905次阅读
    <b class='flag-5'>MQTT</b><b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>平台</b>有哪些?有哪些功能?

    工业智能网关通过MQTT协议对接工业联网平台

    、传感器、工业机器人、数控机床等设备。不仅具备数据采集与协议解析能力,还支持5G/4G/WIFI/以太网等联网方式。此外,支持通过MQTT+ JSON报文对接到通博联
    的头像 发表于 02-26 17:07 ?601次阅读
    工业智能网关通过<b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>对接工业<b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>云</b><b class='flag-5'>平台</b>

    基于MQTT协议的车通信设计

    Queuing Telemetry Transport)是由OASIS发布的应用层协议,采用订阅/发布的通信模式,下层基于TCP/IP进行传输。该标准在工业联网、车联网等领域有广泛
    的头像 发表于 01-08 10:24 ?1162次阅读
    基于<b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>的车<b class='flag-5'>云</b>通信设计

    Tuya联网平台阿里版:助力客户打造融合开放的专属平台

    在2024年9月的云栖大会上,涂鸦智能与阿里联合发布了Tuya联网平台阿里
    的头像 发表于 01-03 17:32 ?927次阅读
    Tuya<b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>平台</b><b class='flag-5'>阿里</b><b class='flag-5'>云</b>版:助力客户打造融合开放的专属<b class='flag-5'>物</b>联<b class='flag-5'>平台</b>

    esp8266连接阿里平台mqtt连接超时

    esp8266nodemcu在使用arduino.ide连接阿里平台的时候,wifi配置正常但连接不上mqtt,显示报错如下: Attempting
    发表于 10-26 21:39

    MQTT网关接入工业联网平台解析

    MQTT网关 能够连接不同类型的工业联设备,实现设备之间的数据传输和控制。它不仅能够将来自不同设备的多种通信协议(如Modbus、PLC、数控机床等)统一转换为MQTT格式,便于与
    的头像 发表于 10-16 16:31 ?766次阅读

    MQTT调试助手中文版(联网开发必备)

    MQTT调试助手中文版(联网开发必备)。?支持模拟设备链接各种MQTT服务器、 ?阿里
    发表于 10-12 14:23 ?9次下载

    MQTT联网平台有什么功能

    关键作用。MQTT联网平台基于MQTT协议,为
    的头像 发表于 10-09 14:15 ?785次阅读

    使用API Post测试阿里联网平台动态注册

    使用API Post测试阿里联网平台动态注册
    的头像 发表于 10-05 19:08 ?935次阅读
    使用API Post测试<b class='flag-5'>阿里</b><b class='flag-5'>云</b><b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>平台</b>动态注册

    联网行业中MQTT通信协议详解以及使用

    联网、小型设备、移动应用等方面有较广泛的应用。 二 MQTT协议特点 MQTT是一个基于 客户端-服务器 的消息发布/订阅传输
    的头像 发表于 09-20 17:08 ?2808次阅读
    <b class='flag-5'>物</b><b class='flag-5'>联网</b>行业中<b class='flag-5'>MQTT</b>通信<b class='flag-5'>协议</b>详解以及使用

    MQTT联网平台和网关有什么功能

    联网(IoT)迅速发展的今天,MQTT(Message Queuing Telemetry Transport)作为一种轻量级的通信协议,以其高效、可靠的特点,在
    的头像 发表于 08-22 14:19 ?755次阅读