开机免登录
sudo mkdir -p /etc/systemd/system/serial-getty@ttyFIQ0.service.d
sudo nano /etc/systemd/system/serial-getty@ttyFIQ0.service.d/autologin.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin wqh --noreset --noclear --keep-baud 115200,57600,38400,9600 - $TERM
sudo systemctl daemon-reload
sudo systemctl restart serial-getty@ttyFIQ0.service
开机wifi
sudo nano /etc/netplan/99-wifi.yaml
network:
version: 2
wifis:
wlan0:
optional: true
dhcp4: true
access-points:
"TP-LINK_12EF":
password: "0000011111"
TP-LINK_12EF 换成你的 WiFi 名称
0000011111 换成你的 WiFi 密码
wlan0 是你的 WiFi 接口名
免密指令
sudo -n wpa_cli -i wlan0 status
sudo -n wpa_cli -i wlan0 scan
sudo -n ip addr replace 192.168.0.233/24 broadcast + dev wlan0
1. 添加 boat002 用户
sudo mosquitto_passwd -b /etc/mosquitto/passwd boat002 Boat002_123456
注意:这里不要加 -c,否则会覆盖原来的 fishboat_app 和 boat001 用户。
2. 编辑 ACL 权限文件
sudo nano /etc/mosquitto/acl
在文件最后追加:
user boat002
topic read boat/boat002/cmd
topic write boat/boat002/ack
topic write boat/boat002/status
topic write boat/boat002/heartbeat
保存退出。
3. 重启 Mosquitto
sudo systemctl restart mosquitto
sudo systemctl status mosquitto --no-pager
4. 测试 boat002 是否能收到命令
窗口 1,模拟 boat002 船端订阅:
mosquitto_sub -h 127.0.0.1 -p 1883 \
-u boat002 -P 'Boat002_123456' \
-t 'boat/boat002/cmd' -v
窗口 2,模拟 APP 发命令:
mosquitto_pub -h 127.0.0.1 -p 1883 \
-u fishboat_app -P 'App_123456' \
-t 'boat/boat002/cmd' \
-m '{"cmd":"forward","speed":60,"seq":2001}'
订阅窗口看到:
boat/boat002/cmd {"cmd":"forward","speed":60,"seq":2001}
就说明 boat002 配好了。
5. boat002 开发板配置里要写
{
"device_id": "boat002",
"mqtt_host": "服务器公网IP",
"mqtt_port": 1883,
"mqtt_user": "boat002",
"mqtt_password": "Boat002_123456",
"cmd_topic": "boat/boat002/cmd",
"ack_topic": "boat/boat002/ack",
"status_topic": "boat/boat002/status",
"heartbeat_topic": "boat/boat002/heartbeat",
"rtsp_url": "rtsp://服务器公网IP:8554/boat002"
}
1. 交叉编译报错现象
在 x86_64 Ubuntu 虚拟机里交叉编译 Radxa Zero3W / ARM64 程序时,报错:
src/mqtt_client.c:7:10: fatal error: mosquitto.h: 没有那个文件或目录
#include <mosquitto.h>
原因是虚拟机里没有安装 Mosquitto 开发头文件和 ARM64 目标库。
2. 本质原因
Radxa Zero3W 是 ARM64/aarch64,交叉编译时不能只装 x86_64 版本的库。
需要安装目标架构的开发包:
libmosquitto-dev:arm64
而不是只装:
libmosquitto-dev
其中:
libmosquitto-dev 默认是虚拟机本机 amd64 版本
libmosquitto-dev:arm64 是给开发板 ARM64 目标程序链接用的版本
3. 遇到的新问题
执行:
sudo apt install -y libmosquitto-dev:arm64
提示:
E: 无法定位软件包 libmosquitto-dev:arm64
原因是虚拟机虽然是 Ubuntu Jammy,但当前 apt 源没有正确提供 arm64 软件包,或者还没有添加 arm64 架构源。
4. 解决思路
需要先启用 arm64 多架构:
sudo dpkg --add-architecture arm64
然后给 arm64 单独添加 ubuntu-ports 源。
注意:ARM64 包应该走 ubuntu-ports,不是普通 ubuntu 源。
5. 推荐国内 arm64 源
因为官方 ports.ubuntu.com 速度慢,可以使用国内镜像。
推荐中科大 USTC:
sudo nano /etc/apt/sources.list.d/arm64.list
写入:
deb [arch=arm64] https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb [arch=arm64] https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb [arch=arm64] https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
deb [arch=arm64] https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
或者清华 TUNA:
deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse
deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
6. 关键操作命令
sudo dpkg --add-architecture arm64
sudo rm -rf /var/lib/apt/lists/*
sudo apt clean
sudo apt update
sudo apt install -y libmosquitto-dev:arm64
安装后检查:
ls /usr/include/mosquitto.h
ls /usr/lib/aarch64-linux-gnu/libmosquitto*
正常应看到:
/usr/include/mosquitto.h
/usr/lib/aarch64-linux-gnu/libmosquitto.so
7. 编译时注意
交叉编译链接时要确保链接 ARM64 库:
/usr/lib/aarch64-linux-gnu/libmosquitto.so
如果后续链接报:
cannot find -lmosquitto
Makefile 里需要加:
LDFLAGS += -L/usr/lib/aarch64-linux-gnu
LDLIBS += -lmosquitto
8. 总结一句话
这次问题不是代码里的 #include <mosquitto.h> 写错,而是 x86 虚拟机交叉编译 ARM64 程序时,缺少 ARM64 版本 Mosquitto 开发库。
解决方法是:开启 arm64 多架构 + 添加 ubuntu-ports 国内源 + 安装 libmosquitto-dev:arm64。
9.开发板也要
推荐直接换中科大源
先备份:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2>/dev/null || true
sudo cp /etc/apt/sources.list.d/debian.sources /etc/apt/sources.list.d/debian.sources.bak 2>/dev/null || true
替换源:
sudo sed -i 's|http://deb.debian.org/debian|https://mirrors.ustc.edu.cn/debian|g' /etc/apt/sources.list 2>/dev/null || true
sudo sed -i 's|http://security.debian.org/debian-security|https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list 2>/dev/null || true
sudo sed -i 's|http://deb.debian.org/debian-security|https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list 2>/dev/null || true
sudo sed -i 's|http://deb.debian.org/debian|https://mirrors.ustc.edu.cn/debian|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || true
sudo sed -i 's|http://security.debian.org/debian-security|https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || true
sudo sed -i 's|http://deb.debian.org/debian-security|https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || true
清理并更新:
sudo rm -rf /var/lib/apt/lists/*
sudo apt clean
sudo apt update
然后安装运行库:
sudo apt install -y libmosquitto1
检查:
ls /usr/lib/aarch64-linux-gnu/libmosquitto.so*
sudo ldconfig
./fishboatd
MQTT 服务器:腾讯云公网IP
端口:1883
APP:
user = fishboat_app
password = App_123456
boat001 开发板:
user = boat001
password = Boat001_123456
APP 发命令 topic:
boat/boat001/cmd
boat001 发 ACK:
boat/boat001/ack
boat001 发状态:
boat/boat001/status
boat001 发心跳:
boat/boat001/heartbeat




