OpenHarmony开发实例:【分布式游戏鉴权应用】

 1.介绍

本文将介绍分布式游戏鉴权应用。操作过程为:

  1. 设备A点击“开始游戏”按钮,开始搜索周边设备。

  2. 设备A显示周边设备,点击设备B并发起连接请求,远程拉起设备B的FA。

  3. 设备B收到请求后,选择是否允许“开启游戏”。

    • 选择允许,远程拉起设备A,并传递允许的信息,设备A解析了信息后自动开始游戏。
    • 选择不允许,远程拉起设备A,并传递不允许的信息,设备A回到最初的状态,并提示申请鉴权未通过。

效果图展示:

image.png

2.相关概念

gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md鸿蒙开发文档参考,点击或者复制转到。

3.搭建OpenHarmony环境

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. [获取OpenHarmony系统版本]:标准系统解决方案(二进制)。

    以3.1版本为例:

  2. 搭建烧录环境。

    1. [完成DevEco Device Tool的安装]
    2. [完成RK3568开发板的烧录]

搜狗高速浏览器截图20240326151547.png

鸿蒙HarmonyOS与OpenHarmony籽料

 

mau123789是v直接拿取

  1. 搭建开发环境。

    1. 开始前请参考[工具准备] ,完成DevEco Studio的安装和开发环境配置。
    2. 开发环境配置完成后,请参考[使用工程向导] 创建工程(模板选择“Empty Ability”) ,选择JS或者eTS语言开发。
    3. 工程创建完成后,选择使用[真机进行调测] 。

4.分布式组网

本章节以系统自带的音乐播放器为例(具体以实际的应用为准),介绍如何完成两台设备的分布式组网。 

  1. 硬件准备:准备两台烧录相同的版本系统的RK3568开发板A、B。

  2. 开发板A、B连接同一个WiFi网络。

    打开设置-->WLAN-->点击右侧WiFi开关-->点击目标WiFi并输入密码。

image.png

  1. 将设备A,B设置为互相信任的设备。

    • 找到系统应用“音乐”。

    • 设备A打开音乐,点击左下角流转按钮,弹出列表框,在列表中会展示远端设备的id。

    • 选择远端设备B的id,另一台开发板(设备B)会弹出验证的选项框。

image.png

 - 设备B点击允许,设备B将会弹出随机PIN码,将设备B的PIN码输入到设备A的PIN码填入框中。

配网完毕。

5.代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在参考中提供下载方式,整个工程的代码结构如下:

  • common:存放公共资源

  • pages:存放页面

    index.js:主页面

  • config.json:配置文件

6.初始化页面

在本章节中,您将学会如何进行页面初始化。

  1. 在data下定义需要使用的字段。

    data: {// 目标设备Id,用于记录申请过来的设备IdtargetDeviceId: '',// 是否同意玩游戏isAgree: false,// 是否显示开始游戏图标showStart: false
    },

  2. 根据Ability启动参数来判断页面被拉起的状态。

    在拉起页面时候,设置requestType为分布式拉起页面的业务请求类型(申请鉴权或者回复鉴权结果),如果没有requestType参数,则为手动拉起本机Ability。然后通过分析requestType参数的值来进行不同的业务逻辑操作。

    onInit() {// 获取Ability启动参数featureAbility.getWant().then((want) => {if (want.parameters !== undefined && want.parameters !== null && want.parameters !== '') {// 如果是请求授权被拉起Ability(requestType === 0),则记录申请权限的设备idif (want.parameters.requestType === 0) {this.isGame = false;this.targetDeviceId = want.parameters.localDeviceId;} else if (want.parameters.requestType === 1) {// 如果是授权后被拉起Ability(requestType === 1),则根据授权情况判断是否进行游戏if (want.parameters.isAgree !== null) {this.isAgree = want.parameters.isAgree;if (this.isAgree === true) {this.isGame = true;this.isStart = true;this.startGame();} else {this.showStart = true;prompt.showToast({message: '申请授权未被允许',duration: 5000});}}this.targetDeviceId = want.parameters.localDeviceId;} else {// 如果没有请求类型字段(requestType),则表明是手动启动的Ability,此时显示启动游戏图标this.showStart = true;}}});

7.显示鉴权设备

在本章节中,您将学会如何显示需要鉴权的设备列表。效果图如下:

  1. 在index.js文件中,在data下定义deviceList数组,用来表示周边的设备。代码如下:

    export default {data: {//可授权的设备deviceList: []}
    }

  2. 在index.hml文件中:

    • 定义一个"开始游戏"的button组件,设置startFA的点击事件;
    • 显示周边设备的对话框dialog,使用list 、list-item实现设备列表的展示;
    • 通过for属性遍历deviceList数组,$item是每一项的实例;
    • 给每一项设置selectDevice点击事件,参数为设备的networkId。

    代码如下:

    <div class="container"><button class="text-button" onclick="startFA">开始游戏</button><dialog id="continueAbilityDialog" class="dialog-main" oncancel="cancelDialog"><div class="dialog-div"><text class="dialog_title_text">选择设备</text><list class="dialog_device_list" divider="true"><list-item for="{{ deviceList }}" class="device_list_item"><div><label class="device_item_title" target="{{ $item.id }}">{{ $item.name }}</label><input class="device_item_radio" type="radio" checked="{{ $item.id === 'localhost' }}"id="{{ $item.id }}"name="radioSample" value="{{ $item.id }}"onchange="onRadioChange({{ $item.id }})"></input></div></list-item></list><div class="inner-btn"><button class="dialog_cancel_button" type="text" value="取消" onclick="onDismissDialogClicked"></button></div></div></dialog>
    </div>

  3. 在index.css文件中,定义布局和样式。代码如下:

    .container {flex-direction: column;justify-content: center;align-items: center;
    }.text-button{background-color: #5959f1;color: #FFFFFF;text-align: center;font-size: 16px;width: 80px;height: 40px;border-radius: 8px;
    }.select-device-dialog {width: 90%;height: 33%;
    }.select-device-wrapper {margin: 5%;width: 90%;height: 90%;flex-direction: column;
    }.select-device-title {width: 100%;height: 20%;text-align: left;font-size: 20px;
    }.select-device-list {width: 100%;height: 60%;text-align: left;font-size: 15px;
    }.select-device-item {width: 100%;height: 33%;
    }.select-device-item-left {width: 100%;height: 100%;text-align: left;font-size: 16px;
    }.dialog-main {width: 500px;
    }.dialog-div {flex-direction: column;align-items: center;
    }.dialog_title_text {width: 434px;height: 80px;font-size: 32px;font-weight: 600;
    }.dialog_cancel_button {width: 100%;font-size: 32px;
    }

  4. 在index.js文件中:

    • 定义createDeviceManager方法,获得设备管理器实例并进行获得同一网段下的所有在线设备;

      // 创建实例createDeviceManager() {if (dmClass !== null) {return;}deviceManager.createDeviceManager('com.huawei.cookbook', (err, data) => {if (err) {return;}subscribeId = Math.floor(Math.random() * 10000 + 1000);dmClass = data;dmClass.on('dmFaCallback', data => this.log('dmFaCallback on:' + JSON.stringify(data)));dmClass.on('deviceStateChange', mFilterOption, data => this.log('deviceStateChange on:' + JSON.stringify(data)));dmClass.on('deviceFound', data => this.log('deviceFound on:' + JSON.stringify(data)));dmClass.on('discoverFail', data => this.log('discoverFail on:' + JSON.stringify(data)));dmClass.on('serviceDie', data => this.log('serviceDie on:' + JSON.stringify(data)));this.getLocalDeviceInfoSync();const deviceInfoList = dmClass.getTrustedDeviceListSync();const list = [];list[0] = DEVICE_LIST_LOCALHOST;if (deviceInfoList.length > 0) {for (let i = 0; i < deviceInfoList.length; i++) {list[i + 1] = {name: deviceInfoList[i].deviceName,id: deviceInfoList[i].deviceId};}}this.deviceList = list;});},

    • 定义getLocalDeviceInfoSync方法,获取本设备信息;

      getLocalDeviceInfoSync() {if (dmClass != null) {deviceInfo = dmClass.getLocalDeviceInfoSync();} else {prompt.showToast({message: '请先初始化'});}},

    • 将获取到的同一网段下的所有在线设备信息放入deviceList数组中;

    • 通过this.$element('showDialog')找到hml文件中dialog组件,调用show()方法显示对话框。

8.鉴权申请与回应

在本章节中,您将学会如何从设备A拉起设备B的FA,并将设备A的标识信息发送给设备B。效果图如下:

image.png

申请鉴权(同意游戏)

申请鉴权(拒绝游戏)

  1. 设备A点击开始游戏,显示可以进行鉴权申请的设备列表,并选中设备申请游戏鉴权

    1. 定义startFa方法,用以显示设备列表对话框;

      startFA() {this.$element('continueAbilityDialog').show();},

    2. 定义onRadioChange方法,用以监听选择的设备变化;

      onRadioChange(inputValue, e) {if (inputValue === e.value) {if (e.value === 'localhost') {this.$element('continueAbilityDialog').close();return;}if (this.deviceList.length > 0) {for (let i = 0; i < this.deviceList.length; i++) {if (this.deviceList[i].id === e.value) {this.startAbilityContinuation(this.deviceList[i].id, this.deviceList[i].name);}}}}},

    3. 定义startAbilityContinuation方法,用以申请鉴权;

      startAbilityContinuation(deviceId, deviceName) {this.$element('continueAbilityDialog').close();const wantValue = {bundleName: 'com.huawei.cookbook',abilityName: 'com.huawei.gameauthopenh.MainAbility',deviceId: deviceId,// localDeviceId:申请设备的id,requestType,请求类型:0,申请鉴权parameters: {'localDeviceId': deviceInfo.deviceId, 'requestType': 0}};featureAbility.startAbility({want: wantValue}).then((data) => {// 销毁自身AbilityfeatureAbility.terminateSelf();});},

  2. 设备B被设备A分布式拉起,对游戏进行授权

    1. index.hml页面添加div用以显示授权选项;

      <div class="div-permit" if="{{!isGame}}" ><text class="text-title">来自远程合成设备小游戏权限请求,是否允许?</text><div class="div-button"  ><text class="text-allow" onclick="responds(true)">允许</text><text class="text-reject" onclick="responds(false)">不允许</text></div>
      </div>

    2. 定义responds方法用以反馈鉴权结果,并分布式拉起设备A的Ability;

      responds(value) {const wantValue = {bundleName: 'com.huawei.cookbook',abilityName: 'com.huawei.gameauthopenh.MainAbility',deviceId: this.targetDeviceId,parameters: {'localDeviceId': deviceInfo.deviceId, 'requestType': 1, 'isAgree': value}};featureAbility.startAbility({want: wantValue}).then((data) => {console.info('featureAbility.startAbility finished, ' + JSON.stringify(data));featureAbility.terminateSelf();});},

  3. 设备A被分布式拉起并解析鉴权结果,并根据结果执行不同的操作;

    在onInit方法中调用featureAbility.getWant()来获取启动信息并根据启动信息判断游戏申请是否被拒绝;

     
    onInit() {...// 获取Ability启动参数featureAbility.getWant().then((want) => {if (want.parameters !== undefined && want.parameters !== null && want.parameters !== '') {// 如果是请求授权被拉起Ability(requestType === 0),则记录申请权限的设备idif (want.parameters.requestType === 0) {this.isGame = false;this.targetDeviceId = want.parameters.localDeviceId;} else if (want.parameters.requestType === 1) {// 如果是授权后被拉起Ability(requestType === 1),则根据授权情况判断是否进行游戏if (want.parameters.isAgree !== null) {this.isAgree = want.parameters.isAgree;if (this.isAgree === true) {this.isGame = true;this.isStart = true;this.startGame();} else {this.showStart = true;prompt.showToast({message: '申请授权未被允许',duration: 5000});}}this.targetDeviceId = want.parameters.localDeviceId;} else {// 如果没有请求类型字段(requestType),则表明是手动启动的Ability,此时显示启动游戏图标this.showStart = true;}}});...
    },

  4. index.css文件新增内容如下:

    .div-permit{flex-direction: column;justify-content: center;align-items: center;width: 100%;height: 100%;
    }
    .div-button{flex-direction: row;justify-content: center;align-items: center;
    }
    .text-title{color: #222222;font-size: 22px;align-items: center;align-content: center;margin: 20px;
    }
    .text-allow{color: #3E7BDE;font-size: 18px;margin-right: 10px;
    }
    .text-reject{color: #212121;font-size: 18px;margin-left: 10px;
    }

9.游戏:图形的运动、碰撞与合成

  • [图形的运动]
  • [图形的碰撞与合成

如下图所示,按照从左到右的顺序,相同的图形碰撞合成下一个图形,最终合成OpenHarmony图形。

效果图预览:

图形的运动

  1. 在index.js的data下定义图片资源数组imgArray和显示在屏幕中图片的数组modes。代码如下:

    export default {data: {// 图片数组imgArray: ['common/images/product0.png', 'common/images/product1.png','common/images/product2.png', 'common/images/product3.png','common/images/product4.png', 'common/images/product5.png','common/images/product6.png'],//在屏幕中出现的数据modes: [],}
    }

    modes添加数据模型格式为:要显示的图形路径src、图形的宽度width、图形的高度height、图形的等级level(用于区分不同的图形),以及图形的左坐标left、顶部坐标top和其在x、y方向上的速度。新增一个数据模型到数组中,代码如下:

    addNewData() {var index = Math.floor(Math.random() * 4);var src = this.imgArray[index];var width = 50 + index * 10;var height = 50 + index * 10;this.modes.push({level: index,width: width,height: height,src: src,top: 0,left: 120,speedX: 0,speedY: 10,})
    }

  2. 在index.hml文件中,遍历modes数组,用Image组件显示图形,只需要动态更改class、style、src等属性即可。代码如下:

    <div class="div-image" if="{{isStart}}"><image for="{{ (index, item) in modes }}"class="product{{ item.level }}"style="top : {{ item.top }}; left : {{ item.left }}" src="{{ item.src }} "/>
    </div>

    对应的index.css新增内容如下:

    .div-image{flex-direction: column;justify-content: flex-start;align-items: flex-start;width: 100%;height: 100%;
    }.product0{width: 50px;height: 50px;position: absolute;
    }
    .product1{width: 60px;height: 60px;position: absolute;
    }
    .product2{width: 70px;height: 70px;position: absolute;
    }
    .product3{width: 80px;height: 80px;position: absolute;
    }
    .product4{width: 90px;height: 90px;position: absolute;
    }
    .product5{width: 100px;height: 100px;position: absolute;
    }
    .product6{width: 110px;height: 110px;position: absolute;
    }

  3. 使用setInterval()开启定时器,反复执行excuteTask()方法,该方法用来计算图形的运动。图形的移动主要是将图形的顶部top和左侧left的坐标值,每次递增各自的x、y方向的速度值。部分代码如下:

    export default {startGame(){addNewData();intervalId = setInterval(this.excuteTask, 50);},excuteTask(){     this.modes.forEach(item => {item.top += item.speedY;item.left += item.speedX;});}
    }

图形的碰撞与合成

这部分仅介绍核心的思路,具体的实现过程读者可自行完成,其达到的效果图如下:

  1. 两个图形若满足它们的的圆心距离小于它们半径的总和,则认为它们发生了碰撞。部分代码如下:

    isCollision(run, other) {var runCenterX = run.left + run.width / 2;var runCenterY = run.top + run.width / 2;var otherCenterX = other.left + other.width / 2;var otherCenterY = other.top + other.width / 2;var distance = Math.sqrt(Math.abs(runCenterX - otherCenterX) * Math.abs(runCenterX - otherCenterX) +Math.abs(runCenterY - otherCenterY) * Math.abs(runCenterY - otherCenterY));if (distance < (run.width + other.width) / 2) {     return true;}return false;
    }

  2. 通过判断两个图形的等级level值是否相等,若相等就可以进行合成。部分代码如下:

    isCompose( productA,  productB) {return productA.level == productB.level;
    }

 最后呢,很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

高清完整版请点击→《鸿蒙NEXT星河版开发学习文档》

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细资料鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的道路上更进一步。

《鸿蒙 (OpenHarmony)开发学习视频》

图片

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

OpenHarmony北向、南向开发环境搭建

图片

《鸿蒙开发基础》

  1. ArkTS语言

  2. 安装DevEco Studio

  3. 运用你的第一个ArkTS应用

  4. ArkUI声明式UI开发

  5. .……

图片

《鸿蒙开发进阶》

  1. Stage模型入门

  2. 网络管理

  3. 数据管理

  4. 电话服务

  5. 分布式应用开发

  6. 通知与窗口管理

  7. 多媒体技术

  8. 安全技能

  9. 任务管理

  10. WebGL

  11. 国际化开发

  12. 应用测试

  13. DFX面向未来设计

  14. 鸿蒙系统移植和裁剪定制

  15. ……

图片

《鸿蒙开发实战》

  1. ArkTS实践

  2. UIAbility应用

  3. 网络案例

  4. ……

图片

 获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git am XXX.patch 文件内容解析

git am XXX.patch 文件内容解析 打补丁的两种方式&#xff1a; 1.patch XXX.patch 2.git am XXX.patch 例如&#xff1a; diff --git a/drivers/crypto/se/ce.c b/drivers/crypto/se/ce.c index e6f68286d4ce6..de1bcb46fbe6b 100644 --- a/drivers/crypto/se/ce.cb/drive…

【生产案例面试题】JVM调优

写作目的 最近上线了一个需求&#xff0c;遇到了一个JVM报警的问题&#xff0c;很荣幸能遇到&#xff0c;在此分享一下整个调优的过程。 背景 我们是中台服务&#xff0c;我们的甲方就是上游不同的业务。中台原则上是业务和能力分离&#xff0c;但是不可避免的是分不开&…

【示例】MySQL-SQL语句优化

前言 本文主要讲述不同SQL语句的优化策略。 SQL | DML语句 insert语句 插入数据的时候&#xff0c;改为批量插入 插入数据的时候&#xff0c;按照主键顺序插入 大批量插入数据的时候&#xff08;百万&#xff09;&#xff0c;用load指令&#xff0c;从本地文件载入&#x…

Web地图服务规范之栅格瓦片地图服务:WMTS(WebMapTileService,网络地图瓦片服务)、TMS(TileMapService,瓦片地图服务)和XYZ

一、什么是栅格瓦片地图服务 这四种地图服务都是通过网络传输的栅格瓦片地图服务&#xff0c;这里有三个名词需要解释&#xff1a; 1、什么是栅格&#xff1f; 遥感影像、Dem等&#xff0c;就是图片。 2、什么是地图服务&#xff1f; 实际上&#xff0c;地图服务就是一个u…

如何在jmeter中把响应中的数据提取出来并引用

jmeter做接口测试过程中&#xff0c;经常遇到请求需要用到token的时候&#xff0c;我们可以把返回token的接口用后置处理器提取出来&#xff0c;但是在这种情况下&#xff0c;只能适用于当前的线程组&#xff0c;其他线程组无法引用到提取的token变量值&#xff0c;所以必须要生…

windows ubuntu子系统,单细胞篇 1.cellranger安装与分析

这几天&#xff0c;我将单细胞测序在windows ubuntu子系统中跑了一遍&#xff0c;将过程分享給大家。 单细胞测序conda create -n 10xdb #创建环境 conda activate 10xdbconda install -c bioconda cellranger -y #失败&#xff0c;可能源中没有 wget -O cellranger-7.…

使用深度学习集成模型进行乳腺癌组织病理学图像分类

基于预训练的VGG16和VGG19架构训练了四种不同的模型&#xff08;即完全训练的 VGG16、微调的 VGG16、完全训练的 VGG19 和微调的 VGG19 模型&#xff09;。最初&#xff0c;我们对所有单独的模型进行了5倍交叉验证操作。然后&#xff0c;我们采用集成策略&#xff0c;取预测概率…

说说你对链表的理解?常见的操作有哪些?

一、是什么 链表&#xff08;Linked List&#xff09;是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的&#xff0c;由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成 每个结点包括两个部分&…

如何编写易于访问的技术文档 - 最佳实践与示例

当你为项目或工具编写技术文档时&#xff0c;你会希望它易于访问。这意味着它将为全球网络上的多样化受众提供服务并可用。 网络无障碍旨在使任何人都能访问网络内容。设计师、开发人员和撰写人员有共同的无障碍最佳实践。本文将涵盖一些创建技术内容的最佳实践。 &#xff0…

JS-30-async函数

上一节说&#xff0c;JavaScript异步操作需要通过Promise实现&#xff0c;一个Promise对象在操作网络时是异步的&#xff0c;等到返回后再调用回调函数&#xff0c;执行正确就调用then()&#xff0c;执行错误就调用catch()。 虽然异步实现了&#xff0c;不会让用户感觉到页面“…

07 SQL进阶 -- 集合运算 -- 表的加减法

1. 表的加减法 1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来…

【企业场景】设计模式重点解析

设计模式 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff1a; 我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;我们自己开发业务使用的设计模式。 在平时的业务开发中&#xff0c;其实真正使用设计模式的场景并不多&#xff0c;虽然设计号…

OpenHarmony实战开发-MpChart图表实现案例。

介绍 MpChart是一个包含各种类型图表的图表库&#xff0c;主要用于业务数据汇总&#xff0c;例如销售数据走势图&#xff0c;股价走势图等场景中使用&#xff0c;方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

C#基础|数据类型、变量

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 数据类型 数据类型是为了方便存储数据的&#xff0c;为了将数据按照不同的分类存储&#xff0c;所以引入数据类型。这个在PLC中已经很熟悉了。 数据类型的作用&#xff1a;就是为了更好地管理内存&#xff0c;为…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记13:RTC实时时钟

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

原文链接&#xff1a;基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601336&idx4&sn143be5669da8ad336a455a4cca3d4b6a&chksmfa820d5fcdf584491…

【机器学习】机器学习创建算法第6篇:线性回归,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

【七 (1)指标体系建设-构建高效的故障管理指标体系】

目录 文章导航一、故障概述1、故障&#xff1a;2、故障管理&#xff1a; 二、指标体系概述1、指标2、指标体系 三、指标体系构建难点1、管理视角2、业务视角3、技术视角 四、指标体系构建原则1、与战略目标对齐2、综合和平衡3、数据可获得性4、可操作性5、具体和可衡量6、参与和…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

00 【哈工大_操作系统】Bochs 汇编级调试方法及指令

本文将介绍一下哈工大李治军老师《操作系统》课程在完成Lab时所使用到的 Bochs 调试工具的使用方法。这是一款汇编级调试工具&#xff0c;打开调试模式非常简单&#xff0c;只需在终端下输入如下指令&#xff1a; 1、bochs 调试基本指令大全 功能指令举例在某物理地址设置断点…