【智体OS】官方上新发布智体电视:基于rtpc和rttouchpad实现智体电视的手机遥控-可安装任意PC应用用于智体电视

news2024/12/13 5:03:09

【智体OS】官方上新发布智体电视:基于rtpc和rttouchpad实现智体电视的手机遥控-可安装任意PC应用用于智体电视

dtns.network是一款主要由JavaScript编写的智体世界引擎(内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆),可以在浏览器和node.js、deno、electron上运行,它是一个跨平台的软件,支持多个操作系统使用!

dtns.connector是dtns.network的客户端软件,允许多用户方便自由地连接dtns.network的智体设备。支持使用内置的poplang智体编程语言实现3D组件的智能化编程——语法超简单,一句话语法,人人轻松上手!通过poplang智体编程,可轻松创建、编辑、分发xverse-3D智体应用。

本次上新的主要内容为:使用rtpc实时分布式PC远程访问和实时控制智体电视,并基于rttouchpad实现智体电视遥控器(rtpc3.3.dpkg版本)

更新内容

1、使用dpkg机制,集成和拓展dtns-rtpc-api,开发了rtpc分布式远程访问和实时控制的DPKG插件rtpc3.3.dpkg(dtns.top官网下载)

2、rtpc和rttouchpad共同支持屏幕同步功能、鼠标点击功能、文字输入功能

3、支持访问内网算力设备,主要是依赖于dtns-api来进行访问(分布式设备终端远程访问),可取代大部分的代理访问机制。

4、可方便集成到了dtns.os的系统应用面板中。

5、可使用poplang调用dtns-rtpc-api,实现桌面操作系统和智体电视的控制机器人

6、可在手机上安装dtns.connector智体OS的客户端,打开rtpc3.3dpkg,点击在上角的【触屏】以激活遥控器功能,实现鼠标移动、点击、鼠标滚动、方向键操作(手机触控版浏览器)

7、利用dtns.network的智体OS操作系统,安装rtpc和rttouchpad智体应用,可以方便地将PC电脑(macos、windows)升级为智体电视机。可以安装数以千万计的第三方应用,并且方便地手机-PC电脑共享视频应用会员等等诸多好处。

完全开源:rtpc和rttouhpad开源、dtns.os和dtns.network等项目均开源。详见文末、或访问dtns.top智体OS官网。

使用教程

一、打开dtns.connector的dweb头榜界面,点击上传了的rtpc3.3.dpkg(或任意其它最新版本)

1.png

二、进入rtpc远程访问和实时管理的智体应用,可以看到最新的macos桌面内容(点击锁屏可见到输入密码提示框,使用右上角的功能-input可以输入文本密码)

2.png

三、点击右上角的“功能”,再点击input输入密码*****

3.png

四、输入完密码,点击->登录箭头登录

4.png

五、进入macos系统后,可以看到视频应用界面

5.png

六、点击右上角的【画面】后,可见状态为【触屏】,可使用移动鼠标、上下滚动鼠标、进行运作操作(前后左右的移动来控制键盘上的前后左右键——用于调整音量、前进后退等)

6.png

Input的poplang代码如下:


set tips 请输入:

$.prompt tips

= keystr $ret

$.g_rtpc.hideTools

#发送键盘输入内容

set p **{"string":""}

object.set p.string keystr

/rtpc/string/type p

注:使用了全局函数 . p r o m p t 来提示输入,并使用 .prompt来提示输入,并使用 .prompt来提示输入,并使用.g_rtpc.hideTools来隐藏功能栏,并最终调用dtns-rtpc-api:/rtpc/string/type来实现文本密码的输入。

rtpc3.3.dpkg的源码分享
/* eslint-disable */

<!--

 * @Description: RtPcClient

 * @Author: poplang

 * @Date: 2024-12-5

 * @LastEditors:

 * @LastEditTime:

 -->

 <template>

    <div style="width: 100%;height: 100%;padding:0px;margin: 0px;" >

      <div @click="back" style="color:black;position: fixed;left:8px;top:8px;z-index: 399;"> ❮返回 </div>

      <div style="color:black;position: fixed;left:0;right:0;top:8px;z-index: 359;text-align: center;  font-size: 18px;font-weight: 800;">{{ title }}</div>

      <div  style="color:black;position: fixed;right:8px;top:8px;z-index: 399;"><span @click="showTouchPadFlag=!showTouchPadFlag" style="margin-right: 8px">{{ showTouchPadFlag?'触屏':'画面' }}</span><span @click="syncScreen" style="margin-right: 8px">{{ syncScreenTips }}</span><span @click="showFlag=true" style="margin-right: 8px">功能</span>

        <!-- <span @click="queryScreen">刷新</span> -->

      </div>

      <!-- <div style="color:red;position: fixed;right:8px;top:8px;z-index: 399;"><b>[分数] {{ top_cnt }} : {{ success_cnt  }}</b></div> -->

      <!-- <div v-show="showInput" style="position: fixed;z-index: 199; display:flex;bottom: 5px;left:0;right: 0;height: auto;text-align: center;margin-bottom: 2px;padding:0px 10px 0px 10px;">

        <input @keydown.enter="keyDown" style="width:100%; height:28px; padding-left:5px; border:1px solid #eeeeee; font-size:13px;" v-model="msg" />

        <button @click="send" style="color: rgb(255, 255, 255);width:70px;border-radius: 0px; font-size: 13px; height: 28px; background-color: rgb(18, 173, 245); border: none;">发送</button>

      </div> -->

      <RtTouchPad v-if="showTouchPadFlag"/>

      <div v-else style="position:fixed;top: 50px;bottom: 0px;left: 0px;right: 0px;z-index: 9;overflow-x: auto;overflow-y: auto;">

        <img :src="base64" style="width: auto;height: auto;" @mousedown="mousedown"/>

      </div>

      <van-popup v-model="showFlag" position="top" :style="{ height: '35%' }" >

        <van-grid>

        <van-grid-item  @click="call(item)"  v-for="(item,index) in list" :key="index" icon="photo-o" :text="item.title"></van-grid-item>

        </van-grid>

      </van-popup>

    </div>

  </template>

  <script>

  import RtTouchPad from './RtTouchPad.vue';

  export default {

    name: "RtPcClient",

    props: ["value"],

    components: { RtTouchPad },

    data() {

      return {

        title:'RTPC客户端',

        // showInput:false,

        base64:null,

        // syncScreenId:0,

        syncScreenNowFlag:false,

        syncScreenTips:'同步',

        syncScreenTipsStart:'同步',

        syncScreenTipsStop:'静止',

        showFlag:false,

        list:[],

        popRutimes:[],

        showTouchPadFlag:false,

      }

    },

    async created()

    {

      this.user_id = localStorage.user_id

    //   setInterval(this.queryScreen,10000)

    },

    mounted(){

        // this.queryScreen()

        this.syncScreen()

 

        //允许使用poplang脚本进行功能拓展。

        this.queryPopPlugins()

        window.g_rtpc = {}

        g_rtpc.queryPopPlugins = this.queryPopPlugins

        g_rtpc.stopSyncScreen = this.stopSyncScreen

        g_rtpc.syncScreen = this.syncScreen

        g_rtpc.queryScreen = this.queryScreen

        g_rtpc.hideTools = this.hideTools

        g_rtpc.showTools = this.showTools

 

    },

    beforeRouteLeave(to,from,next){

      // if(this.syncScreenId) clearInterval(this.syncScreenId)

      console.log('beforeRouteLeave-to-from:',to,from)

      if(to.path != from.path)

      {

        this.stopSyncScreen()

        console.log('into beforeRouteLeave')

        next();

      }

    },

    methods: {

        back(){

          this.stopSyncScreen()

          this.$router.go(-1)

        },

        hideTools()

        {

          this.showFlag = false

        },

        showTools()

        {

          this.showFlag = true

        },

        stopSyncScreen()

        {

          if(this.syncScreenNowFlag)

          {

            // clearInterval(this.syncScreenId)

            this.syncScreenNowFlag = false

            this.syncScreenTips = this.syncScreenTipsStart

          }

 

          //对poplang进行资源回收

          if(this.popRutimes)

          {

            for(let i=0;i<this.popRutimes.length;i++)

            {

              this.popRutimes[i].quit() //退出所有循环和脚本。

              console.log('quit-poplang-',i)

            }

          }

        },

        async syncScreen()

        {

          if(this.syncScreenNowFlag) return this.stopSyncScreen()

          this.syncScreenNowFlag = true//setInterval(this.queryScreen,5000)

          this.syncScreenTips = this.syncScreenTipsStop

          while(this.syncScreenNowFlag)

          {

            await this.queryScreen() //得到查询结果(可能1-15s完成600kb的png截图下载)

            await new Promise((res)=>setTimeout(res,100))

          }

        },

        async queryScreen()

        {

            if(typeof g_dtnsManager =='undefined') return false

            let ret =  await g_dtnsManager.run('dtns://web3:'+rpc_client.roomid+'/rtpc/screen/cap')

            if(ret && ret.ret) this.base64 = ret.base64

            else console.log('query-screen-ret:',ret)

        },

        async mousedown(e)

        {

            if(this.click_event_now_flag) console.log('this.click_event_now_flag is true')

            console.log('RtPcClient.vue mousedown-event:',e)

            let x = e.offsetX , y = e.offsetY//e.layerX, y = e.layerY//e.clientX, y = e.clientY

            if(typeof g_dtnsManager =='undefined') return false

            this.click_event_now_flag = true

            let ret = await g_dtnsManager.run('dtns://web3:'+rpc_client.roomid+'/rtpc/mouse/move',{x,y,click:true})//,click:true

            if(!ret || !ret.ret) g_dchatManager.viewContext.$toast('移动鼠标失败,原因:'+(ret ? ret.msg:'未知网络原因'))

            // else{

            // ret = await g_dtnsManager.run('dtns://web3:'+rpc_client.roomid+'/rtpc/mouse/click')

            // if(!ret || !ret.ret) g_dchatManager.viewContext.$toast('点击屏幕执行失败,原因:'+(ret ? ret.msg:'未知网络原因'))

            // await new Promise((res)=>setTimeout(res,100))

            // await this.queryScreen()

            // }

            await new Promise((res)=>setTimeout(res,100))

            this.click_event_now_flag = false

        },

        async call(item)

        {

          let data = await g_dchatManager.goFile(item.fileid,true)

          if(!data) return false

          let binaryData = data.filedata

          let utf8decoder = new TextDecoder()

          let poplangStr  = utf8decoder.decode(binaryData)

          let poplang = new PopRuntime()

          this.popRutimes.push(poplang)

          console.log('run-item-popRuntimes:',item.title,item,data,poplangStr,this.popRutimes)

          let rets = await poplang.runScript(null,poplangStr) //注意while 循环

          console.log('run-item-result:',rets)

          return true

        },

        async queryPopPlugins()

        {

          if(typeof g_dtnsManager =='undefined') return false

          let ret = await g_dtnsManager.run('dtns://web3:'+rpc_client.roomid+'/rtpc/poplang/apps')

          if(ret && ret.ret)

          {

            return this.list = ret.list

          }

          return false

        },

        send()

        {

 

        },

        keyDown()

        {

 

        }

    }

  }

  </script>

<style scoped>

</style>
 

注:对比rtpc2.*版本,主要是引入了RtTouchPad组件,用于实现手机端的触控板遥控智体电视机(功能类似笔记本电脑键盘下方中间的touch-pad触控面板)。并且,调整了【功能】栏的能力,使得直接使用.pop代码可以轻松拓展任意的rtpc智体电视的控制代码(基于poplang构建的智体应用插件)。

总结:rtpc和rttouchpad的结合,使得智体电视变成了一个非常易于使用的智体设备。功能强大,应用丰富(千万级),并且支持poplang拓展智体电视机的功能插件,从而大大提升了智体电视的用户体验——内容极度丰富、使用超级简单。

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

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

相关文章

Flink+Paimon实时数据湖仓实践分享

随着 Paimon 近两年的推广普及&#xff0c;使用 FlinkPaimon 构建数据湖仓的实践也越来越多。在 Flink 实时数据开发中&#xff0c;对于依赖大量状态 state 的场景&#xff0c;如长周期的累加指标计算、回撤长历史数据并更新等&#xff0c;使用实时数仓作为中间存储来代替 Flin…

Stable Diffusion本地部署:从零开始的完整指南

1、引言 Stable Diffusion是计算机视觉领域的一个生成式大模型&#xff0c;能够进行文生图&#xff08;txt2img&#xff09;和图生图&#xff08;img2img&#xff09;等图像生成任务。它利用深度学习技术&#xff0c;特别是RealisticVision v2.0模型&#xff0c;能够创造出接近…

鸿蒙元服务上架

鸿蒙元服务上架 一、将代码打包成 .app 文件1. 基本需求2. 生成密钥和证书请求文件3. 申请发布证书4. 申请发布Profile5. 配置签名信息6. 更新公钥指纹7. 打包项目成 .app 文件 二、发布元服务1. 进入应用信息页面2. 上传软件包3. 配置隐私协议4. 配置版本信息5. 提交审核&…

【论文阅读】PRIS: Practical robust invertible network for image steganography

内容简介 论文标题&#xff1a;PRIS: Practical robust invertible network for image steganography 作者&#xff1a;Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间&#xff1a;2024年4月11日 Engineering Applications of Artificial Intelligence 关键…

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…

特征交叉-CAN学习笔记代码解读

一 核心模块coaction 对于每个特征对(feature_pairs)weight, bias 来自于P_inductionP_fead是MLP的input 举个例子&#xff1a;如果是用户ID和产品ID的co-action&#xff0c;且产品ID是做induction&#xff0c;用户ID是做feed。 step1 用户ID/产品ID都先形成一个向量&#xf…

EfficientNet与复合缩放理论(Compound Scaling Theory) 详解(MATLAB)

1.EfficientNet网络与模型复合缩放 1.1 EfficientNet网络简介 1.1.1 提出背景、动机与过程 EfficientNet是一种高效的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;由Google的研究团队Tan等人在2019年提出。EfficientNet的设计目标是提高网络的性能&#xff0c;同时减…

SQL语句在MySQL中如何执行

MySQL的基础架构 首先就是客户端&#xff0c;其次Server服务层&#xff0c;大多数MySQL的核心服务都在这一层&#xff0c;包括连接、分析、优化、缓存以及所有的内置函数&#xff08;时间、日期、加密函数&#xff09;&#xff0c;所有跨存储引擎功能都在这一层实现&#xff1…

开源低代码平台-Microi吾码-表单控件数据源绑定配置

表单控件数据源绑定配置 平台简介普通数据源数据源引擎Sql数据源通过其它字段来动态绑定数据源关于绑定数据源后的显示字段和存储字段 平台简介 技术框架&#xff1a;.NET8 Redis MySql/SqlServer/Oracle Vue2/3 Element-UI/Element-Plus平台始于2014年&#xff08;基于Av…

Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)

文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器&#xff08;在游戏内对新的事件进行注册&#xff09;2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…

Redis原理—4.核心原理摘要

大纲(9870字) 1.Redis服务器的Socket网络连接建立 2.Redis多路复用监听与文件事件模型 3.基于队列串行化的文件事件处理机制 4.完整的Redis Server网络通信流程 5.Redis串行化单线程模型为什么能高并发 6.Redis内核级请求处理流程与原理 7.Redis通信协议与内核级请求数据…

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统&#xff0c;与其他日志系统不同的是&#xff0c;Loki最初设计的理念是为了为日志建立标签索引&#xff0c;而非将原日志内容进行索引。 现在目前成熟的方案基本上都是&#xff1a;L…

【规范一】JAVA静态代码规范

1.规范的划分 将Java代码规范分为 风格规范 和 质量规范 &#xff0c;主要是因为这两种规范关注的方面不同&#xff0c;各自解决的问题也不同。下面详细解释为什么需要将代码规范分为这两种 1.1 风格规范&#xff08;Coding Style Guidelines&#xff09; 风格规范主要关注代码…

Angular由一个bug说起之十二:网页页面持续占用CPU过高

随着网络日益发达&#xff0c;网页的内容也更加丰富&#xff0c;形式也更加多样化。而随之而来的性能问题也不容小觑。这篇文章我会根据我在实践中遇到的一个问题来总结&#xff0c;我在面对性能问题的一些解决步骤&#xff0c;希望能对大家有所启发。 查找问题原因 我接触的…

WordPress全能CDN插件_自动刷新预热_缓存优化|国内国外集成CDN配置

WordPress全网独家原创CDN插件 自动刷新预热 缓存优化 国内国外集成CDN配置 支持白山云 cdnfly Cloudflare PS:目前国内集成了CDNfly,白山云国外集成了Cloudflare,更新手动刷新&#xff0c;全站刷新&#xff0c;优化提交线程&#xff0c;根据网友建议适配阿里云&#xff0c;le…

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip&#xff1b;Wav2Lip是一种用于生成唇形同步&#xff08;lip-sync&#xff09;视频的深度学习算法&#xff0c;它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 &#xff08;Paper&#xff09; Wav2Lip模型…

【汽车】-- 燃油发动机3缸和4缸

3缸和4缸燃油发动机是小轿车常见的发动机配置。以下从结构特点、性能、经济性等方面对两者进行对比&#xff0c;并分析优缺点及使用注意事项&#xff1a; 1. 结构与运行原理 3缸发动机 特点&#xff1a;少一个气缸&#xff0c;内部零部件更少&#xff0c;整体结构更紧凑。优点…

[NeurlPS 2022] STaR 开源代码实现解读

STaR 方法代码开源&#xff0c;这里给出一个中文代码解读地址&#xff1a;repo入口点&#xff1a;iteration_train.py&#xff1b;关键代码&#xff1a;device_train.py, device_inference.py, and create_finetune_tfrecords.py&#xff1b;基于 JAX、RAY&#xff0c;在 Googl…

欢迪迈手机商城设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 题目&#xff1a;欢迪迈手机商城设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管…

【鸿蒙实战开发】数据的下拉刷新与上拉加载

本章介绍 本章主要介绍 ArkUI 开发中最常用的场景下拉刷新, 上拉加载&#xff0c;在本章中介绍的内容在实际开发过程当中会高频的使用,所以同学们要牢记本章的内容。下面就让我们开始今天的讲解吧&#xff01; List 组件 在 ArkUI 中List容器组件也可以实现数据滚动的效果&a…