基于OpenHarmony的Nexus_Geometry_Nano_Board亮灯实验
在开发一个项目的时候,首先是对开发板的了解,然后是对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
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
1.3 安装git-lfs
注:首次apt install之前要运行apt update -y
apt update -y
apt install git-lfs
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的邮箱
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
1.6 下载源代码
repo sync -c
1.7 下载大文件
repo forall -c 'git lfs pull'
1.8 下载编译工具链
./build/prebuilts_download.sh
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
1.10 安装hb
pip install build/hb
1.11 显示当前系统的 PATH 环境变量的值
echo $PATH
1.12 apt update
apt update
1.13 安装cmake
apt install cmake
1.14 安装pycparser
pip install pycparser
1.15 选中要编译哪个
hb set (执行这个命令后通过键盘上下键选择到要编译的,然后按enter键选中)
1.16 执行编译
hb build -f
二.第一个案例
由亮灯案例来验证开发环境是否正确,同时熟悉的开发OpenHarmony的方式。
2.1 在/root/code/ws63_ohos/applications/sample/wifi-iot/app路径下新建文件夹light_tricolor,在新建的文件夹目录下新建文件light_tricolor.c与BUILD.gn。
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);
放入源码后如下:
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",
]
}
放入源码后如下:
2.4 在/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/build/config/target_config/ws63/config.py中加入"AAA",如下图所示:
2.5 在/root/code/ws63_ohos/device/soc/hisilicon/ws63v100/sdk/libs_url/ws63/cmake/ohos.cmake下加入“AAA”,入下图所示:
2.6 编译好直接右键下载/root/code/ws63_ohos/out/nearlink_dk_3863/nearlink_dk_3863/ws63-liteos-app/ws63-liteos-app_all.fwpkg文件:
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",
]
}
如下图所示:
三.使用华为云的MQTT实验
3.1华为云上打开iotDA后创建产品,然后注册设备,在注册设备后点击设备右侧的详情查看MQTT连接参数,在MQTTX输入了华为云的MQTT连接参数后会显示设备在线
3.2 打开华为云在线调试,使用代码里有MQTT连接参数的开发板或MQTTX后连接华为云平台,可在华为云在线调试里看到设备在线
3.3 使用开发板或MQTTX发送消息,华为云接收到则调试成功
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文件,这就是要烧录的文件点击文件后右键下载就可以下载到本地,注意文件路径。
4.2 装好驱动(CH341SER)后开发板通过数据线连接电脑,电脑同时打开设备管理器查看COM口的编号,注意不要看错,以免无法烧录。
4.3 打开hitool,选择对应要烧录的文件路径,按照下图进行勾选,然后点击connect后与开发板进行连接,然后点击开发板的复位键就可以进行烧录了,烧录完成会在下面的文字框内显示完成。hitool对于是一个此系列芯片的烧录软件,由芯片的厂商提供。
4.4 烧录完成后重写插拔数据线就可以让板子运行写好的测试程序,运行成功如下图。
最终的效果如上图,烧录时要注意波特率,波特率太低会导致烧录缓慢,波特率太高可能会导致开发板烧录坏,建议按照烧录软件的默认波特率进行烧录。烧录之后需要重新通电测试,观察是否灯已经闪烁。编译没有出现报错不意味着烧录后也可以正常运行,因为可能会有的时候是代码的逻辑出现错误导致最终运行不了。
- 点赞
- 收藏
- 关注作者
评论(0)