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 -frtti


    ldflags = [ "-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 = true
    output_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 = true
    output_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 = true

    use_exceptions = true
  
    include_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学习资料

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon3D表面平面度检测-平面差值法

//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179前言 通常我们对表面平面度进行检测时,通常使用2种方式。1:通过大卷积核的高斯滤波进行拟合平面,然后求取拟合平面与3D模型间的点间的距离。2:通过平…

向机器人传授人类社会同步的艺术

在数字时代,社交机器人正迅速成为主流社会的一部分,从培训医生和教育儿童到提供谈话疗法和客户服务。现在,这是一个价值数十亿美元的全球产业,对具有类似人类社交智能的机器人的需求不断增长,这标志着我们技术史上的一…

CavalierContours 二维线操作

CavalierContours 二维线操作 2D polyline library for offsetting, combining, etc. 用于偏移、交并补等组合等操作的 2D 多折段线库。 Polyline Structure 多段线结构 Polylines are defined by a sequence of vertexes and a bool indicating whether the polyline is cl…

深度学习入门简单实现一个神经网络

实现一个三层神经网络 引言测试数据 代码 引言 今天我们实现一个简单的神经网络 俩个输入神经元 隐藏层两个神经元 一个输出神经元 激活函数我们使用sigmoid 优化方法使用梯度下降 我们前期准备是需要把这些神经元的关系理清楚 x1:第一个输入 x2:第二个…

Linux系统----------探索mysql数据库MHA高可用

目录 一、MHA概述 1.1 什么是 MHA 1.2MHA 的组成 1.2.1MHA Node(数据节点) 1.2.2MHA Manager(管理节点) 1.3MHA 的特点 1.4MHA工作原理 1.5数据同步的方式 1.5.1同步复制 1.5.2异步复制 1.5.3半同步复制 二、搭建 MySQ…

8.6 循环神经网络的简洁实现

每个步长共用参数 加载数据 虽然 8.5节 对了解循环神经网络的实现方式具有指导意义,但并不方便。 本节将展示如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from…

华为流量整形配置

组网需求 如图1所示,企业网内部LAN侧的语音、视频和数据业务通过Switch连接到RouterA的Eth2/0/0上,并通过RouterA的GE3/0/0连接到WAN侧网络。 不同业务的报文在LAN侧使用802.1p优先级进行标识,在RouterA上根据报文的802.1p优先级入队列&…

Flutter环境搭建及版本管理

前言 Flutter已成为移动应用开发的主流选择,其跨平台优势日益凸显,使学习Flutter成为现代开发者的必备技能。越来越多的公司和团队选择Flutter构建应用,这为开发者提供了更广阔的就业机会和职业发展空间。Flutter的热度源自其强大的特性和生…

【动手学深度学习-pytorch】-9.3深度循环神经网络

到目前为止,我们只讨论了具有一个单向隐藏层的循环神经网络。 其中,隐变量和观测值与具体的函数形式的交互方式是相当随意的。 只要交互类型建模具有足够的灵活性,这就不是一个大问题。 然而,对一个单层来说,这可能具有…

WebCopilot:一款功能强大的子域名枚举和安全漏洞扫描工具

关于WebCopilot WebCopilot是一款功能强大的子域名枚举和安全漏洞扫描工具,该工具能够枚举目标域名下的子域名,并使用不同的开源工具检测目标存在的安全漏洞。 工具运行机制 WebCopilot首先会使用assetsfinder、submaster、subfinder、accumt、finddom…

layui laydate日期初始化的一些坑

layui laydate日期初始化的一些坑 背景坑一:利用class属性初始化时间控件失败坑二:后加载页面时间控件初始化失败坑三:结束时间需要默认追加23:59:59 背景 在日常开发中,总是会不可避免的用到日期插件,不同的日期插件…

IoT网关在智能制造工厂生产线监控与管理中的应用-天拓四方

随着工业4.0时代的到来,智能制造已成为工业发展的重要方向。IoT网关在智能制造工厂中扮演着关键角色,它能够实现设备间的互联互通、数据的实时采集与处理,以及生产线的智能监控与管理。本案例将详细介绍IoT网关在智能制造工厂生产线监控与管理…

100 个 Kotlin 面试问题及答案(其二)

尤其是在Android开发中,Kotlin已经成为一种流行的编程语言。为了帮助您在 Kotlin 面试中取得成功,我们为您简化了 100 个最常见的面试问题。本指南涵盖了广泛的主题,包括基本语言概念和高级功能。每个问题都附有简单的答案和实际示例&#xf…

Spring原理

这次我们来研究Bean的相关知识和spring boot自动配置的相关流程 1.Bean的作用域 1概念 在SpringIoC&DI阶段,我们学习了Spring是如何帮助我们管理对象的. 1. 通过 Controller ,Service , Repository , Component , Configuration , Bean 来声明…

Android R 广播注册与发送流程分析

静态广播注册时序图 动态广播注册时序图 发送广播时序图 前言 广播接收器可以分为动态和静态,静态广播接收器就是在 AndroidManifest.xml 中注册的,而动态的广播接收器是在代码中通过 Context#registerReceiver() 注册的。 这里先从静态广播的流程开始…

Pygame基础6-旋转

6-旋转 当我们想要旋转一个图片的时候, 我们可以使用pygame.transform.rotozoom获得旋转后的图片: kitten pygame.transform.rotozoom(kitten, angle, 1)问题是,每次旋转都会降低图片的质量。如果旋转很多次后,图片的质量会变得…

农村集中式生活污水分质处理及循环利用技术指南

立项单位:生态环境部土壤与农业农村生态环境监管技术中心、山东文远环保科技股份有限公司、北京易境创联环保有限公司、中国环境科学研究院、广东省环境科学研究院、中铁第五勘察设计院集团有限公司、中华环保联合会水环境治理专业委员会 本文件规定了集中式村镇生活…

【动手学深度学习-pytorch】9.2长短期记忆网络(LSTM)

长期以来,隐变量模型存在着长期信息保存和短期输入缺失的问题。 解决这一问题的最早方法之一是长短期存储器(long short-term memory,LSTM) (Hochreiter and Schmidhuber, 1997)。 它有许多与门控循环单元( 9.1节&…

婚恋交友APP小程序H5源码交付-支持二开!实名制交友,可服务器审核,亦可后台自己审核!同城交友,多人语音!

一、需求分析 在征婚交友网站开发初期,需求分析是至关重要的环节。这需要深入了解目标用户的需求和期望,包括他们的年龄、职业、兴趣爱好、交友条件等方面。通过收集和分析这些信息,开发团队可以明确网站的目标用户,并为他们提供…

东特科技现已加入2024第13届国际生物发酵产品与技术装备展

参展企业介绍 温州东特科技有限公司是一家集设计、生产、销售及服务为一体的卫生级流体设备企业。专业从事各种乳食品、制药、化工、啤酒设备、不锈钢卫生级阀门,管件,视镜,及非标配件定制等产品的销售与服务。先进的设计理念专业的技术优势一…