OpenHarmony无人机MAVSDK开源库适配方案分享

MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK,支持多种语言如 C/C++、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。

MAVLink 是一种非常轻量级的消息传递协议,用于与无人机(以及机载无人机组件之间)进行通信。MAVLink 遵循现代混合发布-订阅和点对点设计模式,数据流作为主题发送/发布,而任务协议或参数协议等配置子协议是点对点的重传。其中 MAVLink 1 每个数据包只有 8 个字节的开销,包括开始标志和数据包丢弃检测。MAVLink 2 只有 14 字节的开销。由于 MAVLink 不需要任何额外的成帧,因此非常适合通信带宽非常有限的应用程序。

当我们想要在 OpenHarmony 上做无人机相关工作时,在通信方面需要面临 MAVLink 的移植适配工作。因此接下来我们将分享如何将 MAVSDK 移植至 OpenHarmony 系统当中。


MAVSDK Github 开源地址:GitHub - mavlink/MAVSDK: API and library for MAVLink compatible systems written in C++17

接下来讲解如何把 MAVSDK 开源库添加至 OpenHarmony 工程中进行编译。(此方法与其他开源库移植方法基本一致)

本次移植通过新建子系统 mavsdk,在子系统下添加名为 mavsdk 的组件,并在该组件下添加名为 MAVSDK 的模块,OpenHarmony 系统层级顺序如下:子系统-> 组件-> 模块,下文中将都以此为顺序进行叙述。

表 1:添加到工程后的目录结构

路径描述
ohos/build/subsystem_config.json子系统配置
ohos/productdefine/common/products/ohos-arm64.json板级相关
ohos/third_party/MAVSDK/bundle.json在子系统中添加组件配置
ohos/third_party/MAVSDK/BUILD.gn三方库模块化,将其加入组件中的 gn 文件

subsystem_config.json

首先在 ohos/build/subsystem 中添加 subsystem 节点。

"mavsdk": {   "path": "third_party/MAVSDK", "name": "mavsdk"}

ohos-arm64.json 文件

在 ohos/productdefine/common/products/ohos-arm64.json 文件中添加板级相关的信息。

"mavsdk:MAVSDK":{} 

如下图所示:

Bundle.json 文件

在 ohos/third 目录下添加 bundle.json 文件,以便系统可以添加名为 MAVSDK 的组件。

对于此文件要点如注释所见(编译时去除注释以保证配置文件整洁性)

{"name": "@ohos/MAVSDK","description": "","version": "","license": "","publishAs": "","segment": {"destPath": "third_party/MAVSDK"},"dirs": {},"scripts": {},"readmePath": {},"component": {"name": "MAVSDK","subsystem": "mavsdk","syscap": [],"features": [],"adapted_system_type": [],"rom": "","ram": "","deps": {"components": [ "jsoncpp","zlib"//此处添加了要用的三方库,后续的build.gn中还会有所体现。],"third_party": ["jsoncpp","zlib"]},"build": {"sub_component": [  "//third_party/mavsdk:MAVSDK","//third_party/mavsdk:mavsdk_test"],//此处添加了接下来要编译的组件,一个是代码主仓组件,一个是代码的测试文件组件"inner_kits": [],"test": ["//third_party/mavsdk:mavsdk_test"]}}}

BUILD.gn 文件

在完成上述步骤后,下面需要在 ohos/third 目录添加 BUILD.gn,根据不同的系统生成静态或者动态库,注意点如下:

文件作用
build.make生成目标的源文件
depend.make需要依赖的其他 C 源文件
flags.makecflags 相关的一些标志
link.txt链接库相关信息

① 注意移植时的 cflags、cflags 应从原始的编译文件(例如 cmake 过程中 build 的生成文件:在 cmake 生成 makefile 的过程中分析 build.make、depend.make、flags.make、link.txt 等得出三方库对应的依赖关系)中获取相关的标志位

② 注意移植的源文件及头文件地址可以使用当前 build.gn 所在路径下相对位置,例如/src 与 build.gn 在同一路径下则路径可以直接应用 src/....

③ 注意 deps 若引用的是组件内的其他模块,例如其他 build.gn 文件中的组件或当前 build.gn 中位于此 deps 前的其他组件可以使用 ”:module 进行模块依赖,若是引用组件外的其他组件则需要使用 ”bundle

import("//build/ohos.gni")  
import("//build/test.gni")config("mavsdk_cflag_config") {#编译时的标志位cflags = [  "-fexceptions","-Wextra","-Wshadow","-Wno-strict-aliasing","-Wformat=2","-Wextra","-Wno-unused-lambda-capture","-Wno-pragmas","-Wno-unknown-warning-option","-Wduplicated-cond","-Wnull-dereference","-Wduplicated-branches","-Wlogical-op", "-Wno-old-style-cast","-pthread",]cflags_cc = [ "-frtti" ] #fix:[OHOS ERROR] ../../prebuilts/clang/ohos/linux-x86_64/llvm/bin/../include/libcxx-ohos/include/c++/v1/memory:3566:16: error: use of dynamic_cast requires -frttildflags = [ "-fPIC","-g","-shared","-Wl","-soname" ]
}ohos_source_set("libmavsdk_source") {configs = [":mavsdk_cflag_config"]deps = [ "//third_party/curl:curl"  ] #需要包含的源文件sources = ["src/mavsdk/core/call_every_handler.cpp" ,"src/mavsdk/core/connection.cpp" ,"src/mavsdk/core/connection_result.cpp" ,"src/mavsdk/core/curl_wrapper.cpp" ,"src/mavsdk/core/crc32.cpp" ,"src/mavsdk/core/system.cpp" ,"src/mavsdk/core/system_impl.cpp" ,"src/mavsdk/core/fs.cpp" ,"src/mavsdk/core/mavsdk.cpp" ,"src/mavsdk/core/mavsdk_impl.cpp" ,"src/mavsdk/core/http_loader.cpp" ,"src/mavsdk/core/mavlink_channels.cpp" ,"src/mavsdk/core/mavlink_command_receiver.cpp" ,"src/mavsdk/core/mavlink_command_sender.cpp" ,"src/mavsdk/core/mavlink_ftp.cpp" ,"src/mavsdk/core/mavlink_mission_transfer.cpp" ,"src/mavsdk/core/mavlink_parameters.cpp" ,"src/mavsdk/core/mavlink_receiver.cpp" ,"src/mavsdk/core/mavlink_request_message_handler.cpp" ,"src/mavsdk/core/mavlink_statustext_handler.cpp" ,"src/mavsdk/core/mavlink_message_handler.cpp" ,"src/mavsdk/core/ping.cpp" ,"src/mavsdk/core/plugin_impl_base.cpp" ,"src/mavsdk/core/serial_connection.cpp" ,"src/mavsdk/core/tcp_connection.cpp" ,"src/mavsdk/core/timeout_handler.cpp" ,"src/mavsdk/core/udp_connection.cpp" ,"src/mavsdk/core/log.cpp" ,"src/mavsdk/core/cli_arg.cpp" ,"src/mavsdk/core/geometry.cpp" ,"src/mavsdk/core/request_message.cpp" ,"src/mavsdk/core/mavsdk_time.cpp" ,"src/mavsdk/core/timesync.cpp" ,"src/mavsdk/plugins/action/action.cpp" ,"src/mavsdk/plugins/action/action_impl.cpp" ,"src/mavsdk/plugins/action_server/action_server.cpp" ,"src/mavsdk/plugins/action_server/action_server_impl.cpp" ,"src/mavsdk/plugins/calibration/calibration.cpp" ,"src/mavsdk/plugins/calibration/calibration_impl.cpp" ,"src/mavsdk/plugins/calibration/calibration_statustext_parser.cpp" ,"src/mavsdk/plugins/camera/camera.cpp" ,"src/mavsdk/plugins/camera/camera_impl.cpp" ,"src/mavsdk/plugins/camera/camera_definition.cpp" ,"src/mavsdk/plugins/camera/camera_definition_files/generated/camera_definition_files.cpp" ,"src/mavsdk/plugins/component_information/component_information.cpp" ,"src/mavsdk/plugins/component_information/component_information_impl.cpp" ,"src/mavsdk/plugins/component_information_server/component_information_server.cpp" ,"src/mavsdk/plugins/component_information_server/component_information_server_impl.cpp" ,"src/mavsdk/plugins/failure/failure.cpp" ,"src/mavsdk/plugins/failure/failure_impl.cpp" ,"src/mavsdk/plugins/follow_me/follow_me.cpp" ,"src/mavsdk/plugins/follow_me/follow_me_impl.cpp" ,"src/mavsdk/plugins/ftp/ftp.cpp" ,"src/mavsdk/plugins/ftp/ftp_impl.cpp" ,"src/mavsdk/plugins/geofence/geofence.cpp" ,"src/mavsdk/plugins/geofence/geofence_impl.cpp" ,"src/mavsdk/plugins/gimbal/gimbal.cpp" ,"src/mavsdk/plugins/gimbal/gimbal_impl.cpp" ,"src/mavsdk/plugins/gimbal/gimbal_protocol_v1.cpp" ,"src/mavsdk/plugins/gimbal/gimbal_protocol_v2.cpp" ,"src/mavsdk/plugins/info/info.cpp" ,"src/mavsdk/plugins/info/info_impl.cpp" ,"src/mavsdk/plugins/log_files/log_files.cpp" ,"src/mavsdk/plugins/log_files/log_files_impl.cpp" ,"src/mavsdk/plugins/manual_control/manual_control.cpp" ,"src/mavsdk/plugins/manual_control/manual_control_impl.cpp" ,"src/mavsdk/plugins/mavlink_passthrough/mavlink_passthrough.cpp" ,"src/mavsdk/plugins/mavlink_passthrough/mavlink_passthrough_impl.cpp" ,"src/mavsdk/plugins/mission/mission.cpp" ,"src/mavsdk/plugins/mission/mission_impl.cpp" ,"src/mavsdk/plugins/mission_raw/mission_raw.cpp" ,"src/mavsdk/plugins/mission_raw/mission_raw_impl.cpp" ,"src/mavsdk/plugins/mission_raw/mission_import.cpp" ,"src/mavsdk/plugins/mission_raw_server/mission_raw_server.cpp" ,"src/mavsdk/plugins/mission_raw_server/mission_raw_server_impl.cpp" ,"src/mavsdk/plugins/mocap/mocap.cpp" ,"src/mavsdk/plugins/mocap/mocap_impl.cpp" ,"src/mavsdk/plugins/offboard/offboard.cpp" ,"src/mavsdk/plugins/offboard/offboard_impl.cpp" ,"src/mavsdk/plugins/param/param.cpp" ,"src/mavsdk/plugins/param/param_impl.cpp" ,"src/mavsdk/plugins/param_server/param_server.cpp" ,"src/mavsdk/plugins/param_server/param_server_impl.cpp" ,"src/mavsdk/plugins/server_utility/server_utility.cpp" ,"src/mavsdk/plugins/server_utility/server_utility_impl.cpp" ,"src/mavsdk/plugins/shell/shell.cpp" ,"src/mavsdk/plugins/shell/shell_impl.cpp" ,"src/mavsdk/plugins/telemetry/telemetry.cpp" ,"src/mavsdk/plugins/telemetry/telemetry_impl.cpp" ,"src/mavsdk/plugins/telemetry/math_conversions.cpp" ,"src/mavsdk/plugins/telemetry_server/telemetry_server.cpp" ,"src/mavsdk/plugins/telemetry_server/telemetry_server_impl.cpp" ,"src/mavsdk/plugins/tracking_server/tracking_server.cpp" ,"src/mavsdk/plugins/tracking_server/tracking_server_impl.cpp" ,"src/mavsdk/plugins/transponder/transponder.cpp" ,"src/mavsdk/plugins/transponder/transponder_impl.cpp" ,"src/mavsdk/plugins/rtk/rtk.cpp" ,"src/mavsdk/plugins/rtk/rtk_impl.cpp" ,"src/mavsdk/plugins/tune/tune.cpp" ,"src/mavsdk/plugins/tune/tune_impl.cpp"]#需要包含的头文件include_dirs = ["src/mavsdk/core","src/mavsdk/core/include/mavsdk","src/mavsdk/plugins/action/include","src/mavsdk/plugins/action_server/include","src/mavsdk/plugins/calibration/include","src/mavsdk/plugins/camera/include","src/mavsdk/plugins/camera/camera_definition_files/generated","src/mavsdk/plugins/component_information/include","src/mavsdk/plugins/component_information_server/include","src/mavsdk/plugins/failure/include","src/mavsdk/plugins/follow_me/include","src/mavsdk/plugins/ftp/include","src/mavsdk/plugins/geofence/include","src/mavsdk/plugins/gimbal/include","src/mavsdk/plugins/info/include","src/mavsdk/plugins/log_files/include","src/mavsdk/plugins/manual_control/include","src/mavsdk/plugins/mavlink_passthrough/include","src/mavsdk/plugins/mission/include","src/mavsdk/plugins/mission_raw/include","src/mavsdk/plugins/mission_raw_server/include","src/mavsdk/plugins/mocap/include","src/mavsdk/plugins/offboard/include","src/mavsdk/plugins/param/include","src/mavsdk/plugins/param_server/include","src/mavsdk/plugins/rtk/include","src/mavsdk/plugins/server_utility/include","src/mavsdk/plugins/shell/include","src/mavsdk/plugins/telemetry/include","src/mavsdk/plugins/telemetry_server/include","src/mavsdk/plugins/tracking_server/include","src/mavsdk/plugins/transponder/include","src/mavsdk/plugins/tune/include","src/mavsdk/plugins/action","src/mavsdk/plugins/action_server","src/mavsdk/plugins/calibration","src/mavsdk/plugins/camera","src/mavsdk/plugins/component_information","src/mavsdk/plugins/component_information_server","src/mavsdk/plugins/failure","src/mavsdk/plugins/follow_me","src/mavsdk/plugins/ftp","src/mavsdk/plugins/geofence","src/mavsdk/plugins/gimbal","src/mavsdk/plugins/info","src/mavsdk/plugins/log_files","src/mavsdk/plugins/manual_control","src/mavsdk/plugins/mavlink_passthrough","src/mavsdk/plugins/mission","src/mavsdk/plugins/mission_raw","src/mavsdk/plugins/mission_raw_server","src/mavsdk/plugins/mocap","src/mavsdk/plugins/offboard","src/mavsdk/plugins/param","src/mavsdk/plugins/param_server","src/mavsdk/plugins/rtk","src/mavsdk/plugins/server_utility","src/mavsdk/plugins/shell","src/mavsdk/plugins/telemetry","src/mavsdk/plugins/telemetry_server","src/mavsdk/plugins/tracking_server","src/mavsdk/plugins/transponder","src/mavsdk/plugins/tune","src/third_party/mavlink","src/third_party/mavlink/mavlink/src/mavlink/include/mavlink/v2.0","src/third_party/mavlink/mavlink/src/mavlink/include/mavlink/v2.0/common","//third_party/jsoncpp/include","//third_party/curl/include","//third_party/tinyxml2","//third_party/zlib",]
}ohos_shared_library("MAVSDK") {deps = [    ":libmavsdk_source","//third_party/curl:curl_shared","//third_party/openssl:libssl_shared","//third_party/openssl:libcrypto_shared","//third_party/jsoncpp:jsoncpp","//third_party/tinyxml2:tinyxml2"]         #依赖的三方库part_name = "MAVSDK"subsystem_name = "mavsdk"output_name = "libmavsdk"}ohos_executable("takeoff_and_land") {use_exceptions = trueoutput_name = "takeoff_and_land" # 可选,模块输出名include_dirs = ["src/third_party/mavlink/mavlink/src/mavlink/include","src/mavsdk/core/include/mavsdk","src/mavsdk/plugins/action/include","src/mavsdk/plugins/telemetry/include"]sources = ["examples/takeoff_and_land/takeoff_and_land.cpp","examples/takeoff_and_land/autopilot_interface.cpp",]deps = ["//third_party/MAVSDK:MAVSDK"]part_name = "MAVSDK"subsystem_name = "MAVSDK"}
#演示编译部分
ohos_executable("offboard") {  use_exceptions = trueoutput_name = "offboard" # 可选,模块输出名include_dirs = ["src/third_party/mavlink/mavlink/src/mavlink/include","src/mavsdk/core/include/mavsdk","src/mavsdk/plugins/offboard/include","src/mavsdk/plugins/action/include","src/mavsdk/plugins/telemetry/include"]sources = ["examples/offboard/offboard.cpp",]deps= ["//third_party/MAVSDK:MAVSDK"]part_name = "MAVSDK"subsystem_name = "MAVSDK"}#编译测试文件
ohos_unittest("mavsdk_test") {module_out_path = "MAVSDK/mavsdk_test" testonly = trueuse_exceptions = trueinclude_dirs = [ "src/mavsdk/core/include/mavsdk","src/mavsdk/plugins/action/include","src/mavsdk/plugins/action_server/include","src/mavsdk/plugins/calibration/include","src/mavsdk/plugins/camera/include","src/mavsdk/plugins/camera/camera_definition_files/generated","src/mavsdk/plugins/component_information/include","src/mavsdk/plugins/component_information_server/include","src/mavsdk/plugins/failure/include","src/mavsdk/plugins/follow_me/include","src/mavsdk/plugins/ftp/include","src/mavsdk/plugins/geofence/include","src/mavsdk/plugins/gimbal/include","src/mavsdk/plugins/info/include","src/mavsdk/plugins/log_files/include","src/mavsdk/plugins/manual_control/include","src/mavsdk/plugins/mavlink_passthrough/include","src/mavsdk/plugins/mission/include","src/mavsdk/plugins/mission_raw/include","src/mavsdk/plugins/mission_raw_server/include","src/mavsdk/plugins/mocap/include","src/mavsdk/plugins/offboard/include","src/mavsdk/plugins/param/include","src/mavsdk/plugins/param_server/include","src/mavsdk/plugins/rtk/include","src/mavsdk/plugins/server_utility/include","src/mavsdk/plugins/shell/include","src/mavsdk/plugins/telemetry/include","src/mavsdk/plugins/telemetry_server/include","src/mavsdk/plugins/tracking_server/include","src/mavsdk/plugins/transponder/include","src/mavsdk/plugins/tune/include","src/mavsdk/core","src/mavsdk/plugins/action","src/mavsdk/plugins/action_server","src/mavsdk/plugins/calibration","src/mavsdk/plugins/camera","src/mavsdk/plugins/component_information","src/mavsdk/plugins/component_information_server","src/mavsdk/plugins/failure","src/mavsdk/plugins/follow_me","src/mavsdk/plugins/ftp","src/mavsdk/plugins/geofence","src/mavsdk/plugins/gimbal","src/mavsdk/plugins/info","src/mavsdk/plugins/log_files","src/mavsdk/plugins/manual_control","src/mavsdk/plugins/mavlink_passthrough","src/mavsdk/plugins/mission","src/mavsdk/plugins/mission_raw","src/mavsdk/plugins/mission_raw_server","src/mavsdk/plugins/mocap","src/mavsdk/plugins/offboard","src/mavsdk/plugins/param","src/mavsdk/plugins/param_server","src/mavsdk/plugins/rtk","src/mavsdk/plugins/server_utility","src/mavsdk/plugins/shell","src/mavsdk/plugins/telemetry","src/mavsdk/plugins/telemetry_server","src/mavsdk/plugins/tracking_server","src/mavsdk/plugins/transponder","src/mavsdk/plugins/tune","src/third_party/mavlink","src/third_party/curl/curl/src/curl/include","src/third_party/install/include","src/third_party/mavlink/mavlink/src/mavlink/include/mavlink/v2.0","src/third_party/mavlink/mavlink/src/mavlink/include/mavlink/v2.0/common",]sources = ["src/mavsdk/core/mavsdk_time_test.cpp" ,"src/mavsdk/core/mavsdk_math_test.cpp" ,"src/mavsdk/core/mavlink_channels_test.cpp" ,"src/mavsdk/core/unittests_main.cpp" ,"src/mavsdk/core/timeout_handler_test.cpp" ,"src/mavsdk/core/call_every_handler_test.cpp" ,"src/mavsdk/core/curl_test.cpp" ,"src/mavsdk/core/cli_arg_test.cpp" ,"src/mavsdk/core/locked_queue_test.cpp" ,"src/mavsdk/core/safe_queue_test.cpp" ,"src/mavsdk/core/mavsdk_test.cpp" ,"src/mavsdk/core/mavlink_mission_transfer_test.cpp" ,"src/mavsdk/core/mavlink_statustext_handler_test.cpp" ,"src/mavsdk/core/geometry_test.cpp" ,"src/mavsdk/core/ringbuffer_test.cpp" ,"src/mavsdk/plugins/calibration/calibration_statustext_parser_test.cpp" ,"src/mavsdk/plugins/camera/camera_definition_test.cpp" ,"src/mavsdk/plugins/mission_raw/mission_import_test.cpp" ,"src/mavsdk/plugins/telemetry/math_conversions_test.cpp"]deps = ["//third_party/MAVSDK:MAVSDK","//third_party/googletest:gmock_main","//third_party/googletest:gtest_main"]part_name = "MAVSDK"
}

通过以上操作以后,就可以在 OpenHarmony 编译源码了:

./build.sh --product-name rpi4 --build-target=MAVSDK --ccache

编译完成以后可以在 out/rpi4/mavsdk/MAVSDK 目录下看到编译生成的 libmavsdk.z.so 文件。

同时,还可以在 ohos/out/rpi4/tests/unittest/MAVSDK/mavsdk_test/mavsdk_test 目录下看到我们编译的测试文件,如下所示:

接下来把编译完成的 so 及测试文件到 RPI4 开发板中,运行测试文件验证整个库的移植情况。

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[flink 实时流基础]源算子和转换算子

文章目录 1. 源算子 Source1. 从集合读2. 从文件读取3. 从 socket 读取4. 从 kafka 读取5. 从数据生成器读取数据 2. 转换算子基本转换算子(map/ filter/ flatMap) 1. 源算子 Source Flink可以从各种来源获取数据,然后构建DataStream进行转换…

Day55:WEB攻防-XSS跨站CSP策略HttpOnly属性Filter过滤器标签闭合事件触发

目录 XSS跨站-安全防御-CSP XSS跨站-安全防御-HttpOnly XSS跨站-安全防御-XSSFilter(过滤器的意思) 1、无任何过滤 2、实体化 输入框没有 3、全部实体化 利用标签事件 单引号闭合 4、全部实体化 利用标签事件 双引号闭合 5、事件关键字过滤 利用其他标签调用 双引号闭合…

代码随想录训练营第60天 | LeetCode 84.柱状图中最大的矩形、总结

LeetCode 84.柱状图中最大的矩形 文章讲解:代码随想录(programmercarl.com) 视频讲解:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili 思路 代码如下: ​​​​​​总结 感…

代码随想录|Day28|贪心03|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

1005.K次取反后最大化的数组和 思路: 优先取反 绝对值最大的负数如果没有负数,不断取反 绝对值最小的数,直到次数 K 耗尽 取反最小数有一个优化技巧: 如果 K 为偶数,则取反 K 次后,正负不变。如果 K 为奇数…

ROM-IP

1.原理 通过添加数据文件,使ROM看起来不是易失性存储器, 产生256个数据,每个数据的位宽是8 如果前面为x,后面就是x256-1 2.单端口ROM配置 FPGA内部没有非易失性存储器。调用的ROM和RAM都是用RAM来生成的 3.双端口ROM配置 使用第一…

马斯克旗下xAI发布Grok-1.5,相比较开源的Grok-1,各项性能大幅提升,接近GPT-4!

本文原文来自DataLearnerAI官方网站:马斯克旗下xAI发布Grok-1.5,相比较开源的Grok-1,各项性能大幅提升,接近GPT-4! | 数据学习者官方网站(Datalearner) 继Grok-1开源之后,xAI宣布了Grok-1.5的内测消息&…

手撕算法-跳跃游戏

描述 分析 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新如果可以一直跳到最后,就成功了 代码 class Solution {…

07-JavaScript DOM事件

1. 事件 1.1 事件概述 JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。 简单理解: 触发--- 响应机制。 网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某…

【漏洞潜在风险】弹框干扰类风险

弹框干扰风险定义: 游戏过程中,客户端经常会以文字类形式对玩家进行说明和指引,而对于一些更为重要的信息,便会用游戏中的弹框进行强调。由玩家主动触发对其他玩家造成重复弹框进而干扰到正常游戏的都可以称之为弹框干扰类风险。弹框干扰风险…

C++项目——集群聊天服务器项目(六)MySQL模块

Hello,大家好啊,最近比较忙,没来得及更新项目,实在抱歉~今天就恢复更新拉~ 在验证完网络模块与业务模块代码可以正常使用后,需完成的操作是与底层数据库进行交互,为实现各类用户查询、增删业务奠定良好的基…

【群晖】白群晖如何公网访问

【群晖】白群晖如何公网访问 ——> 点击查看原文 在使用默认配置搭建好的群晖NAS后,我们可以通过内网访问所有的服务。但是,当我们出差或者不在家的时候也想要使用应该怎么办呢? 目前白群提供了两种比较快捷的方式,一种是直接注…

【Python系列】合并配置文件的最佳实践

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python实现两个Excel表格数据对比、补充、交叉验证

业务背景 业务中需要用到类似企查查一类的数据平台进行数据导出,但企查查数据不一定精准,所以想采用另一个官方数据平台进行数据对比核验,企查查数据缺少的则补充,数据一致的保留企查查数据,不一致的进行颜色标注。 …

脱壳之常用的加固样本特征

梆梆加固样本特征 清单文件入口 android:name“com.SecShell.SecShell.ApplicationWrapper” 特征 免费版 meta-data meta-data总结 assets/secData0.jar lib/armeabi/libSecShell.so lib/armeabi/libSecShell-x86.so 梆梆企业版 assets/classes0.jar lib/armeabi-v7a/libD…

第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片

人工智能时代,最需要学习的编程语言是:python 。笔者是个 python 小白,昨天花了两个小时,第一次成功运行起来 python 项目 。 项目是 powerpoint-extractor ,可以将 ppt 文件中的图片提取出来,并输出到固定…

Windows安装tomcat,以服务的方式管理,如何设置虚拟内存

之前工作中,部署tomcat都是使用Linux服务器,最近遇到个客户,提供的服务器是Windows server,并且需要通过服务的方式管理tomcat;以自己多年的码农经验,感觉应该没有问题,结果啪啪打脸了&#xf…

双向BFS

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 方法学自于B19 双向BFS 字串变换_哔哩哔哩_bilibili #include<iostream> #include<algorithm> #include<cstdio> #include<queue> #include<map> using namesp…

Adaboost集成学习 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如双向长短期记忆…

python爬虫之selenium4使用(万字讲解)

文章目录 一、前言二、selenium的介绍1、优点&#xff1a;2、缺点&#xff1a; 三、selenium环境搭建1、安装python模块2、selenium4新特性3、安装驱动WebDriver驱动选择驱动安装和测试 基础操作1、属性和方法2、单个元素定位通过id定位通过class_name定位一个元素通过xpath定位…

【OJ】动归练习五之子组串

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 53. 最大子数组和1.1 分析1.2 代码 2. 918. 环形子数组的最大和2.1 分析2.2 代码 3. 152. 乘积最大子数组3.1 分析3.2 代码 4. 1567. 乘积为正数的最长子数组长度4.1 分析4.2 代码 1. 53. 最大子数组和 1.1 分析 一、…