(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)

OpenAtom OpenHarmony(以下简称“OpenHarmony”)作为分布式操作系统,让多个设备之间能够相互感知,进而整合成一个超级终端。从而实现设备与设备之间取长补短、相互帮助,为用户提供自然流畅的分布式体验。
那么超级终端中,设备的能力和状态如何管理?设备之间如何进行信息协同?要回答这些问题,就不得不提我们本期的主角——DeviceProfile。
超级终端中的设备之间如何能实现取长补短、相互帮助?首先,就必须知道每个设备的能力,以及设备是否在线。对此,OpenHarmony 提出了“设备画像”,也就是通过 DeviceProfile 来记录设备的能力和状态等信息。
DeviceProfile 是设备硬件能力和系统软件特征的管理器,记录的典型设备信息有设备类型、设备名称、存储容量、是否折叠屏、有无屏幕、分辨率、设备安全等级、设备 OS 类型、OS 版本号等。
(备注:DeviceProfile 支持分布式部署在多个设备上,所以 DeviceProfile 也称为分布式 DeviceProfile)
接下来,我们来看看 DeviceProfile 的组成结构。
图1 DeviceProfile的组成结构
如图 1 所示, DeviceProfile 主要包含以下模块:
ㆍ 数据管理:提供设备信息的插入、删除、查询、同步等数据管理功能;
ㆍ 订阅管理:订阅和取消订阅远端设备的同步完成事件和数据变更事件;
ㆍ 安全管理:管控本地设备 DeviceProfile 的访问权限,保障数据在可信范围内获取。
分布式 DeviceProfile 基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性,构建统一的设备信息管理机制。支持对设备信息的插入、删除、查询、跨设备同步、同步完成及数据变更事件监听等操作。
图 2 展示了两个设备的分布式 DeviceProfile 及其内部业务流程。

在介绍业务流程之前,先让我们来认识一下图 2 中涉及到的几个模块。
ㆍ DP Client 和 CS(Content Sensor)都是 DeviceProfile 一部分。DP Client 是 DeviceProfile 的客户端,其他服务可以通过 DP Client 来调用 DeviceProfile 的接口进行数据同步、数据变更等。CS 负责采集本设备的设备信息;
ㆍ HiChain:设备互信认证服务,管理设备的可信群组;
ㆍ 分布式数据管理服务:DeviceProfile 通过分布式数据管理服务插入、更新、查询、删除及同步设备信息。
接下来,我们就来详细介绍分布式 DeviceProfile 的典型业务流程。
1. 插入/删除本地设备信息
CS 模块定期探测本地设备的能力信息。当设备能力发生变化时,CS 发送给本地 DeviceProfile,本地 DeviceProfile 再通过分布式数据管理服务插入或更新设备信息。
当设备的某项能力很久未使用,本地 DeviceProfile 会通过分布式数据管理服务删除设备信息。
设备信息插入的内部流程图如图 3 所示。本地 DeviceProfile 通过 PutDeviceProfile 接口,请求写入一条设备信息记录。如果数据库已经初始化完成,DeviceProfileStorageManager 会直接调用 OnLineSyncTable 的 PutDeviceProfile 写入数据库。如果数据库经初始化未完成,则先将数据写入临时缓存,等初始化完成后再写入数据库,并清理缓存。

2. 跨设备同步设备信息
跨设备同步设备信息分为两种场景:
(1)设备上线时自动触发同步
如图 2,当 Device B 上线时,Device A 的 DeviceProfile 会从分布式软总线收到上线通知。DeviceProfile 的安全管理模块通过与 HiChain 交互,获知 Device B 在可信群组内。此时,自动触发同步,Device A 将自己的设备信息推送给 Device B 实现同步。同样的,Device A 上线时,Device B 也会收到上线通知,触发 Device B 主动推送自己的设备信息给 Device A 实现同步。
(2)通过 DP Client 调用接口触发同步
系统服务也可以通过 DP Client 调用 SyncDeviceProfile 接口,触发两个设备的分布式数据库的数据同步。
跨设备同步设备信息的内部流程如图 4 所示。设备 A 的 DeviceProfile 通过 SyncDeviceProfile 接口发起同步请求,再通过 CheckTrustGroup 接口获取本设备(即设备 A)和需要同步设备(即设备 B)的可信群组信息。如果两个设备的 GroupType 类型为 1(同账号组网)或者 256(点对点无账号组网),并且 Visibility(可见性)为 public,则说明两个设备之间可信。设备 A 将自己的设备信息推送给设备 B。

3. 查询设备信息
跨设备同步设备信息之后,本地设备上除了自己设备的信息,还有远端设备的信息。因而,在本地设备上就可以查询本地和远端设备信息,DeviceProfile 通过 deviceid 来判断是否为远端设备。DeviceProfile 提供的查询接口为 GetDeviceProfile 接口,具体查询流程如图 5 所示。

4. 订阅同步完成/数据变更事件
DeviceProfile 提供两类事件的订阅和取消订阅功能:
ㆍ 同步完成事件
跨设备同步设备信息时,支持订阅同步完成事件。比如 Device A 同步 Device B 的设备信息,如果 Device B 订阅了同步完成事件,则同步完成后 Device B 会收到 Device A 发送的同步完成通知。如果 Device B 取消订阅同步完成事件,则后续同步完成后不再收到通知。
DeviceProfile 提供的同步完成事件订阅接口为 SubscribeProfileEvent 接口,取消订阅的接口为 UnsubscribeProfileEvent 接口。
ㆍ 数据变更事件
DeviceProfile 支持远程订阅数据变更事件,比如,Device B 可以订阅 Device A 的数据变更事件。当 Device A 的数据发生变更,Device B 会收到数据变更通知。如果 Device B 取消订阅数据变更事件,则后续不再收到数据变更通知。
DeviceProfile 提供的数据变更事件订阅接口为 SubscribeProfileChange 接口,取消订阅的接口为 SubscribeProfileChange 接口。
同步完成事件、数据变更事件的订阅流程相似。图 6 展示了同步完成事件的订阅流程。

本期我们介绍了 DeviceProfile 的概念、组成和典型的业务流程。你是否已经了解了呢?
还想深入了解的开发者,可以参考以下链接查看 DeviceProfile 的实现代码和介绍:https://gitee.com/openharmony/device_profile_core

我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的
如果我一直输入geminstallrails使用不同版本的Rails会怎样?例如,我可以输入:geminstallrails--verson3.2.10或geminstallrails这给了我版本3.2.12。问题每次安装都会覆盖之前的吗?它会删除所有旧文件并添加我正在安装的新版本吗?或者如果我运行它两次,它会保留一些文件吗?我正在使用Ubuntu。 最佳答案 它将安装两个独立的gem。实际的可执行文件rails将调用最新版本。你可以覆盖它__例如,rails_3.2.10_将执行Rails3.2.10。bundler顺便说一下,如
我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正