当前位置:   article > 正文

物联网小项目智能家居(QT、MQTT、嵌入式开发板、Ubuntu)

物联网小项目

项目框架:

概述:搭建一个物联网的实战小项目,为本阶段的学习做了一次总结及记录。把构建的整个过程分享出来给大家,项目难点在于各种环境的搭建,而代码逻辑并不难。 在这里插入图片描述

说明:

(1)本项目总共涉及到了4个MQTT客户端以及1个MQTT服务器;
(2)其中,需要我们实现的是2个客户端:家(开发板)和APP_1(Ubuntu),其他客户端都是现成的;
(3)服务器是直接使用现成的(对于我们初学者而言不需要去关心别的,我们只会用到服务器的地址+端口);
(4)客户端的安卓端也是直接下载现成的(因为作者没有学过安卓或者IOS的开发),此部分即使是不做也不会对项目效果造成影响。

项目步骤:

1 客户端-MQTTX下载以及MQTT的协议测试

(1) 现在MQTTX(MQTT客户端)
MQTTX的下载官网 https://mqttx.app/zh
我是在Windows下运行的这个客户端(读者可以根据需要选择Linux下,这个没有任何关系)
在这里插入图片描述
(2) 下载完成后,按照步骤,输入必填的4项即可,其中“名称”随便写,“Clien ID”也随便写,但是要保证不能重复,我是直接使用随机的生成的,服务器和端口号我是直接使用这个APP的默认地址和端口,也可以使用别的服务器(例如:test.ranye-iot.net 1883)。至于,其他的项,暂时不用过多关心。
在这里插入图片描述 (3)点击连接,如果连接没成功,是无法进入下一步的。
在这里插入图片描述(4)订阅主题,选择QoS等级(根据自身需求选择,作者使用Qos1)。
在这里插入图片描述
(5)消息的订阅和发布
在这里插入图片描述
至此为止,我们已经测通了服务器能用,以及MQTTX(后续用于调试使用)能用。

2 Ubuntu的环境搭建

(作者所使用的开发板是韦东山老师的IMX6ULL PRO)
概述:QT的环境搭建、MQTT的环境搭建、Ubuntu可以连公网。
Ubuntu内QT的环境搭建以及MQTT的环境搭建,网上的方法比较多,只需在百度上搜索即可找到大量的教程,作者也是参考了比较多的文章。
Ubuntu的联网我是参考韦老师的文章搭建的,大家如果没有韦老师手册的话,可以直接在CSDN搜索韦老师的账号。

3 开发板的环境搭建(交叉编译)

这边的所谓开发板的环境搭建实际上就是在Ubuntu上面把库都使用交叉编译工具链编译好,然后打包到开发板上面。
我们同样需要在开发板上面完成QT、MQTT的搭建,以及确保可以开发板联网。
QT在开发板上面如何使用,网上也有很多文章介绍的,我使用的是正点原子的方案,大家可以直接参考正点原子的手册《05【正点原子】I.MX6U出厂系统Qt交叉编译环境搭建V1.6》,里面介绍了一个常用的开发方案,也就是,你在Ubuntu里面使用QT Create编写代码,点击运行后,可以直接远程控制开发板实现代码效果,然后等你感觉代码没有问题了,在拷贝到开发板上面即可。
MQTT在开发板上面使用的方法同样也有很多,我在这边推荐一篇文章。
https://itcn.blog/p/2243502540.html
文章里面介绍了MQTT如何在Ubuntu、IMX6ULL板子上面运行。
作者也是根据这边文章操作的,需要注意的是,如果读者在最后运行(可执行文件)的时候,如果看到提示说格式错误时,那就说明得到的可执行文件或者.so库的格式有问题,此时读者要使用linux的“file file_name”命令去查看文件的格式是否有问题。如果程序是放在开发板上面运行的,那么格式就不能是x86或者x64的(对于ARM开发板而言),那么此时你就需要好好检查交叉编译的设置有没有问题了。
下图是file命令的一个示例:
在这里插入图片描述

4 Ubuntu的QT上位机编写

至此,我已经默认你搭建好了所有的开发环境。下面开始编写QT的Ubuntu上位机。
我会把源码公布出来(很简单的),下面介绍功能。下图为界面1。
输入用户名密码,在代码中暂时用字符串代替,
用户名:usetest;密码:123456在这里插入图片描述
成功后,会进入如下界面,我用红色框框起来的是表示目前已经实现的部分,界面做的比较简单,目的在于先把功能实现,(注:发布消息那边的QoS等级我默认为1,没有在界面中体现出来)。下图为界面2。在这里插入图片描述
订阅主题那一块我设置了一些宏,来定义我默许的主题,也就是说目前是只能支持下列主题。在这里插入图片描述
实际应用时,读者可以定义一些缓存区来专门存放这些主题。像我这样写勉强还能用,但是我们订阅了那么多主题,我们必须要把每次的消息都要不遗漏的处理掉,而不能被覆盖。
那么这时候一个重要的数据结构队列就派上了用场。

环形缓存区(环形队列):这个数据结构个人认为会比链表实现更加简单,网上也有大量的实现方法,作者这边做最简单的讲解。
队列的简单实现:(静态型)
(1)定义全局read、write变量,(读者可以理解为)用于访问数组;
(2)定义一个缓存区,可以是普通的数据、也可以是结构体数组(常用),在这里插入图片描述其中REV_LEN是数组长度,我设为51,实际长度为50(会预留一个空位,是用于判断队列是否为满的必要条件);
(3)接下来,有数据来了,我们就操作消息入队;
在这里插入图片描述为什么写指针需要自增后取余呢?这正是环形队列之所以叫环形的灵魂所在,因为达到最大值后,他就跳回下标为0的地方重新开始(但是用户不用去关心数据到底要从数组的哪个索引处写入,十分巧妙!!)。
实际上,队列还可以判断目前有效数据的个数,但是本文并不关心。
(4)获取数据方(需要得到这个数据的一方),去异步的获取队列的数据; 在这里插入图片描述
读指针的自增取余的原理和写指针一样。
如此简短(不到20行的)的代码,在整个软件领域的应用十分大,它的写法很多,但是原理都一样,它可以很好的解决数据读取方和数据接收方时间不同步的问题。
例如:试着想象一下,我们在键盘上面一次性输入很多的字符,无论你的手速有多快,这个按键的处理速度有多慢(实际上是很快的),但是计算机都会一一去处理,而不会丢失任意一次按下的按键值(除非电脑死机),这就是利用到了这个原理。
下图为界面3。点击了开关灯或者是开关窗帘,实际上会向灯或窗帘这个主题发布一条消息,那么订阅了这些主题的其他客户端就会收到这条消息。在这里插入图片描述

5 开发板的QT上位机编写:

到这里,作者已经迫不及待的要去验证开发板了,所以就随便写了1个窗口 在这里插入图片描述
我们可以看到实际的运行效果,当我们在上位机上面按下开关灯或者是开关窗帘后,开发板上面就会打印相关的信息,如果读者不用QT,也可以使用串口打印。

代码我会传到git,后面发出来。
本文是作者的一个项目记录,比较粗糙。
有什么问题也可以提出来,大家讨论。

=======================================
第一次添加:ubuntu上面编写的qt APP源码。git clone https://gitee.com/guo-jinpeng-666/smart-home.git

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/725027
推荐阅读
相关标签
  

闽ICP备14008679号