基于OpenHarmony的Nexus_Geometry_Nano_Board亮灯实验

举报
袁睿 发表于 2025/08/07 00:43:34 2025/08/07
【摘要】 Nexus_Geometry_Nano_Board因为板载天线的能力,可以使用星闪技术,蓝牙技术,以及WIFI连接华为云实现MQTT协议的使用连接华为云,应用场景为可作为任何小型设备主板。

在开发一个项目的时候,首先是对开发板的了解,然后是对OpenHarmony操作系统的解读,知道要使用哪些系统能力。在开发的过程中要了解git与相关命令(比如说repo),可以更高效的获取OpenHarmony源码。开发的过程中要注意开发环境是否装好,首次获取OpenHarmony源码可以通过进行编译来验证开发环境与源码的完整性。开发后进行编译如果有报错建议逐行解决报错,在没有报错后将编译产生最终的目标文件使用烧录软件进行烧录,验证逻辑是否有问题,是否可以正常运行等。本文中有很详细的对开发环境安装命令,案例源码等的解释。如果是基础的开发者,建议可以先研究编译过程的理论和案例源码的理论,再去按照步骤进行实验。


一.环境搭建

1.1 安装码云repo工具

mkdir ~/bin


curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo


chmod a+x ~/bin/repo


pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

Install_the_repo_tool.png

1.2 环境变量path中增加repo路径

vim ~/.bashrc #编辑环境变量


#进入后按键盘i键进入输入模式,把下面这段复制粘贴到最后一行。


export PATH=~/bin:$PATH #这行用于加在尾部


#然后点击键盘左上角的Esc键后输入:wq回车就保存好了。


source ~/.bashrc #应用变量(相当于刷新,会清空命令行)

或者使用echo xxx >> ~/.bashrc也可以,比如说

echo 'export PATH="~/bin:$PATH"' >> ~/.bashrc

source ~/.bashrc

Add_the_repo_variable_to_the_environment_variable.png

Applying_variables.png

1.3 安装git-lfs

注:首次apt install之前要运行apt update -y

apt update -y

apt install git-lfs

Install_git-lfs.png

1.4 下载OpenHarmony 5.1 源码

cd ~/code #将命令行的路径移动到目标目录


mkdir ws63_ohos #新建文件夹


cd ~/code/ws63_ohos #命令的位置移动到这个目录下


git config --global user.email “lengqinjie@lengqinjie.xyz”


git config --global user.name “lengqinjie.


#上面带user.email和user.name的为两行,一起复制粘贴为命令行,建议使用自己在gitcode的邮箱


Download_the_OpenHarmony_5.1_source_code.png

An_error_may_occur.png

1.5 初始化本地代码仓库

repo init -u https://gitee.com/HiSpark/manifest.git -b OpenHarmony-v5.1.0-Release -m default-ws63-without-xts.xml --no-repo-verify


Continue_the_repo.png

1.6 下载源代码

repo sync -c


Continue_repo.png

1.7 下载大文件

repo forall -c 'git lfs pull'

Complete_the_repo.png

1.8 下载编译工具链

./build/prebuilts_download.sh

Download_the_compilation_toolchain.png

1.9 vim ~/.bashrc

vim ~/.bashrc


#进入后按键盘i键进入输入模式,把下面这段复制粘贴到最后一行


export PATH=/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/tools/bin/compiler/riscv/cc_riscv32_musl_100/cc_riscv32_musl/bin:$PATH #这行用于加在尾部


#然后点击键盘左上角的Esc键后输入:wq回车就保存好了。


source ~/.bashrc #应用变量

或者使用也可以达到相同效果的命令:

echo 'export PATH="/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/tools/bin/compiler/riscv/cc_riscv32_musl_100/cc_riscv32_musl/bin:$PATH"' >> ~/.bashrc


source ~/.bashrc

重复问题,可以通过grep命令先判断一下:

grep 'export PATH="/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/tools/bin/compiler/riscv/cc_riscv32_musl_100/cc_riscv32_musl/bin:$PATH"' ~/.bashrc | sort | uniq -d

bash脚本本身也可以支持if判断

#!/bin/bash


# 目标工具名称(假设为 "mytool")

TOOL_NAME="mytool"


# 工具所在的绝对路径(替换为你的实际路径)

TOOL_PATH="/opt/custom_tools/mytool/bin"


echo "=== Step 1: 检查当前 PATH 是否包含 ${TOOL_PATH} ==="

sleep 2 # 停顿以便阅读输出


# 检查工具是否已在 PATH 中


if command -v "$TOOL_NAME" &> /dev/null; then

echo "'${TOOL_NAME}' 已存在于 PATH 中!当前版本:"

"$TOOL_NAME" --version | head -n 1 # 显示版本号(假设支持 --version 参数)

else

echo "未找到 '${TOOL_NAME}',尝试添加到 PATH..."


# 检查是否已手动添加过该路径(避免重复)

if grep -qF "${TOOL_PATH}" ~/.bashrc; then

echo "错误:${TOOL_PATH} 已存在于 ~/.bashrc 但未生效!请检查配置。"

exit 1

fi


# 追加路径到 .bashrc 并立即生效

echo "export PATH=\"${TOOL_PATH}:\$PATH\"" >> ~/.bashrc

echo "已将 ${TOOL_PATH} 添加到 ~/.bashrc"

sleep 3 # 长时间停顿强调关键操作完成


# 重新加载配置

source ~/.bashrc

echo "新 PATH 已加载,再次检查..."

sleep 2


# 最终验证

if command -v "$TOOL_NAME" &> /dev/null; then

echo "成功!'${TOOL_NAME}' 现在可用:"

"$TOOL_NAME" --help # 显示帮助信息证明可用

else

echo "失败!虽然添加了路径但仍无法找到 '${TOOL_NAME}'。请检查实际文件是否存在。"

exit 1

fi

fi


echo

Continue_to_modify_the_environment_variables.png

1.10 安装hb

pip install build/hb

Install_hb.png

1.11 显示当前系统的 PATH 环境变量的值

echo $PATH

Displays_the_value_of_the_PATH_environment_variable_for_the_current_system.png

1.12 apt update

apt update

apt_update.png

1.13 安装cmake

apt install cmake


Installing_cmake.png

1.14 安装pycparser

pip install pycparser

Install_pycparser.png


1.15 选中要编译哪个

hb set (执行这个命令后通过键盘上下键选择到要编译的,然后按enter键选中)


Select_which_one_to_compile.png


1.16 执行编译

hb build -f


Execute_compilation.png


二.第一个案例

由亮灯案例来验证开发环境是否正确,同时熟悉的开发OpenHarmony的方式。

2.1 在/root/code/ws63_ohos/applications/sample/wifi-iot/app路径下新建文件夹light_tricolor,在新建的文件夹目录下新建文件light_tricolor.c与BUILD.gn。


How_it_looks_after_creating_new_folders_files.png


2.2 在/root/code/ws63_ohos/applications/sample/wifi-iot/app/light_tricolor/light_tricolor.c文件放入源码:

#include <stdio.h> // 标准输入输出库

#include <unistd.h> // 提供 sleep() 函数用于延时

#include "cmsis_os2.h" // ARM Cortex-M 的 RTOS API 接口

#include "ohos_init.h" // OpenHarmony的初始化接口

#include "iot_gpio.h" // 物联网设备GPIO操作接口


// 按照原理图,定义三色LED对应的GPIO引脚编号

#define LED_R_PIN 10 // GPIO10

#define LED_G_PIN 12 // GPIO12

#define LED_B_PIN 13 // GPIO13


void LedInit(void) {

// 初始化GPIO,设置为输出

IoTGpioInit(LED_R_PIN);

IoTGpioSetDir(LED_R_PIN, IOT_GPIO_DIR_OUT);

// 初始化GPIO,设置为输出

IoTGpioInit(LED_G_PIN);

IoTGpioSetDir(LED_G_PIN, IOT_GPIO_DIR_OUT);

// 初始化GPIO,设置为输出

IoTGpioInit(LED_B_PIN);

IoTGpioSetDir(LED_B_PIN, IOT_GPIO_DIR_OUT);

}


void LightTricolorEntry(void) {

LedInit(); // 初始化LED的GPIO

while (1) { // 循环

IoTGpioSetOutputVal(LED_R_PIN, 1); // 点亮

sleep(1); // 延时

IoTGpioSetOutputVal(LED_R_PIN, 0); // 关闭

sleep(1); // 延时

}

}


SYS_RUN(LightTricolorEntry);

放入源码后如下:


light_tricolor.c_effect_after_placing_the_source_code.png


2.3 在/root/code/ws63_ohos/applications/sample/wifi-iot/app/light_tricolor/BUILD.gn文件放入源码:

static_library("AAA") {

sources = [ "light_tricolor.c" ]


include_dirs = [

"//utils/native/lite/include",

"//kernel/liteos_m/kal",

"//base/iothardware/peripheral/interfaces/inner_api",

]

}

放入源码后如下:


Put_the_source_code_in_a_BUILD.gn_file.png


2.4 在/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/build/config/target_config/ws63/config.py中加入"AAA",如下图所示:


After_modifying_config.py.png


2.5 在/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/libs_url/ws63/cmake/ohos.cmake下加入“AAA”,入下图所示:


Add_AAA_to_the_file_ohos.cmake.png


2.6 编译好直接右键下载/root/code/ws63_ohos/out/nearlink_dk_3863/nearlink_dk_3863/ws63-liteos-app/ws63-liteos-app_all.fwpkg文件:


After_compiling.png


2.7 在路径为/root/code/ws63_ohos/applications/sample/wifi-iot/app的文件BUILD.gn改为:

import("//build/lite/config/component/lite_component.gni")


lite_component("app") {

features = [

"light_tricolor:AAA",

]

}

如下图所示:


Modify_the_BUILD.gn_file.png


三.使用华为云的MQTT实验


3.1华为云上打开iotDA后创建产品,然后注册设备,在注册设备后点击设备右侧的详情查看MQTT连接参数,在MQTTX输入了华为云的MQTT连接参数后会显示设备在线


华为云产品注册.png


华为云设备.png




3.2 打开华为云在线调试,使用代码里有MQTT连接参数的开发板或MQTTX后连接华为云平台,可在华为云在线调试里看到设备在线


华为云设备调试.png


3.3 使用开发板或MQTTX发送消息,华为云接收到则调试成功


华为云设备调试成功.png


3.4 MQTT案例

void mqtt_callback(MessageData *msg_data)

    {

        size_t res_len = 0;

        uint8_t *response_buf = NULL;

        char topicname[45] = { "$crsp/" };

   

        LOS_ASSERT(msg_data);

   

    printf("topic %.*s receive a message\r\n",    msg_data->topicName->lenstring.len, msg_data->topicName->lenstring.data);

   

    printf("message is %.*s\r\n",

    msg_data->message->payloadlen,

    msg_data->message->payload);

   

    }

   

    int mqtt_connect(void)

    {

        int rc = 0;

       

        NetworkInit(&n);

        NetworkConnect(&n, "xxxxxxxxxx.iot-mqtts.cn-north-4.myhuaweicloud.com", 1883);

        buf_size  = 4096+1024;

        onenet_mqtt_buf = (unsigned char *) malloc(buf_size);

        onenet_mqtt_readbuf = (unsigned char *) malloc(buf_size);

        if (!(onenet_mqtt_buf && onenet_mqtt_readbuf))

        {

            printf("No memory for MQTT client buffer!");

            return -2;

        }

   

        MQTTClientInit(&mq_client, &n, 1000, onenet_mqtt_buf, buf_size, onenet_mqtt_readbuf, buf_size);

       

        MQTTStartTask(&mq_client);

        data.keepAliveInterval = 30;

        data.cleansession = 1;

        data.clientID.cstring = "xxxxxxxxxxxxxxxxxxx_88888888_0_0_xxxxxxxxxx";

        data.username.cstring = "xxxxxxxxxxxxxxxxxxx_88888888";

        data.password.cstring = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

        data.cleansession = 1;

       

        mq_client.defaultMessageHandler = mqtt_callback;

   

        //连接服务器

        rc = MQTTConnect(&mq_client, &data);

   

        //订阅消息,设置回调函数

        MQTTSubscribe(&mq_client, "porsche", 0, mqtt_callback);

   

        while(1)

        {

            MQTTMessage message;

   

            message.qos = QOS1;

            message.retained = 0;

            message.payload = (void *)"huaweiyun";

            message.payloadlen = strlen("huaweiyun");

        //上报

            if (MQTTPublish(&mq_client, "hi", &message) < 0)

            {

                printf("MQTTPublish faild !\r\n");

            }

            IoTGpioSetOutputVal(9, 0);      //9gpio 0 light on

            usleep(1000000);

        }

   

        return 0;

       }

 



四.烧录与运行

4.1 在编译后在ws63-liteos-app中产生.fwpkg文件,这就是要烧录的文件点击文件后右键下载就可以下载到本地,注意文件路径。


The_file_is_about_to_be_burned.jpg


4.2 装好驱动(CH341SER)后开发板通过数据线连接电脑,电脑同时打开设备管理器查看COM口的编号,注意不要看错,以免无法烧录。


COM_port_number.png


4.3 打开hitool,选择对应要烧录的文件路径,按照下图进行勾选,然后点击connect后与开发板进行连接,然后点击开发板的复位键就可以进行烧录了,烧录完成会在下面的文字框内显示完成。hitool对于是一个此系列芯片的烧录软件,由芯片的厂商提供。


The_usage_method_of_hiburn.png



4.4 烧录完成后重写插拔数据线就可以让板子运行写好的测试程序,运行成功如下图。


The_running_board.jpg

最终的效果如上图,烧录时要注意波特率,波特率太低会导致烧录缓慢,波特率太高可能会导致开发板烧录坏,建议按照烧录软件的默认波特率进行烧录。烧录之后需要重新通电测试,观察是否灯已经闪烁。编译没有出现报错不意味着烧录后也可以正常运行,因为可能会有的时候是代码的逻辑出现错误导致最终运行不了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。