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

news2024/10/9 12:33:52

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学习资料

总结

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

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

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

相关文章

【Unity】TextMeshPro富文本

启用富文本 在Unity里&#xff0c;如果需要使用富文本&#xff0c;首先需要开启Rich Text 如果不开启Rich Text&#xff0c;就会在UI上显示富文本代码 1.粗体 <b>Game</b> Over2.斜体 <i>Game</i> Over3.下划线 <u>Game</u> Over4…

6个常用的界面原型设计工具,新手小白看!

界面原型设计是现代设计师必备的技能之一。界面原型是设计数字产品或应用程序的重要步骤&#xff0c;将概念转化为具体的互动界面。对于初学者小白来说&#xff0c;选择一款易于使用、功能强大的界面原型设计工具非常重要。本文将介绍 10 种常用的界面原型设计工具&#xff0c;…

基于8086CPU和8255并行接口扩展系统设计

**单片机设计介绍&#xff0c;基于8086CPU和8255并行接口扩展系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086CPU和8255并行接口扩展系统设计的主要目的是通过8255并行接口芯片实现对外部设备的并行接口扩展&…

162.乐理基础-和声大调、旋律大调

内容参考于&#xff1a; 三分钟音乐社 上一个内容&#xff1a;161.音程、和弦板块总结、重点、建议 首先需要回忆一下18.调式、自然大调式&#xff08;C大调、D大调。。。&#xff09;与19.音阶是什么、有什么用&#xff0c;在18.调式、自然大调式&#xff08;C大调、D大调。…

代码随想录训练营Day37:● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

738.单调递增的数字 题目链接 https://leetcode.cn/problems/monotone-increasing-digits/description/ 题目描述 思路 从后往前遍历数字的每一位&#xff0c;如果前一位大于后一位&#xff0c;则将其减一&#xff0c;后边的一位取 i-9 中最大的 解答的两点疑惑&#xff1a;…

uniapp 使用命令行创建vue3 ts 项目

命令行创建 uni-app 项目&#xff1a; vue3 ts 版 npx degit dcloudio/uni-preset-vue#vite-ts 项目名称注意 Vue3/Vite版要求 node 版本^14.18.0 || >16.0.0 如果下载失败&#xff0c;请去gitee下载 https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite-ts…

2020年30米二级分类北京市土地利用数据

引言 北京市省土地利用数据产品是指基于Landsat TM/ETM/OLI遥感影像&#xff0c;采用遥感信息提取方法&#xff0c;并结合野外实测&#xff0c;以及参照国内外现有的土地利用/土地覆盖分类体系&#xff0c;经过波段选择及融合&#xff0c;图像几何校正及配准并对图像进行增强处…

上采样技术在语义分割中的应用

目录 概要 一、概述 二、实现方法 1.转置卷积 2.反池化 3.双线性插值法 三、在经典网络中的的应用 1.U-Net 2.FCN 总结 概要 上采样是用于深度学习中提高语义分割精度的技术&#xff0c;可以实现图像放大和像素级别标注 一、概述 神经网络的基本结构为&#xff1a;…

年轻力壮,副业当道:推荐6个热门小副业

#下班后的年轻人第二事业风潮# 热门话题你加入了吗&#xff1f; 如今&#xff0c;年轻人早已摒弃“懒散”的标签&#xff0c;全身心投入到“事业拼搏”之中。然而&#xff0c;自主创业的高投入与风险&#xff0c;让许多年轻人望而却步。于是&#xff0c;副业成为了他们触手可及…

Vue3基础笔记(2)事件

一.事件处理 1.内联事件处理器 <button v-on:click"count">count1</button> 直接将事件以表达式的方式书写~ 每次单击可以完成自增1的操作~ 2.方法事件处理器 <button click"addcount(啦啦啦~)">count2</button> 如上&…

4、Cocos Creator 动画系统

目录 1、Clip 参数 2、动画编辑器 3、基本操作 更改时间轴缩放比例 移动显示区域 更改当前选中的时间轴节点 播放 / 暂停动画 修改 clip 属性 快捷键 4、模拟实验 5、动画事件 6、注意事项 参考 Animation 组件是节点上的一个组件。Clip 动画剪辑就是一份动画的声…

【CTA动画】制作全记录 笔记

3Dxchange的使用 让图片跳舞 导入&#xff1a;I:\安装包\#动画开发\test\跳舞 model(includeTPose).fbx 转成非标准角色 手动点击骨骼&#xff0c;然后点击人物骨骼&#xff0c;选择00_t-pose 绿灯了就可以转换了&#xff0c;记得启用。 上面的自定义可以先选择3DS 转换后…

Stream2Graph论文翻译

Stream2Graph: Dynamic Knowledge Graph for Online Learning Applied in Large-scale Network Abstract 知识图谱(KG)是用于存储某个领域(医疗保健、金融、电子商务、ITOps等)中的知识的有价值的信息来源。大多数工业KG本质上是动态的&#xff0c;因为它们定期更新流数据(客…

如何准备科学海报

科学会议上的海报展示可以为早期职业研究人员提供宝贵的机会来练习他们的沟通技巧&#xff0c;获得有关他们研究的反馈&#xff0c;并扩大他们的网络。“通过与其他研究人员一对一地讨论我的工作&#xff0c;[我发现]我可以确定哪些工作做得好&#xff0c;哪些需要改进&#xf…

LQR的横向控制与算法仿真实现

文章目录 1. 引言2. 车辆运动学线性离散模型3. LQR求解4. 算法和仿真实现 1. 引言 在现代控制理论的领域中&#xff0c;线性二次型调节器&#xff08;Linear Quadratic Regulator&#xff0c;简称LQR&#xff09;被广泛认可为一种高效的优化控制方法。LQR的核心优势在于其能力…

python练习五

1. 给定一个包含n1个整数的数组nums&#xff0c;其数字在1到n之间&#xff08;包含1和n&#xff09;&#xff0c;可知至少存在一个重复的整数&#xff0c;假设只有一个重复的整数&#xff0c;请找出这个重复的数 def find_difnumber(ls):for index in range(0, len(ls)):for n…

Linux应用实战之网络服务器(四)JavaScript介绍

0、前言 准备做一个Linux网络服务器应用实战&#xff0c;通过网页和运行在Linux下的服务器程序通信&#xff0c;这是第四篇&#xff0c;介绍一下JS&#xff0c;让HTML网页实现与服务器通信。 1、JS常用语法 JavaScript是一种脚本语言&#xff0c;主要用于前端开发&#xff0…

纯前端搭建ChatGpt应用(全部代码在这了)

话不多说直接放代码&#xff1a; &#xff08;需要下载并导入axios包&#xff0c;懒省事的人也可以直接使用uni.request等请求方法&#xff09; 目录 1、html代码&#xff1a; &#xff08;本例使用的uniapp编写&#xff09; 2、js代码&#xff1a;&#xff08;API-KEY需要…

基于ssm电子竞技管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电子竞技管理平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

尾盘拉升超8个点,速腾聚创交出来一份怎样的超预期答卷?

“如果说2024年是智驾加速渗透&#xff0c;L3级智能驾驶陆续落地的一年&#xff0c;那么激光雷达将是这股潮流中不可缺失的那一份。” 2024年开年&#xff0c;速腾聚创以相当“闪亮的姿态”成为“港股2024年首只IPO上市成功”的企业。 然而&#xff0c;其上市之后的市场表现却…