目录
[1. 图形设计生成的代码解析](#1. 图形设计生成的代码解析)
[2. 结合mylvgl](#2. 结合mylvgl)
[1. 拼接显示内容](#1. 拼接显示内容)
[2. 设置定时器](#2. 设置定时器)
[3. 主函数与线程](#3. 主函数与线程)
[3. Makefile](#3. Makefile)
[1. gdb移植](#1. gdb移植)
[2. gdb命令](#2. gdb命令)
[3. 一般调试运行](#3. 一般调试运行)
[4. PC端与arm端结合调试](#4. PC端与arm端结合调试)
[1. arm端](#1. arm端)
[2. PC端](#2. PC端)
[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. 板子内测时)
[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移植
- echo $PATH查看地址

- 将gdbsercer向根文件目录复制移植到板子上

- 然后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. 一般调试运行
- gcc -g -lpthread 1.c
编辑Makefile添加 -g 选项使允许 gdb 调试
- gdb a.out
开始gdb调试生成后的 .c 文件
- b fun.c :36
设置断点,使运行到这个位置,程序暂停
- r
运行整个代码开始调试
- n
单步执行下一步
- 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端
-
加入 -g 选项编译测试程序
-
arm-linux-gdb ./a.oout
使用gdb编译器进入调试
- (gdb)target remote 192.168.1.100:2000
PC机从网络访问端口为2000板子
-
开始调试步骤
-
额外选项
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. 流程
-
发布:发布者将消息发送到 Broker,并指明消息所属的主题(Topic)
-
路由:Broker 接收到消息后,查看消息的主题
-
订阅: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'