IOT课上实验
交叉编译环境
什么是交叉编译环境?
交叉编译其实是相对于本地编译(native build)来说的,大家最开始学习 C/C++ 这些语言的时候,都是在自己的笔记本上写程序,然后在直接在电脑上编译生成可执行文件,最后在电脑上运行。整个流程为:程序的编辑->编译->运行,整个过程都是在一台 X86 电脑上。
当我们开始接触嵌入式开发后,事情变的不一样了。你在电脑上写程序,在电脑上编译出可执行文件,最后这个可执行文件需要下载到你的开发板上运行。程序最后运行的环境变了,比如你的开发板是基于 Arm 的——程序在 X86 上编辑,编译,最终运行在另一个和 X86 完全不同的架构的 Arm 芯片上。
之所以整个流程变成了这个样子,这是由嵌入式系统的特性决定的:一般嵌入式系统里面使用的芯片性能都比较弱,而且绝大部分都不能像 X86 一样运行 Windows/Ubuntu 桌面系统,即使能运行,性能也很弱,在开发板上很难提供写代码、编译代码的环境。所以我们还是离不开 X86 电脑强大高效的桌面环境进行软件开发。
总结: 在性能强大的个人电脑上编写源码和编译程序,将可执行文件运行在开发板上。
搭建交叉编译环境
操作系统强烈推荐使用 ubuntu-12.04 以上版本的 64 位发行版, windows上不行
-
预安装:在安装交叉编译工具之前需要先安装 32 位的兼容库和 libncurses5-dev 库,安装兼容库 需要从 ubuntu 的源库中下载。如果主机没有安装 32 位兼容库,在使用交叉编译工具的时候可能会出现错误:
-bash: ./arm-fsl-linux-gnueabi-gcc: 没有那个文件或目录
因此需要先sudo apt-get install ia32-libs
安装32位兼容库,然后sudo apt-get install libncurses5-dev
安装 libncurses5-dev,如果没有安装libncurses5-dev
,在使用 make menucofig 时会如所示的错误'make menuconfig' requires the ncurses libraries
-
安装交叉编译工具链:需要 root 权限。在终端执行命令:
$ sudo tar –zxvf gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz -C /opt/
, 交叉编译工具链将会被安装到/opt/ gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12
目录下(注意解压时-C为改变解压目录,指定为 /opt/ 目录),交叉编译器的具体目录是/opt/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/bin
。 -
为了方便使用,还需将交叉编译器路径添加到系统路径中:修改~/.bashrc 文件,在 PATH 变量中增加交叉编译工具链的 安装路径,然后运行~/.bashrc 文件,使设置生效。在~/.bashrc 文件末尾增加一行:
export PATH=$PATH:/opt/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/
-
查看是否安装成功:在终端输入
arm-fsl-linux-gnueabi-
并按 TAB 键,如果能够看到很多 arm-fsl-linux-gnueabi前缀的命令,则基本可以确定交叉编译器安装正确。
注:从ubuntu 13.10已经废弃了ia32-libs,因此如果在Ubuntu16.04的机子上安装,会出现如下报错:
1 | mrli@welcome:~/iot$ sudo apt-get install ia32-libs |
编译代码
由于一直报错:/home /mrli/iot/gcc-46.2-glibc-213-linaro-multillb-201112/fsl-linaro-toolchain/bin/。/lib/gcc/arm-fsl-linux-gnueabi/4.6.2/。.//。/arm-fsl-linux-gnueabi/bin/ld:warning:libcrypto so 1.1, needed by ./lib/libcurl. so, not found(try using -rpath or -rpath-link)
, 原因是LIB后没有带编译链接选项-lcurl, -lcrypto, -lssl
MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT协议实现方式
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
- (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
- (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
mosquitto使用
库函数API介绍:mosquitto库函数详解
1 |
MQTT设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同层次QoS(Quality of Service):
- QoS0,At most once,至多一次;
- QoS1,At least once,至少一次;
- QoS2,Exactly once,确保只有一次。
客户端可以主动选择性地往某一主题推送信息,这个不需要提前设定;但在接收信息方面,需要客户端提前订阅主题,注:客户端同时可以订阅多个主题,且MQTT协议的主题解析有规则,规则如下:
Springboot_MQTT:
- https://blog.csdn.net/yl_hahha/article/details/99246679
- https://blog.csdn.net/qq_41018959/article/details/81076055?utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.no_search_link
pthread库使用
库函数API介绍:线程以及pthread库的使用
Author: Mrli
Link: https://nymrli.top/2021/09/27/物联网基础与应用-课程笔记/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.