Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

物联网基础与应用-课程笔记

2021/10/11 ZJU 嵌入式开发
Word count: 1,577 | Reading time: 6min

IOT课上实验

交叉编译环境

什么是交叉编译环境?

交叉编译其实是相对于本地编译(native build)来说的,大家最开始学习 C/C++ 这些语言的时候,都是在自己的笔记本上写程序,然后在直接在电脑上编译生成可执行文件,最后在电脑上运行。整个流程为:程序的编辑->编译->运行,整个过程都是在一台 X86 电脑上。

当我们开始接触嵌入式开发后,事情变的不一样了。你在电脑上写程序,在电脑上编译出可执行文件,最后这个可执行文件需要下载到你的开发板上运行。程序最后运行的环境变了,比如你的开发板是基于 Arm 的——程序在 X86 上编辑,编译,最终运行在另一个和 X86 完全不同的架构的 Arm 芯片上。

之所以整个流程变成了这个样子,这是由嵌入式系统的特性决定的:一般嵌入式系统里面使用的芯片性能都比较弱,而且绝大部分都不能像 X86 一样运行 Windows/Ubuntu 桌面系统,即使能运行,性能也很弱,在开发板上很难提供写代码、编译代码的环境。所以我们还是离不开 X86 电脑强大高效的桌面环境进行软件开发。

总结: 在性能强大的个人电脑上编写源码和编译程序,将可执行文件运行在开发板上。

emb

搭建交叉编译环境

操作系统强烈推荐使用 ubuntu-12.04 以上版本的 64 位发行版, windows上不行

  1. 预安装:在安装交叉编译工具之前需要先安装 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

  2. 安装交叉编译工具链:需要 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

  3. 为了方便使用,还需将交叉编译器路径添加到系统路径中:修改~/.bashrc 文件,在 PATH 变量中增加交叉编译工具链的 安装路径,然后运行~/.bashrc 文件,使设置生效。在~/.bashrc 文件末尾增加一行: export PATH=$PATH:/opt/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/

  4. 查看是否安装成功:在终端输入 arm-fsl-linux-gnueabi-并按 TAB 键,如果能够看到很多 arm-fsl-linux-gnueabi前缀的命令,则基本可以确定交叉编译器安装正确。

注:从ubuntu 13.10已经废弃了ia32-libs,因此如果在Ubuntu16.04的机子上安装,会出现如下报错:

1
2
3
4
5
6
7
8
9
10
11
12
mrli@welcome:~/iot$ sudo apt-get install ia32-libs
sudo: unable to resolve host welcome
[sudo] password for mrli:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package ia32-libs is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
lib32ncurses5 lib32z1
E: Package 'ia32-libs' has no installation candidate

编译代码

由于一直报错:/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,可以理解为消息的内容,是指订阅者具体要使用的内容。

MQTT入门介绍——菜鸟教程

mosquitto使用

库函数API介绍:mosquitto库函数详解

1
2


MQTT设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同层次QoS(Quality of Service):

  • QoS0,At most once,至多一次;
  • QoS1,At least once,至少一次;
  • QoS2,Exactly once,确保只有一次。

客户端可以主动选择性地往某一主题推送信息,这个不需要提前设定;但在接收信息方面,需要客户端提前订阅主题,注:客户端同时可以订阅多个主题,且MQTT协议的主题解析有规则,规则如下:

Springboot_MQTT:

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.

< PreviousPost
Makefile使用记录
NextPost >
学点Gradle
CATALOG
  1. 1. IOT课上实验
    1. 1.1. 交叉编译环境
      1. 1.1.1. 什么是交叉编译环境?
      2. 1.1.2. 搭建交叉编译环境
    2. 1.2. 编译代码
    3. 1.3. MQTT
      1. 1.3.1. mosquitto使用
    4. 1.4. pthread库使用