#2020徵文-開發板# 基於Hi3861平臺的 HarmonyOS Device開發體驗
"剩蛋老人"哼著”金顧拜“來了HarmonyOS Device 開發體驗
大家好,我是不務正業的非著名 Copy 攻城獅,此篇應是 Copy 攻城獅 2020 年最後一個”Hello,World“--基於 Harmony OS 的 Hi3861 開發板進行物聯網應用開發實戰。Copy 攻城獅的“Hello World”之路從來都不是一帆風順的,此次嘗試開(拷)發(貝)物聯網應用也走了不少彎路,最後終於跑通了蜂鳴器版的《Jingle Bells》,預祝大家新年快樂!
目錄:
環境搭建篇
開發除錯篇
實戰應用篇
後記
環境搭建篇
程式設計界有個傳承了幾十年的”規矩“--入門先從環境搭建開始,有的時候環境搭建比較簡單,比如學習 HTML 程式設計,有瀏覽器就行;有時候又比較繁瑣,比如 React Native 開發,需要安裝 NodeJS、Python、Java、Android SDK……而 HarmonyOS Device 開發屬於後者,環境搭建比較繁瑣,比如需要 Linux 系統進行編譯,燒錄到裝置時又需要用到 Windows。如果您還想體驗 Wifi 模組或者“碰一碰”等其他功能,還需要提供熱點及其他裝置。HarmonyOS 官方提供了詳細的環境搭建文件以及Hi3861 開發板介紹理論上跟著文件走一遍就能正常執行“Hello,HarmonyOS Device”。
儘管如此,不過每個人的開發習慣或者工具口味不一樣,因此在實際搭建環境的時候還是會和官方文件有些不一樣的地方。由於手頭有點乞丐版的雲主機資源,因此我選擇將他們派上用場,用 Linux 的雲主機作為編譯機,在本地的 Window 10 電腦上安裝 SFTP Drive 將 Linux 雲主機掛載到本機,使得燒錄的時候能直接讀取到 Linux 上的檔案;通過 VSCode 的 Remote SSH 擴充套件以及 HUAWEI DevEco Device Tool 擴充套件來開發除錯程式碼,此外通過某大佬分享的 sscom 串列埠除錯工具進行更加便捷的除錯。如果您恰好和我一樣的情況,或者您也想嘗試一下我的搭建思路,那我們就開始吧!
1. Windows 環境(開發、除錯、燒錄)
在 Windows 上,因為涉及到開發除錯,因此我們需要安裝 VS Code 及擴充套件(也就是外掛)、SFTP Drive(燒錄時用來直接訪問 Linux 上的檔案)、CH341SER.EXE(USB 轉串列埠驅動)、sscom(可選,方面連線串列埠除錯)。我這邊本地已經安裝了 VS Code 就不過多贅述,相信大家都安裝了,從我接觸過的幾個軟硬體開發教程都推薦安裝 VS Code,真香!
1.1Remote - SSH和 SFTP Drive
可能大家會有疑問,這兩個玩意都是訪問遠端主機上檔案的,裝一個就行了吧?剛開始我也有同樣的想法,後來在實操中發現:如果只安裝 Remote - SSSH,燒錄配置時無法讀取遠端檔案;如果只安裝 SFTP Drive,在編輯程式碼時訪問遠端檔案非常慢;在座的給位大佬有好的方案的話一定要傳授一下哦。我這裡安裝的是 Remote - SSH,如果您想體驗更多的功能,可以直接安裝 Remote Development,Remote 系列是巨硬公司針對遠端開發而開發的擴充套件。安裝完 Remote - SSH 之後,為了免密碼登入 Linux(有風險需謹慎),我們需要操作一下 SSH 金鑰配置。
在 VSCode 的 Remote 擴充套件和 SFTP Drive 中先通過賬號密碼訪問遠端主機,確保能正常訪問到 Linux 主機中的程式碼和檔案。
SSH 金鑰配置的時候,我們可以在遠端主機上生成金鑰,也可以在本機生成金鑰,最終將配置關聯就可以。我們這裡採用的是 Windows 機使用 PowerShell 執行`ssh-keygen`生成金鑰到檔案`C:\Users\您的使用者名稱\.ssh\id_rsa`(私鑰),同時會生成檔案`C:\Users\您的使用者名稱\.ssh\id_rsa.pub`(公鑰),通過 SFTP Drive 拷貝公鑰到遠端主機的`~/.ssh`目錄,在 VSCode 中連線遠端主機執行命令`cat id_rsa.pub >> authorized_keys`追加到 authorized_keys 中,由於我本機已經有了公鑰私鑰,直接拿來用即可。
此步需注意的是:
cd ~/.ssh
cat id_rsa.pub >> authorized_keys #追加公鑰
sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh #檔案及資料夾加許可權
sudo vim /etc/ssh/sshd_config #準備修改sshd配置
# PubkeyAuthentication yes 確保此處註釋放開
sudo service sshd restart #重啟sshd
完事之後關閉 VSCode 再開啟,不出意外再連線遠端主機就不需要輸入訪問密碼了,徹底告別每次連線都要輸密碼的煩惱。
1.2 HUAWEI DevEco Device Tool 及依賴安裝
HUAWEI DevEco Device Tool可以理解為是 HarmonyOS Device 的開發工具,“HarmonyOS 智慧裝置一站式整合開發環境,支援 HarmonyOS 元件按需定製、一鍵編譯和燒錄、視覺化除錯、分散式能力整合等,幫助開發者高效開發和創新新硬體”。
官網:https://device.harmonyos.com/cn/ide,目前只支援 Windows,這也是為什麼我們需要用到 Windows 本機的原因!另外 HUAWEI DevEco Device Tool 沒有上架到 VSCode 擴充套件市場,只能通過**從 VSIX 安裝**的方式進行安裝,也就是說我們需要解壓從官網下載的安裝包,另外將`.vsix`檔案字尾修改為`.zip`解壓有驚喜哦 -- 在DevEcoDeviceTool/extension/deveco/tool您能得到HiBurn.exe,這個程式就可以用來燒錄(相當於不使用 VSCode 的擴充套件在程式中配置燒錄引數直接燒錄)。
根據官方文件的指引,我們還需要:
- 安裝 Node.js(儘量別裝最新的)
- 安裝 JDK
- 安裝 hpm
- 安裝 VSCode C/C++擴充套件
- 安裝 CH341SER.EXE
- 安裝 Jlink 工具(可選,V6.54c 及以上版本)
- 安裝 hcc_riscv32(這個我沒裝成功,所以除錯全靠手打)
鑑於前期跑過“Hello, HarmonyOS”(因此才獲得的開發板),大部分環境我都有,不過在安裝 Jlink 工具的時候卡了很久,主要是網路的問題,導致下載的檔案不全,好在想方設法終於下好了,又在安裝 hcc_riscv32 時卡住了,幸好不是關鍵,索性放棄!……費了九牛二虎之力,終於完成 Windows 部分的環境搭建,可以直接燒錄別人編譯好的程式了!
2. Linux 環境(編譯)
相比 Windows 環境,HarmonyOS Device Linux 的環境搭建顯得微不足道,跟著文件走一遍就完事了。不過,經過實操,如果您是 Ubuntu 18.04,我更加推薦潤和許老師的文件--Harmony OS 開發指南——原始碼下載和編譯。如果您和我一樣還想嘗試一下在 CentOS 上搭建環境,那就推薦鴻蒙社群的文章--在 CentOS 中安裝鴻蒙 LiteOS 編譯環境-海思 Hi3861,同樣的也只取我需要的--我只需要編譯部分的環境搭建。我的雲主機作業系統是 CentOS 7.6 64 位,和博主的大同小異,按照文章中的命令列逐個敲完再去編譯就一把過。
老話說得好:"If I have seen further, it is by standing upon the shoulders of giants",於是我結合許老師和社群文章完成了 HarmonyOS 在 CentOS 上的編譯環境搭建。
2.1 原始碼獲取(其中的一種方法)
```bash
# 配置repo工具
mkdir ~/bin/
# sudo apt install curl # 如果沒有curl命令需要先下載
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo
chmod +x ~/bin/repo
echo 'export PATH=~/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```
```bash
# 下載Harmony OS原始碼
mkdir -p ~/harmonyos/openharmony && cd ~/harmonyos/openharmony
sudo apt install --no-install-recommends git python # repo工具本身是python指令碼,它會呼叫git命令下載單個程式碼倉
# 開始前需要配置`user.name`和`user.email`,如果沒有配置,使用如下命令進行配置:
# git config --global user.name "yourname"
# git config --global user.email "your-email-address"
repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
repo sync -c # 以後每天同步遠端倉的修改,只需要執行這一條命令即可
```
2.2 安裝編譯基礎環境
依賴 Python 3.7+ 以及SCons安裝,我這裡通過自行編譯安裝的 Python 3.9.0。
```bash
# 下載Python原始碼包
wget https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
# 解壓原始碼包
tar -xzvf Python-3.9.0.tgz
# 安裝依賴
yum groupinstall -y "Development tools"
yum install -y openssl-devel
yum install -y libffi libffi-devel
yum install -y bzip2-devel
yum install -y sqlite-devel
yum install -y readline-devel
yum install -y libuuid-devel
yum install -y uuid-devel
yum install -y xz-devel
yum install -y gdbm-devel
yum install -y tk-devel
# 配置編譯
cd Python-3.9.0
./configure --prefix=/usr/local/python3
# 編譯Python
make -j8 && make install
# 建立軟連結
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# 驗證
python3 --version
pip3 --version
# 安裝編譯時需依賴的Python 3元件
pip3 install setuptools
pip3 install kconfiglib
pip3 install pycryptodome
pip3 install six --upgrade --ignore-installed six
pip3 install ecdsa
```
```bash
# 下載SCons原始碼包
wget http://prdownloads.sourceforge.net/scons/scons-4.0.1.tar.gz
# 解壓原始碼包
tar -xzvf scons-4.0.1.tar.gz
# 安裝
cd SCons-4.0.1/
python3 setup.py install
# 建立軟連結
ln -s /usr/local/python3/bin/scons /usr/bin/scons
```
2.3 安裝編譯工具環境
我們需要用到的編譯工具有交叉編譯器 gcc_riscv32、 產生 ninja 編譯指令碼的 gn、執行 ninja 編譯指令碼的 ninja,雖然我並不知道她們是怎麼工作的,但我堅信“Just Do IT”!
```bash
# 下載交叉編譯工具
wget https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz
# 解壓工具鏈
tar -xvf gcc_riscv32-linux-7.3.0.tar.gz
# 安裝交叉編譯工具
mv gcc_riscv32 /usr/local/ # 按照個人喜好存放
vi /etc/profile # 將環境變數配置進來export PATH=/usr/local/gcc_riscv32/bin:$PATH
# 如果已存在PATH,需將:/usr/local/gcc_riscv32/bin:$PATH 追加到PATH
source /etc/profile
# 如果還是不生效,請嘗試加到全域性變數 vim ~/.bashrc 我這邊就醬
# 驗證
cd
riscv32-unknown-elf-gcc --version
```
```bash
# 下載gn工具原始碼包
wget https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar
# 解壓
tar -xvf gn.1523.tar
# 安裝
mv gn /usr/local/
ln -s /usr/local/gn/gn /usr/bin/gn
# 驗證
gn --version
```
```bash
# 下載ninja
wget https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar
# 解壓
tar -xvf ninja.1.9.0.tar
# 安裝
mv ninja /usr/local/
ln -s /usr/local/ninja/ninja /usr/bin/ninja
# 驗證
ninja --version
```
2.4 編譯測試
通過簡單而又繁瑣的 Ctrl C 和 Ctrl V 我們終於完成了 HarmonyOS Device 用於編譯的 Linux 環境搭建。我已經迫不及待地想編譯一次試試:
```bash
cd /root/harmonyos/openharmony
python3 build.py wifiiot
```
至此,完整的 HarmonyOS Device 環境算是搭建完畢,我們可以開始編寫自己的程式進行編譯、燒錄了。接下來,我們嘗試從 Hi3861 套件的一些基本功能中瞭解 HarmonyOS Device 的開發除錯。
開發除錯篇
具體的文件和教程請參考 HarmonyOS 官方文件以及廠商的開源教程如 HiHope 的《Harmony OS 物聯網應用開發實戰》配套視訊和程式碼倉庫、BearPi 的《HM Nano 鴻蒙·季 釋出》配套視訊及程式碼倉庫。我們使用的是 HiHope 出品的 WI-FI IoT Hi3861 套件,涵蓋了一個核心板(Hi3861 WLAN 模組)和七個擴充套件模組(交通燈板、炫彩燈板、OLED 板、NFC 板、機器人擴充套件板),包含了豐富的外設介面如 I2C(The Inter Integrated Circuit)、PWM(Pulse Width Modulation)、GPIO(General Purpose Input/Output)和多路 ADC(Analog to Digital Converter)等等,可玩性非常高。鴻蒙社群也有很多牛人創造了超多創意玩法,比如通過蜂鳴器演奏樂曲、通過 OLED 播放視訊、俄羅斯方塊小遊戲、控制大疆無人機……您是不是也想來一套?接下來,請跟隨 Copy 攻城獅本大獅一起探索一下 HarmonyOS Devic 開發除錯吧!
3.1 從點燈開始
如果您留意到 HarmonyOS Device 官方文件中關於 Hi3861 的示例程式,除了“Hello,World”和 WLAN 模組聯網,在裝置開發章節還提供了一個 LED 外設控制的 Demo,通過呼叫 HarmonyOS 的 NDK 介面,實現對 GPIO 控制,達到 LED 閃爍的效果,也就是我們常說的“點燈”。原始碼在我們下載的目錄中:harmonyos/openharmony/applications/sample/wifi-iot/app/iothardware/led_example.c。
在 Copy 程式碼之前,大概瞭解一下原始碼的目錄:
.
├── applications # 應用程式樣例,包括wifi-iot,camera等
│ └── sample
│ ├──── camera # 攝像頭類產品
│ └──── wifi-iot # WIFI連線類產品
├── base # 基礎軟體服務子系統集&硬體服務子系統集
├── build # 元件化編譯、構建和配置指令碼
│ └── lite
├── build.py # 編譯指令碼檔案
├── device # qemu模擬不同核心執行在不同的單板
├── docs # OpenHarmony開發者文件
├── domains # 增強軟體服務子系統集
│ └── iot
├── drivers # 驅動子系統
│ ├── hdf
│ └── liteos
├── foundation # 系統基礎能力子系統集
├── kernel # 核心子系統
├── out # 編譯輸出
│ └── wifiiot # python3 build.py wifiiot的產物
├── prebuilts # 編譯器及工具鏈子系統
├── test # 測試子系統
├── third_party # 開源第三方元件
├── utils # 常用的工具集
└── vendor # 廠商提供的軟體
├── hisi
└── huawei
再看看我們的開發目錄`applications/sample/wifi-iot`:
├── app
│ ├── BUILD.gn # 入口
│ ├── demolink # Hello,World
│ │ ├── BUILD.gn
│ │ └── helloworld.c
│ ├── iothardware # 點燈Demo
│ │ ├── BUILD.gn
│ │ └── led_example.c
│ ├── samgr # 服務框架子系統管理系統功能
│ │ ├── bootstrap_example.c
│ │ ├── broadcast_example.c
│ │ ├── BUILD.gn
│ │ ├── example.h
│ │ ├── feature_example.c
│ │ ├── maintenance_example.c
│ │ ├── service_example.c
│ │ ├── service_recovery_example.c
│ │ ├── specified_task_example.c
│ │ └── task_example.c
│ └── startup # 啟動配置
│ └── BUILD.gn
└── LICENSE # 許可證
根據現有的程式碼,要想完成“點燈”實踐,我們只需在 VSCode Remote 中修改入口檔案`BUILD.gn`:
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"iothardware:led_example"
]
}
然後新開一個 VSCode 視窗進行 DevEco Device Tool 配置及燒錄,燒錄完畢通過串列埠工具能檢視開發板的輸出,再 Reset 開發板之後,伴隨著節奏聲,LED 燈一閃一閃,有點轉向燈的趕腳,按下左邊按鈕時提示閃爍。
解鎖更多章節>>>
想了解更多內容,請訪問: 51CTO和華為官方戰略合作共建的鴻蒙技術社群https://harmonyos.51cto.com
來源:王府井集團股份有限公司