缘由:
opt环境在晚高峰几乎无法部署成功,下载https://opt.cn2qq.com/opt-file/opttmpg12.tgz总是失败,如果在这个时间段重启路由器,那么需要Opkg安装的mosquitto_sub自然也无法使用。
遂想把mosquitto_sub客户端和依赖库都提取出来保存本地直接使用。
结论前置:
未完成:最终只能IP连接服务端成功;使用域名会报错。因并非唯一选择,此方案不值得继续花时间探索,遂放弃 [25-12-14]。
体积:mosquitto_sub加上所有声明的依赖库,总体积=3.34M,虽然比Go编译的5.87M小2.5M,但在空间还剩55M余量较宽裕的情况下没必要为扣这2.5M体积继续耗费时间,直接用Go写个MQTT程序交叉编译成MIPSEL的静态可执行文件,一小时搞定。
从Opkg安装mosquitto_sub并提取依赖库:
- 注意事项:
- 安装opkg后部署的/opt/lib/依赖库,直接拉取整个目录时不会下载软链接,无法直接使用。
- 也不能直接下载软链接文件,需用cp命令拷贝出来再下载到本地。
- 先用 Opkg 部署 mosquitto-client :
12/opt/bin/opkg update #更新软件包索引/opt/bin/opkg install mosquitto-client #安装mosquitto客户端
- ldd 查询 mosquitto_sub 声明的依赖关系 :
1234567891011[RM2100]# ldd /opt/bin/mosquitto_sublibcjson.so.1 => /opt/lib/libcjson.so.1 (0x77134000)libmosquitto.so.1 => /opt/lib/libmosquitto.so.1 (0x7710f000)libpthread.so.0 => /opt/lib/libpthread.so.0 (0x770e1000)librt.so.1 => /opt/lib/librt.so.1 (0x770c9000)libcares.so.2 => /opt/lib/libcares.so.2 (0x77098000)libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x77074000)libc.so.6 => /opt/lib/libc.so.6 (0x76ee1000)libm.so.6 => /opt/lib/libm.so.6 (0x76dd9000)libssp.so.0 => /opt/lib/libssp.so.0 (0x76dc7000)/opt/lib/ld.so.1 (0x7714b000) #动态链接器
- 批量导出这 9个依赖库 和 1个动态链接器 :
123456# 自建存放目录:mkdir -p "/opt/mylib/"# 提取所有依赖路径,并通过 xargs 复制:ldd /opt/bin/mosquitto_sub | grep "=>" | awk '{print $3}' | xargs -I {} cp -v {} "/opt/mylib/"# 重要:/opt/lib/ld.so.1 是动态链接器,需要单独复制:cp -v /opt/lib/ld.so.1 "/opt/mylib/"
- 完成。下载 /opt/mylib/ 到本地。
本地上传mosquitto_sub和依赖库测试:
- 注意事项:
- 路径:动态链接器ld.so.1必须存放在/opt/lib/目录,否则报错:-sh: ./mosquitto_sub: not found
- 权限:除了mosquitto_sub客户端,动态链接器ld.so.1也必须授予执行权限,否则报错:-sh: ./mosquitto_sub: Permission denied
- 先将路由器恢复成无opkg状态:【配置扩展环境】-【opt 强制安装】禁用,重启路由器。
- 上传:mosquitto_sub客户端、ld.so.1动态链接器,和其他9个依赖库到 /opt/lib/ 目录,并授予执行权限:
123456789101112[RM2100 /opt/lib]# ls -l | awk '{print $1, $9}'-rwxrwxrwx ld.so.1-rw-rw-rw- libc.so.6-rw-rw-rw- libcares.so.2-rw-rw-rw- libcjson.so.1-rw-rw-rw- libgcc_s.so.1-rw-rw-rw- libm.so.6-rw-rw-rw- libmosquitto.so.1-rw-rw-rw- libpthread.so.0-rw-rw-rw- librt.so.1-rw-rw-rw- libssp.so.0-rwxrwxrwx mosquitto_sub
- ldd 查询 mosquitto_sub 声明的依赖关系:
1234567891011121314当前无opkg环境,ldd能查询到所有依赖,除了/etc/ld.so.cache这个文件报错:[RM2100]# ldd /opt/lib/mosquitto_subldd: can't open cache '/etc/ld.so.cache'libcjson.so.1 => /opt/lib/libcjson.so.1 (0x7750c000)libmosquitto.so.1 => /opt/lib/libmosquitto.so.1 (0x774e7000)libpthread.so.0 => /opt/lib/libpthread.so.0 (0x774b9000)librt.so.1 => /opt/lib/librt.so.1 (0x774a1000)libcares.so.2 => /opt/lib/libcares.so.2 (0x77470000)libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x7744c000)libc.so.6 => /opt/lib/libc.so.6 (0x772b9000)libm.so.6 => /opt/lib/libm.so.6 (0x771b1000)libssp.so.0 => /opt/lib/libssp.so.0 (0x7719f000)/opt/lib/ld.so.1 (0x77523000)
- 运行mosquitto_sub:使用域名连接报错Unable to connect (Lookup error.):
123./mosquitto_sub --host bemfa.com --port 9501 -t test009 -i xxxxxxxxxx --qos 1报错:Unable to connect (Lookup error.).错误分析:Lookup error 几乎总是与 DNS (Domain Name System) 解析或网络配置有关。它发生在程序尝试将您提供的服务器名称或域名转换为实际的 IP 地址时。
- 运行mosquitto_sub:使用IP连接成功:
12./mosquitto_sub --host 119.91.109.180 --port 9501 -t test009 -i xxxxxxxxxx --qos 1改用IP连接成功√
- 结束。