提交 90196066 authored 作者: 陈泽健's avatar 陈泽健

fix(mqtt): 解决MQTT工具包依赖库路径问题

- 验证mosquitto工具是否可用并记录版本信息
- 设置LD_LIBRARY_PATH环境变量让mosquitto二进制文件能找到依赖库
- 在子进程中执行订阅命令确保输出重定向正常工作
- 增加等待时间确保MQTT连接建立
- 检查订阅进程状态和输出文件创建情况
- 优化发布命令执行前的版本测试
- 改进错误日志记录包含退出码和输出信息
- 修复订阅输出文件处理逻辑确保消息验证正常
上级 891120d0
...@@ -1668,6 +1668,12 @@ test_mqtt_connection() { ...@@ -1668,6 +1668,12 @@ test_mqtt_connection() {
mqtt_pub_cmd="$mqtt_toolkit_dir/mosquitto_pub" mqtt_pub_cmd="$mqtt_toolkit_dir/mosquitto_pub"
use_toolkit=true use_toolkit=true
log INFO "[MQTT] 使用内置工具包: $mqtt_toolkit_dir" log INFO "[MQTT] 使用内置工具包: $mqtt_toolkit_dir"
# 验证mosquitto工具是否可用
local mqtt_lib_dir="$mqtt_toolkit_dir/lib"
local version_test
version_test="$(LD_LIBRARY_PATH="$mqtt_lib_dir:${LD_LIBRARY_PATH:-}" "$mqtt_pub_cmd" --version 2>&1 || echo "FAILED")"
log INFO "[MQTT] mosquitto_pub版本: $version_test"
else else
# 降级:检查容器内是否有mosquitto命令 # 降级:检查容器内是否有mosquitto命令
local check_mosquitto_output local check_mosquitto_output
...@@ -1699,7 +1705,9 @@ test_mqtt_connection() { ...@@ -1699,7 +1705,9 @@ test_mqtt_connection() {
local sub_output local sub_output
if [[ "$use_toolkit" == true ]]; then if [[ "$use_toolkit" == true ]]; then
# 使用工具包:通过docker cp复制到容器内执行,或映射端口从宿主机执行 # 使用工具包:通过docker cp复制到容器内执行,或映射端口从宿主机执行
sub_output="$(timeout 2 "$mqtt_sub_cmd" -h localhost -p "$mqtt_port" -t "$topic" -C 1 -W 2 2>&1 || true)" || sub_output="SUB_TIMEOUT" # 需要设置LD_LIBRARY_PATH让mosquitto二进制文件能找到依赖库
local mqtt_lib_dir="$(dirname "$mqtt_sub_cmd")/lib"
sub_output="$(LD_LIBRARY_PATH="$mqtt_lib_dir:${LD_LIBRARY_PATH:-}" timeout 2 "$mqtt_sub_cmd" -h localhost -p "$mqtt_port" -t "$topic" -C 1 -W 2 2>&1 || true)" || sub_output="SUB_TIMEOUT"
else else
# 使用容器内命令 # 使用容器内命令
sub_output="$(docker exec "$actual_container" timeout 2 mosquitto_sub -h localhost -p "$mqtt_port" -t "$topic" -C 1 -W 2 2>&1 || true)" || sub_output="SUB_TIMEOUT" sub_output="$(docker exec "$actual_container" timeout 2 mosquitto_sub -h localhost -p "$mqtt_port" -t "$topic" -C 1 -W 2 2>&1 || true)" || sub_output="SUB_TIMEOUT"
...@@ -1727,17 +1735,38 @@ test_mqtt_connection() { ...@@ -1727,17 +1735,38 @@ test_mqtt_connection() {
if [[ "$use_toolkit" == true ]]; then if [[ "$use_toolkit" == true ]]; then
# 使用工具包 # 使用工具包
timeout 5 "$mqtt_sub_cmd" -h localhost -p "$mqtt_port" -t "$test_topic" -C 1 -v > "$sub_output_file" 2>&1 & # 需要设置LD_LIBRARY_PATH让mosquitto二进制文件能找到依赖库
local mqtt_lib_dir="$(dirname "$mqtt_sub_cmd")/lib"
# 使用shell子进程确保输出重定向正常工作
(
LD_LIBRARY_PATH="$mqtt_lib_dir:${LD_LIBRARY_PATH:-}"
export LD_LIBRARY_PATH
timeout 5 "$mqtt_sub_cmd" -h localhost -p "$mqtt_port" -t "$test_topic" -C 1 -v > "$sub_output_file" 2>&1
) &
local sub_pid=$!
log INFO "[MQTT] 订阅进程PID: $sub_pid (LD_LIBRARY_PATH=$mqtt_lib_dir, 输出文件=$sub_output_file)"
else else
# 使用容器内命令 # 使用容器内命令
docker exec "$actual_container" sh -c "timeout 5 mosquitto_sub -h localhost -p $mqtt_port -t '$test_topic' -C 1 -v > $sub_output_file 2>&1" & docker exec "$actual_container" sh -c "timeout 5 mosquitto_sub -h localhost -p $mqtt_port -t '$test_topic' -C 1 -v > $sub_output_file 2>&1" &
local sub_pid=$!
log INFO "[MQTT] 订阅进程PID: $sub_pid (容器内, 输出文件=$sub_output_file)"
fi
# 等待订阅启动 - 增加等待时间确保MQTT连接建立
sleep 2
# 检查订阅进程是否还在运行,以及输出文件是否已创建
if kill -0 "$sub_pid" 2>/dev/null; then
log INFO "[MQTT] 订阅进程 $sub_pid 正在运行"
else
log WARN "[MQTT] 订阅进程 $sub_pid 已提前退出"
fi fi
local sub_pid=$! || true
# 等待订阅启动 if [[ -f "$sub_output_file" ]]; then
sleep 1 log INFO "[MQTT] 订阅输出文件已创建: $sub_output_file"
else
log WARN "[MQTT] 订阅输出文件尚未创建: $sub_output_file"
fi
# 步骤2: 发送测试消息 # 步骤2: 发送测试消息
log INFO "[MQTT] 步骤2/3: 发送测试消息到主题: $test_topic" log INFO "[MQTT] 步骤2/3: 发送测试消息到主题: $test_topic"
...@@ -1747,37 +1776,56 @@ test_mqtt_connection() { ...@@ -1747,37 +1776,56 @@ test_mqtt_connection() {
if [[ "$use_toolkit" == true ]]; then if [[ "$use_toolkit" == true ]]; then
# 使用工具包 # 使用工具包
pub_output="$("$mqtt_pub_cmd" -h localhost -p "$mqtt_port" -t "$test_topic" -m "$test_message" 2>&1 || true)" # 需要设置LD_LIBRARY_PATH让mosquitto二进制文件能找到依赖库
local mqtt_lib_dir="$(dirname "$mqtt_pub_cmd")/lib"
log INFO "[MQTT] 准备执行发布命令: LD_LIBRARY_PATH=$mqtt_lib_dir, cmd=$mqtt_pub_cmd, port=$mqtt_port, topic=$test_topic"
# 先测试mosquitto_pub是否能执行
local test_cmd_output
test_cmd_output="$(LD_LIBRARY_PATH="$mqtt_lib_dir:${LD_LIBRARY_PATH:-}" "$mqtt_pub_cmd" --version 2>&1 || echo "mosquitto_pub_version_failed")"
log INFO "[MQTT] mosquitto_pub版本测试: [$test_cmd_output]"
pub_output="$(LD_LIBRARY_PATH="$mqtt_lib_dir:${LD_LIBRARY_PATH:-}" "$mqtt_pub_cmd" -h localhost -p "$mqtt_port" -t "$test_topic" -m "$test_message" 2>&1 || true)"
pub_exit_code=$? pub_exit_code=$?
log INFO "[MQTT] 发布命令执行结果: exit_code=$pub_exit_code, output=[$pub_output]"
else else
# 使用容器内命令 # 使用容器内命令
pub_output="$(docker exec "$actual_container" mosquitto_pub -h localhost -p "$mqtt_port" -t "$test_topic" -m "$test_message" 2>&1 || true)" pub_output="$(docker exec "$actual_container" mosquitto_pub -h localhost -p "$mqtt_port" -t "$test_topic" -m "$test_message" 2>&1 || true)"
pub_exit_code=$? pub_exit_code=$?
log INFO "[MQTT] 发布命令执行结果: exit_code=$pub_exit_code, output=[$pub_output]"
fi fi
if [[ $pub_exit_code -eq 0 ]]; then if [[ $pub_exit_code -eq 0 ]]; then
log SUCCESS "[MQTT] 消息发送成功" log SUCCESS "[MQTT] 消息发送成功"
local pub_success=1 local pub_success=1
else else
log ERROR "[MQTT] 消息发送失败: $pub_output" log ERROR "[MQTT] 消息发送失败: exit_code=$pub_exit_code, output=[$pub_output]"
local pub_success=0 local pub_success=0
fi fi
# 等待订阅接收消息 # 等待订阅接收消息
wait $sub_pid 2>/dev/null || true wait $sub_pid 2>/dev/null || true
local sub_exit_code=$? local sub_exit_code=$?
log INFO "[MQTT] 订阅进程退出: pid=$sub_pid, exit_code=$sub_exit_code"
# 步骤3: 验证接收结果 # 步骤3: 验证接收结果
log INFO "[MQTT] 步骤3/3: 验证消息接收" log INFO "[MQTT] 步骤3/3: 验证消息接收"
local received_message="" local received_message=""
if [[ $sub_exit_code -eq 0 ]]; then if [[ "$use_toolkit" == true ]]; then
if [[ "$use_toolkit" == true ]]; then if [[ -f "$sub_output_file" ]]; then
received_message="$(cat "$sub_output_file" 2>/dev/null || echo "")" received_message="$(cat "$sub_output_file" 2>/dev/null || echo "")"
log INFO "[MQTT] 订阅输出文件内容: [$received_message]"
rm -f "$sub_output_file" 2>/dev/null || true rm -f "$sub_output_file" 2>/dev/null || true
else else
received_message="$(docker exec "$actual_container" cat "$sub_output_file" 2>/dev/null || echo "")" log WARN "[MQTT] 订阅输出文件不存在: $sub_output_file"
docker exec "$actual_container" rm -f "$sub_output_file" 2>/dev/null || true
fi fi
else
received_message="$(docker exec "$actual_container" cat "$sub_output_file" 2>/dev/null || echo "")"
log INFO "[MQTT] 订阅输出文件内容(容器): [$received_message]"
docker exec "$actual_container" rm -f "$sub_output_file" 2>/dev/null || true
fi
if [[ $sub_exit_code -eq 0 ]]; then
# 打印接收到的原始消息体 # 打印接收到的原始消息体
log INFO "[MQTT] 接收消息体: [$received_message]" log INFO "[MQTT] 接收消息体: [$received_message]"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论