-
案例介绍本案例帮助开发者了解仓颉编程语言的能力,以及如何利用仓颉编程语言和Cangjie Magic智能体框架,基于华为云提供的DeepSeek服务开发出功能强大的智能家居智能体,在其中演示了如何通过华为云IoTDA平台和物联网设备进行交互,以推动智能家居智能体技术的落地应用,为用户提供更加智能、便捷的服务体验。 原创声明: 本案例的内容均为原创,部分内容曾经在作者的CSDN博客(cid:link_2)发表过,不涉及抄袭。案例内容1 概述1.1 案例介绍大型语言模型(LLM)的常识推理能力和广泛的通用知识使其非常适合在智能家居场景中理解用户请求。然而,LLM 缺乏关于用户及其家庭的特定知识,这限制了其潜力。我们使用仓颉编程语言和Cangjie Magic智能体框架构建了基于华为云IoTDA的智能家居智能体 克服了现有智能家居App的限制:通过 IoTDA的用户侧API 读取所有设备信息,无需任何编码即可访问任何智能设备,并由智能体工具根据这些设备信息和用户的场景需求自动产生操作设备的指令,并调用IoTDA的用户侧API 发送给智能设备。例如,当用户的请求是“我想看大片”时,智能体就能够自动做出决策:打开客厅电视,调低客厅灯的亮度并关闭客厅窗帘制作影院式的氛围。本案例的架构图参见图1。 图1 案例架构图1.2 适用对象企业个人开发者高校学生本案例需要使用者有仓颉语言编程、大语言模型、智能体以及智能物联网的基本知识。1.3 案例时间本案例总时长预计60分钟。1.4 资源总览本案例预计花费总计0元。资源名称规格单价(元)时长(分钟)云主机2vCPU 4GB X86 Ubuntu 或4vCPUs 8GB ARM Ubuntu免费60IoTDA接入服务标准版免费 2 基于Cangjie Magic开发智能家居智能体2.1 准备开发环境有关华为开发者空间云主机安装仓颉语言开发板环境的详细说明,可参考以下链接:cid:link_02.2 下载并阅读案例代码确保在执行下面步骤前,先运行Cangjie SDK目录中的envsetup.h设置环境变量。先安装并配置Cangjie Magic。进入云主机桌面,右键选择Open Terminal Here打开终端命令窗口,执行命令:git clone https://gitcode.com/Cangjie-TPC/CangjieMagic.git -b devcd CangjieMagic cjc -o build build.cj ./build pre-build然后访问Gitcode网站下载本案例的代码(这里假定CangjieMagic和iotagent是同一级目录)。git clone https://gitcode.com/zealsoft/iotagent.git使用CodeArts IDE for Cangjie打开IoTAgent示例项目。左上点击文件—打开项目,选择前面克隆的示例代码目录。2.3 Cangjie对接DeepSeek接口华为云提供了单模型200万免费Tokens,包含DeepSeek-R1&V3满血版,我们可以登录华为云ModelArts Studio(MaaS)控制台领取免费额度,这里我们选择DeepSeek-V3满血版来搭建我们的智能家居智能体。之所以选择V3而不是R1,主要原因是R1的推理速度太慢了,而智能家居智能体应该有较快的反应速度,所以选择V3版本。在云主机桌面底部菜单栏,点击打开火狐浏览器。用火狐浏览器访问ModelArts Studio首页:cid:link_1,点击ModelArts Studio控制台跳转到登录界面,按照登录界面提示登录,即可进入ModelArts Studio控制台。进入ModelArts Studio控制台首页,区域选择西南-贵阳一,在左侧菜单栏,选择在线推理 > 预置服务 > 免费服务,选择DeepSeek-V3-32K模型,点击领取额度,领取200万免费token。 领取后点击调用说明,可以获取到对应的API地址、模型名称。点击API Key管理-创建API Key。(注意保存好API Key,这个Key只显示一次,以后就无法复制了) 至此,华为云MaaS提供的免费DeepSeek Tokens就领取完成啦,记录对应的API地址、模型名称、API Key留作下面步骤使用。2.4 创建IAM用户登录华为云,在右上角单击“控制台”。在控制台页面,鼠标移动至右上方的用户名,在下拉列表中选择“统一身份认证”。在左侧导航窗格中,选择“用户”,单击右上方的“创建用户”。在“创建用户”界面配置用户基本信息。单击右下角的“下一步”,进入“加入用户组(可选)”界面。选择“按身份策略配置”,确保用户拥有IoTDA相关的权限。单击右下角的“创建用户”,用户创建成功。管理员在用户列表中,单击用户名称,或单击右侧的“安全设置”,进入用户详情页面。选择“安全设置”页签。单击“登录凭证>登录密码”右侧的,重置IAM用户的登录密码。记录下IAM用户名和密码,后面会用到。2.5 在IoTDA中建立智能设备首先进入华为云 IoTDA 网站: https://www.huaweicloud.com/product/iothub.html,点击控制台按钮进行登录。 在控制台界面处点击左上角三条横线,会出现菜单,选择“IoT 物联网” ——“设备接入 IoTDA” , 在左侧栏目中选择 IoTDA 实例,在标准版处选择购买实例。 每位用户都有一次免费的使用机会,在其中选择免费单元即可。 点击“产品”进入页面,然后点击“创建产品”。在产品名称部分输入“智能灯”,协议类型为“MQTT”,数据格式为JSON,其他内容随便填写,然后点击确定。类似的,创建“智能电视”和“智能窗帘”。点击左侧的“所有设备”,然后点击“注册设备”,选择所属的资源空间,然后在“所属产品”中选择“智能灯”,设备标识码为livingroomlight。然后点击确定。进入到“客厅智能灯”的详情页,点击“MQTT连接参数”后的“查看”,会出现下图窗口,记住其中的参数,下面会用到。类似的,建立两个设备“客厅窗帘”和“客厅电视”。2.6 使用MQTTX模拟设备MQTTX是一个免费的MQTT协议客户端,我们借助它来模拟智能家居设备。首先从MQTTX网站下载软件:https://mqttx.app/zh。在 MQTTX 中点击左侧的加号创建一个 MQTT 连接,其中 name 设置为 “客厅照明灯”, Client ID、Host和username password请参照上一节记录的连接参数填写, Port 为 1883,不支持 SSL/TLS。设置如下图所示: 然后点击Connect按钮建立模拟设备到云端的连接。类似的建立另外两个设备的连接。在IoTDA的控制台可以看到3个设备在线。2.7 运行智能家居智能体案例修改main.cj中main函数,添加华为云DeepSeek V3密钥: Config.env["DEEPSEEK_API_KEY"] = "XXXXXXXXXXXXXXXX"按照实际情况修改下面的参数(请使用华为云账号登录“我的凭证”页面。在“我的凭证”页面,“项目列表”区域可以查看项目ID,账号名就是下面的domain name): iotda.iotdaEndpoint = "https://bde4cbe7aa.st1.iotda-app.cn-north-4.myhuaweicloud.com" iotda.projectId = "<yourprojectid>" iotda.region = "cn-north-4" iotda.token = iotda.getToken("<domain name>", "<iamusername", "<iampassword>") 先运行Cangjie SDK目录中的envsetup.h设置环境变量,然后执行cjpm run --name iotagent执行智能体程序。可以看到智能体会发送3条指令给设备。此时,在MQTTX中可以看到云端下发的指令。到此整个项目案例创建完成。 3. 案例的扩展考虑到案例的篇幅有限,并且难度不宜过大,有些内容没有包括在本案例中,有兴趣的朋友可以对案例做如下扩展。3.1 设备指令模型目前由于缺乏设置指令的信息,所以智能体发出的指令内容有点随机。IoTDA缺乏对设备支持的指令的描述。所以我们可以在智能体中增加关于设备指令的模型,从而确保大模型发出的指令信息是设备所支持的。3.2 用户偏好记忆Cangjie Magic智能体框架提供了记忆组件,支持多轮对话和长期记忆,我们可以通过对话分析用户的偏好(比如用户喜欢什么风格的音乐和电影),从而提供更好的用户体验。 欢迎朋友们和我一起扩展智能家居智能体。Cangjie Magic智能体框架好啊,要学,真程序员必学仓颉编程语言。我正在参加【案例共创】第4期 基于华为开发者空间+仓颉/DeepSeek/MCP完成应用构建开发实践 https://bbs.huaweicloud.com/forum/thread-02127182415062274055-1-1.html
-
引言随着物联网(IoT)技术的迅猛发展,越来越多的开发者和企业开始关注如何高效地构建和管理智能设备。物联网概览物联网通过传感器、RFID等技术实现了物品与物品、物品与人之间的信息交换与通信,构建了一个智能化网络。其架构分为感知层、网络层和应用层,各层次协同工作,实现数据采集、传输与处理。据预测,到2025年全球物联网市场规模将达到1.5万亿美元,在智能家居、智能交通等领域有广泛的应用前景。应用案例智能家居:智能音箱可通过语音控制家电,智能门锁实现远程开门,智能摄像头实时监控家庭安全。智能交通:利用传感器优化交通流量,车联网技术提升交通安全与效率。工业物联网:通过传感器监控生产设备状态,提高生产效率和产品质量。华为云IoT平台介绍华为云IoT平台提供了一套完整的设备接入解决方案,支持设备注册、状态监控、远程控制等功能模块,帮助用户快速搭建稳定的物联网应用。主要功能设备管理:包括设备注册区、设备管理列表、设备详情页等部分,支持多种设备类型的注册与批量操作。在线调试:提供详细的设备创建流程指导,简化了开发者接入设备的难度。消息跟踪:实时监控设备上报的数据,并能下发命令给设备。实例展示以智慧烟感器为例,演示了设备连接平台、上报数据到平台以及平台下发命令给设备的过程。这不仅展示了平台的功能性,还证明了其实时性和高效性。首页搜索“设备接入”,进行服务的开通随后来到控制台,点击你所开通的服务在产品里“创建产品”输入相关产品信息随后到设备页面进行注册设备相关demo案例引导可参考:https://support.huaweicloud.com/qs-iothub/iot_05_00010.html以一款虚拟的智慧烟感器为例,带您快速体验平台的三个基本功能:设备连接平台,设备上报数据到平台,平台下发命令给设备API Explorer助力开发API Explorer是华为云提供的一个强大的工具,它允许开发者快速调试API、查看文档并获取代码示例,极大地提高了开发效率。功能亮点快速上手:降低调试难度,减少开发时间。多语言支持:丰富的代码示例覆盖多种编程语言,满足不同需求。应用场景多样:适用于物联网设备开发、数据分析等多种场景。首页搜索“API Explorer”找到你想要测试的API带星号的是必填信息,填入相关信息即可调试在右侧窗口可查看代码示例复制到IDE里需要填充请求头里的token!!!具体token可使用IAM接口获取结语华为云通过一系列创新的物联网解决方案,为开发者们提供了强大而灵活的工具集,推动了物联网技术的发展。
-
近日,中国移动与华为联合申报的“5G时代算网融合标志性应用——移动云手机”入选了由工业和信息化部新闻宣传中心(人民邮电报社)组织征集的2023年ICT优秀案例,并凭借其在5G业务创新、提升用户体验、算力惠民等方面的突出价值,被授予“算力赋能创新应用”荣誉称号。 作为实体手机的云端延伸,移动云手机基于5G超宽连接通道,接入云端无限算力,突破了本地设备限制,让公众在保障安全私密的前提下实现云端算力的即取即用。其典型场景有:一是算力随身,弹性调用云端算力,突破物理手机性能限制;二是真机延伸,应用及文件上云,释放物理手机存储空间;三是公私分离,多账号绑定,实现一机多机多身份管理;四是数据安全,数据云端存储不落地,手机永不“丢”;五是多端协同,跨云终端之间同屏互动,实现远程协同。 华为基于ARM架构云底座,融合多种创新技术打造云手机极致体验:一、通过自研Monbox软件仿真架构,实现单服务器云机密度翻倍提升,端到端时延持续优化;二、超分还原+AVS3视频流,实现高清低码,大幅提升云上渲染效率;三、创新指令流分离渲染技术,在确保画质的同时进一步降低时延和流量消耗。 移动云手机作为5G用户的个人算力终端,高度契合“算网时代算力赋能数字经济高质量发展”的趋势,为广大用户带来全新的差异化体验和算力普惠服务,而中国移动作为“连接+算力+能力”新型信息服务体系的建设者,有望借此重构算力消费新体验,重构能力底座,重构用户信息服务新入口,为5G发展开辟一条全新业务赛道。
-
全球根域名服务器分为IPv4和IPv6两种。在IPv4体系中,全球共有13台根服务器,其中1个主根服务器位于美国,其余12个为辅根服务器,分布在美国、欧洲和日本1。在IPv6体系中,全球有25台根服务器,中国写阶段部署了其中的4台,包括1台主根和3台辅根服务器12。中国根域名服务器现状根镜像服务器:中国部署了数十个根镜像服务器,遍布各大骨干网,承担了大量域名解析请求,提高了国内网络访问速度和稳定性34。“雪人计划”与IPv6根服务器:中国积极参与并推动了“雪人计划”,在全球16个国家完成25台IPv6根服务器的架设,其中中国部署了4台,包括1台主根和3台辅根服务器,增强了中国互联网的自主性和安全性25。网络安全与治理:中国建立了根区异常监测系统,实时感知国际根区解析状态,并能在必要时启动快速重路由策略,由国内调度体系接管流量,确保网络稳定运行3。综上所述,中国通过根镜像服务器和IPv6根服务器的布局,构建起了一道坚实的网络安全防线,增强了网络自主性和安全性。
-
下载包体后,Windows操作系统下,打开本地命令提示符,输入如下命令(其中,“C:\Users\xxx\Downloads\HoloSens-Android-SDK-V1.1.24.5.zip”为包体的本地存放路径及包名,请根据实际情况修改)certutil -hashfile C:\Users\xxx\Downloads\HoloSens-Android-SDK-V1.1.24.5.zip SHA256执行命令后,得到如下输出:SHA256 的 C:\Users\xxx\Downloads\HoloSens-Android-SDK-V1.1.24.5.zip 哈希:6f974cf1c3fb0a20a0b4e0b04bb4ab0b9e3ce1c3538b0bbaad6c5cb55eb6a993CertUtil: -hashfile 命令成功完成。对比上述输出的SHA265值与下表中对应包体的SHA256值,如果一致,表明下载过程不存在篡改与丢包。文件名 SHA256值HoloSens-Android-SDK-V1.1.24.5.zip6f974cf1c3fb0a20a0b4e0b04bb4ab0b9e3ce1c3538b0bbaad6c5cb55eb6a993HoloSens-Device-SDK.zip81cc26c25a555de33d7bfe9c92ec73ce060807012d6bc4ed0691791b0a470187HoloSens-iOS-SDK-V1.1.24.5.zip81d8fc658546ac69973c8d888b75f07f51eee1511d763b7bf3b2e6fb4ea0394cHoloSens-PC-SDK-V1.1.24.5.zipa487da85a7410ed151eb6727557868121fdf72a09796a822b3fb605601308cbcHoloSens-Smart-WebPlugin-V1.3.8.3.zip45c70bc79e58175ff9c27a42b05d25adfc046bfec5b203c7fb1757b935ce7a4a
-
本人是一名作为大学生,小白,参与次参加了华为活动,并拿下这些认证,于我而言是宝贵的学习历程。在接触人工智能入门认证时,起初看着文档操作,从陌生到逐渐熟悉。跟着文档步骤搭建环境、配置参数,过程中虽因对概念理解不深偶有卡顿,但每解决一个小问题,都让我对ai的底层逻辑有了新认识。我觉得这些认证看似按部就班,但是实则是在不断积累对人工智能算法和开发流程的感知。这段跟着文档学习拿证的经历,让我明白理论与实践结合的重要性。它不仅为我构建了基础技术框架,更培养了我自主学习和解决问题的能力。未来,我会凭借这份经验,更深入探索相关技术领域。
-
1、无法获取华为云账号用户里的企业管理员的TOKEN2、使用IAM登录企业管理员时,提示我该IAM用户名不存在,但是输入的账号名和IAM用户名与我的凭证中一致
-
使用JDK jdk1.8.0_241进行动态鉴权,一直报javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates do not conform to algorithm constraints at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1640) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)这个是什么原因呢
-
响应这么写的:{"result_code":0,"response_name":"COMMAND_RESPONSE","paras":{"result":"success"}},收到命令后,通过调试助手发送响应仍显示超时,怎么办?
-
主页import prompt from '@ohos.prompt';import Prompt from '@system.prompt';import router from '@ohos.router';/** * Main page */@Entry@Componentstruct MainPage { @State currentIndex: number = 0; private tabsController: TabsController = new TabsController(); private swiperController: SwiperController = new SwiperController(); @State pictures: any[] = [ { Simg1:$r('app.media.fig1')}, { Simg2:$r('app.media.fig2')}, { Simg3:$r('app.media.fig3')}, { Simg4:$r('app.media.fig4')} ] @State othersItems:any[]=[ {title:'我的最爱',img:$r('app.media.love')}, {title:'历史记录',img:$r('app.media.record')}, {title:'消息通知',img:$r('app.media.message')}, {title:'回收站',img:$r('app.media.recycle')}, {title:' 收藏',img:$r('app.media.favorite')}, {title:'购物清单',img:$r('app.media.shopping')}, {title:'动态',img:$r('app.media.circle')}, {title:'计划目标',img:$r('app.media.target')}, ] @State listItems: any[] = [ {title:'排行榜', img:$r('app.media.top'), text: '并肩于雪上之巅'}, {title:'新品首发', img:$r('app.media.new'), text: '新品抢先购!'}, {title:'大牌闪购', img:$r('app.media.brand'), text: '不存在中间商赚差价'}, {title:'发现好物', img:$r('app.media.found'), text: '你想要的这里都有'} ] @State setItems: any[] = [ {title:'推送通知', img:$r('app.media.news'), textF:'开关'}, {title:'数据管理', img:$r('app.media.data')}, {title:'菜单设置', img:$r('app.media.menu')}, {title:'关于', img:$r('app.media.about')}, {title:'清除缓存', img:$r('app.media.storage')}, {title:'隐私协议', img:$r('app.media.privacy')} ] @Builder TabBuilder(title: string, index: number, selectedImg: Resource, normalImg: Resource) { Column() { Image(this.currentIndex === index ? selectedImg : normalImg) .width(25) .height(25) Text(title) .margin({ top: 4 }) .fontSize(10) .fontColor(this.currentIndex === index ? '#1698CE' : '#6B6B6B') } .justifyContent(FlexAlign.Center) .height(56) .width('100%') .onClick(() => { this.currentIndex = index; this.tabsController.changeIndex(this.currentIndex); }) } @Builder settingCell(sI) { Row() { Row({ space: 12 }) { Image(sI.img) .width(22) .height(22) Text(sI.title) .fontSize(16) } if (sI.textF === null) { Image($r('app.media.right_grey')) .width(12) .height(24) } else { Toggle({ type: ToggleType.Switch, isOn: false }) } } .justifyContent(FlexAlign.SpaceBetween) .width('100%') .padding({ left: 8, right: 22 }) } build() { Tabs({ barPosition: BarPosition.End, controller: this.tabsController }) { TabContent() { Scroll() { Column({ space: 12 }) { Column() { Text('首页') .fontWeight(FontWeight.Medium) .fontSize(24) .margin({ top: 12 }) .padding({ left: 12 }) } .width('100%') .alignItems(HorizontalAlign.Start) Swiper(this.swiperController) { ForEach(this.pictures, (img) => { Image(img.Simg1) .borderRadius(16) Image(img.Simg2) .borderRadius(16) Image(img.Simg3) .borderRadius(16) Image(img.Simg4) .borderRadius(16) }, (img: Resource) => JSON.stringify(img.id)) } .margin({ top: 24 }) .autoPlay(true) Grid() { ForEach(this.othersItems, (oI) => { GridItem() { Column() { Image(oI.img) .width(24) .height(24) Text(oI.title) .fontSize(12) .margin({ top: 4 }) } } }) } .columnsTemplate('1fr 1fr 1fr 1fr') .rowsTemplate('1fr 1fr') .columnsGap(8) .rowsGap(12) .padding({ top: 12, bottom: 12 }) .height(124) .backgroundColor(Color.White) .borderRadius(24) Text('列表') .fontSize(16) .fontWeight(FontWeight.Medium) .width('100%') .margin({ top: 12 }) Grid() { ForEach(this.listItems, (lI) => { GridItem() { Column() { Text(lI.title) .fontSize(16) .fontWeight(FontWeight.Medium) Text(lI.text) .margin({ top: 4 }) .fontSize(12) .fontColor('"#99182431"') } .alignItems(HorizontalAlign.Start) } .padding({ top: 8, left: 8 }) .borderRadius(12) .align(Alignment.TopStart) .backgroundImage(lI.img) .backgroundImageSize(ImageSize.Cover) .width('100%') .height('100%') }) } .width('100%') .height(260) .columnsTemplate('1fr 1fr') .rowsTemplate('1fr 1fr') .columnsGap(8) .rowsGap(12) .margin({ bottom: 55 }) } } .height('100%') } .padding({ left: 12, right: 12 }) .backgroundColor('#F1F3F5') .tabBar(this.TabBuilder('首页', 0, $r('app.media.home_selected'), $r('app.media.home_normal'))) TabContent() { Scroll() { Column({ space: 12 }) { Column(){ Text('我的') .fontWeight(FontWeight.Medium) .fontSize(24) .margin({ top: 12 }) .padding({ left: 12 }) } .width('100%') .alignItems(HorizontalAlign.Start) Row() { Image($r('app.media.account')) .width(48) .height(48) Column() { Text('Mr.Xie') .fontSize(20) Text('2521885390@qq.com') .fontSize(12) .margin({ top: 4 }) } .alignItems(HorizontalAlign.Start) .margin({ left: 24 }) } .margin({ top: 24 }) .alignItems(VerticalAlign.Center) .width('100%') .height(96) .backgroundColor(Color.White) .padding({ left: 24 }) .borderRadius(16) List() { ForEach(this.setItems, (sI) => { ListItem() { this.settingCell(sI) } .height(48) }) } .backgroundColor(Color.White) .width('100%') .height('42%') .divider({ strokeWidth: 0.25, color: Color.Grey, startMargin: 42, endMargin: 24 }) .borderRadius(16) .padding({ top: 4, bottom: 4 }) Blank() Button('退出登录', { type: ButtonType.Capsule }) .width('90%') .height(40) .fontSize(16) .fontColor('#FA2A2D') .fontWeight(FontWeight.Medium) .backgroundColor('#E5E8EA') .margin({ bottom: 55}) .onClick(() => { AlertDialog.show({ title:'提示消息', message: '确定退出登录吗?', offset:{ dx:0, dy: -20}, alignment: DialogAlignment.Bottom, gridCount:4, autoCancel:true, primaryButton:{ value:'取消', action:() => { //取消操作 } }, secondaryButton:{ value:'确定', action:() => { router.back({ url: 'pages/LoginPage'}) } }, cancel:() => { //取消操作 } }) }) } .height('100%') } } .padding({ left: 12, right: 12 }) .backgroundColor('#F1F3F5') .tabBar(this.TabBuilder('我的', 1, $r('app.media.mine_selected'), $r('app.media.mine_normal'))) } .width('100%') .backgroundColor(Color.White) .barHeight(56) .barMode(BarMode.Fixed) .onChange((index: number) => { this.currentIndex = index; }) }}登录import router from '@ohos.router'import prompt from '@ohos.promptAction';@Extend(TextInput) function InputStyle(){//输入框统一样式 .width('90%').height('25%') .backgroundColor('#f1f3f5') .placeholderColor('#99182431')}@Extend(Line)function linestyle(){//直线统一样式 .height(1) .width('100%') .backgroundColor(Color.Gray)}@Extend(Button)function buttonstyle(){//按钮统一样式 .type(ButtonType.Circle) .width(65) .height(65) .backgroundColor('#d7eef8f7')}@Entry@Componentstruct denglu { @State account:string='' @State password:string='' @State caccount:string=(router.getParams()as Record<string,string>)['account'] @State cpassword:string=(router.getParams()as Record<string,string>)['password'] denglu():void{ if(this.account==''||this.password=='') { prompt.showToast({ message:'账户或密码不能为空!' }) }else { if( (this.account!= this.caccount) ||(this.password!=this.cpassword)){ prompt.showToast({ message: '账号或密码错误,请重新输入' }) } else { router.pushUrl({ url:'pages/zhuye', }) } } } build() { // 根组件 Column({space:10}){ // logo Column(){ Row(){ Image($r("app.media.icon")) .width(70) .height(70) .margin({top:25}) } Row(){ Text('登录界面') .fontSize(30) .fontWeight(FontWeight.Bold) .margin({top:12}) } Row(){ Text('登录已享受更多服务') .fontColor(Color.Gray) .fontSize(17) .fontWeight(FontWeight.Regular) .margin({top:10}) } } .height('20%') .width('100%') .margin({top:35}) // 输入框 Column(){ Column({space:17}){ TextInput({placeholder:'账号'}) .InputStyle() .type(InputType.Number) .maxLength(15) .onChange((value:string)=>{ this.account=value }) Line() .linestyle() TextInput({placeholder:'密码'} ).InputStyle() .type(InputType.Password) .maxLength(8) .onChange((value:string)=>{ this.password=value }) Line() .linestyle() } Row(){ Row(){ Text('发送短信验证码') .fontSize(16) .fontColor('#ff137cf1') .margin(10) }.justifyContent(FlexAlign.Start) .width('50%') Row(){ Text('重置') .fontSize(16) .fontColor('#ff137cf1') .margin(10) }.justifyContent(FlexAlign.End) .width('50%') }.width('100%') .margin({top:15}) } .height('30%') .width('100%') .margin({top:45}) // 登录方式 Column() { Row() { Button('登录') .width('70%') .height('14%') .fontColor(Color.White) .fontWeight(FontWeight.Bold) .fontSize(30) .onClick(()=>{ this.denglu() }) }.margin({ bottom: 20 }) Row() { Text('注册账号') .fontSize(27) .fontWeight(FontWeight.Bold) .fontColor('#007dff') }.justifyContent(FlexAlign.Center) .width('30%') .onClick(()=>{ router.pushUrl({url:'pages/zhuce'}) }) Row() { Text('其他登录方式') .fontSize(16) .fontColor('#99182431') .fontWeight(400) }.margin({top:25}) Row(){ Button() { Image($r('app.media.weixin')) .width(60) .height(60) }.buttonstyle() Button() { Image($r('app.media.qq')) .width(60) .height(60) }.buttonstyle() Button() { Image($r('app.media.douyin')) .width(60) .height(60) }.buttonstyle() } .margin({top:25}) .justifyContent(FlexAlign.SpaceAround) .width('100%') } .height('60%') .width('100%') } .width('100%') .height('100%') .backgroundColor('#d7b1e2f0') }}注册import router from '@ohos.router'import prompt from '@ohos.promptAction';@Extend(TextInput) function InputStyle(){//输入框统一样式 .width('90%').height('16%') .backgroundColor('#f1f3f5') .placeholderColor('#99182431')}@Extend(Line)function linestyle(){//直线统一样式 .height(1) .width('100%') .backgroundColor(Color.Gray)}@Extend(Button)function buttonstyle(){//按钮统一样式 .type(ButtonType.Circle) .width(65) .height(65) .backgroundColor('#d7eef8f7')}@Entry@Componentstruct zhhuce { @State account:string='' @State password:string='' @State rpassword:string=''@State isShowProgress:boolean=false private timeOutId=-1; zhuce():void{ if(this.account==''||this.password==''||this.rpassword=='') { prompt.showToast({ message:'注册信息不能为空,请重新输入' }) }else { if (this.password != this.rpassword) { prompt.showToast({ message: '密码不一致,请重新核对后输入' }) } else { this.isShowProgress=true if(this.timeOutId===-1){ this.timeOutId=setTimeout(()=>{ prompt.showToast({ message:'注册成功!' }) this.isShowProgress=false this.timeOutId=-1 router.pushUrl({ url:'pages/denglu', params:{ account:this.account, password:this.password } }) },2000) } } } } aboutToDisappear(){ clearTimeout(this.timeOutId) this.timeOutId=-1 } build() { // 根组件 Column({space:10}){ // logo Column(){ Row(){ Image($r("app.media.icon")) .width(70) .height(70) .margin({top:25}) } Row(){ Text('注册界面') .fontSize(30) .fontWeight(FontWeight.Bold) .margin({top:12}) } Row(){ Text('注册新用户') .fontColor(Color.Gray) .fontSize(17) .fontWeight(FontWeight.Regular) .margin({top:10}) } } .height('30%') .width('100%') .margin({top:25}) // 输入框 Column(){ Column({space:17}){ TextInput({placeholder:'账号'}) .InputStyle() .type(InputType.Number) .maxLength(15) .onChange((value:string)=>{ this.account=value }) Line() .linestyle() TextInput({placeholder:'密码'} ).InputStyle() .type(InputType.Password) .maxLength(8) .onChange((value:string)=>{ this.password=value }) Line() .linestyle() TextInput({placeholder:'确认密码'}) .InputStyle() .type(InputType.Password) .maxLength(8) .onChange((value:string)=>{ this.rpassword=value }) Line() .linestyle() } Row(){ Row(){ Text('发送短信验证码') .fontSize(16) .fontColor('#ff137cf1') .margin(10) }.justifyContent(FlexAlign.Start) .width('50%') Row(){ Text('重置') .fontSize(16) .fontColor('#ff137cf1') .margin(10) }.justifyContent(FlexAlign.End) .width('50%') }.width('100%') .margin({top:15}) } .height('40%') .width('100%') .margin({top:-40}) if(this.isShowProgress){ LoadingProgress() .margin({top:-50}) .backgroundColor('#182431') .width(60) .height(60) } // 登录方式 Column() { Row() { Button('注册') .width('90%') .height('11%') .fontColor(Color.White) .fontWeight(FontWeight.Bold) .fontSize(25) .onClick(()=>{ this.zhuce() }) }.margin({top:-18}) Row() { Text('登录') .fontSize(25) .fontWeight(FontWeight.Bold) .fontColor('#007dff') .onClick(()=>{ router.pushUrl({ url:'pages/denglu', params:{ account:this.account, password:this.password } }) }) }.justifyContent(FlexAlign.Center) .width('30%') .margin({ top: 10 }) Row() { Text('其他登录方式') .fontSize(16) .fontColor('#99182431') .fontWeight(400) }.margin({top:25}) Row(){ Button() { Image($r('app.media.weixin')) .width(60) .height(60) }.buttonstyle() Button() { Image($r('app.media.qq')) .width(60) .height(60) }.buttonstyle() Button() { Image($r('app.media.douyin')) .width(60) .height(60) }.buttonstyle() } .margin({top:25}) .justifyContent(FlexAlign.SpaceAround) .width('100%') } .height('60%') .width('100%') } .width('100%') .height('100%') .backgroundColor('#d7eef8f7') }}
-
最近在通过华为云hcs运营面api服务接口做一些资源信息获取,通过ecs服务api获取到的server详情有关host主机的信息很有限,大多是所属宿主机的id值,请问如何可以获取到某台ecs弹性云服务器所属宿主机的序列号?谢谢
-
在金融科技的浪潮中,Python以其简洁的语法和强大的功能,成为金融投资领域的新宠。无论是数据分析师、量化交易员还是投资研究员,Python都提供了丰富的工具和库来帮助他们更好地理解市场、制定策略和执行交易。本文将带领读者从Python的基础知识出发,逐步深入了解其在金融投资中的多种应用。Python:金融投资的新工具Python,一种开源的高级编程语言,以其易读性和易用性而广受欢迎。在金融领域,Python的应用包括但不限于数据获取、数据分析、策略开发和资产配置。Python的跨平台特性和丰富的库支持,使其成为金融专业人士的理想选择。网络爬虫:获取市场数据Python的网络爬虫功能可以帮助投资者自动获取股票价格、企业财报等市场数据。通过Python使用Alltick API,投资者可以轻松地从交易所网站或其他金融信息平台上抓取数据,为后续的数据分析和策略制定提供原材料。数据分析:历史回测数据分析是Python在金融领域中的另一个重要应用。利用pandas、numpy等数据处理库,投资者可以对历史数据进行深入分析,发现潜在的投资机会。此外,通过回测,投资者可以在不承担实际风险的情况下,验证交易策略的有效性。投资研究:策略开发Python的统计和机器学习库,如statsmodel和tensorflow,为量化模型设计和策略开发提供了强大的支持。投资者可以利用这些工具开发出基于历史数据和市场规律的交易策略,实现自动化交易。数据整理:资产配置资产配置是分散投资风险的一种有效手段。Python可以帮助投资者快速搜集、整理和分析资产配置相关的数据,自动根据预设规则进行资产分配,实现投资组合的优化。学习Python:从IDE开始对于初学者来说,选择合适的集成开发环境(IDE)是学习Python的第一步。常见的Python IDE包括Spyder、Jupyter、PyCharm和VS Code等。这些IDE提供了代码编辑、调试、运行和版本控制等功能,帮助用户更高效地编写和测试代码。Python常用名词解析为了更好地理解Python代码,以下是一些基本的Python术语和概念:print:用于输出信息,查看程序运行结果。註解:用于解释代码,不会被程序执行。縮排:Python使用缩进来定义代码块。SyntaxError:程序语法错误提示。變數:给数据命名,用于存储信息。資料型態:数据的基本分类,如整数、浮点数、字符串和布尔值。基本運算式:进行数学运算的表达式。關係運算式:比较两个值的大小。邏輯運算式:处理逻辑关系,如and、or和not。布林值:表示逻辑判断的结果,True或False。input:从用户那里获取输入。pip:Python的包管理工具,用于安装外部库。import:导入模块,使用其功能。迴圈:重复执行一段代码直到满足特定条件。函式:执行特定任务的代码块,可以重复调用。Python在金融投资领域的应用是多方面的,从数据获取到策略执行,Python提供了一整套解决方案。对于希望进入量化交易领域的投资者来说,掌握Python是一项宝贵的技能。随着技术的不断进步,Python在金融领域的应用将会更加广泛和深入。通过本文的介绍,我们希望读者能够对Python在金融投资中的应用有一个基本的了解,并激发进一步学习和探索的兴趣。随着实践的深入,Python将帮助投资者更好地分析市场、制定策略,并最终实现投资目标。
-
活动完成标准请注册华为云账号并完成实名认证,实验过程中请使用Chrome浏览器完成相关操作。华为云账号注册步骤请参考:cid:link_4实名认证操作步骤请参考:cid:link_21 通过CodeArts API设计语音合成接口1.1 进入CodeArts API官网,点击网页版体验并登录cid:link_51.2 创建项目1.2.1 登录后点击页面右上角的“创建项目”按钮1.2.2 在创建项目弹窗中输入项目名称:语音合成,并点击保存1.2.3 提示保存成功,点击API设计页签,进入到API设计页面1.3 设计接口1.3.1 点击页面上的“新建API接口”卡片1.3.2 显示新建标签页1.3.3 输入接口的URL:/tts1.3.4 输入接口名称:语音合成1.3.5 下拉滚动条到请求体区域,将请求的格式修改为:application/json1.3.6 显示请求体的数据结构模板,默认根节点类型为“object”1.3.7 点击根节点最右侧的“+”操作1.3.8 页面上在根节点下新增一条参数(可以通过滚动条左右拖动)1.3.9 将参数名param2修改为text,描述param2修改为待合成的文本1.3.10 下拉页面,看到返回响应区域1.3.11 同样点击根节点最右侧的“+”操作(可以通过滚动条拖动到最右侧),在根节点下显示一条新的参数1.3.12 将参数名param2修改为result,将描述修改为合成结果1.3.13 点击右上角的保存按钮1.3.14 保存成功,设计完成2 通过API Explorer调试语音合成接口,生成5段音频2.1 语音合成(API Explorer部分)链接:cid:link_32.1.1 生成语音格式为wav,采样率:8000,标准女音,语速0,音高0图1.1.1 wav标准女音2.1.2 生成语音格式为wav,采样率:16000,标准男声,语速0,音高0图1..12 wav标准男音2.1.3 生成语音格式为mp3,采样率:8000,标准女音,语速100,音高100图1.1.3 mp3标准女音2.1.4 生成语音格式为mp3,采样率:16000,标准男声,语速100,音高100图1.1.4 mp3标准男声2.1.5 生成语音格式为pcm,采样率:16000,标准男声,语速100,音高100图1.1.5 标准男声3 基于华为云自研CodeArts IDE,实现数据流转换为音频的功能3.1 打开CodeArts IDE ONLINE链接:cid:link_6点击免费体验云开发3.2 实现数据流转换为音频3.2.1 将实验用Demo工程上传到CodeArts IDE OnlineDemo工程下载链接:cid:link_11)打开CodeArts IDE Online后,左上角点击“文件”->“上传文件”:2)上传“CodeArtsProject.zip”,点击“终端”对工程进行解压3)左上角->文件->打开,打开解压后的工程目录3.2.2 在华为云控制台新增访问秘钥,配置AK/SK1)登录华为云控制台:https://console.huaweicloud.com/iam/?agencyId=599e2ee1492f48e9b69a0a682d435fb8®ion=cn-north-4&locale=zh-cn#/mine/accessKey选择“我的凭证”->“访问秘钥”->新增访问秘钥注:如果已经有AK/SK秘钥,不需要新增访问秘钥创建秘钥成功后点击“立即下载”,即可获得“credentials.csv”文件,里面可以查看到AK(Access Key Id)和SK(Secret Access Key)2)进入工程,src/main/resources下选择credentials.properties,讲AK/SK配置上3.2.3 将API Explorer上调试成功的流数据文件配置到APIResponse.json中在2.1语音合成章节,我们在API Explorer完成接口的调试cid:link_3最终生成“SIS_RunTts_ResponseBody_xxxxxxxxxxxxx.json”文件,打开json文件,复制响应体内容打开工程,进入src/main/resources中,选择APIResponse.json,将json文件的内容复制到APIResponse.json中。3.2.4 执行“should_return_audio_when_response_json”,生成mps格式音频文件:找到test目录下的测试类SisServiceTest.java,点击找到方法“should_return_audio_when_response_json()”,点击Run Test,最后可以看到目录下生成的音频文件。目录下生成“devkit.mps”文件右击下载,可以获得转换后的音频文件,实验结束
-
我们这边是有个活,自己做不了,找会的懂的帮我们做下。内容大概如下。基于华为手机的系统开发。刷机类需求。 要求: 1. 开机进入设备后。去掉原始的logo,用定制的图片代替; 2. 开机进入设备后。不要进入系统自带界面,而是自动进入已安装的指定APP; 3. 去掉屏保。不按电源键则不会灭屏,默认一直保持最高亮度; 4. 关闭后台app,不能出现各类消息弹出。声明下:1)这里板块太多啦,我刚找了半天,不知该发哪个板块。所发的板块,分类可能不精准。有懂的,可帮我转发到合适的板块啊,谢谢。2)标签太多了。乱打的。见谅哈。
-
请参加活动的开发者将完成的命令行截图提交至本帖评论区。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签