监控系统4 - LVGL | sqlite3 | mqtt

目录

一、LVGL

[1. 图形设计生成的代码解析](#1. 图形设计生成的代码解析)

[2. 结合mylvgl](#2. 结合mylvgl)

[1. 拼接显示内容](#1. 拼接显示内容)

[2. 设置定时器](#2. 设置定时器)

[3. 主函数与线程](#3. 主函数与线程)

[3. Makefile](#3. Makefile)

二、gdb调试

[1. gdb移植](#1. gdb移植)

[2. gdb命令](#2. gdb命令)

[3. 一般调试运行](#3. 一般调试运行)

[4. PC端与arm端结合调试](#4. PC端与arm端结合调试)

[1. arm端](#1. arm端)

[2. PC端](#2. PC端)

三、sqlite移植

[1. 解压文件](#1. 解压文件)

[2. 生成makefile](#2. 生成makefile)

[1. 新建文件夹](#1. 新建文件夹)

[2. 指定Makefile生成路径](#2. 指定Makefile生成路径)

[3. 执行configure生成makefile](#3. 执行configure生成makefile)

[3. 设置Makefile](#3. 设置Makefile)

[1. Makefile](#1. Makefile)

[2. 编译](#2. 编译)

[3. 放置文件](#3. 放置文件)

[4. 转移文件](#4. 转移文件)

[1. 放置bin文件](#1. 放置bin文件)

[2. 放置库文件](#2. 放置库文件)

[5. 测试](#5. 测试)

[1. 测试代码](#1. 测试代码)

[2. Makefile](#2. Makefile)

[3. 编译](#3. 编译)

[4. 转移生成文件](#4. 转移生成文件)

[5. 板子内测时](#5. 板子内测时)

四、mqtt

[1. 概念](#1. 概念)

[2. 特点](#2. 特点)

[3. 工作原理](#3. 工作原理)

[1. 定义](#1. 定义)

[2. 组成](#2. 组成)

[3. 流程](#3. 流程)

​编辑

[4. 报文组成](#4. 报文组成)

[5. 心跳包](#5. 心跳包)

[1. 概念](#1. 概念)

[2. 原理](#2. 原理)

[3. 实现方式](#3. 实现方式)

[1. 应用层实现​](#1. 应用层实现)

[2. 传输层实现​](#2. 传输层实现)

[6. 操作命令](#6. 操作命令)

[7. OneNet](#7. OneNet)

[1. 创建产品](#1. 创建产品)

[2. 添加物模型](#2. 添加物模型)

[3. 添加设备](#3. 添加设备)

五、补充

[1. 屏幕熄灭屏设置](#1. 屏幕熄灭屏设置)

[2. 编译器阻塞](#2. 编译器阻塞)

[3. 只读问题](#3. 只读问题)

[1. 修改PC端配置](#1. 修改PC端配置)

[2. 修改arm端配置](#2. 修改arm端配置)


一、LVGL

1. 图形设计生成的代码解析

图表数据部分:

生成一个定时器,通过定时器原理经过一段时间后触发事件

2. 结合mylvgl

通过线程显示动态数据

一个线程负责​​数据生成/采集​​,另一个线程负责​​图形渲染和显示​​

两者通过​​线程间通信​​(如共享内存、消息队列)传递数据
图形之间不可跨线程操作,使用回调函数调用timer_call操作

1. 拼接显示内容

参数名himi+随机值count

添加出错处理防止段错误

2. 设置定时器

经过1000ms时间执行 timer_call 函数,实现参数周期变化

3. 主函数与线程

线程1实现初始化屏幕并执行显示函数

线程2实现传递显示的随机值

图形之间不可跨线程操作

3. Makefile

添加允许编译pthread函数 -lpthread

编译执行实现表格内参数动态变化

二、gdb调试

1. gdb移植

  1. echo $PATH查看地址
  1. 将gdbsercer向根文件目录复制移植到板子上
  1. 然后PC端可使用arm-linux-gnueabihf-gbd调用

2. gdb命令

|---------|----------|--------------------------------|
| 指令 | 释义 | 执行 |
| r | run | 直接运行代码 |
| bt | where | 显式调用栈 |
| b | break | 设置断点 |
| n | next | 运行下一步,步过,运行主函数 |
| s | setp | 运行下一步,步入,有函数时进入函数内部(自定义函数) |
| p | print | 显示变量和指针 |
| display | print | 一直显示变量 |
| c | continue | 跳出循环 |
| return || 返回调用处 |

b 170 main.c 在main.c函数中第170设置断点

b myfun 在整个工程中的 myfun 函数开始的地方设置断点

display a 一直显示变量 a

set print elements 300 设置显示字符串长度

info breakpoints 查看有几个断点

delete 1 关闭断点

3. 一般调试运行

  1. gcc -g -lpthread 1.c

编辑Makefile添加 -g 选项使允许 gdb 调试

  1. gdb a.out

开始gdb调试生成后的 .c 文件

  1. b fun.c :36

设置断点,使运行到这个位置,程序暂停

  1. r

运行整个代码开始调试

  1. n

单步执行下一步

  1. p

使用 p 命令查看变量或指针等数据

4. PC端与arm端结合调试

1. arm端

gdbserver :2000 ./a.out

指定空闲端口2000,或者写成192.168.1.100:2000

表示允许192.168.1.100:2000 设备的ip,port 进行连接,任意主机都可以链接进来。

2. PC端

  1. 加入 -g 选项编译测试程序

  2. arm-linux-gdb ./a.oout

使用gdb编译器进入调试

  1. (gdb)target remote 192.168.1.100:2000

PC机从网络访问端口为2000板子

  1. 开始调试步骤

  2. 额外选项

set sysroot /home/linux/rootfs

三、sqlite移植

1. 解压文件

将 sqlite3.tar 文件在rootfs目录下解压并进入

内部的 .am 和 .in 文件是核心文件不能使用

2. 生成makefile

1. 新建文件夹

后续安装的内容在该文件夹下

mkdir sqlite3_install

2. 指定Makefile生成路径

./configure --host=arm-linux-gnueabihf-gcc --prefix=/home/linux/nfs/imx6/rootfs/sqlite-3.7.3/sqlite_install

CC=arm-linux-gnueabihf-gcc 指定编译器

--host 指定目标平台为ARM架构运行linux系统

--prefix 指定编译后的库和可执行文件的生成路径

3. 执行configure生成makefile

3. 设置Makefile

1. Makefile

进入指定目录下的Makefile进行修改

vi Makefile

2. 编译

make进行编译生成

确保编译器为 arm-linux-gnueabihf-gcc

3. 放置文件

将生成的文件放置到设置的目标目录下

make install

4. 转移文件

1. 放置bin文件

将生成目标下的bin目录下的 sqlite3放置到开发板的 usr//lib 路径下

cp sqlite_install/bin /home/linux/nfs/imx6/rootfs/usr/bin/

2. 放置库文件

将生成目标下的lib目录下的 sqlite3放置到开发板的/lib路径下

cp sqlite_install/lib/* /home/linux/nfs/imx6/rootfs/lib

5. 测试

1. 测试代码

2. Makefile

3. 编译

指定专用的名字

make -f Makefile_sqlite

4. 转移生成文件

cp a.out ./imx6/rootfs

5. 板子内测时

四、mqtt

1. 概念

MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议)

是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上由IBM在1999年发布。

最高层应用层协议

2. 特点

MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。

MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如

机器与机器(M2M)通信和物联网(loT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

3. 工作原理

发布 - 订阅模型

1. 定义

该模型旨在解耦消息的发送者(发布者)和接收者(订阅者),二者不直接通信,而是通过一个中间代理(Broker)进行消息路由。

2. 组成

|-------------------------|--------------------------------------------------|
| 发布者 ​(Publish)​ | 消息的生产者。负责产生数据并将其发布到特定的​​主题​​上。 |
| ​​代理 (Broker)​​ | 消息代理服务器。是整个系统的中枢,负责接收发布者的消息,并根据主题将其分发给所有对应的订阅者。 |
| ​​订阅者 ​(Subscribe)​ | 消息的消费者。向 Broker 订阅它感兴趣的​​主题​​,然后接收来自这些主题的消息。 |

3. 流程

  1. 发布:发布者将消息发送到 Broker,并指明消息所属的主题(Topic)

  2. 路由:Broker 接收到消息后,查看消息的主题

  3. 订阅:Broker 将消息转发给所有订阅了该主题的订阅者

4. 报文组成

固定报头

可变报头

5. 心跳包

1. 概念

心跳包(Heartbeat Packet)是网络通信中一种​​维持连接活性​​的机制,尤其对于需要​​长时间保持连接​​的应用至关重要。

确保服务器和客户端同时在线

2. 原理

通信的一方(通常是客户端)按照​​固定的时间间隔​​,向另一方(通常是服务器)发送一个包含特定信息的小数据包。这个数据包可以非常小,有时甚至是一个空包或只包含包头

3. 实现方式

1. 应用层实现​

由应用程序自身通过定时器,主动、定期地发送自定义结构的心跳包。

这种方式允许开发者根据具体需求灵活调整心跳间隔(例如设置为30-40秒),并能快速响应网络异常。

2. 传输层实现​

TCP协议本身提供了一个名为 ​​SO_KEEPALIVE​​ 的选项。

开启后,操作系统内核会在连接空闲一段时间后自动发送探测包。虽然设置方便,但其默认检测周期过长,难以满足实时性要求高的应用需求

6. 操作命令

7. OneNet

物联网开放平台文档

1. 创建产品

产品开发 - 创建产品

2. 添加物模型

3. 添加设备

五、补充

1. 屏幕熄灭屏设置

i:忽略大小写

屏幕不熄灭设置为0

编译后zImage复制到tftpboot

2. 编译器阻塞

vi编辑器下

ctrl + s 阻塞vi

ctrl + q 解决

3. 只读问题

1. 修改PC端配置

2. 修改arm端配置

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.200:/home/linux/nfs/imx6/rootfs,proto=tcp rw ip=192.168.1.100:192.168.1.200:192.168.1.1:255.255.255.0::eth:off'

相关推荐
敲上瘾3 小时前
Docker镜像构建指南:Dockerfile语法与docker build命令全解析
linux·服务器·docker·微服务·容器
@小博的博客8 小时前
【Linux探索学习】第二篇Linux的基本指令(2)——开启Linux学习第二篇
linux·运维·学习
openHiTLS密码开源社区10 小时前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
WTCLLB10 小时前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
迎風吹頭髮11 小时前
UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写
linux·c语言·unix
做运维的阿瑞11 小时前
Linux系统性能监控与故障定位实战:CPU/内存/I/O/网络
linux·运维·网络
驱动探索者11 小时前
车库到双子星:惠普的百年科技传奇
linux
啊?啊?14 小时前
1 玩转Linux命令行:基础文件操作实战教程
linux·服务器·基础指令
Code Warrior14 小时前
【Linux】线程概念与控制(2)
linux