【gdb/sqlite3移植/mqtt】
gdb:
基础命令:
- r (run) : 代码直接运行
- where bt :显示栈结构,函数的调用关系
- gdb和c语言中,是函数来回调的过程,栈结构就是记录了函数的调用过程,谁调谁。比如,最开始一定是main函数,main函数中调用了哪个函数。
- 栈是先入后出
- b :设置断点 b 行号 main.c(写上在哪个.c文件里的)/ b 函数名
- n : next 下一步,步过,直接执行
- s :setp 下一步,步入,进入函数里,还没执行,只是先进去,(一定得是自定义函数,不能是系统函数,比如strcpy之类的)
- p :printf 显示变量,指针。 p a(显示变量), p *a(显示指针)
- c :continue跳出循环,可以在循环后面设置断点,然后按c,就直接执行循环部分
- return :返回调用处。和s有关,进到函数里,函数没有问题执行完了,可以return回到上一级函数中去
gdb移植:
在虚拟机终端里,echo $PATH
进入目录里,ls
将gdbserver文件拷贝到 ~/nfs/rootfs/bin目录下
进到开发板终端中,进入/bin目录,有gdbserver
进入代码mylvgl目录里, 执行gdbserver :2000 ./demo
在虚拟机终端里:
在代码mylvgl目录下:
arm-linux-gnueabihf-gdb ./demo
target remote 192.168.1.100:2000
开始调试:
- b time_all 设置断点
- c 运行代码
- n 下一步
- p buf 查看变量 p guider_ui.screen_table_1查看是否为空,为空就是错误的位置
- info breakpoints 查看程序中有几个断点
- delete删除所有断点
sqlite3数据库移植:
修改imx6ull不熄屏:
在当前目录下,根据文件名找文件
打开vt.c
make 编译
zImage复制到tftpboot目录下
创建install目录:
修改makefile:
make编译“:
make install :
进入__install目录下,出现新的目录bin include等等
在__install/bin目录下拷贝:
cp sqlite3 ~/nfs/rootfs/usr/bin
复制lib:
将sqlite的测试文件拷贝到rootfs:
写makefile_sqlite:
编译:
将a.out复制到rootfs目录下:
mqtt:
报文格式:基于二进制的
2个字节的固定头,数据长度变化的可变头,
payload可选,不能太长,三个总体不超过64k
传感器连接服务器,服务器应答传感器
传感器发送数据,服务器应答
客户端订阅
客户端取消订阅
心跳包(keep alive):保证传感器和服务器都在线
心跳包的触发:
当客户端 在一个 KeepAlive 周期内未发送任何数据 时,会自动发送 PINGREQ;
如果应用层有发布消息(Publish / Subscribe),就不需要额外发心跳,因为数据包本身也会刷新计时。
Q1:什么是 MQTT 心跳包? | 心跳包是 MQTT 客户端与 Broker 之间周期性发送的 PINGREQ/PINGRESP 控制报文,用于维持 TCP 长连接与检测在线状态。 |
Q2:Keep Alive 参数的含义? | 客户端在 CONNECT 报文中指定 Keep Alive 秒数,表示两个报文之间的最大允许空闲时间。超时后 Broker 断开连接。 |
Q3:如果设置 Keep Alive=0 会怎样? | 表示禁用心跳,Broker 不会主动断开,但 TCP 连接可能被中间设备关闭。 |
Q4:为什么需要心跳? | 因为很多 NAT、防火墙会在连接空闲超过一定时间后强制关闭 TCP 连接,心跳可以防止掉线。 |
Q5:如果长时间没收到 PINGRESP 怎么办? | 客户端认为连接失效,执行自动重连逻辑。 |
Q6:心跳包是应用层还是传输层? | 心跳是 应用层(MQTT 协议) 报文,底层依然基于 TCP。 |
、
固定报头:
类型有0-15个,一共16个类型