1 Star 0 Fork 146

李少龙 / knowledge_demo_temp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
readme.md 16.60 KB
一键复制 编辑 原始数据 按行查看 历史

基于OpenHarmony的智能指南针-显示端

此项目是基于OpenHarmony操作系统,设备侧使用Geek_Lite_Board开发板,主控芯片为STM32F427IIH6,操作系统为OpenHarmony 3.0。应用端采用大禹系列HH-SCDAYU200开发板套件,主控芯片为瑞芯微RK3568芯片,操作系统为OpenHarmony 3.1 release。

STM32通过mpu9250九轴姿态传感器中内置的ak8963磁力计获取磁场数据,把转换后的数据通过ESP8266无线模块把数据发送到RK3568。RK3568的应用是采用方舟开发框架(ArkUI)基于JS扩展的类web开发范式编写页面;通过NAPI接口获取底层网络数据,并在页面展示,展示效果如下图所示。

OpenHarmony技术特性

指南针应用端开发主要涉及:

  • OpenHarmonyJS UI

  • Canvas 组件

  • NAPI

1.快速上手

1.1 标准设备环境准备

1.2 应用编译环境准备

  • IDE版本:DevEco Studio 3.0 Beta3,DevEco Studio 下载地址
  • SDK 版本 :OpenHarmony SDK API 8,请参考配置OpenHarmony SDK,完成DevEco Studio的安装和开发环境配置。

1.3 项目下载和导入

1)git下载

git clone git@gitee.com:openharmony-sig/knowledge_demo_temp.git --depth=1

2)项目导入

打开DevEco Studio,点击File->Open->下载路径/electronic_compass/app-code/compass

1.4 安装应用

  • 配置应用签名信息,点击File > Project Structure > Project > Signing Configs界面勾选“Automatically generate signing”,等待自动签名完成即可,点击“OK”。如下图所示:运行

  • 安装应用 识别到设备后点击img,或使用默认快捷键Shift+F10(macOS为Control+R)运行应用。

    运行

  • 如果IDE没有识别到设备就需要通过命令安装,如下

    打开OpenHarmony SDK路径 \toolchains 文件夹下,执行如下hdc_std命令,其中path为hap包所在绝对路径。

    hdc_std install -r path\entry-debug-standard-ark-signed.hap

    应用安装到3568开发板后,需要SMT32开发板发送角度数据,才能看到效果;两个板子连接同一个wifi或使用网线连接并配置同一网段IP地址

    hdc_std shell ifconfig eth0 192.168.1.111 netmask 255.255.255.0

2.关键代码解读

2.1 目录结构

├─entry
│  └─src
│      └─main
│          │  config.json      应用配置文件
│          │   
│          ├─js
│          │  └─MainAbility
│          │      │  app.js    // 应用程序主入口
│          │      │  
│          │      ├─i18n
│          │      │      en-US.json  
│          │      │      zh-CN.json
│          │      │      
│          │      └─pages
│          │          └─index       // 指南针应用首页面
│          │                  index.css
│          │                  index.hml
│          │                  index.js
│          │                  
│          └─resources
│              ├─base
│              │  ├─element
│              │  │      string.json
│              │  │      
│              │  └─media           // 存放媒体资源
│              │          icon.png  // 应用桌面小图标
│              │          
│              └─rawfile

2.2 日志查看方法

hdc_std shell
hilog | grep "xxx" (xxx表示你添加的日志标记)

2.3 关键代码

  • 指南针UI界面:index.hml , index.js , index.css
  • NAPI: 导入 tcpserverapi 模块,该模块是要在3568系统代码中编译

3.从零开发指南针应用

3.1 新建OpenHarmony ETS项目

在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择JS语言,最后点击Finish即创建成功。 image-20211124092813545

3.2编写指南针主页面

image-20211124093106260

效果图如上可以分为三部分。

3.2.1 方位角度

1)在hml文件添加text组件;

2)在css文件添加样式表;

3)在js 文件修改text内容,即变量position的值;

index.hml
	<text class="text-style">{{ position }}°</text>
 
index.css
	.text-style{
    	font-size: 60px;
	}
index.js
	getCompassMsg() {
        this.intervalID = setInterval(() => {
            //NAPI调用
            compassapi.recvCompassMsg().then((result) => {
                var resultAngle = result.angle;
                if (resultAngle.match("angle:")) {
                    var info = parseInt(resultAngle.slice(6));
                    if (this.angle != info) {
                        this.angle = info;
                        console.info("=======compassAngle====" + this.angle)
                        if (this.angle >= 0 && this.angle < 23) {
                            this.position = '北 ' + this.angle;
                        }
                        else if (this.angle >= 23 && this.angle < 68) {
                            this.position = '东北 ' + this.angle;
                        }
                        else if (this.angle >= 68 && this.angle < 113) {
                            this.position = '东 ' + this.angle;
                        }
                        else if (this.angle >= 113 && this.angle < 158) {
                            this.position = '东南 ' + this.angle;
                        }
                        else if (this.angle >= 158 && this.angle < 203) {
                            this.position = '南 ' + this.angle;
                        }
                        else if (this.angle >= 203 && this.angle < 248) {
                            this.position = '西南 ' + this.angle;
                        }
                        else if (this.angle >= 248 && this.angle < 293) {
                            this.position = '西 ' + this.angle;
                        }
                        else if (this.angle >= 293 && this.angle < 338) {
                            this.position = '西北 ' + this.angle;
                        }
                        else if (this.angle >= 338 && this.angle < 360) {
                            this.position = '北 ' + this.angle;
                        }
                    }
                }
            });

        }, 100);
    },
3.2.2 指南针盘

指南针盘只由一个Canvas组件组成,但是却包括刻度盘,角度数字,方位文字 3 个部分;

如下是指南针盘Canvas组件以及CanvasRenderingContext2D的代码:

index.hml  添加canvas组件,并设置ref,以及配置坐标轴进行顺时针旋转角度
	<canvas class="compass-canvas" ref="compassCanvas"style="transform : rotate({{ -angle }});"></canvas>
index.css 长宽占用都是100%
	.compass-canvas {
    	width:100%;
    	height: 100%;
	}
index.js 根据 hml 中的 ref,拿到该组件,并获取CanvasRenderingContext2D对象compass_context,之后所有的绘制都是调用compass_context对象方法
	
	compass_canvas = this.$refs.compassCanvas;
        compass_context = compass_canvas.getContext('2d', {
            antialias: true
        });

1)刻度盘

刻度盘是由内圆、外圆和刻度竖线组成;如下是内外圆绘制:

compass_context.translate(this.width / 2, this.height / 2); 移动当前坐标系的原点。

this.outsideRadius = this.width / 2 - this.width / 7;  // 计算外圆半径
this.insideRadius = this.outsideRadius - this.width / 8;   // 计算内圆半径
        
this.drawCircle(this.outsideRadius, '#F9F9F9'); //外圆,传入外圆半径和颜色
 this.drawCircle(this.insideRadius, '#FFFFFF');  //内圆,传入内圆半径和颜色
 
 drawCircle(radius, color) {
        compass_context.beginPath(); // 创建一个新的绘制路径。
        compass_context.fillStyle = color; // 指定绘制的填充色.
        compass_context.strokeStyle = color; //设置描边的颜色。
        compass_context.arc(0, 0, radius, 0, 6.28); //绘制弧线路径。
        compass_context.fill(); //对封闭路径进行填充。
    },

如下是圆环内部竖线刻度绘制:

drawAngleLine() {
        compass_context.strokeStyle = '#000000'; //设置描边的颜色。
        // 总共有60 个刻度,按5的倍数进行线条加粗。
        for (var i = 0; i < 60; i++) {  
            if (i == 0 || i == 5 || i == 10 || i == 15 || i == 20 || i == 25 || i == 30 || i == 35 || i == 40 || i == 45 || i == 50 || i == 55) {
                compass_context.lineWidth = 3; // 线条宽度
                compass_context.beginPath(); // 创建一个新的绘制路径。
                compass_context.moveTo(0, this.insideRadius + (this.outsideRadius - this.insideRadius) / 4); // 当前点移动到指定点。
                compass_context.lineTo(0, this.outsideRadius - this.width / 30); // 从当前点到指定点进行路径连接.

            } else {
                compass_context.lineWidth = 0.5; 
                compass_context.beginPath();
                compass_context.moveTo(0, this.insideRadius + (this.outsideRadius - this.insideRadius) / 4);  
                compass_context.lineTo(0, this.outsideRadius - this.width / 30);
            }
            compass_context.stroke();
            compass_context.rotate(15 * Math.PI / 450);
        }
    },

2)外围数字角度

 drawAngleNumber() {
        compass_context.beginPath(); // 创建一个新的绘制路径。
        this.angleNumberSize = this.width / 30; // 角度数字文字大小。
        compass_context.font = this.angleNumberSize + 'px' + ' sans-serif';  // 角度数字文字大小转换。
        for (var i = 0; i < this.angleNumbers.length; i++) {
            if (i == 0) {                                       // 判断是0 设备颜色为红色,其他为灰黑色.
                compass_context.fillStyle = '#FF00000';
            } else {
                compass_context.fillStyle = '#AF000000';
            }
            let number = this.angleNumbers[i];      // 获取数组对象里面的数字内容.
            compass_context.fillText(number, -this.width / 85, -this.width / 2.45); // 绘制填充类文本。
            compass_context.rotate(30 * Math.PI / 180);  // 设置当前坐标轴进行顺时针旋转,成圆形排列
        }
    }

3)内部方位文字和三角箭头绘制

如下是

 drawPositionText() {
        compass_context.beginPath();
        this.positionTextSize = this.width / 20;
        compass_context.font = this.positionTextSize + 'px' + ' sans-serif';
        for (let i = 0; i < this.positionTexts.length; i++) {
            if (i == 0) {
                compass_context.fillStyle = '#FF00000';   // 获取方位文字为北,改变文字颜色为红色
                this.drawTriangle();                      // 指北三角箭头绘制
            } else {
                compass_context.fillStyle = '#0000000';
            }
            let positionText = this.positionTexts[i];
            compass_context.fillText(positionText, -this.width / 40, -this.width / 9);
            compass_context.stroke();
            compass_context.rotate(90 * Math.PI / 180);
        }
    },

4)三角箭头绘制

 drawTriangle() {
        compass_context.beginPath();
        compass_context.fillStyle = '#FF00000';
        compass_context.moveTo(0, -this.width / 5);
        compass_context.lineTo(this.width / 40, -this.width / 5 + this.width / 35);
        compass_context.lineTo(-this.width / 40, -this.width / 5 + this.width / 35);
        compass_context.closePath(); // 结束当前路径形成一个封闭路径。
        compass_context.fill();
    },
3.2.3 指示线

指南针指示线只由一个Canvas组件组成,也只包括一根竖线的绘制;

1)如下是指南针指示线Canvas组件以及CanvasRenderingContext2D的代码:

index.hml  添加canvas组件,并设置ref
	 <canvas class="line-canvas" ref="lineCanvas"></canvas>
index.css 长宽占用都是100%,并设定样式 position: absolute 相对于父元素进行定位。
.line-canvas {
    width: 100%;
    height:100%;
    position: absolute;
}
index.js 根据 hml 中的 ref,拿到该组件,并获取CanvasRenderingContext2D对象compass_context,之后所有的绘制都是调用compass_context对象方法
	
	 line_canvas = this.$refs.lineCanvas;
        line_context = line_canvas.getContext('2d', {
            antialias: true
        });

2)指示线获取

 drawPositionLine() {
        line_context.strokeStyle = '#000000'; 
        line_context.lineWidth = 6;
        line_context.lineCap = 'round';  // 线端点以圆形结束。
        line_context.moveTo(0, -this.outsideRadius + this.width / 15);
        line_context.lineTo(0, -this.outsideRadius - this.width / 28);
        line_context.stroke();  // 进行边框绘制操作。
    },

3.3 NAPI

3.3.1 底层NAPI模块封装

1)NAPI接口开发具体请参考文档OpenharmonyNAPI开源仓库

2)本应用封装的模块名为tcpserverapi,源码路径,下载好的tcpservermodule文件夹。

3)下载完成后放到3.1Beta版本根目录,并按照参考PPT配置编译脚本;第一次编译完成需要烧写整个镜像,请参考开发板上新 | RK3568开发板上丝滑体验OpenHarmony标准系统;后面修改模块源码,只需将库send到板子里面。命令如下:

先挂载,再send
hdc_std shell mount -oremount,rw /
hdc_std file send libtcpserverapi.z.so system/lib/module/libtcpserverapi.z.so
3.3.2 应用端导入NAPI模块
import tcpserverapi from '@ohos.tcpserverapi'
3.3.3 应用端NAPI接口调用
//调用initServer接口 初始化 TCP 服务器
tcpserverapi.initServer() 
//调用recvMsg 获取并解析SMT32板子发送过来的角度
tcpserverapi.recvMsg().then((result) => {  
                var resultAngle = result.angle;
                })

3.4 项目下载和导入

1)git下载

git clone git@gitee.com:openharmony-sig/knowledge_demo_temp.git --depth=1

2)项目导入

打开DevEco Studio,点击File->Open->下载路径/electronic_compass/app-code/compass

3.5 约束与限制

3.5.1 设备编译约束

以润和大禹系列HH-SCDAYU200开发板套件为例

3.5.2 应用编译约束
1
https://gitee.com/coolbi/knowledge_demo_temp.git
git@gitee.com:coolbi/knowledge_demo_temp.git
coolbi
knowledge_demo_temp
knowledge_demo_temp
master

搜索帮助