Commit e179dc11 authored by 957dd's avatar 957dd

加入了动态订阅主题

parent 59e18a8c
cmake_minimum_required(VERSION 3.12)
++ /dev/null
cmake_minimum_required(VERSION 3.12)
project(gps_tank)
# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 Paho MQTT 库。
# 你的 dpkg 输出证明了系统中有正确的 CMake 配置文件,所以这行会成功。
find_package(PahoMqttCpp REQUIRED)
# 添加可执行文件
add_executable(main
src/main.cc
src/serial_port.cc
src/mqtt_controller.cc
)
# 包含所有需要的头文件路径
target_include_directories(main PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/third_party/json/include
# find_package 会自动处理 Paho Mqtt 的头文件路径,
# 因为 PahoMqtt::paho-mqttpp3 目标包含了它的 include 目录。
# 所以这里不再需要手动添加 ${PahoMqttCpp_INCLUDE_DIRS}。
)
# 链接库文件
# 只需要链接最顶层的 C++ 库目标。
# 它会自动将其依赖的 C 库 (paho-mqtt3as) 和 pthread 链接进来。
target_link_libraries(main PRIVATE
paho-mqttpp3 # C++ 库
paho-mqtt3as # 它依赖的 C 库 (asynchronous)
pthread # 线程库
)
# 可选:添加调试和警告信息
target_compile_options(main PRIVATE -g -Wall -Wextra)
\ No newline at end of file
CN040300000002
\ No newline at end of file
......@@ -149,12 +149,12 @@ third_party/paho.mqtt.cpp/src/clean: third_party/paho.mqtt.cpp/src/CMakeFiles/pa
CMakeFiles/main.dir/all:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=1,2,3,4 "Built target main"
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=1,2,3,4,5,6 "Built target main"
.PHONY : CMakeFiles/main.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/main.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/orangepi/gps/master/build/CMakeFiles 4
$(CMAKE_COMMAND) -E cmake_progress_start /home/orangepi/gps/master/build/CMakeFiles 6
$(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/main.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/orangepi/gps/master/build/CMakeFiles 0
.PHONY : CMakeFiles/main.dir/rule
......@@ -175,7 +175,7 @@ CMakeFiles/main.dir/clean:
third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/all:
$(MAKE) $(MAKESILENT) -f third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/build.make third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/depend
$(MAKE) $(MAKESILENT) -f third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/build.make third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 "Built target paho-mqttpp3-shared"
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 "Built target paho-mqttpp3-shared"
.PHONY : third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/all
# Build rule for subdir invocation for target.
......
......@@ -8,8 +8,10 @@ set(CMAKE_DEPENDS_LANGUAGES
# The set of dependency files which are needed:
set(CMAKE_DEPENDS_DEPENDENCY_FILES
"/home/orangepi/gps/master/src/file_operations.cc" "CMakeFiles/main.dir/src/file_operations.cc.o" "gcc" "CMakeFiles/main.dir/src/file_operations.cc.o.d"
"/home/orangepi/gps/master/src/main.cc" "CMakeFiles/main.dir/src/main.cc.o" "gcc" "CMakeFiles/main.dir/src/main.cc.o.d"
"/home/orangepi/gps/master/src/mqtt_controller.cc" "CMakeFiles/main.dir/src/mqtt_controller.cc.o" "gcc" "CMakeFiles/main.dir/src/mqtt_controller.cc.o.d"
"/home/orangepi/gps/master/src/mqtt_used.cc" "CMakeFiles/main.dir/src/mqtt_used.cc.o" "gcc" "CMakeFiles/main.dir/src/mqtt_used.cc.o.d"
"/home/orangepi/gps/master/src/serial_port.cc" "CMakeFiles/main.dir/src/serial_port.cc.o" "gcc" "CMakeFiles/main.dir/src/serial_port.cc.o.d"
)
......
......@@ -69,10 +69,24 @@ include CMakeFiles/main.dir/progress.make
# Include the compile flags for this target's objects.
include CMakeFiles/main.dir/flags.make
CMakeFiles/main.dir/src/file_operations.cc.o: CMakeFiles/main.dir/flags.make
CMakeFiles/main.dir/src/file_operations.cc.o: ../src/file_operations.cc
CMakeFiles/main.dir/src/file_operations.cc.o: CMakeFiles/main.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/main.dir/src/file_operations.cc.o"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/main.dir/src/file_operations.cc.o -MF CMakeFiles/main.dir/src/file_operations.cc.o.d -o CMakeFiles/main.dir/src/file_operations.cc.o -c /home/orangepi/gps/master/src/file_operations.cc
CMakeFiles/main.dir/src/file_operations.cc.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/src/file_operations.cc.i"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/orangepi/gps/master/src/file_operations.cc > CMakeFiles/main.dir/src/file_operations.cc.i
CMakeFiles/main.dir/src/file_operations.cc.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/src/file_operations.cc.s"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/orangepi/gps/master/src/file_operations.cc -o CMakeFiles/main.dir/src/file_operations.cc.s
CMakeFiles/main.dir/src/main.cc.o: CMakeFiles/main.dir/flags.make
CMakeFiles/main.dir/src/main.cc.o: ../src/main.cc
CMakeFiles/main.dir/src/main.cc.o: CMakeFiles/main.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/main.dir/src/main.cc.o"
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/main.dir/src/main.cc.o"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/main.dir/src/main.cc.o -MF CMakeFiles/main.dir/src/main.cc.o.d -o CMakeFiles/main.dir/src/main.cc.o -c /home/orangepi/gps/master/src/main.cc
CMakeFiles/main.dir/src/main.cc.i: cmake_force
......@@ -86,7 +100,7 @@ CMakeFiles/main.dir/src/main.cc.s: cmake_force
CMakeFiles/main.dir/src/mqtt_controller.cc.o: CMakeFiles/main.dir/flags.make
CMakeFiles/main.dir/src/mqtt_controller.cc.o: ../src/mqtt_controller.cc
CMakeFiles/main.dir/src/mqtt_controller.cc.o: CMakeFiles/main.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/main.dir/src/mqtt_controller.cc.o"
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/main.dir/src/mqtt_controller.cc.o"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/main.dir/src/mqtt_controller.cc.o -MF CMakeFiles/main.dir/src/mqtt_controller.cc.o.d -o CMakeFiles/main.dir/src/mqtt_controller.cc.o -c /home/orangepi/gps/master/src/mqtt_controller.cc
CMakeFiles/main.dir/src/mqtt_controller.cc.i: cmake_force
......@@ -97,10 +111,24 @@ CMakeFiles/main.dir/src/mqtt_controller.cc.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/src/mqtt_controller.cc.s"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/orangepi/gps/master/src/mqtt_controller.cc -o CMakeFiles/main.dir/src/mqtt_controller.cc.s
CMakeFiles/main.dir/src/mqtt_used.cc.o: CMakeFiles/main.dir/flags.make
CMakeFiles/main.dir/src/mqtt_used.cc.o: ../src/mqtt_used.cc
CMakeFiles/main.dir/src/mqtt_used.cc.o: CMakeFiles/main.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/main.dir/src/mqtt_used.cc.o"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/main.dir/src/mqtt_used.cc.o -MF CMakeFiles/main.dir/src/mqtt_used.cc.o.d -o CMakeFiles/main.dir/src/mqtt_used.cc.o -c /home/orangepi/gps/master/src/mqtt_used.cc
CMakeFiles/main.dir/src/mqtt_used.cc.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/src/mqtt_used.cc.i"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/orangepi/gps/master/src/mqtt_used.cc > CMakeFiles/main.dir/src/mqtt_used.cc.i
CMakeFiles/main.dir/src/mqtt_used.cc.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/src/mqtt_used.cc.s"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/orangepi/gps/master/src/mqtt_used.cc -o CMakeFiles/main.dir/src/mqtt_used.cc.s
CMakeFiles/main.dir/src/serial_port.cc.o: CMakeFiles/main.dir/flags.make
CMakeFiles/main.dir/src/serial_port.cc.o: ../src/serial_port.cc
CMakeFiles/main.dir/src/serial_port.cc.o: CMakeFiles/main.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/main.dir/src/serial_port.cc.o"
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/main.dir/src/serial_port.cc.o"
/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/main.dir/src/serial_port.cc.o -MF CMakeFiles/main.dir/src/serial_port.cc.o.d -o CMakeFiles/main.dir/src/serial_port.cc.o -c /home/orangepi/gps/master/src/serial_port.cc
CMakeFiles/main.dir/src/serial_port.cc.i: cmake_force
......@@ -113,22 +141,26 @@ CMakeFiles/main.dir/src/serial_port.cc.s: cmake_force
# Object files for target main
main_OBJECTS = \
"CMakeFiles/main.dir/src/file_operations.cc.o" \
"CMakeFiles/main.dir/src/main.cc.o" \
"CMakeFiles/main.dir/src/mqtt_controller.cc.o" \
"CMakeFiles/main.dir/src/mqtt_used.cc.o" \
"CMakeFiles/main.dir/src/serial_port.cc.o"
# External object files for target main
main_EXTERNAL_OBJECTS =
main: CMakeFiles/main.dir/src/file_operations.cc.o
main: CMakeFiles/main.dir/src/main.cc.o
main: CMakeFiles/main.dir/src/mqtt_controller.cc.o
main: CMakeFiles/main.dir/src/mqtt_used.cc.o
main: CMakeFiles/main.dir/src/serial_port.cc.o
main: CMakeFiles/main.dir/build.make
main: /usr/lib/aarch64-linux-gnu/libcurl.so
main: /usr/lib/aarch64-linux-gnu/libssl.so
main: /usr/lib/aarch64-linux-gnu/libcrypto.so
main: CMakeFiles/main.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Linking CXX executable main"
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/orangepi/gps/master/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Linking CXX executable main"
$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
......
file(REMOVE_RECURSE
"CMakeFiles/main.dir/src/file_operations.cc.o"
"CMakeFiles/main.dir/src/file_operations.cc.o.d"
"CMakeFiles/main.dir/src/main.cc.o"
"CMakeFiles/main.dir/src/main.cc.o.d"
"CMakeFiles/main.dir/src/mqtt_controller.cc.o"
"CMakeFiles/main.dir/src/mqtt_controller.cc.o.d"
"CMakeFiles/main.dir/src/mqtt_used.cc.o"
"CMakeFiles/main.dir/src/mqtt_used.cc.o.d"
"CMakeFiles/main.dir/src/serial_port.cc.o"
"CMakeFiles/main.dir/src/serial_port.cc.o.d"
"main"
......
/usr/bin/c++ CMakeFiles/main.dir/src/main.cc.o CMakeFiles/main.dir/src/mqtt_controller.cc.o CMakeFiles/main.dir/src/serial_port.cc.o -o main /usr/lib/aarch64-linux-gnu/libcurl.so -lpaho-mqttpp3 -lpaho-mqtt3as /usr/lib/aarch64-linux-gnu/libssl.so /usr/lib/aarch64-linux-gnu/libcrypto.so -lc -ldl -lpthread -lrt -lanl
/usr/bin/c++ CMakeFiles/main.dir/src/file_operations.cc.o CMakeFiles/main.dir/src/main.cc.o CMakeFiles/main.dir/src/mqtt_controller.cc.o CMakeFiles/main.dir/src/mqtt_used.cc.o CMakeFiles/main.dir/src/serial_port.cc.o -o main /usr/lib/aarch64-linux-gnu/libcurl.so -lpaho-mqttpp3 -lpaho-mqtt3as /usr/lib/aarch64-linux-gnu/libssl.so /usr/lib/aarch64-linux-gnu/libcrypto.so -lc -ldl -lpthread -lrt -lanl
......@@ -2,4 +2,6 @@ CMAKE_PROGRESS_1 = 1
CMAKE_PROGRESS_2 = 2
CMAKE_PROGRESS_3 = 3
CMAKE_PROGRESS_4 = 4
CMAKE_PROGRESS_5 = 5
CMAKE_PROGRESS_6 = 6
CMakeFiles/main.dir/src/file_operations.cc.o: \
/home/orangepi/gps/master/src/file_operations.cc \
/usr/include/stdc-predef.h \
/home/orangepi/gps/master/include/file_operations.hpp \
/usr/include/c++/11/iostream \
/usr/include/aarch64-linux-gnu/c++/11/bits/c++config.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/os_defines.h \
/usr/include/features.h /usr/include/features-time64.h \
/usr/include/aarch64-linux-gnu/bits/wordsize.h \
/usr/include/aarch64-linux-gnu/bits/timesize.h \
/usr/include/aarch64-linux-gnu/sys/cdefs.h \
/usr/include/aarch64-linux-gnu/bits/long-double.h \
/usr/include/aarch64-linux-gnu/gnu/stubs.h \
/usr/include/aarch64-linux-gnu/gnu/stubs-lp64.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/cpu_defines.h \
/usr/include/c++/11/pstl/pstl_config.h /usr/include/c++/11/ostream \
/usr/include/c++/11/ios /usr/include/c++/11/iosfwd \
/usr/include/c++/11/bits/stringfwd.h \
/usr/include/c++/11/bits/memoryfwd.h /usr/include/c++/11/bits/postypes.h \
/usr/include/c++/11/cwchar /usr/include/wchar.h \
/usr/include/aarch64-linux-gnu/bits/libc-header-start.h \
/usr/include/aarch64-linux-gnu/bits/floatn.h \
/usr/include/aarch64-linux-gnu/bits/floatn-common.h \
/usr/lib/gcc/aarch64-linux-gnu/11/include/stddef.h \
/usr/lib/gcc/aarch64-linux-gnu/11/include/stdarg.h \
/usr/include/aarch64-linux-gnu/bits/wchar.h \
/usr/include/aarch64-linux-gnu/bits/types/wint_t.h \
/usr/include/aarch64-linux-gnu/bits/types/mbstate_t.h \
/usr/include/aarch64-linux-gnu/bits/types/__mbstate_t.h \
/usr/include/aarch64-linux-gnu/bits/types/__FILE.h \
/usr/include/aarch64-linux-gnu/bits/types/FILE.h \
/usr/include/aarch64-linux-gnu/bits/types/locale_t.h \
/usr/include/aarch64-linux-gnu/bits/types/__locale_t.h \
/usr/include/c++/11/exception /usr/include/c++/11/bits/exception.h \
/usr/include/c++/11/bits/exception_ptr.h \
/usr/include/c++/11/bits/exception_defines.h \
/usr/include/c++/11/bits/cxxabi_init_exception.h \
/usr/include/c++/11/typeinfo /usr/include/c++/11/bits/hash_bytes.h \
/usr/include/c++/11/new /usr/include/c++/11/bits/move.h \
/usr/include/c++/11/type_traits \
/usr/include/c++/11/bits/nested_exception.h \
/usr/include/c++/11/bits/char_traits.h \
/usr/include/c++/11/bits/stl_algobase.h \
/usr/include/c++/11/bits/functexcept.h \
/usr/include/c++/11/bits/cpp_type_traits.h \
/usr/include/c++/11/ext/type_traits.h \
/usr/include/c++/11/ext/numeric_traits.h \
/usr/include/c++/11/bits/stl_pair.h \
/usr/include/c++/11/bits/stl_iterator_base_types.h \
/usr/include/c++/11/bits/stl_iterator_base_funcs.h \
/usr/include/c++/11/bits/concept_check.h \
/usr/include/c++/11/debug/assertions.h \
/usr/include/c++/11/bits/stl_iterator.h \
/usr/include/c++/11/bits/ptr_traits.h /usr/include/c++/11/debug/debug.h \
/usr/include/c++/11/bits/predefined_ops.h /usr/include/c++/11/cstdint \
/usr/lib/gcc/aarch64-linux-gnu/11/include/stdint.h /usr/include/stdint.h \
/usr/include/aarch64-linux-gnu/bits/types.h \
/usr/include/aarch64-linux-gnu/bits/typesizes.h \
/usr/include/aarch64-linux-gnu/bits/time64.h \
/usr/include/aarch64-linux-gnu/bits/stdint-intn.h \
/usr/include/aarch64-linux-gnu/bits/stdint-uintn.h \
/usr/include/c++/11/bits/localefwd.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/c++locale.h \
/usr/include/c++/11/clocale /usr/include/locale.h \
/usr/include/aarch64-linux-gnu/bits/locale.h /usr/include/c++/11/cctype \
/usr/include/ctype.h /usr/include/aarch64-linux-gnu/bits/endian.h \
/usr/include/aarch64-linux-gnu/bits/endianness.h \
/usr/include/c++/11/bits/ios_base.h /usr/include/c++/11/ext/atomicity.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/gthr.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/gthr-default.h \
/usr/include/pthread.h /usr/include/sched.h \
/usr/include/aarch64-linux-gnu/bits/types/time_t.h \
/usr/include/aarch64-linux-gnu/bits/types/struct_timespec.h \
/usr/include/aarch64-linux-gnu/bits/sched.h \
/usr/include/aarch64-linux-gnu/bits/types/struct_sched_param.h \
/usr/include/aarch64-linux-gnu/bits/cpu-set.h /usr/include/time.h \
/usr/include/aarch64-linux-gnu/bits/time.h \
/usr/include/aarch64-linux-gnu/bits/timex.h \
/usr/include/aarch64-linux-gnu/bits/types/struct_timeval.h \
/usr/include/aarch64-linux-gnu/bits/types/clock_t.h \
/usr/include/aarch64-linux-gnu/bits/types/struct_tm.h \
/usr/include/aarch64-linux-gnu/bits/types/clockid_t.h \
/usr/include/aarch64-linux-gnu/bits/types/timer_t.h \
/usr/include/aarch64-linux-gnu/bits/types/struct_itimerspec.h \
/usr/include/aarch64-linux-gnu/bits/pthreadtypes.h \
/usr/include/aarch64-linux-gnu/bits/thread-shared-types.h \
/usr/include/aarch64-linux-gnu/bits/pthreadtypes-arch.h \
/usr/include/aarch64-linux-gnu/bits/atomic_wide_counter.h \
/usr/include/aarch64-linux-gnu/bits/struct_mutex.h \
/usr/include/aarch64-linux-gnu/bits/struct_rwlock.h \
/usr/include/aarch64-linux-gnu/bits/setjmp.h \
/usr/include/aarch64-linux-gnu/bits/types/__sigset_t.h \
/usr/include/aarch64-linux-gnu/bits/types/struct___jmp_buf_tag.h \
/usr/include/aarch64-linux-gnu/bits/pthread_stack_min-dynamic.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/atomic_word.h \
/usr/include/aarch64-linux-gnu/sys/single_threaded.h \
/usr/include/c++/11/bits/locale_classes.h /usr/include/c++/11/string \
/usr/include/c++/11/bits/allocator.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/c++allocator.h \
/usr/include/c++/11/ext/new_allocator.h \
/usr/include/c++/11/bits/ostream_insert.h \
/usr/include/c++/11/bits/cxxabi_forced.h \
/usr/include/c++/11/bits/stl_function.h \
/usr/include/c++/11/backward/binders.h \
/usr/include/c++/11/bits/range_access.h \
/usr/include/c++/11/initializer_list \
/usr/include/c++/11/bits/basic_string.h \
/usr/include/c++/11/ext/alloc_traits.h \
/usr/include/c++/11/bits/alloc_traits.h \
/usr/include/c++/11/bits/stl_construct.h /usr/include/c++/11/string_view \
/usr/include/c++/11/bits/functional_hash.h \
/usr/include/c++/11/bits/string_view.tcc \
/usr/include/c++/11/ext/string_conversions.h /usr/include/c++/11/cstdlib \
/usr/include/stdlib.h /usr/include/aarch64-linux-gnu/bits/waitflags.h \
/usr/include/aarch64-linux-gnu/bits/waitstatus.h \
/usr/include/aarch64-linux-gnu/sys/types.h /usr/include/endian.h \
/usr/include/aarch64-linux-gnu/bits/byteswap.h \
/usr/include/aarch64-linux-gnu/bits/uintn-identity.h \
/usr/include/aarch64-linux-gnu/sys/select.h \
/usr/include/aarch64-linux-gnu/bits/select.h \
/usr/include/aarch64-linux-gnu/bits/types/sigset_t.h \
/usr/include/alloca.h /usr/include/aarch64-linux-gnu/bits/stdlib-float.h \
/usr/include/c++/11/bits/std_abs.h /usr/include/c++/11/cstdio \
/usr/include/stdio.h \
/usr/include/aarch64-linux-gnu/bits/types/__fpos_t.h \
/usr/include/aarch64-linux-gnu/bits/types/__fpos64_t.h \
/usr/include/aarch64-linux-gnu/bits/types/struct_FILE.h \
/usr/include/aarch64-linux-gnu/bits/types/cookie_io_functions_t.h \
/usr/include/aarch64-linux-gnu/bits/stdio_lim.h \
/usr/include/c++/11/cerrno /usr/include/errno.h \
/usr/include/aarch64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \
/usr/include/aarch64-linux-gnu/asm/errno.h \
/usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
/usr/include/aarch64-linux-gnu/bits/types/error_t.h \
/usr/include/c++/11/bits/charconv.h \
/usr/include/c++/11/bits/basic_string.tcc \
/usr/include/c++/11/bits/locale_classes.tcc \
/usr/include/c++/11/system_error \
/usr/include/aarch64-linux-gnu/c++/11/bits/error_constants.h \
/usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \
/usr/include/c++/11/bits/streambuf.tcc \
/usr/include/c++/11/bits/basic_ios.h \
/usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \
/usr/include/wctype.h /usr/include/aarch64-linux-gnu/bits/wctype-wchar.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/ctype_base.h \
/usr/include/c++/11/bits/streambuf_iterator.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/ctype_inline.h \
/usr/include/c++/11/bits/locale_facets.tcc \
/usr/include/c++/11/bits/basic_ios.tcc \
/usr/include/c++/11/bits/ostream.tcc /usr/include/c++/11/istream \
/usr/include/c++/11/bits/istream.tcc /usr/include/c++/11/fstream \
/usr/include/c++/11/bits/codecvt.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/basic_file.h \
/usr/include/aarch64-linux-gnu/c++/11/bits/c++io.h \
/usr/include/c++/11/bits/fstream.tcc /usr/include/c++/11/sstream \
/usr/include/c++/11/bits/sstream.tcc
This diff is collapsed.
......@@ -130,7 +130,11 @@ CMakeFiles/main.dir/src/mqtt_controller.cc.o: \
/usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
/usr/include/aarch64-linux-gnu/bits/types/error_t.h \
/usr/include/c++/11/bits/charconv.h \
/usr/include/c++/11/bits/basic_string.tcc /usr/include/c++/11/functional \
/usr/include/c++/11/bits/basic_string.tcc /usr/include/c++/11/vector \
/usr/include/c++/11/bits/stl_uninitialized.h \
/usr/include/c++/11/bits/stl_vector.h \
/usr/include/c++/11/bits/stl_bvector.h \
/usr/include/c++/11/bits/vector.tcc /usr/include/c++/11/functional \
/usr/include/c++/11/tuple /usr/include/c++/11/utility \
/usr/include/c++/11/bits/stl_relops.h /usr/include/c++/11/array \
/usr/include/c++/11/bits/uses_allocator.h \
......@@ -143,11 +147,7 @@ CMakeFiles/main.dir/src/mqtt_controller.cc.o: \
/usr/include/c++/11/bits/enable_special_members.h \
/usr/include/c++/11/bits/node_handle.h \
/usr/include/c++/11/bits/unordered_map.h \
/usr/include/c++/11/bits/erase_if.h /usr/include/c++/11/vector \
/usr/include/c++/11/bits/stl_uninitialized.h \
/usr/include/c++/11/bits/stl_vector.h \
/usr/include/c++/11/bits/stl_bvector.h \
/usr/include/c++/11/bits/vector.tcc /usr/include/c++/11/bits/stl_algo.h \
/usr/include/c++/11/bits/erase_if.h /usr/include/c++/11/bits/stl_algo.h \
/usr/include/c++/11/bits/algorithmfwd.h \
/usr/include/c++/11/bits/stl_heap.h \
/usr/include/c++/11/bits/stl_tempbuf.h \
......@@ -168,22 +168,23 @@ CMakeFiles/main.dir/src/mqtt_controller.cc.o: \
/usr/include/c++/11/backward/auto_ptr.h \
/usr/include/c++/11/pstl/glue_memory_defs.h \
/usr/include/c++/11/pstl/execution_defs.h /usr/include/c++/11/atomic \
/usr/include/mqtt/async_client.h /usr/include/MQTTAsync.h \
/usr/include/MQTTExportDeclarations.h /usr/include/MQTTProperties.h \
/usr/include/MQTTReasonCodes.h /usr/include/MQTTSubscribeOpts.h \
/usr/include/MQTTClientPersistence.h /usr/include/mqtt/types.h \
/usr/include/c++/11/chrono /usr/include/c++/11/ratio \
/usr/include/c++/11/limits /usr/include/c++/11/ctime \
/usr/include/c++/11/bits/parse_numbers.h /usr/include/mqtt/token.h \
/usr/include/c++/11/mutex /usr/include/c++/11/chrono \
/usr/include/c++/11/ratio /usr/include/c++/11/limits \
/usr/include/c++/11/ctime /usr/include/c++/11/bits/parse_numbers.h \
/usr/include/c++/11/system_error \
/usr/include/aarch64-linux-gnu/c++/11/bits/error_constants.h \
/usr/include/c++/11/stdexcept /usr/include/c++/11/bits/std_mutex.h \
/usr/include/c++/11/bits/unique_lock.h /usr/include/mqtt/async_client.h \
/usr/include/MQTTAsync.h /usr/include/MQTTExportDeclarations.h \
/usr/include/MQTTProperties.h /usr/include/MQTTReasonCodes.h \
/usr/include/MQTTSubscribeOpts.h /usr/include/MQTTClientPersistence.h \
/usr/include/mqtt/types.h /usr/include/mqtt/token.h \
/usr/include/mqtt/iaction_listener.h /usr/include/mqtt/exception.h \
/usr/include/c++/11/iostream /usr/include/c++/11/ostream \
/usr/include/c++/11/ios /usr/include/c++/11/bits/ios_base.h \
/usr/include/c++/11/bits/locale_classes.h \
/usr/include/c++/11/bits/locale_classes.tcc \
/usr/include/c++/11/system_error \
/usr/include/aarch64-linux-gnu/c++/11/bits/error_constants.h \
/usr/include/c++/11/stdexcept /usr/include/c++/11/streambuf \
/usr/include/c++/11/bits/streambuf.tcc \
/usr/include/c++/11/streambuf /usr/include/c++/11/bits/streambuf.tcc \
/usr/include/c++/11/bits/basic_ios.h \
/usr/include/c++/11/bits/locale_facets.h /usr/include/c++/11/cwctype \
/usr/include/wctype.h /usr/include/aarch64-linux-gnu/bits/wctype-wchar.h \
......@@ -201,9 +202,7 @@ CMakeFiles/main.dir/src/mqtt_controller.cc.o: \
/usr/include/c++/11/bits/stl_multimap.h \
/usr/include/mqtt/server_response.h /usr/include/c++/11/thread \
/usr/include/c++/11/bits/std_thread.h \
/usr/include/c++/11/bits/this_thread_sleep.h /usr/include/c++/11/mutex \
/usr/include/c++/11/bits/std_mutex.h \
/usr/include/c++/11/bits/unique_lock.h \
/usr/include/c++/11/bits/this_thread_sleep.h \
/usr/include/c++/11/condition_variable \
/usr/include/mqtt/create_options.h /usr/include/mqtt/delivery_token.h \
/usr/include/mqtt/message.h /usr/include/mqtt/iclient_persistence.h \
......
This diff is collapsed.
......@@ -217,6 +217,30 @@ paho-mqttpp3-shared/fast:
$(MAKE) $(MAKESILENT) -f third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/build.make third_party/paho.mqtt.cpp/src/CMakeFiles/paho-mqttpp3-shared.dir/build
.PHONY : paho-mqttpp3-shared/fast
src/file_operations.o: src/file_operations.cc.o
.PHONY : src/file_operations.o
# target to build an object file
src/file_operations.cc.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/file_operations.cc.o
.PHONY : src/file_operations.cc.o
src/file_operations.i: src/file_operations.cc.i
.PHONY : src/file_operations.i
# target to preprocess a source file
src/file_operations.cc.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/file_operations.cc.i
.PHONY : src/file_operations.cc.i
src/file_operations.s: src/file_operations.cc.s
.PHONY : src/file_operations.s
# target to generate assembly for a file
src/file_operations.cc.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/file_operations.cc.s
.PHONY : src/file_operations.cc.s
src/main.o: src/main.cc.o
.PHONY : src/main.o
......@@ -265,6 +289,30 @@ src/mqtt_controller.cc.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/mqtt_controller.cc.s
.PHONY : src/mqtt_controller.cc.s
src/mqtt_used.o: src/mqtt_used.cc.o
.PHONY : src/mqtt_used.o
# target to build an object file
src/mqtt_used.cc.o:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/mqtt_used.cc.o
.PHONY : src/mqtt_used.cc.o
src/mqtt_used.i: src/mqtt_used.cc.i
.PHONY : src/mqtt_used.i
# target to preprocess a source file
src/mqtt_used.cc.i:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/mqtt_used.cc.i
.PHONY : src/mqtt_used.cc.i
src/mqtt_used.s: src/mqtt_used.cc.s
.PHONY : src/mqtt_used.s
# target to generate assembly for a file
src/mqtt_used.cc.s:
$(MAKE) $(MAKESILENT) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/src/mqtt_used.cc.s
.PHONY : src/mqtt_used.cc.s
src/serial_port.o: src/serial_port.cc.o
.PHONY : src/serial_port.o
......@@ -306,12 +354,18 @@ help:
@echo "... test"
@echo "... main"
@echo "... paho-mqttpp3-shared"
@echo "... src/file_operations.o"
@echo "... src/file_operations.i"
@echo "... src/file_operations.s"
@echo "... src/main.o"
@echo "... src/main.i"
@echo "... src/main.s"
@echo "... src/mqtt_controller.o"
@echo "... src/mqtt_controller.i"
@echo "... src/mqtt_controller.s"
@echo "... src/mqtt_used.o"
@echo "... src/mqtt_used.i"
@echo "... src/mqtt_used.s"
@echo "... src/serial_port.o"
@echo "... src/serial_port.i"
@echo "... src/serial_port.s"
......
No preview for this file type
CMAKE_PROGRESS_1 = 5
CMAKE_PROGRESS_2 = 6
CMAKE_PROGRESS_3 = 7
CMAKE_PROGRESS_4 = 8
CMAKE_PROGRESS_5 = 9
CMAKE_PROGRESS_6 = 10
CMAKE_PROGRESS_7 = 11
CMAKE_PROGRESS_8 = 12
CMAKE_PROGRESS_9 = 13
CMAKE_PROGRESS_10 = 14
CMAKE_PROGRESS_11 = 15
CMAKE_PROGRESS_12 = 16
CMAKE_PROGRESS_13 = 17
CMAKE_PROGRESS_14 = 18
CMAKE_PROGRESS_15 = 19
CMAKE_PROGRESS_16 = 20
CMAKE_PROGRESS_17 = 21
CMAKE_PROGRESS_1 = 7
CMAKE_PROGRESS_2 = 8
CMAKE_PROGRESS_3 = 9
CMAKE_PROGRESS_4 = 10
CMAKE_PROGRESS_5 = 11
CMAKE_PROGRESS_6 = 12
CMAKE_PROGRESS_7 = 13
CMAKE_PROGRESS_8 = 14
CMAKE_PROGRESS_9 = 15
CMAKE_PROGRESS_10 = 16
CMAKE_PROGRESS_11 = 17
CMAKE_PROGRESS_12 = 18
CMAKE_PROGRESS_13 = 19
CMAKE_PROGRESS_14 = 20
CMAKE_PROGRESS_15 = 21
CMAKE_PROGRESS_16 = 22
CMAKE_PROGRESS_17 = 23
......@@ -19,7 +19,7 @@ def get_local_ip():
def write_to_file(data):
try:
# 打开文件,模式为写入模式(会清空已有内容)
with open("./master/Deviceld.txt", "w", encoding="utf-8") as file:
with open("/home/orangepi/car/master/Deviceld.txt", "w", encoding="utf-8") as file:
file.write(data)
print("数据已成功写入 Deviceld.txt")
except Exception as e:
......@@ -28,8 +28,8 @@ def write_to_file(data):
def read_from_file():
try:
if os.path.exists("./master/Deviceld.txt"):
with open("./master/Deviceld.txt", "r", encoding="utf-8") as file:
if os.path.exists("/home/orangepi/car/master/Deviceld.txt"):
with open("/home/orangepi/car/master/Deviceld.txt", "r", encoding="utf-8") as file:
return file.read()
return "文件内容为空。"
except Exception as e:
......
#pragma once
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
class FileReader{
private:
std::string _filePath;
std::ifstream _fileStream;
void close();
public:
// 构造函数,传入文件路径
FileReader(const std::string& path) : _filePath(path) {}
// 打开文件
bool open();
// 读取整个文件内容为字符串
std::string readAll();
// 析构函数确保文件关闭
~FileReader() {
close();
}
};
\ No newline at end of file
// mqtt_controller.hpp
#ifndef MQTT_CONTROLLER_HPP
#define MQTT_CONTROLLER_HPP
#include <string>
#include <vector>
#include <functional>
#include <memory>
#include <atomic>
#include <mqtt/async_client.h> // 引入Paho C++库头文件
#include <mutex>
#include <unordered_map>
#include <mqtt/async_client.h>
class MqttController {
public:
// 定义消息回调函数的类型,方便用户使用
// 定义回调函数类型
using MessageCallback = std::function<void(const std::string& topic, const std::string& payload)>;
using ConnectionSuccessCallback = std::function<void()>;
using ConnectionLostCallback = std::function<void(const std::string& cause)>;
// 构造函数:需要代理地址和客户端ID
MqttController(const std::string& broker_address, const std::string& client_id);
......@@ -23,8 +27,11 @@ public:
MqttController& operator=(const MqttController&) = delete;
// 连接到MQTT代理
// @return 连接成功或正在连接返回true
bool connect(const std::string& username, const std::string& password);
// @param username 用户名
// @param password 密码
// @param automatic_reconnect 是否启用自动重连
// @return 连接请求已发送返回true,立即出错返回false
bool connect(const std::string& username, const std::string& password, bool automatic_reconnect = true);
// 断开连接
void disconnect();
......@@ -32,29 +39,40 @@ public:
// 检查客户端是否已连接
bool isConnected() const;
// 订阅一个主题,并设置一个专门处理该主题消息的回调函数
void subscribe(const std::string& topic, MessageCallback callback);
// 设置连接成功的回调
void setOnConnectSuccessCallback(ConnectionSuccessCallback cb);
// 设置连接丢失的回调
void setOnConnectionLostCallback(ConnectionLostCallback cb);
// 订阅一个主题
void subscribe(const std::string& topic, int qos, MessageCallback callback);
// 订阅多个主题(使用相同的回调和QoS)
void subscribe(const std::vector<std::string>& topics, int qos, MessageCallback callback);
// 取消订阅
void unsubscribe(const std::string& topic);
// 发布消息
void publish(const std::string& topic, const std::string& payload, int qos = 1, bool retained = false);
private:
// Paho库需要一个回调处理类,我们将其作为内部类以实现良好封装
// 内部类,用于处理来自Paho库的回调
class CallbackHandler : public virtual mqtt::callback {
public:
CallbackHandler(MqttController& controller) : controller_(controller) {}
private:
// 当连接成功建立时调用
void connected(const std::string& cause) override;
// 当连接丢失时调用
void connection_lost(const std::string& cause) override;
// 当订阅的消息到达时调用
void message_arrived(mqtt::const_message_ptr msg) override;
MqttController& controller_;
};
// 静态辅助函数,用于MQTT主题通配符匹配
static bool topic_matches_sub(const std::string& sub, const std::string& topic);
// Paho异步客户端的智能指针
std::unique_ptr<mqtt::async_client> client_;
// 回调处理类的实例
......@@ -63,7 +81,13 @@ private:
std::atomic<bool> is_connected_;
// 存储用户为特定主题设置的回调函数
MessageCallback message_callback_;
std::unordered_map<std::string, MessageCallback> topic_callbacks_;
// 互斥锁,用于保护回调映射的线程安全访问
std::mutex callbacks_mutex_;
// 存储连接状态的回调
ConnectionSuccessCallback on_connect_success_cb_;
ConnectionLostCallback on_connection_lost_cb_;
};
#endif // MQTT_CONTROLLER_HPP
\ No newline at end of file
#pragma once
#include "mqtt_controller.hpp" // 假设之前的 MqttController 类代码可用
#include <unordered_map>
#include <functional>
#include <vector>
#include "nlohmann/json.hpp"
class MqttTopicsHandler : public MqttController {
public:
using JsonCallback = std::function<void(const std::string& topic, const nlohmann::json& json_payload)>;
using SimpleJsonCallback = std::function<void(const nlohmann::json& json_payload)>;
// 构造函数:启动工作线程
MqttTopicsHandler(const std::string& broker_address, const std::string& client_id);
// 析构函数:停止工作线程
~MqttTopicsHandler();
// ... 其他方法保持不变 ...
void InitBaseSubscription();
void AddSubscription(const std::string& topic, JsonCallback callback);
void AddSubscription(const std::string& topic, SimpleJsonCallback callback);
void AddSubscriptions(const std::vector<std::string>& topics, SimpleJsonCallback common_callback);
void RemoveSubscription(const std::string& topic);
void PublishJson(const std::string& topic, const nlohmann::json& json_payload, int qos = 1, bool retained = false);
private:
// 将订阅请求封装成一个任务
void post_task(std::function<void()> task);
// 工作线程的执行函数
void worker_thread_func();
std::unordered_map<std::string, JsonCallback> active_subscriptions_;
// --- 新增的成员变量 ---
std::queue<std::function<void()>> task_queue_; // 任务队列
std::mutex queue_mutex_; // 保护队列的互斥锁
std::condition_variable condition_; // 用于唤醒工作线程的条件变量
std::thread worker_thread_; // 工作线程
std::atomic<bool> stop_worker_{false}; // 控制线程停止的原子标志
};
\ No newline at end of file
#include "file_operations.hpp"
// 打开文件
bool FileReader::open() {
_fileStream.open(_filePath, std::ios::in);
if (!_fileStream.is_open()) {
std::cerr << "Failed to open file: " << _filePath << std::endl;
return false;
}
return true;
}
// 读取整个文件内容为字符串
std::string FileReader::readAll() {
if (!_fileStream.is_open()) {
throw std::runtime_error("File not opened");
}
std::ostringstream ss;
ss << _fileStream.rdbuf();
return ss.str();
}
// 关闭文件
void FileReader::close() {
if (_fileStream.is_open()) {
_fileStream.close();
}
}
This diff is collapsed.
// mqtt_controller.cpp
#include "mqtt_controller.hpp"
#include <iostream>
#include <utility>
// 构造函数:初始化客户端和回调处理器
MqttController::MqttController(const std::string& broker_address, const std::string& client_id)
......@@ -18,14 +18,16 @@ MqttController::~MqttController() {
}
// 连接到代理
bool MqttController::connect(const std::string& username, const std::string& password) {
bool MqttController::connect(const std::string& username, const std::string& password, bool automatic_reconnect) {
if (isConnected()) {
return true;
}
mqtt::connect_options conn_opts;
conn_opts.set_keep_alive_interval(30);
conn_opts.set_keep_alive_interval(60);
conn_opts.set_clean_session(true);
conn_opts.set_automatic_reconnect(automatic_reconnect); // 设置自动重连
if (!username.empty()) {
conn_opts.set_user_name(username);
conn_opts.set_password(password);
......@@ -34,9 +36,10 @@ bool MqttController::connect(const std::string& username, const std::string& pas
try {
std::cout << "正在连接到 MQTT 代理..." << std::endl;
// connect是异步的,它会立即返回。连接过程在后台进行。
client_->connect(conn_opts);
client_->connect(conn_opts)->wait(); // 使用 wait() 使其变为同步调用,简化示例
} catch (const mqtt::exception& exc) {
std::cerr << "错误:连接时发生异常 - " << exc.what() << std::endl;
is_connected_ = false; // 确保状态正确
return false;
}
return true;
......@@ -44,39 +47,102 @@ bool MqttController::connect(const std::string& username, const std::string& pas
// 断开连接
void MqttController::disconnect() {
if (isConnected() || client_->is_connected()) {
if (isConnected()) {
try {
std::cout << "正在断开与 MQTT 代理的连接..." << std::endl;
is_connected_ = false;
// disconnect是异步的,但我们通常希望等待它完成
// disconnect是异步的,我们等待它完成
client_->disconnect()->wait();
std::cout << "已断开连接。" << std::endl;
} catch (const mqtt::exception& exc) {
std::cerr << "错误:断开连接时发生异常 - " << exc.what() << std::endl;
}
}
is_connected_ = false; // 确保状态被更新
}
bool MqttController::isConnected() const {
return is_connected_;
}
void MqttController::setOnConnectSuccessCallback(ConnectionSuccessCallback cb) {
on_connect_success_cb_ = std::move(cb);
}
void MqttController::setOnConnectionLostCallback(ConnectionLostCallback cb) {
on_connection_lost_cb_ = std::move(cb);
}
// 订阅主题,并为这个主题的后续消息设置回调
void MqttController::subscribe(const std::string& topic, MessageCallback callback) {
void MqttController::subscribe(const std::string& topic, int qos, MessageCallback callback) {
if (!isConnected()) {
std::cerr << "错误:未连接,无法订阅主题" << std::endl;
std::cerr << "错误:未连接,无法订阅主题 \"" << topic << "\"" << std::endl;
return;
}
std::lock_guard<std::mutex> lock(callbacks_mutex_);
topic_callbacks_[topic] = std::move(callback);
std::cout << "正在订阅主题: " << topic << std::endl;
message_callback_ = callback; // 保存回调函数
client_->subscribe(topic, 1); // QoS 等级为 1
try {
std::cout << "正在订阅主题: " << topic << std::endl;
client_->subscribe(topic, qos);
} catch (const mqtt::exception& exc) {
std::cerr << "订阅错误: " << exc.what() << std::endl;
// 如果订阅失败,移除回调以避免混淆
topic_callbacks_.erase(topic);
}
}
void MqttController::subscribe(const std::vector<std::string>& topics, int qos, MessageCallback callback) {
if (!isConnected()) {
std::cerr << "未连接,无法订阅多个主题" << std::endl;
return;
}
std::lock_guard<std::mutex> lock(callbacks_mutex_);
for (const auto& topic : topics) {
topic_callbacks_[topic] = callback; // 使用相同的回调
}
// Paho V1.2.0及以上版本支持批量订阅
auto topic_collection = std::make_shared<mqtt::string_collection>();
for (const auto& topic : topics) {
topic_collection->push_back(topic);
}
std::vector<int> qos_levels(topics.size(), qos);
try {
std::cout << "正在批量订阅主题..." << std::endl;
client_->subscribe(topic_collection, qos_levels);
} catch (const mqtt::exception& exc) {
std::cerr << "批量订阅错误: " << exc.what() << std::endl;
// 如果失败,移除所有刚刚添加的回调
for (const auto& topic : topics) {
topic_callbacks_.erase(topic);
}
}
}
void MqttController::unsubscribe(const std::string& topic) {
if (!isConnected()) {
std::cerr << "错误:未连接,无法取消订阅主题 \"" << topic << "\"" << std::endl;
return;
}
std::lock_guard<std::mutex> lock(callbacks_mutex_);
topic_callbacks_.erase(topic);
try {
std::cout << "正在取消订阅主题: " << topic << std::endl;
client_->unsubscribe(topic);
} catch (const mqtt::exception& exc) {
std::cerr << "取消订阅错误: " << exc.what() << std::endl;
}
}
// 发布消息
void MqttController::publish(const std::string& topic, const std::string& payload, int qos, bool retained) {
if (!isConnected()) {
std::cerr << "错误:未连接,无法发布消息" << std::endl;
std::cerr << "错误:未连接,无法发布消息到主题 \"" << topic << "\"" << std::endl;
return;
}
......@@ -92,23 +158,73 @@ void MqttController::publish(const std::string& topic, const std::string& payloa
// --- 内部回调处理类的实现 ---
// 连接成功时,由Paho库的后台线程调用
void MqttController::CallbackHandler::connected(const std::string& cause) {
void MqttController::CallbackHandler::connected(const std::string& /*cause*/) {
std::cout << "连接成功!" << std::endl;
controller_.is_connected_ = true;
if (controller_.on_connect_success_cb_) {
controller_.on_connect_success_cb_();
}
}
// 连接丢失时,由Paho库的后台线程调用
void MqttController::CallbackHandler::connection_lost(const std::string& cause) {
std::cerr << "错误:连接已丢失。原因: " << cause << std::endl;
controller_.is_connected_ = false;
if (controller_.on_connection_lost_cb_) {
controller_.on_connection_lost_cb_(cause);
}
}
// 收到消息时,由Paho库的后台线程调用
void MqttController::CallbackHandler::message_arrived(mqtt::const_message_ptr msg) {
// 检查用户是否设置了回调函数
if (controller_.message_callback_) {
// 调用用户设置的C++回调函数,将消息传递出去
controller_.message_callback_(msg->get_topic(), msg->to_string());
std::lock_guard<std::mutex> lock(controller_.callbacks_mutex_);
const std::string received_topic = msg->get_topic();
const std::string payload = msg->to_string();
bool matched = false;
// 遍历所有注册的回调,查找匹配的订阅(支持通配符)
for (const auto& pair : controller_.topic_callbacks_) {
const std::string& subscribed_topic = pair.first;
if (topic_matches_sub(subscribed_topic, received_topic)) {
if (pair.second) {
pair.second(received_topic, payload);
matched = true;
}
}
}
if (!matched) {
std::cout << "收到消息,但未匹配任何已注册的回调: " << received_topic << std::endl;
}
}
// --- 静态通配符匹配函数 ---
bool MqttController::topic_matches_sub(const std::string& sub, const std::string& topic) {
auto sub_it = sub.begin();
auto topic_it = topic.begin();
while (sub_it != sub.end() && topic_it != topic.end()) {
if (*sub_it == *topic_it) {
sub_it++;
topic_it++;
} else if (*sub_it == '+') {
// '+' 匹配一个层级
sub_it++;
while (topic_it != topic.end() && *topic_it != '/') {
topic_it++;
}
} else if (*sub_it == '#') {
// '#' 必须是订阅的最后一个字符,匹配所有剩余层级
return sub_it + 1 == sub.end();
} else {
return false;
}
}
// 如果订阅以 "/#" 结尾,它可以匹配没有后续层级的主题
if (topic_it == topic.end() && sub_it != sub.end()) {
if (*sub_it == '/' && (sub_it + 1) != sub.end() && *(sub_it + 1) == '#') {
return (sub_it + 2) == sub.end();
}
}
return sub_it == sub.end() && topic_it == topic.end();
}
\ No newline at end of file
#include "mqtt_controller.hpp"
#include <iostream>
#include "mqtt_used.hpp"
// 构造函数:启动工作线程
MqttTopicsHandler::MqttTopicsHandler(const std::string& broker_address, const std::string& client_id)
: MqttController(broker_address, client_id) {
worker_thread_ = std::thread(&MqttTopicsHandler::worker_thread_func, this);
}
// 析构函数:优雅地停止工作线程
MqttTopicsHandler::~MqttTopicsHandler() {
stop_worker_ = true;
condition_.notify_one(); // 唤醒线程,让它退出循环
if (worker_thread_.joinable()) {
worker_thread_.join();
}
}
// 将任务放入队列
void MqttTopicsHandler::post_task(std::function<void()> task) {
{
std::lock_guard<std::mutex> lock(queue_mutex_);
task_queue_.push(std::move(task));
}
condition_.notify_one(); // 唤醒工作线程来处理新任务
}
// 工作线程的主循环
void MqttTopicsHandler::worker_thread_func() {
while (!stop_worker_) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(queue_mutex_);
// 等待直到队列不为空或收到停止信号
condition_.wait(lock, [this] { return !task_queue_.empty() || stop_worker_; });
if (stop_worker_) {
return;
}
task = std::move(task_queue_.front());
task_queue_.pop();
}
if (task) {
task(); // 在工作线程中执行任务
}
}
}
// **关键修改**:在 AddSubscription 中,如果是在回调中被调用,则将实际订阅操作 post 到工作线程
// 为了简化,我们统一将实际的订阅操作都 post 出去
void MqttTopicsHandler::AddSubscription(const std::string& topic, JsonCallback callback) {
if (active_subscriptions_.count(topic)) {
std::cerr << "警告:主题 \"" << topic << "\" 的订阅已存在,将被覆盖。" << std::endl;
}
auto wrapped_callback = [callback](const std::string& received_topic, const std::string& payload) {
try {
nlohmann::json j = nlohmann::json::parse(payload);
callback(received_topic, j);
} catch (const nlohmann::json::parse_error& e) {
std::cerr << "在主题 \"" << received_topic << "\" 上发生JSON解析错误: " << e.what() << std::endl;
}
};
active_subscriptions_[topic] = std::move(callback);
// 将真正的 subscribe 调用封装成一个任务,交给工作线程执行
post_task([this, topic, wrapped_callback]() {
std::cout << "工作线程:正在执行订阅主题: " << topic << std::endl;
// 假设 QoS 为 1
subscribe(topic, 1, wrapped_callback);
});
}
// 其他方法保持类似逻辑,或者如果它们不涉及阻塞调用,则无需更改
// (此处省略了其他方法的代码,它们与之前版本相同)
// ...
// ... AddSubscription(SimpleJsonCallback), AddSubscriptions, RemoveSubscription, PublishJson 的实现 ...
// ... 为了简洁,这里不再重复贴出,它们的实现无需改动,因为它们最终都调用了上面的 AddSubscription(...)
// ... 唯一需要注意的是,RemoveSubscription 内部的 Unsubscribe 也应该被 post_task
void MqttTopicsHandler::RemoveSubscription(const std::string& topic) {
if (active_subscriptions_.erase(topic) > 0) {
post_task([this, topic]() {
unsubscribe(topic);
std::cout << "工作线程:已取消订阅主题: " << topic << std::endl;
});
} else {
std::cerr << "无法移除订阅:主题 \"" << topic << "\" 未被订阅。" << std::endl;
}
}
// ... InitBaseSubscription 和 PublishJson 的实现保持不变
void MqttTopicsHandler::InitBaseSubscription() {
AddSubscription("ser/dev", [](const nlohmann::json& json) {
try {
std::cout << "[收到系统状态] " << json.dump(2) << std::endl;
} catch (const std::exception& e) {
std::cerr << "处理系统状态时出错: " << e.what() << std::endl;
}
});
}
void MqttTopicsHandler::PublishJson(
const std::string& topic,
const nlohmann::json& json_payload,
int qos,
bool retained) {
try {
publish(topic, json_payload.dump(), qos, retained);
} catch (const std::exception& e) {
std::cerr << "向主题 \"" << topic << "\" 发布 JSON 失败: " << e.what() << std::endl;
}
}
void MqttTopicsHandler::AddSubscription(const std::string& topic, SimpleJsonCallback callback) {
JsonCallback full_callback = [callback](const std::string& /*topic*/, const nlohmann::json& json) {
callback(json);
};
AddSubscription(topic, std::move(full_callback));
}
void MqttTopicsHandler::AddSubscriptions(const std::vector<std::string>& topics, SimpleJsonCallback common_callback) {
for (const auto& topic : topics) {
AddSubscription(topic, common_callback);
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment