一、簡介
智能金屬探測器是基于 OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)作業系統,利用電磁感應原理來探測周圍的金屬物體。該樣例采用多裝置協同的方式,相容 OpenHarmony 裝置開發與應用開發,整個樣例展現了 OpenHarmony 的 NAPI、eTS UI、UI 管理狀态 @state 和音頻播放等技術特性。
本項目由 Geek_Lite_Board 開發闆和潤和 RK3568 開發闆構成,Geek_Lite_Board 開發闆主要晶片為 STM32F427IIH6,作為裝置端檢測磁場強度的變化,使用的是 OpenHarmony 3.0 LTS 版本。潤和 RK3568 開發闆是由潤和軟體研發,采用瑞芯微 RK3568 晶片,作為應用端顯示金屬探測資訊,使用的是 OpenHarmony 3.1 Release 版本。
二、運作效果
當周圍有金屬靠近時,裝置端蜂鳴器會發出警報并把檢測資訊通過 Wi-Fi 模組發送給應用端。在應用端收到檢測資訊之後,會通過螢幕顯示檢測狀态并語音播報檢測結果。
三、功能實作
Geek_Lite_Board 開發闆通過 AK8963 電子羅盤晶片擷取地球磁場強度。通常地球的磁場強度是 0.4-0.6 高斯,當金屬靠近電子羅盤晶片時,根據電磁感應原理,金屬在磁場中的感應會引起磁場信号的變化。Geek_Lite_Board 開發闆通過 Wi-Fi 與潤和 RK3568 開發闆實時通信,把檢測到的資訊實時上傳。潤和 RK3568 開發闆作為應用端,采用方舟開發架構(ArkUI)基于 eTS 擴充的聲明式開發範式編寫頁面,通過 NAPI 接口接收裝置端 Geek_Lite_Board 開發闆的檢測資訊,使用 OpenHarmony 媒體子系統中的音頻播放功能實作語音播報金屬檢測狀态。
磁場資料擷取
AK8963 一款具有高靈敏度霍爾傳感器技術的三軸電子羅盤內建晶片,内部包含磁力傳感器,可以在 x 軸、y 軸、z 軸檢測地球磁場強度。
● 通過Mpu_Read_Bytes()函數讀晶片資料寄存器的值。
uint8_t Mpu_Read_Bytes(uint8_t const regAddr, uint8_t *pData, uint8_t len)
● 擷取 AK8963 的磁場原始資料。
Mpu_Data.mag_x = (MPU_BUFF[16] << 8) | MPU_BUFF[15]; // x軸磁場資料
Mpu_Data.mag_y = (MPU_BUFF[18] << 8) | MPU_BUFF[17]; // y軸磁場資料
Mpu_Data.mag_z = (MPU_BUFF[20] << 8) | MPU_BUFF[19]; // z軸磁場資料
● 對 AK8963 原始磁場資料進行轉化,得到磁場強度,機關高斯。
Gauss_Mag_z = Mpu_Calc.mag_z * 0.15f * 0.01f;
檢測金屬資訊
首先采集 100 組 z 軸磁場強度基準資料,然後對這些資料做平均處理,由此得到 z 軸磁場強度的零點資料。
const uint16_t calibrateCount = 1000; // 測量最大次數為1000
const uint16_t calibrateFrequency = 5; // 每測量5次取一次有效值
const uint16_t calibrateAverageCount = 100; // 取100次有效值
if(i < calibrateCount){
i++;
if(i%calibrateFrequency == calibrateFrequency){
Mag_z_buff[j++] = Gauss_Mag_z;
if(j >= calibrateAverageCount){
i = calibrateCount;
Mag_z_Flag = true;
for(k=0;k<calibrateAverageCount;k++){
origin_mag_z += Mag_z_buff[k];
}
origin_mag_z = origin_mag_z / calibrateAverageCount;
// 校準完成,藍燈亮,發送給應用端 "CalibrateOK"
BLUE_LED_ON();
memset(buff,0x00,sizeof(buff));
sprintf(buff,"angle:%s","CalibrateOK");
ESP8266_send_data(buff,strlen(buff));
}
}
}
以 origin_mag_z 作為零點,把擷取到的磁場資料與它進行對比,以此來判斷是否檢測到金屬。
NAPI擷取資料
NAPI(Native API)是 OpenHarmony 标準系統的一種 JS API 實作機制,适合封裝 IO、CPU 密集型、OS 底層等能力并對外暴露 JS 接口,通過 NAPI 可以實作 JS 與 C/C++ 代碼互相通路。潤和 RK3568 應用端通過 NAPI 來接受裝置端發出的檢測資訊。
● 底層 NAPI 子產品封裝
封裝子產品名為 tcpserverapi,下載下傳至 tcpservermodule 檔案夾。
下載下傳完成後放到 3.1Release 源碼根目錄,并配置編譯腳本;第一次編譯完成需要燒寫整個鏡像,後面修改子產品源碼,隻需将庫 send 到闆子裡面。指令如下:
// 先挂載,再send
hdc_std shell mount -oremount,rw /
hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so
● 應用端導入 NAPI 子產品
import tcpserverapi from '@ohos.tcpserverapi'
● 應用端 NAPI 接口調用
// 調用initServer接口 初始化 TCP 伺服器
tcpserverapi.initServer()
// 調用recvMsg 擷取并解析Geek_Lite_Board開發闆發送過來的角度
tcpserverapi.recvMsg().then((result) => {
var resultAngle = result.angle;
})
UI狀态顯示與管理
如上圖所示為檢測中頁面,整體布局分為文字标題和檢測狀态示意圖。
文字标題由 Flex 布局容器 text 元件實作,用于呈現一段資訊,如下為 text 接口相關屬性。
● 檢測狀态示意圖包括頁面背景圖,檢測狀态圖,檢測結果說明文字,具體功能由 Flex 彈性布局元件實作。接口原型如下所示:
Flex(options?: { direction?: FlexDirection, wrap?: FlexWrap, justifyContent?: FlexAlign, alignItems?: ItemAlign, alignContent?: FlexAlign })
● 通過調用 recvMsg 接口接送金屬探測器的消息,并修改首頁展示狀态,關鍵實作代碼描述如下:
aboutToAppear() {
var intervalID = setInterval(() => {
tcpserverapi.recvMsg().then((result) => {
}
}
}
其中 “ var intervalID = setInterval(() => ” 使用了定時器,定時調用 “recvMsg” 方法,通過 NAPI 擷取金屬檢測結果。
if (resultMetal.match("metal:")) {
this.metal = resultMetal.slice(6);
console.info('=======' + this.metal)
if (this.metal === 'Detected') {
this.detectionState = '發現金屬';
this.detection = $r("app.media.img_detected");
this.isDisplay = false;
}
else if (this.metal === 'UnDetected' || this.metal ==='CalibrateOK') {
this.detectionState = '檢測中';
this.detection = $r("app.media.img_detecting");
this.isDisplay = true;
}
}
當通過 NAPI 方式擷取到檢測資訊為 “ metal:Detected ” 時,設定 detectionState 為發現金屬狀态,螢幕顯示檢測到金屬頁面;當通過 NAPI 方式擷取到的檢測資訊為 “ metal:UnDetected ” 時,此時并未檢測到任何金屬資訊,設定 detectionState 為檢測中狀态,螢幕顯示檢測中狀态頁面。
語音播報檢測狀态
檢測到金屬後,RK3568 會播報已探測到金屬的語音資訊,達到通知使用者的目的,通過 OpenHarmony 媒體子系統的音頻播放功能實作。
OpenHarmony 媒體子系統為開發者提供一套簡單且易于了解的接口,使得開發者能夠友善接入系統并使用系統的媒體資源。媒體子系統包含了音頻播放、視訊播放、音頻錄制和視訊錄制等常用功能。
音頻播放的主要工作是将音頻資料轉碼為可聽見的音頻模拟信号并通過輸出裝置進行播放,同時對播放任務進行管理。本樣例主要通過導入 media 子產品、建立音頻播放執行個體、實作音頻播放接口和實作暫停播放接口等流程實作。
● 導入media子產品
import media from '@ohos.multimedia.media';
● 建立音頻播放執行個體
// OH media對象
private player = media.createAudioPlayer();
● 實作音頻播放接口
使用 play() 調用開始播放音頻資源,需在完成音頻資料加載後,即 src 屬性設定完成後才能調用。
play():void
四、總結
本文簡述了如何使用 OpenHarmony 進行多裝置的開發,示範了 NAPI、eTS UI、UI 管理狀态 @state 和音頻播放等技術特性的應用,通過這些多元化的功能,我們最終實作了金屬探測器樣例。豐富多樣的 OpenHarmony 開發樣例離不開廣大合作夥伴和開發者的貢獻,如果你也想把自己開發的樣例分享出來,歡迎把樣例送出到 OpenHarmony 知識體系 SIG 倉來,一起實作開發樣例共建。
五、參考連結
RK3568開發闆上絲滑體驗OpenHarmony标準系統
https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/docs/rk3568_quick_start
在Windows編譯OpenHarmony工程
https://gitee.com/Cruise2019/team_x/blob/master/homework/ohos_build_win/readme.md
OpenHarmony NAPI 學習文檔
https://gitee.com/javen678/hello-ohos-napi/tree/master/doc#/javen678/hello-ohos-napi/blob/master/doc/1.HelloNAPI.md
OpenHarmony基于eTS擴充的聲明式開發範式
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/Readme-CN.md
音頻播放開發指導
https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/audio-playback.md
從零開發金屬探測器應用
https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/metal_detection/quick_develop.md