首页 文章 精选 留言 我的

精选列表

搜索[CloudQ共创征文],共1296篇文章
优秀的个人博客,低调大师

#2020征文-手表#【纯干货】手把手教你JS开发智能表应用

目录: 前言 配置 开发 调试 结尾 前言 本人于9月中旬,开始接触鸿蒙。那时候还只是抱着尝新的心态,跟着官方文档,写出了TV版的hello world和Lite Wearable的hello world,现在回想起来,还是有点激动。 到了9月下旬,公司收到了华为寄过来的搭载鸿蒙系统的智能手表,因为某种原因,智能表开发的任务落到了我头上。我是前端开发,说实话,当时接到这个任务时候,其实没多少底,毕竟不懂APP开发的流程,虽说鸿蒙支持JS开发,但其实心里也清楚,里面应该还是有很多坑要踩的,事实证明,坑是真的多。哈哈哈。 今天为什么有时间写这篇文章呢?因为我的智能手表应用已经开发、联调、测试完毕了,马上要上架啦。 话不多说,让我们进入正题。 配置 1、准备工作(下载、安装、环境配置、创建项目等) 这个过于简单,就毋庸赘言了,请参考官方文档 生成的目录结构,就是这个样子。对于安卓开发来讲,应该是很熟悉的,但对于前端来讲,就很懵逼啊。 什么gradle文件,这是啥啊,咦,为什么还有java,我不是选择的js模板呢?很是疑惑。先不管了,硬着头皮干。 2、config.json权限列表配置(fetch、network等) 鸿蒙应用里,image标签想要使用https的外链资源,必须要配置权限,同理,fetch接口请求也是如此。 我自己在开发过程中,是配置了网络请求的权限,以及网络状态的权限。 "reqPermissions": [ { "name": "ohos.permission.GET_NETWORK_INFO" }, { "name": "ohos.permission.GET_WIFI_INFO" }, { "name": "ohos.permission.INTERNET", }, ], 3、离线签名与签名配置 (用于真机调试) 如果用不到真机调试,可忽略这一步。 请参考文档 编辑器的版本不一样,使用的密钥文件不一样。有的是.p12,有的是.jks。 如果你生成的是jks,那么你可能需要转换p12,笔者就转过,可自行百度。 申请开发者证书和调试 Profile request.json 如下 { "developerRequest": { "Applicant": "XXXX", "ApplicationName": "XXXX", "CN": "XXXX", "validYear": "1" }, "provisionRequest": { "debug-info": { "device-ids": [ "" // 调试真机的UDID ] }, "permissions": { "restricted-permissions": [ "harmonyos.permission.ANSWER_PHONE_CALLS" ] }, "bundle-name": "你的包名", "developer-id": "你的开发者ID" } } 然后将你生成csr、p12还有这个request.json一并发给华为的人,然后他们会给你cer和p7b的文件,你直接导入就行了 至此,真机调试的准备工作我们就已经完成了。 真机调试打出来的包是hap包,如果要上架的话,必须是.app的文件,所以我们还要在项目配置里,导入这些证书等,同上一步操作 4、集成 Wear Engine SDK(手表和APP通讯) APP和手表都要集成对应的SDK,才能通讯 添加编译依赖 1、联系华为接口人获取 SDK。 2、将 SDK 解压后,把 SDK 中的 har 包放在项目\entry\ libs 目录下。 3、打开应用级的 build.gradle 文件。 4、在“dependencies ”中添加如下编译依赖,,然后同步 5、生成穿戴设备侧签名证书指纹、设备检测 手表侧要配置APP的指纹和包名,APP侧要配置手表侧的指纹和包名 请参考文档 手表侧配置APP的包名和指纹代码如下 6、编译构建生成HAP或者生成APP 请参考文档 开发 开发倒没有什么好说的,就是正常的前端那一套,布局、样式、逻辑。需要注意的是,设备的分辨率是454*454,圆形屏幕,需要留出安全距离。 如果手表需要和手机APP进行交互的话,JS的能力比较弱,需要依赖JAVA来做中转。 JAVA代码不是我写的,直接照抄的官方文档,然后让安卓客户端改造了一下。 我做的这个项目就是这么做的,目录如下 解锁更多章节>>> 作者:dadtakesmefly 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

优秀的个人博客,低调大师

——从 Palantir 那套方法论,到 CloudQ 的全景图谱

Ontology(本体论,在企业 AI 语境里常被叫做「业务本体」或「知识图谱」),说白了就是一套把真实世界里的 对象、属性、关系、动作 理成一张结构化图的方法论。它的作用只有一个:让大模型的推理别再靠训练记忆瞎猜,而是基于你企业里真实存在的数据去推——于是 AI 说出来的东西,能解释、能追溯、能在人授权后执行。到了云运维领域,Ontology 长出来的样子,就叫 全景图谱。

优秀的个人博客,低调大师

推动开源鸿蒙RN版本演进与性能优化 共创跨平台体验新标杆

10月24日,在QCon全球软件开发大会上海站的 HarmonyOS 开发者技术分论坛上,华为终端BG软件主任工程师带来了《开源鸿蒙 React Native 性能体验提升实践与思考》的主题分享,深入解析了开源鸿蒙React Native(RN)版本的最新进展,以及在性能和负载优化方面的实践探索。 开源鸿蒙RN版本快速演进,助力应用RN业务高效商用 随着鸿蒙生态的持续壮大,开发者迎来了除 Android 与 iOS 之外的“第三种选择”。React Native(RN)作为业界广泛应用的跨平台开发框架,兼具开发效率与性能优势。推进 RN 框架的鸿蒙化适配与版本演进,将有助于开发者复用原有技术栈,快速构建高性能的鸿蒙应用,有效缓解“加入一个新生态就会增加一倍投入”的行业困境,实现“一套代码、多平台复用”的开发体验。 据华为专家介绍,依托开源鸿蒙社区平台,华为携手产业界及学术界力量共同交付RN跨平台框架的开源鸿蒙版本。通过开源共建的模式,开源鸿蒙RN版本快速迭代,能力不断完善,已支撑200多个应用RN业务商用。其中,在头部200多个鸿蒙应用中,有40多款涉及RN框架,均已全部实现商用。更多应用仍在快速、健康适配中,为鸿蒙生态的持续扩展奠定坚实基础。 多维优化路径,提升性能与能效体验 在社区伙伴的共同合力下,开源鸿蒙RN版本在性能、负载优化等方面取得了显著成效。现场,华为专家从架构设计、编译优化、系统资源调度、能效控制等多个维度进行了全方位分享。 架构层面,RN Mount 段通过 C++ 对接 ArkUI 的 C-API 接口,无跨语言流程,大幅度提升端到端性能。目前,开源鸿蒙RN各版本都已对接ArkUI C-API接口,显著提升了页面交互性能。 虚拟机侧,龙雀 JS 引擎通过三级JIT流水线优化、LLVM编译优化、Builtins PGO重排、灵活GC(暴露GC调参接口)、codecache等技术,在 V8 虚拟机的基础上实现约20%的性能提升,相比原始版 Hermes 提升更为明显,开发者只需修改两行代码即可调用。 编译器优化方面,开源鸿蒙RN通过毕昇编译器支持 LTO/PGO 等高级编译优化技术,实现 5~8% 的性能提升与 2~5% 的负载下降,RN 库产物尺寸缩小约15%。 能耗与动画方面,LTPO在开源鸿蒙 RN上已实现衰变动画、帧动画、弹跳动画等三类原生动画适配,能够降低部分动画场景手机负载,让设备不发热,更节能。未来,将在RN JS动画上使能LTPO帧率动态调整逻辑,使其根据动画速度设置帧率。 页面时延优化上,Text 组件及 Stack 等控件通过结构优化,避免无效和重复的测量动作,让页面完成时延平均降低超过100ms(benchmark测试)。目前,该措施已落地开源鸿蒙RN全部版本。 携手推进类RN框架技术演进,共同繁荣鸿蒙生态 RN 框架在开源鸿蒙的持续演进,不仅依赖华为自身的研发投入,更离不开开源社区的协同共建。未来,华为还将携手更多伙伴,在开源社区上对RN框架以及包括 Lynx、Taro、Hippy、Mach、AJX、Cube、KDS、DX、Talos、Picasso等在内的类RN框架进行技术演进的探讨,共同推进性能、负载优化方案的落地,构建开发者友好的跨平台框架生态,推动鸿蒙应用开发迈入高质量发展新阶段。

优秀的个人博客,低调大师

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

海外某电信,是某国的主要国有电信服务供应商,不仅致力于为民众和企业提供全面的电信服务,还肩负着推动国家通信基础设施和信息技术进步的重任。在数字化转型的关键时期,海外某电信选择与 Databend 携手合作,开启了数据驱动业务决策的新篇章。 为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加,传统的 Clickhouse + Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse + Hive 方案进行离线的实时报表。但随着业务量的上升后,Hive的数据存储压力变大,且 Hive 缺乏索引设计,导致存储压力巨大,每天需要进行大量的中转和数据比对工作。同时 Clickhouse 随着业量上升后单机已经扩容到 128c768g 的机型,对后续的扩容及弹性挑战较大。 为了应对这一挑战,Databend 以其高效、弹性、低成本的云原生数据仓库解决方案,成为了海外某电信的理想选择。Databend 的技术创新不仅提高了数据处理速度,还支持实时分析,大大增强了海外某电信的服务质量和运营效率。 Databend 是一款使用 Rust 研发、开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。 具有即时扩缩容能力,能在数分钟内增加数百倍的算力,为企业提供了一个基于对象存储、湖仓一体化、计算和存储分离的大数据管理和分析集中式平台。实现了一份数据,统一计算入口,供多用种业务使用,从而助力企业更准确地洞察业务、制定战略,很好的满足了私有化部署的不同需求。 Databend 的核心优势在于其高性能的数据处理能力和成本效益。 在 Databend 的存算分离架构下,计算节点可以根据实际需求动态调整,有效节省了资源。同时,利用 Kubernetes 的弹性伸缩能力,Databend 能够迅速适应各种业务需求和负载变化,提供了真正的实时数据处理和智能决策支持。 这次合作不仅解决了海外某电信当前的数据处理挑战,更为其长远发展奠定了坚实的基础。Databend 的先进技术使海外某电信能够从庞大的数据集中提取出更有价值的洞察,助力其更准确地洞察业务、制定战略,满足不同需求的私有化部署,这在推动某国社会经济发展中起到了不可或缺的作用。 Databend 与海外某电信的合作是双方共同迈向数据仓库技术新纪元的重要一步。这不仅标志着海外某电信在海外电信领域的重要进展,也为全球电信行业提供了一个成功的合作范例。 关于Databend Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式数仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。 👨‍💻‍Databend Cloud:https://databend.cn 📖Databend 文档:https://databend.rs/ 💻Wechat:Databend ✨GitHub:https://github.com/datafuselabs/databend

优秀的个人博客,低调大师

大咖集结,共创生态|首届AIOps社区专家团正式集结出道

近年来,在AIOps领域极速发展的背景下,IT工具、平台能力、解决方案、AI场景及可用数据集的迫切需求在各行业迸发。基于此,云智慧在2021年8月发布了AIOps社区,旨在树起一面开源旗帜,为各行业客户、用户、研究者和开发者们构建活跃的用户及开发者社区,共同贡献及解决行业难题、促进该领域技术发展。 成立近半年,社区先后开源了数据可视化编排平台-FlyFish、运维管理平台OMP、云服务管理平台-摩尔平台、Hours算法等产品。其中FlyFish斩获中国开源云联盟2021优秀开源项目奖。OMP运维管理平台入选2021 年度 OSC 中国开源项目「最受欢迎项目」榜单。并在业内首次开源了智能运维开源数据集-GAIA数据集,填补了AIOps开源集数据领域的空白。 2021年11月,云智慧正式成为中国开源云联盟成员单位,2022年1月,云智慧入选SegmentFault 思否「2021 中国技术品牌影响力企业榜单」,这一切都代表着开发者和社区对我们的认可,这也更加坚定了云智慧开源战略的决心。近日,AIOps社区联合在云原生、开源、AIOps等众多领域专家,共同成立社区专家团。 AIOps社区专家团是什么 AIOps专家团是由云智慧AIOps社区发起成立的开源技术组织,是一个汇聚开源领导者、技术领导者、社区布道者的开放组织,专家团致力于创建开放、包容的开源生态体系,让开源爱好者在社区中学有所得、让技术领袖充分发挥自身价值。 目前,我们正在邀请各行业专家入驻,一起推动AIOps在中国的落地和繁荣。如果您是在AIOps、云原生、开源、自动化运维等领域的技术领袖,或者您热衷开源文化,有多年开源项目运营、社区布道师经验。请点击下方“阅读原文”,填写表单,我们将及时和您取得联系,邀请您入驻社区专家团。 未来我们要干什么 根据GitHub 统计,预计2025 年开发者用户的数量将达到 1 亿,中国开发者数量及开源贡献度增长已成为全球最快,到 2030 年中国开发者或将成为全球最大的开源群体。 面对时代所赋予的机遇,2022年,云智慧将加码开源战略,以社区专家团为切入点,在前沿技术话题、开源治理、AIOps场景落地等领域打造一系列社区Meetup,闭门会等活动。通过社区专家团,我们将搭建技术领导者与开发者之间的沟通桥梁,让开源的力量赋能更多的开发者。 未来云智慧将继续抓住时代所给予的机遇,在各界大力支持开源运动的背景下,探索开源在中国AIOps领域里落地生根新模式,依托云智慧在AIOps领域的深厚积累,开源更多优秀的技术产品,为整个AIOps开源软件生态贡献出自己一点微不足道的力量。 专家团邀请表单链接:http://t27bk7mb4txdpwcz.mikecrm.com/SSdfnv1 云智慧AIOps社区链接:https://www.cloudwise.ai/communityPanel.html

优秀的个人博客,低调大师

斐讯与思科签署合作备忘录,共创数据时代商业蓝海

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 【51CTO.com原创稿件】斐讯数据通信技术有限公司(以下简称斐讯),一家致力于向客户提供移动终端、数据通信产品、云计算等技术设备及整体解决方案和服务的高新技术企业公司。凭借出色的产品和业绩,蝉联中国电子***,以平均每年超过200%的营收增速,在行业中稳步前进。从K2路由器、智能路由产品K3C、到斐讯智能运动手环W1、斐讯智能运动手表W2、斐讯智能体脂秤S7、斐讯智能空气检测仪悟空M1、斐讯智能空气净化器悟净A1,款款智能新品不仅质量出众,还启用 “0元购”的创新模式,从家庭常用智能硬件开始,尽***可能降低科技成果、科技产品的获得成本,让消费者见微知著,用最小的代价感受到***的智慧。 然而斐讯的发展战略远不止于此,斐讯提出了战略转型的“金三角战略”,即Smart Home、Smart Data、Smart Life。斐讯结合自身的优势和对产业的深刻洞察,结合智慧大数据产业共同打造智慧生活,从智慧家庭、到智慧大数据、再到智慧生活,是斐讯战略转型的全盘布局。 近日,斐讯-思科签约仪式在斐讯总部正式举行。双方就网络服务业务(云计算数据中心及服务器业务)开展深度合作,并签署合作备忘录。斐讯创始人顾国平表示:“斐讯基于北京、华东、华南、西南等地的数据中心,已在全国布局智慧大数据战略。此次与思科达成合作后,相信依托思科三十多年来专注于互联网领域的广泛产品及解决方案,能为斐讯建设更完善的数据中心架构,并全面提升数据中心服务能力。在斐讯全球化战略的开展过程中,思科也将成为斐讯紧密的合作伙伴,助力产品及技术的***水准发展,共同打造行业标杆。” 签约仪式 资源互补、合作共赢 斐讯创始人顾国平表示,此次跟思科合作,主要是从两个核心方面来展开:一是基础网络,希望思科的服务器、交换机这些大型骨干产品可以给斐讯提供比较安全可靠的解决方案。 二是云计算的安全。斐讯希望思科可以帮助其在云计算安全方面构建一个好的体系。 除了已经成熟的北京、上海和广州这些数据中心之外,其他数据中心如遵义、重庆、成都、丽江、南宁等大型数据中心都在逐步建设中,这些数据中心节点布局将采用思科业界领先的数据中心解决方案产品和服务,从顶层设计方面提升数据中心建设的高度和纬度,从基础设施方面搭建更具安全稳定的数据中心架构,打造行业标杆,加速行业创新,推动斐讯CDC业务在2018年再创骄人业绩。 思科大中华区资深副总裁倪殿令先生则表示,思科将利用先进技术和解决方案,并且结合思科在全球领先的创新实践以及市场洞察,致力于与中国本土企业在大数据、互联网+、人工智能等先进领域的合作,为客户创造更高的价值。希望与斐讯的这次合作, 能为发展数字中国添砖加瓦。 从左至右依次:斐讯CEO王佳彬 斐讯创始人顾国平 思科大中华区资深副总裁倪殿令 与思科携手,布局海外市场 说到海外布局,顾国平表示,斐讯在海外布局的步伐还是比较大的。在北美、在欧洲斐讯都已有布局,斐讯正在慕尼黑建设比较大型的数据中心,希望全球知名的公司给斐讯提供技术支撑和产品保障。顾国平还透露,今年3月9日斐讯的发布会,将发布斐讯海外策略。 将区块链技术融入到生活场景 区块链作为当今的热点,引得众多拥有技术与实力的厂商加入。斐讯更是将区块链技术融入到生活场景。在顾国平看来,斐讯进军区块链有三大优势:技术创新能力、持续增长的用户数量、成熟的数据中心布局。 斐讯在区块链方面已经有了明确的布局,将推出跟区块链有关系的一些产品,这些产品首先聚焦在普通的产品上,斐讯首款运用区块链技术的产品斐讯天天链N1将于近日面世。 【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】 【责任编辑: 赵立京 TEL:(010)68476606】

优秀的个人博客,低调大师

#2020征文-TV#【鸿蒙基地】鸿蒙从窗口开始:Page Ability诞生记

目录: 1. Page Ability概述 2. 手动创建Page Ability类 3. 在config.json文件中注册Page Ability 4. 创建布局文件 5. 装载布局文件 6. 显示Page Ability 7. 销毁Page Ability 8.源代码包 1. Page Ability概述 Page Ability是FA唯一支持的Ability,本质上是一个窗口,类似于Android的Activity,用于提供与用户交互的能力。为了方便,在后面的内容就将Page Ability简称为Page。另外,HarmonyOS还提供了一个AbilitySlice。AbilitySlice的功能与Page类似,只是在切换时可以在同一个Page内完成。如果从Page到Page,相当于Web页面用新窗口导航到另一个页面。如果从AbilitySlice切换到AbilitySlice,相当于Web页面以同一个窗口的方式导航到另一个页面。 一个Page可以不使用AbilitySlice,也可以使用一个或多个AbilitySlice,在创建HarmonyOS工程时,生成的Demo代码中包含了一个默认的AbilitySlice(MainAbilitySlice.java)。图1 是Page和AbilitySlice的关系。 图1 Page与AbilitySlice的关系 如果在Page中使用多个AbilitySlice,那么这些AbilitySlice提供的业务能力应高度相关。下面是一个典型的应用场景: 在线视频播放器的主界面可以用一个Page来实现,在主界面中包含了两个AbilitySlice:一个AbilitySlice用于展示视频列表,另一个AbilitySlice用于播放视频。 在DevEco Studio中创建HarmonyOS工程时,IDE会提供一些Page模板,如图2所示。通过这些Page模板,可以生成HarmonyOS工程的骨架代码,其中会包含一些简单的例子,相当于HelloWorld。 图2 创建HarmonyOS工程时的提供的Page模板 DevEco Studio提供了自动创建Page Ability的功能,在创建的过程中会自动向config.json文件中添加相应的配置信息。不过为了更深入理解Page Ability的创建和使用过程,本节将用纯手工的方式创建一个Page Ability。 2. 手动创建Page Ability类 Page Ability是一个普通的Java类,所以我们首先应该创建一个Java类,本例创建的Java类是FirstAbility。任何一个Page Ability类都必须从Ability类继承,该类属于ohos.aafwk.ability包,所以FirstAbility的最终形式如下: 3. 在config.json文件中注册Page Ability 在HarmonyOS App中,任何一个可用的Page Ability,都必须在config.json文件中注册。Page Ability需要在config.json文件中的abilities部分注册。abilities是一个对象数组,每一个元素是一个对象,表示一个Ability(包括Page Ability、Data Ability和Service Ability)。FirstAbility的配置代码如下: 在创建HarmonyOS工程时,IDE已经自动在config.json文件中添加了MainAbility的注册信息,读者可以照葫芦画瓢,将MainAbility的注册代码复制一份,然后略作修改。 这里主要修改了actions、name和label属性。actions表示一个或多个与Page Ability关联的动作,可以通过这些action来调用当前的Page Ability。name指定了Page Ability类的全名,本例是com.unitymarvel.demo.FirstAbility。label用于指定窗口的标题文本。 4. 创建布局文件 HarmonyOS App既可以用Java代码动态创建组件的方式布局,也可以使用布局文件。本例使用布局文件的方式进行布局,这也是我推荐的布局方式。因为使用Java代码创建复杂的布局非常困难,而且代码量比较大,代码难以维护。 HarmonyOS工程的所有布局文件都放在resources/base/layout目录中,现在创建一个first_layout.xml文件,并输入下面的代码: 关于布局的更多内容在后面的 章节会详细讨论,这里只要知道,first_layout.xml文件中使用了方向布局,而且是垂直方向。在垂直方向上从上到下放置了3个组件,分别是Button1、Text和Button2。 查看更多章节>>> 作者:李宁 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/

优秀的个人博客,低调大师

#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.1 Remote - 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

优秀的个人博客,低调大师

校企联动 开源共创 东方通& openEuler Meetup开启开发者效率变革

5月27日,东方通与OpenAtom openEuler(简称"openEuler")社区联合主办的openEuler社区云原生开源中间件Meetup天津站在天津职业技术师范大学圆满落幕。此次活动以轻舟融合管理平台和云翼数据缓存中间件云原生管理平台两大开源项目为核心,聚焦云原生中间件技术实践与开发者赋能,通过技术分享、实战演示与openEuler开源实习计划发布,培养兼具创新思维与实践能力的技术人才,携手推动云原生中间件技术赋能研发效能提升。 校企联合 共促开源项目交流 天津职业技术师范大学信息技术工程学院教学副院长武志峰发表致辞,他表示,此次与东方通合作举办开源技术沙龙,旨在为学生提供接触实战技术的机会,帮助他们在实践中提升技能,培养具备实战能力的创新型人才。这种产教深度融合的模式,不仅能为学生职业发展奠定坚实基础,更能为国家科技自主创新输送“新鲜血液”。 东方通开发部经理王普在致辞中强调,基础软件是软件工程的核心组件,在数字化转型中发挥着关键作用,而开源是推动技术进步的重要方式。非常期待年轻开发者能积极参与到轻舟、云翼等开源中间件项目中来,这些项目不仅能帮助开发者提升开发效率,更能借助年轻开发者的创新思维,激发项目的持续进化,形成 “技术赋能人才 — 人才反哺技术” 的正向循环,为产业技术革新与企业效能升级开拓更多可能性。 云原生中间件技术演进 轻舟与云翼开源项目解析 面对业务快速迭代与算力需求激增的双重挑战,中间件的云原生化已从技术选择变为必然趋势,东方通技术专家在沙龙现场深入解析了openEuler社区的轻舟与云翼两大开源项目的技术特性与创新价值。 轻舟开源项目:云原生时代的开发效率“加速器” 东方通核心技术与轻舟项目Committer程福娟介绍了轻舟开源项目,作为开源的轻量级Web管理软件开发平台,轻舟能够支持开发者通过编写Java Bean,自动生成业务模块对应的前端网页、REST接口、JMX接口、国际化等服务,并能开箱即用内置的用户管理、认证授权、监视自动化、文件上传下载、本地和远程集中管理、公共组件等能力,大幅提升开发效率。同时,程福娟以实践项目展示了如何快速基于轻舟搭建完整的应用程序,让在场师生直观感受到该平台的便捷性、开发的高效性。 云翼开源项目:高性能缓存的技术突破 openEuler社区云翼项目Committer李东升在分享环节,系统讲解了TongRDS分布式数据缓存中间件的技术优势与应用场景等。TongRDS不仅全面兼容Redis,而且凭借自主创新能力及面向云原生和现代多核硬件设计的全新架构,在性能、可靠性、可扩展性和云原生适应性上超越同类传统产品。能够在Web 加速、会话管理、热点数据缓冲、实时数据计算与推送等关键业务场景发挥重要支撑。在互动交流环节,通过现场研讨与思维碰撞,全面加深了同学们对 TongRDS技术特性的理解与认知。 openEuler社区云翼项目Committer张聪进一步聚焦TongRDS如何适配云原生环境(Kubernetes/K8S)进行解析。详细介绍了K8S自动化管理容器化应用平台的主要特性、技术架构等,指出传统集群模式在K8S中存在Pod IP变动致连接失效、分片伸缩难、客户端连接复杂等问题。为此,TongRDS引入中心节点和Proxy代理层,采用代理集群与可伸缩集群模式,通过代理层屏蔽底层变化,利用备份资源池实现故障恢复,使客户端只需连接单一地址端口,即可实现在K8S环境下的高效部署与运行。该开源平台,既助力开发者提升分布式系统开发能力,又为企业云原生转型提供平滑上云路径,现场的师生对此也报以热烈反响。 开源实习计划 助力年轻开发者实战能力跃迁 东方通生态发展经理祝晓阳介绍了东方通openEuler社区的开源实习计划。该计划面向全国高校学生,提供轻舟和云翼两大项目的实战任务,学生可通过线上方式参与开发,积累积分兑换实习证明及奖金。祝晓阳详细讲解了实习方式、实习流程、实习任务、奖励机制等,根据积分进阶机制,表现突出者最高可得8000 元实习工资及证明。同时,通过理论知识与实战开发结合的实践机会,将帮助年轻开发者更好地融入实际开发环境,提升创新能力与实际开发技能。 轻舟项目地址: https://gitee.com/openeuler/qingzhou 云翼项目地址: https://gitee.com/openeuler/yunyi 想要加入实习项目的小伙伴可通过以下方式联系 轻舟项目联系方式: wangpl@tongtech.com 云翼项目联系方式: wuyd@tongtech.com 积极拥抱开源 技术赋能与人才培养双轮驱动 东方通积极拥抱开源生态,作为openEuler社区的重要参与者与推动者,深度参与openEuler社区,持续推进轻舟、云翼两大开源项目发展,秉持开放共享精神,依托openEule社区的技术资源和人才优势,持续优化项目性能,显著加速了云原生中间件技术迭代进程,为开发者提供了更高效的开发模式,让企业能够缩短开发周期,加速上云效率,切实解决数字化转型中的核心痛点。 本次东方通&openEuler Meetup走进高校,通过深入解析轻舟、云翼两大开源项目,并结合实际案例演示,让更多年轻开发者接触到前沿云原生技术,吸引更多新鲜力量参与openEuler社区贡献开源力量,通过校企联合的创新模式,将产业需求与教育实践紧密结合,为开源生态培育了新生力量。 开源不仅是技术的共享,更是生态的共建。期待更多年轻开发者投身开源与基础软件,与东方通一起,共同书写云原生时代的技术新篇章!

优秀的个人博客,低调大师

共创网络安全,鲸鲮科技与奇安信战略合作框架协议落地

信创产业的发展,网络安全是核心!“数字中国”的建设发展和政企数字化转型的趋势,都对信息安全和网络安全提出新要求。 今年6月,鲸鲮科技与奇安信集团签订战略合作框架协议,全面加强双方在网络安全领域的全方位合作,携手为不同行业、不同使用场景的用户提供安全稳定、智能易用的移动端软硬一体化解决方案。 后疫情时代,随着移动设备的普及和远程协同办公的发展,行业用户和消费者对移动办公、移动作业、远程协同的需求日益提升。 但传统PC和手机等设备,因为碎片式的发展导致各种系统漏洞和恶意软件层出不群,而且由于技术垄断,目前国内的移动终端市场不论硬件还是软件,都存在对国外的技术路径依赖。用户迫切需要国产化移动终端来满足移动办公场景下的安全性、高效性需求。 鲸鲮作为国内少有的提供移动端软硬一体化解决方案的公司,在JingOS操作系统和JingPad移动终端的研发过程中,始终把安全可信放在重要战略地位。 在不断提升操作系统和移动终端整体性能与生产力的同时,从底层架构到防御工具,从网络保护到应用控制,不断打造核心技术,强化系统“免疫力”。 奇安信集团作为中国网络安全领域的领军企业,多年来专注网络空间安全市场,向广大政企用户提供新一代企业级网络安全产品和服务,具有丰富的网络安全实战经验,现已发展成为国内领先的基于大数据、人工智能和安全运营技术的网络安全供应商。同时,奇安信也是2022年冬奥会和冬残奥会网络安全服务与杀毒软件的官方赞助商。 自战略合作框架协议签订以来,双方已在安全技术服务、网络安全防护、产品兼容互认等多个领域开展了深度合作。 未来,双方还将本着“互惠互利、诚实守信,共同发展”的原则,在产品技术服务、网络信息安全、市场品牌宣传、创新项目研究等多个方面深化合作。围绕国产移动终端软硬件一体化,提供全场景、全序列的安全解决方案,为我国数字经济社会转型升级打牢安全基座。

优秀的个人博客,低调大师

#2020征文-开发板# 用鸿蒙开发AI应用(五)HDF 驱动补光灯

目录: 前言 硬件准备 HDF 驱动开发 总结 前言 上一篇,我们在鸿蒙上运行了第一个程序,这一篇我们来编写一个驱动开启摄像头的红外补光灯,顺便熟悉一下鸿蒙上的 HDF 驱动开发。 硬件准备 先查一下原理图(具体可参考第一篇的硬件资料),找到红外灯的 IO 口编号,GPIO5_1。 HDF 驱动开发 1. 简介 HDF(OpenHarmony Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。旨在构建统一的驱动架构平台,为驱动开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。 HDF框架以组件化的驱动模型作为核心设计思路,为开发者提供更精细化的驱动管理,让驱动开发和部署更加规范。HDF框架将一类设备驱动放在同一个host里面,驱动内部实现开发者也可以将驱动功能分层独立开发和部署,支持一个驱动多个node,HDF框架管理驱动模型如下图所示: 2. 驱动框架 2.1 驱动框架实现 在 huawei/hdf 目录下新建一个文件夹 led, 然后在其中新建一个源文件 led.c。 #include "hdf_device_desc.h" // HDF框架对驱动开放相关能力接口的头文件 #include "hdf_log.h" // HDF 框架提供的日志接口头文件 #define HDF_LOG_TAG led_driver // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签 //驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架 int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject) { HDF_LOGD("Led driver bind success"); return 0; } // 驱动自身业务初始的接口 int32_t HdfLedDriverInit(struct HdfDeviceObject *deviceObject) { if (deviceObject == NULL) { HDF_LOGE("Led driver Init failed!"); return HDF_ERR_INVALID_OBJECT; } HDF_LOGD("Led driver Init success"); return HDF_SUCCESS; } // 驱动资源释放的接口 void HdfLedDriverRelease(struct HdfDeviceObject *deviceObject) { if (deviceObject == NULL) { HDF_LOGE("Led driver release failed!"); return; } HDF_LOGD("Led driver release success"); return; } 2.2 驱动入口注册到HDF框架 // 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量 struct HdfDriverEntry g_ledDriverEntry = { .moduleVersion = 1, .moduleName = "led_driver", .Bind = HdfLedDriverBind, .Init = HdfLedDriverInit, .Release = HdfLedDriverRelease, }; // 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 HDF_INIT(g_ledDriverEntry); 3. 驱动编译 在 huawei/hdf/led 目录下新建编译文件 Makefile include $(LITEOSTOPDIR)/../../drivers/hdf/lite/lite.mk #导入hdf预定义内容,必需 MODULE_NAME := hdf_led_driver #生成的结果文件 LOCAL_SRCS += led.c #本驱动的源代码文件 LOCAL_INCLUDE := ./include #本驱动的头文件目录 LOCAL_CFLAGS += -fstack-protector-strong -Wextra -Wall -Werror #自定义的编译选项 include $(HDF_DRIVER) #导入模板makefile完成编译 这里的hdf_led_driver为驱动文件名,注意对应关系。 4. 编译结果链接到内核镜像 修改 huawei/hdf/hdf_vendor.mk 文件,添加以下代码 LITEOS_BASELIB += -lhdf_led_driver #链接生成的静态库 LIB_SUBDIRS += $(VENDOR_HDF_DRIVERS_ROOT)/led #驱动代码Makefile的目录 填入驱动文件名和源码路径。 5. 驱动配置 驱动配置包含两部分,HDF框架定义的驱动设备描述和驱动的私有配置信息。 5.1 驱动设备描述(必选) HDF框架加载驱动所需要的信息来源于HDF框架定义的驱动设备描述。 修改 vendor/hisi/hi35xx/hi3516dv300/config/device_info/device_info.hcs配置文件,添加驱动的设备描述。 platform :: host { hostName = "platform_host"; // host名称,host节点是用来存放某一类驱动的容器 priority = 50; // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序 device_led :: device { // led设备节点 device0 :: deviceNode { // led驱动的DeviceNode节点 policy = 2; // policy字段是驱动服务发布的策略,在驱动服务管理章节有详细介绍 priority = 100; // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序 preload = 0; // 驱动按需加载字段 permission = 0666; // 驱动创建设备节点权限 moduleName = "led_driver"; // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 serviceName = "led_service"; // 驱动对外发布服务的名称,必须唯一 deviceMatchAttr = "led_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 } } 其中,moduleName、serviceName和deviceMatchAttr 都比较重要,分布链接到源码的不同位置,我这里都分开命名,便于理解。 5.2 驱动私有配置信息(可选) 如果驱动有私有配置,则可以添加一个驱动的配置文件,用来填写一些驱动的默认配置信息,HDF框架在加载驱动的时候,会将对应的配置信息获取并保存在HdfDeviceObject 中的property里面,通过Bind和Init(参考驱动开发)传递给驱动。 在 vendor/hisi/hi35xx/hi3516dv300/config/ 目录下新建一个文件夹 led, 然后在其中新建一个源文件 led_config.hcs, 填入以下代码。 root { LedDriverConfig { led_version = 1; match_attr = "led_config"; //该字段的值必须和device_info.hcs中的deviceMatchAttr值一致 } } 配置信息定义之后,需要将该配置文件添加到板级配置入口文件hdf.hcs。 5.3 板级配置(可选) 修改 vendor/hisi/hi35xx/hi3516dv300/config/hdf.hcs文件,添加代码 #include "device_info/device_info.hcs" #include "led/led_config.hcs" 6. 驱动消息机制管理 当用户态应用和内核态驱动需要交互时,可以使用HDF框架的消息机制来实现。用消息管理可以在用户态和内核态之间架起桥梁,这为我们之后的APP提供了操控底层设备功能的能力。 这里我们在用户态实现一个简单的消息机制,内核态接受到消息后,翻转摄像头两侧的红外补光灯。 6.1 配置服务策略 HDF框架定了驱动对外发布服务的策略,是由配置文件中的policy字段来控制。 typedef enum { /* 驱动不提供服务 */ SERVICE_POLICY_NONE = 0, /* 驱动对内核态发布服务 */ SERVICE_POLICY_PUBLIC = 1, /* 驱动对内核态和用户态都发布服务 */ SERVICE_POLICY_CAPACITY = 2, /* 驱动服务不对外发布服务,但可以被订阅 */ SERVICE_POLICY_FRIENDLY = 3, /* 驱动私有服务不对外发布服务,也不能被订阅 */ SERVICE_POLICY_PRIVATE = 4, /* 错误的服务策略 */ SERVICE_POLICY_INVALID } ServicePolicy; 我们将驱动配置信息中服务策略policy字段设置为2,在之前的设备描述文件device_info.hcs里已经配置好了。 6.2 实现服务 在第2章,我们实现了一个空的驱动框架,现在继续实现内核态的消息服务接口。 编辑 huawei/hdf/led/led.c, 实现服务基类成员IDeviceIoService中的Dispatch方法。收到用户态发来的命令后,操作LED设备,然后将返回值通过reply传回,最后再将收到的命令回传给用户态程序。 // Dispatch是用来处理用户态发下来的消息 int32_t LedDriverDispatch(struct HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t result = HDF_FAILURE; HDF_LOGE("Led driver dispatch"); if (client == NULL || client->device == NULL) { HDF_LOGE("Led driver device is NULL"); return HDF_ERR_INVALID_OBJECT; } switch (cmdCode) { case LED_WRITE_READ: const char *recv = HdfSbufReadString(data); if (recv != NULL) { HDF_LOGI("recv: %s", recv); result = CtlLED(-1); # 操作设备 // CtlLED(GPIO_VAL_HIGH); if (!HdfSbufWriteInt32(reply, result)) { HDF_LOGE("replay is fail"); } return HdfDeviceSendEvent(client->device, cmdCode, data); } break; default: break; } return result; } 修改 HdfLedDriverBind函数,将服务绑定到框架。 //驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架 int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject) { if (deviceObject == NULL) { HDF_LOGE("Led driver bind failed!"); return HDF_ERR_INVALID_OBJECT; } static struct IDeviceIoService ledDriver = { .Dispatch = LedDriverDispatch, }; deviceObject->service = (struct IDeviceIoService *)(&ledDriver); HDF_LOGD("Led driver bind success"); return HDF_SUCCESS; } 7. 业务代码 内核态核心功能,就简单实现一个每调用一次,就翻转一下LED状态的CtrlLED函数。这里mode为 -1 时为翻转,也可以直接指定高电平或低电平来开关,方便后续扩展。 其中Hi3516DV300的控制器管理12组GPIO管脚,每组8个。 GPIO号 = GPIO组索引(0~11)* 每组GPIO管脚数(8) + 组内偏移。 那么GPIO5_1的GPIO号 = 5 * 8 +1 = 41。 static int32_t CtlLED(int mode) { int32_t ret; uint16_t valRead; /* LED的GPIO管脚号 */ uint16_t gpio = 5 * 8 + 1; // 红外补光灯 // uint16_t gpio = 2 * 8 + 3; // 绿色指示灯 // uint16_t gpio = 3 * 8 + 4; // 红色指示灯 /* 将GPIO管脚配置为输出 */ ret = GpioSetDir(gpio, GPIO_DIR_OUT); if (ret != 0) { HDF_LOGE("GpioSerDir: failed, ret %d\n", ret); return ret; } if (mode == -1) { // 翻转输出口 (void)GpioRead(gpio, &valRead); ret = GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW); } else { ret = GpioWrite(gpio, mode); } if (ret != 0) { HDF_LOGE("GpioWrite: failed, ret %d\n", ret); return ret; } return ret; } 同理,GPIO2_3、GPIO3_4和蜂鸣器组件等等通用IO设备也能相应控制,可以尽情发挥想象力了。 8. 配置Kconfig 在`vendor/huawei/hdf/led/`下,新建一个目录`driver`,再在其下新建`Kconfig`文件。 config LOSCFG_DRIVERS_HDF_PLATFORM_LED bool "Enable HDF LED driver" default n depends on LOSCFG_DRIVERS_HDF_PLATFORM help Answer Y to enable HDF LED driver. 将其链接到板级Kconfig中,在vendor/huawei/hdf/Kconfig增加 source "../../vendor/huawei/hdf/led/driver/Kconfig" 好了,内核态的程序基本都搞定了。 查看更多章节>>> 作者:bluishfish 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com/

优秀的个人博客,低调大师

#2020征文-手表#深鸿会深大小组:HarmonyOS手表游戏—数字华容道

目录: 前言 概述 正文 前言 此前已经为大家分享了黑白翻棋小游戏的开发思路,感兴趣的读者可以前往学习交流:黑白翻棋,现在为大家分享第二个小游戏的开发思路,也是一款十分经典的小游戏——数字华容道,同样是深鸿会深大小组学习完HarmonyOS后自行开发的一个鸿蒙demo,详细讲述了数字华容道的编写思路,内含详细解释,同时也欢迎与各位感兴趣的读者一起学习HarmonyOS开发,相互交流、共同进步。 概述 本个demo将从零基础开始完成鸿蒙小游戏APP在可穿戴设备上的编译,此处以运动手表为例,在项目中我们所使用到的软件为DevEco Studio,下载地址为:DevEco Studio下载、DevEco Studio安装教程,在项目中我们要实现的内容为数字华容道APP的开发。 在初始界面中显示4*4的方阵,方阵中分布有随意打乱的1至15的数字和一个空白方格,方阵上方增加一个计时器,显示游戏进行的时间,单位为秒,方阵下方显示一个“重新开始”的按钮,为用户提供重新开始游戏的机会 向上、下、左、右任一方向滑动,空白方格周围对应位置的方格便会随之向对应的方向移动一格,计时器也会显示游戏开始到当前的时间。 经过若干次移动后,当所有的数字按顺序排列后,则会弹出游戏成功的界面,再滑动也不会有任何变化,此时方阵上方的计时器停止计时,点击“重新开始”的按钮后则会重新返回步骤1界面所示。 正文 创建项目 DevEco Studio下载安装成功后,打开DevEco Studio,点击左上角的File,点击New,再选择New Project,选择Lite Wearable选项,选择默认的模板,然后选择保存路径,将文件命名为Game1(文件名不能出现中文或者特殊字符,否则将无法成功创建项目文件),最后点击Finish。 主要编写的文件为index.css、index.hml和index.js,打开路径如图所示,index.hml用于描述页面中包含哪些组件,index.css用于描述页面中的组件都长什么样,index.js用于描述页面中的组件是如何进行交互的。 实现开始界面的布局 首先,我们要先画出一个4*4的方阵,方阵中按照顺序显示1至15的数字,方阵上方显示“当前秒数:0.0”,方阵下方有一个“重新开始”的按钮。 在index.hml中添加相应的页面组件:首先创建一个基础容器div类名为container,用于盛装所有的其他组件;然后在此基础容器中添加一个文字组件text类名为seconds,且注明显示的固定部分“当前秒数:”,为动态变换部分赋予一个名为currentSteps的变量,用于动态显示游戏进行的秒数;再添加一个画布组件canvas类名为canvas,增加一个引用属性ref,用来指定指向子元素或子组件的引用信息,该引用将注册到父组件的$refs 属性对象上,以便在此画布上画出4*4的方阵;最后添加一个普通按钮组件,类名为bit,并赋值“重新开始”,用于重新开始游戏 <div class="container" > <text class="seconds"> 当前秒数:{{currentSeconds}} </text> <canvas class="canvas" ref="canvas" ></canvas> <input type="button" value="重新开始" class="bit"/> </div> 2. 在index.css中描述刚才添加的页面组件的样式:首先编写container的样式,flex-direction为容器主轴方向,选择column(垂直方向从上到下),justify-content为容器当前行的主轴对齐格式,选择center(项目位于容器的中心),align-items为容器当前行的交叉轴对齐格式,选择center(元素在交叉轴居中),width、height分别为容器以像素为单位的宽度和高度,都设定为450px;然后编写seconds的样式,font-size为设置文本的尺寸,设定为18px,text-align为设置文本的文本对齐方式,选择center(文本居中对齐),width、height分别设定为300px和20px,letter-spacing为设置文本的字符间距,设定为0px,margin-top为设置上外边距,设定为10px;再编写canvas的样式,width、height都设定为320px,background-color为设置背景颜色,设定为#FFFFFF;最后编写bit的样式,width、height分别设定为150px和30px,background-color设定为#AD9D8F,font-size设定为24px,margin-top设定为10px .container { flex-direction: column; justify-content: center; align-items: center; width:450px; height:450px; } .seconds{ font-size: 18px; text-align:center; width:300px; height:20px; letter-spacing:0px; margin-top:10px; } .canvas{ width:305px; height:305px; background-color: #FFFFFF; } .bit{ width:150px; height:30px; background-color:#AD9D8F; font-size:24px; margin-top:10px; } 3. 在index.js中描述页面中的组件交互情况:首先在data中为当前秒数currentSeconds赋值为0.0 data: { currentSeconds:'0.0', } 然后在文件开头定义一个全局变量context,定义一个全局变量的二维数组grids,其中的值为1至15和0,定义全局常量方格的边长SIDELEN为70,方格的间距MARGIN为5,创建一个onReady()函数,用于定义2d绘画工具 var grids=[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 0]]; var context; const SIDELEN = 70; const MARGIN = 5; onReady(){ context=this.$refs.canvas.getContext('2d'); } 再创建drawGrids()函数,先将grids的值利用toString()函数全部转化为字符串,fillStyle为画图工具context的方格的颜色,方格的背景颜色定义为#BBADA0,数字的颜色定义为#000000,fillRect为画图工具context的画图矩形的大小,其中有四个参数,第一个参数指定矩形左上角的x坐标,第二个参数指定矩形左上角的y坐标,第三个参数指定矩形的高度,第四个参数指定矩形的宽度。font为为画图工具context的字体大小,定义为30px HYQiHei-65S,因为要出现一个空白的方格,所以需要添加一个判断语句,当数字为0时不显示数字。fillText为画图工具context的文本字体大小,其中有三个参数,第一个参数为绘制的文本,第二个参数指定文本左上角的x坐标,第三个参数指定文本左上角的y坐标,最后创建onShow()函数,用于调用drawGrids()函数 onShow() { this.drawGrids(); }, drawGrids() { for (let row = 0; row < 4; row++) { for (let column = 0; column < 4; column++) { let gridStr = grids[row][column].toString(); context.fillStyle = "#BBADA0"; let leftTopX = column * (MARGIN + SIDELEN) + MARGIN; let leftTopY = row * (MARGIN + SIDELEN) + MARGIN; context.fillRect(leftTopX, leftTopY, SIDELEN, SIDELEN); context.font = "30px HYQiHei-65S"; if (gridStr != "0") { context.fillStyle = "#000000"; let offsetX = (4 - gridStr.length) * (SIDELEN / 8); let offsetY = (SIDELEN - 30) / 2; context.fillText(gridStr, leftTopX + offsetX, leftTopY + offsetY); } } } } 至此,运行即可得出上述界面布局了。 实现数字的随机打乱和方格的移动 其次我们要在屏幕上随机生成一个数字被随意打乱的4*4的方阵,并且向任意方向滑动屏幕,空白方格周围对应位置的方格便会随之向对应的方向移动一格 1. 在index.hml中添加相应的页面组件:我们需要在画布中添加一个swipe属性,用于响应滑动事件,赋予一个所自动调用的函数swipeGrids <canvas class="canvas" ref="canvas" onswipe="swipeGrids"></canvas> 2. 在index.css中描述刚才添加的页面组件的样式:这一部分不需要添加或修改页面组件的样式 3. 在index.js中描述页面中的组件交互情况:首先我们得先实现方格的移动,创建一个函数changeGrids(direction),接受一个参数direction指示滑动的方向,先找出空白方格所在位置对应的二维数组下标,接着判断参数direction为’left’、‘right’、‘up’ 或’down’时,当isShow为false时,对应的方格和空白方格对应的二维数组的数值对调,创建响应滑动事件所自动调用的函数swipeGrids(event),参数为滑动事件,调用函数changeGrids(direction),并传入滑动的方向,最后调用函数drawGrids() swipeGrids(event) { this.changeGrids(event.direction); this.drawGrids(); }, changeGrids(direction) { let x; let y; for (let row = 0; row < 4; row++) { for (let column = 0; column < 4; column++) { if (grids[row][column] == 0) { x = row; y = column; break; } } } let temp; if(this.isShow==false){ if (direction == 'left' && (y + 1) < 4) { temp = grids[x][y + 1]; grids[x][y + 1] = grids[x][y]; grids[x][y] = temp; } else if (direction == 'right' && (y - 1) > -1) { temp = grids[x][y - 1]; grids[x][y - 1] = grids[x][y]; grids[x][y] = temp; } else if (direction == 'up' && (x + 1) < 4) { temp = grids[x + 1][y]; grids[x + 1][y] = grids[x][y]; grids[x][y] = temp; } else if (direction == 'down' && (x - 1) > -1) { temp = grids[x - 1][y]; grids[x - 1][y] = grids[x][y]; grids[x][y] = temp; } } 然后添加一个函数initGrids(),用于随机打乱排列规则的数字,先创建一个一维数组变量array,赋值为上下左右四个方向"left",“up”,“right”,“down”,Math.random()函数是随机[0,1)内的小数,Math.random() * 4是随机[0,4)内的小数,Math.floor(x)为得出小于或等于x的最大整数,随机生成一个数字,读取数组array对应的值,调用函数this.changeGrids(direction)并将刚才的array对应的值传入,便能移动一次方格,循环此步骤若干次便可随机打乱排列规则的数字,生成一个数字被随意打乱的4*4的方阵 initGrids(){ let array=["left","up","right","down"]; for (let i = 0; i < 100; i++){ let randomIndex = Math.floor(Math.random() * 4); let direction = array[randomIndex]; this.changeGrids(direction); } } 最后在函数onShow()中调用函数initGrids() onShow() { this.initGrids(); this.drawGrids(); } 至此,运行即可得出上述界面布局了。 实现计时器、重新开始和游戏成功 解锁更多章节>>> 作者:wx5fa5fef168fd0 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com 【有奖直播-HarmonyOS驱动框架调试总结 火热报名中!】

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册