“万物互联”似乎是这些年被提的最多的一个概念,在我们的理解中万物互联似乎就是将生活中的每个实物都接入到网络中。不过因为“万物互联”概念中,“造物”的厂商千千万,各自接入网络的方式又五花八门。所以在绝大部分情况下,即便万物真能接入网络,体验也是割裂的。
rtWesmc
华为的“万物互联”实现方式有些另辟蹊径的意思:分布式技术通过“分布式软总线”,将硬件资源融合为硬件池,不仅实现硬件互联,而且让硬件资源可以相互利用。典型比如WPS与华为终端分布式技术联手打造的分布式文件,可以手机中的文档,可以在PC上直接查看、编辑、保存,提升跨终端工作效率。rtWesmc
5月27日,华为在线上举办了一场HDD华为终端分布式生态技术交流会,除了华为自己针对这种分布式生态的技术讲解和发展现状,也拉来了不少第三方开发者讲述接入生态的价值和过程。我们也期望通过这篇文章,面向开发者谈谈华为生态究竟是怎么回事,以及要加入生态,会不会特别麻烦。rtWesmc
rtWesmc
我们借用一个具体的例子来看看,分布式技术究竟有哪些能力。科大讯飞的办公本应该是比较早接入到华为分布式生态中的一类产品。主要解决的问题是跨设备传输文件,就是在手机和办公本之间做笔记、网文、图书等的分享。rtWesmc
而科大讯飞在智能办公本中,期望解决的问题是:rtWesmc
rtWesmc
而在双方合作后,华为终端分布式技术Share Kit便能够解决这些问题,其采用华为私有传输协议,实现一键分享和更多的数据互通。在科大讯飞的办公本上,其特性至少包括了快速发现设备;PAKE密钥交换做到数据安全交换;快速信道能力协商,根据业务调整物理通路来实现高速传输。rtWesmc
在具体开发的Share Kit集成过程里,科大讯飞办公本涉及到集成发送和接收功能,除了最上层Launcher集成Share Kit 接口,还需要在HAL(硬件抽象层)和Framework层做一些适配。科大讯飞方面则表示,针对Framework和HAL层,华为有提供代码修改流程图,可以非常轻松地搞定;而且即便集成阶段遇到问题,华为也提供服务支持,可以共同解决问题。rtWesmc
对于很多硬件厂商来说,如果只需实现发送功能,那么整个开发过程会更简单,只需上层Launcher集成Share Kit 接口即可。rtWesmc
除了Share Kit外, CaaS Kit是另外一个典型的分布式Kit,比如接入了CaaS Kit的无人机产品,可以直接在无人机APP应用内拨打畅连视频通话,无人机镜头拍摄的画面可直接作为视频来源显示在对方的屏幕上;Drift运动相机利用DeviceVirtualization Kit能力,可以在运动的时候发起畅连通话并将镜头一键转移到Drift镜头,让对方体验第一运动视角带来的紧张刺激;极米投影仪在集成Cast+ Kit后,为用户带来流畅、高清的家庭娱乐投屏体验。rtWesmc
在理解了华为的分布式生态究竟是什么,以及能做什么以后。接下来我们以其中的DeviceVirtualization Kit和Cast+ Kit为例,简单谈谈要将这些能力接入到自己的应用或设备中,具体过程和易用性如何,毕竟易用性是吸引开发者的一大重点。rtWesmc
在前期准备阶段,开发者需要在线提交申请,华为会把相应的SDK提供给开发者。开发可以选择华为的DevEco Studio——这是一个全流程覆盖的IDE。当前的beta版DevEco Studio需要在开发者联盟做申请;也可以选择Android Studio。rtWesmc
通过DevEco Studio的Kit Manager简单勾选Kit、添加依赖库之后,就进入开发阶段了。rtWesmc
(1)DeviceVirtualization KitrtWesmc
DeviceVirtualization Kit(以下简称DV Kit)能够将附近的设备或组件转换为手机的虚拟组件,将其能力作为手机的能力来使用。比如说外部的摄像头、音箱、显示器、话筒,甚至如心率传感器这类设备组件,令其成为手机的眼睛、嘴巴、耳朵等等。rtWesmc
rtWesmc
这里从应用开发者的角度来谈一谈接入过程。有关前期在开发者联盟的注册、获取签名证书指纹以及向华为方的接口权限申请这里不再赘述。这里着重说接入过程。首先是声明虚拟外设的使用权限,以及声明该应用调用DV Kit对应接口需要的权限,比如摄像头、音频、身体传感器的权限等。申请不同的Android权限,在AndroidMenifest.xml文件中添加相应权限,例如:rtWesmc
<uses-permission android:name="android.permission.CAMERA"/>rtWesmc
<uses-permission android:name="android.permission.RECORD_AUDIO"/>rtWesmc
<uses-permission android:name="com.huawei.permission.DISTRIBUTED_VIRTUALDEVICE"/>rtWesmc
这里申请的是虚拟摄像头、虚拟麦克风对应的Android权限;最后一行是在应用需要使用外部的虚拟分布式外设时,所需申请的权限。rtWesmc
DV Kit开发基本方法是,首先创建基础DV Kit对象,并连接后端服务进行初始化;通过该对象获取VirtualDeviceManager服务。通过VirtualDeviceManager服务可以发现当前手机能够控制的虚拟设备。比如前文中的例子,VirtualDeviceManager服务发现Drift运动相机,并返回运动相机当前支持的是Camera(摄像头)、Speaker(扬声器)能力。rtWesmc
rtWesmc
按照上图思路,首先初始化连接DV Kit服务,服务初始化结果通过onConnect回调返回。连接成功后,调用getKitService获取VirtualDeviceManager服务实例,用于控制虚拟设备:rtWesmc
//获取DvKit对象并连接DvKit服务rtWesmc
DvKit.getInstance().connect(getApplicationContext(), new IDvKitConnectCallback() {rtWesmc
//服务连接成功后的回调通知rtWesmc
@OverridertWesmc
public void onConnect(int result) {rtWesmc
addLog("msdp service connect");rtWesmc
mVirtualDeviceManager = (VirtualDeviceManager) DvKit.getInstance().getKitService(VIRTUAL_DEVICE_CLASS);rtWesmc
mVirtualDeviceManager.subscribe(EnumSet.of(VIRTUALDEVICE), observer);rtWesmc
}rtWesmc
//服务断开后的回调通知rtWesmc
@OverridertWesmc
public void onDisconnect() {rtWesmc
addLog("msdp service disconnect");rtWesmc
}rtWesmc
});rtWesmc
接下来就是设备发现,如前文所述连接成功,获取到VirtualDeviceManager服务,应用就能调用VirtualDeviceManager服务的startDiscovery接口用于发现周围的可用设备。发现的设备会通过IDiscoveryCallback回调的onFound接口返回:rtWesmc
//开始发现设备rtWesmc
mVirtualDeviceManager.startDiscovery(new IDiscoveryCallback() {rtWesmc
//设备发现时的回调接口rtWesmc
@OverridertWesmc
public void onFound(VirtualDevice device, int state) {rtWesmc
if (device == null) {rtWesmc
addLog("onDevice callback but device is null");rtWesmc
} else {rtWesmc
HwLog.d(TAG, "onDevice Found: " + Util.hideSensitiveInfo(device.getDeviceId()) + " Name: "rtWesmc
+ device.getDeviceName() + " Type:" + device.getDeviceType());rtWesmc
if (!mVirtualDeviceMap.containsKey(device.getDeviceId())) {rtWesmc
addLog("onDevice Found: " + device.getDeviceId() + " Name: " + device.getDeviceName() + " Type:"rtWesmc
+ device.getDeviceType());rtWesmc
mVirtualDeviceMap.put(device.getDeviceId(), device);rtWesmc
handler.sendMessage(handler.obtainMessage(DEVICE_ADD, device));rtWesmc
}rtWesmc
}rtWesmc
}rtWesmc
//发现状态变更的回调通知rtWesmc
@OverridertWesmc
public void onState(int state) {rtWesmc
}rtWesmc
});rtWesmc
在发现虚拟设备之后,应用就可以调用虚拟设备的getDeviceCapability()接口获取设备支持能力,按需选择具体的能力。具体是调用enableVirtualDevice来使能所需使能的设备和能力,支持同时传入多个能力。应用使能的结果可以通过subscribe接口传入的回调对象来获得:rtWesmc
mVirtualDeviceManager.enableVirtualDevice(deviceId, EnumSet.of(CAMARA), null);rtWesmc
//调用subscribe时传入的observer对象rtWesmc
private IVirtualDeviceObserver observer = new IVirtualDeviceObserver() {rtWesmc
//虚拟设备状态变化时的回调通知rtWesmc
@OverridertWesmc
public void onDeviceStateChange(VirtualDevice virtualDevice, int returncode) {rtWesmc
}rtWesmc
//虚拟设备能力状态变化时的回调通知rtWesmc
@OverridertWesmc
public void onDeviceCapabilityStateChange(VirtualDevice virtualDevice, Capability capability, int returncode) {rtWesmc
if (returncode == EventType.EVENT_DEVICE_CAPABILITY_ENABLE) {rtWesmc
//当设备能力使能成功时,应用处理使能成功流程rtWesmc
onEnable(virtualDevice, capability);rtWesmc
} else if (returncode == EventType.EVENT_DEVICE_CAPABILITY_DISABLE) {rtWesmc
//当设备能力去使能成功时,应用处理去使能成功流程rtWesmc
onDisable(virtualDevice, capability);rtWesmc
} else {rtWesmc
//当虚拟设备能力状态异常时,应用应处理异常流程rtWesmc
one rror(virtualDevice, capability, returncode);rtWesmc
}rtWesmc
}rtWesmc
};rtWesmc
这里是以虚拟Camera能力为例,在虚拟Camera能力接入后,应用可以通过getData接口来获取虚拟设备(比如Drift运动相机)的虚拟Camera id。应用随后就能和传统获取手机的本地前后置摄像头一样,来获取虚拟Camera的属性信息(getCameraCharacteristics),以及打开虚拟Camera(openCamera),示例如下:rtWesmc
//通过虚拟设备的getData接口获取设备虚拟Camera的IDrtWesmc
String cameraId = device.getData(Constants.ANDROID_CAMERAID_FRONT);rtWesmc
//使用CameraManager的getCameraCharacteristics接口获取虚拟Camera的属性信息rtWesmc
CameraManager manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);rtWesmc
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);rtWesmc
//使用CameraManager的openCamera接口打开虚拟CamerartWesmc
manager.openCamera(cameraId, mStateCallback, null)rtWesmc
“去使能”是通过调用disableVirtualDevice接口来实现的,比如去使能摄像头能力:rtWesmc
mVirtualDeviceManager.disableVirtualDevice(deviceId, EnumSet.of(CAMERA));rtWesmc
整体DV Kit提供服务的断连,释放底层资源:rtWesmc
DvKit.getInstance().disConnect();rtWesmc
另外各种应用的具体实现也各有不同,例如有些可能需要使用虚拟Display,有些则需要虚拟Sensor(如Drift Life应用),或者使用本地消息通知等。这在华为开发者文档中都有比较详细的介绍,这里不再一一列举。rtWesmc
整个过程还是比较清晰和便捷的,对于一般开发者而言,代码难度也不高;其流程对于App开发的整体业务存在的影响实际上都是比较小的,这是融入分布式生态比较便利的体现。rtWesmc
(2)Cast+ KitrtWesmc
在日常生活中,我们经常需要投屏玩游戏、看电影等方式实现跨屏幕协同。而一些第三方厂商,如极米就有多款投影仪集成了华为终端分布式技术Cast+ Kit。从现场演示来看,令人印象比较深刻的就是低延迟,这对于投屏玩游戏还是相对重要的。rtWesmc
Cast+ Kit在设备侧需要与华为进行合作协议签署后获取。对于设备侧而言,开发过程首先也是申请权限,包括允许访问网络连接、获取当前WiFi接入状态和热点信息、获取设备当前WiFi频率信息等。rtWesmc
rtWesmc
上面这张图给出了简略的调用流程。其大步骤分成了:首先做变量声明和实例获取:rtWesmc
private PlayerClient mPlayerClient;rtWesmc
private ProjectionDevice mProjectionDevice;rtWesmc
//获取PlayerClient实例rtWesmc
mPlayerClient = PlayerClient.getInstance();rtWesmc
启动服务并注册监听:实现IEventListener.Stub()rtWesmc
private IEventListener mCallback = new IEventListener.Stub() {rtWesmc
//上报连接状态。rtWesmc
public boolean onEvent(int eventId, String type) {rtWesmc
//根据连接状态进行对应的配置及逻辑处理。rtWesmc
…rtWesmc
return true;rtWesmc
}rtWesmc
//上报显示相关事件。rtWesmc
public boolean onDisplayEvent(int eventId, DisplayInfo displayInfo) {rtWesmc
//根据连接状态进行对应的配置及逻辑处理。rtWesmc
…rtWesmc
return true;rtWesmc
}rtWesmc
};rtWesmc
启动服务:rtWesmc
mPlayerClient.init(context);rtWesmc
注册回调接口:rtWesmc
mPlayerClient.registerCallback(mCallback);rtWesmc
随后进行投屏业务相关设置,设置鉴权模式信息:rtWesmc
AuthInfo authInfo = null;rtWesmc
if (needPassword) {rtWesmc
//密码模式,设置6位密码(需要支持混合密码的能力)rtWesmc
authInfo = new AuthInfo(AuthInfo.AUTH_MODE_PWD);rtWesmc
authInfo.setAuthCode(password);rtWesmc
} else {rtWesmc
//PIN码模式rtWesmc
authInfo = new AuthInfo(AuthInfo.AUTH_MODE_GENERIC);rtWesmc
}rtWesmc
boolean isAuthModeSuccessfullySet = mPlayerClient.setAuthMode(authInfo);rtWesmc
If (isAuthModeSuccessfullySet) {rtWesmc
//更新本地密码 or 更新UIrtWesmc
}rtWesmc
设置大屏端设备的投屏能力,首先构造HiSightCapability对象:rtWesmc
HiSightCapability capability = new HiSightCapability(1920, 1080, 1920, 1080);rtWesmc
设置投屏显示帧率,默认为30fps:rtWesmc
capability.setVideoFps(30);rtWesmc
根据平台配置低时延策略:rtWesmc
capability.setMediaCodecConfigureFlag(2)rtWesmc
设置投屏能力:rtWesmc
mPlayerClient.setCapability(capability);rtWesmc
根据选用芯片的不同,可选用HiSightCapability提供的不同方法,设定平台的解码优化参数:rtWesmc
HiSightCapability.setMediaCodecConfigureFlag(int flag)rtWesmc
HiSightCapability. setMediaFormatInteger(String name, int value)rtWesmc
HiSightCapability. setMediaFormatFloat(String name, float value)rtWesmc
HiSightCapability. setMediaFormatLong(String name, long value)rtWesmc
HiSightCapability. setMediaFormatString(String name, String value)rtWesmc
配置大屏端设备信息,包括大屏端设备名称、设备类型:rtWesmc
private DeviceInfo mDeviceInfo = new DeviceInfo(mTvDeviceName, DeviceInfo. TYPE_TV);rtWesmc
并设置设备可被周围的设备发现:rtWesmc
mPlayerClient.setDiscoverable(true, mDeviceInfo);rtWesmc
在大屏设备首次收到移动端连接请求后,会上报EVENT_ID_PIN_CODE_SHOW信息,并提供对端设备信息。在首次连接成功后,再次通过PIN码模式发起连接请求时,会跳出PIN码鉴权步骤:rtWesmc
if (displayInfo != null) {rtWesmc
//设备连接需要的PIN码rtWesmc
String pinCode = displayInfo.getPinCode();rtWesmc
//按照UX规范开发PIN码界面以展示PIN码rtWesmc
showPinCode(pinCode, mProjectionDevice.getDeviceName());rtWesmc
//设置允许手机连接(用于不弹框让用户选择的场景)rtWesmc
mPlayerClient.setConnectRequestChooseResult(new ConnectRequestChoice(rtWesmc
Constant.CONNECT_REQ_CHOICE_ALWAYS, mProjectionDevice));rtWesmc
}rtWesmc
在手机正确输入PIN码鉴权通过后,大屏端应用会上报EVENT_ID_CONNECT_REQ信息,另外也包含移动端设备信息:rtWesmc
if (displayInfo != null) {rtWesmc
//获取请求连接的移动端设备信息rtWesmc
mProjectionDevice = displayInfo.getProjectionDevice();rtWesmc
}rtWesmc
在EVENT_ID_CONNECT_REQ之后,会顺序上报EVENT_ID_DEVICE_CONNECTED和EVENT_ID_PAUSED消息。PAUSED消息下,大屏端可以设置Surface并开始播放投屏视频流,为加快起播速度,也可提前(如EVENT_ID_CONNECT_REQ消息下)启动投屏Acitivity和Surface的创建。rtWesmc
mProjectionDevice为Event_ID_CONNECT_REQ消息中从DisplayInfo中获取的对端设备信息,可通过其获取DeviceId,再通过DeviceID构造TrackControl对象做投屏使用。投屏成功,大屏端将上报EVENT_ID_CASTING消息,标识当前正在投屏。rtWesmc
具体实现上,首先设计应用投屏界面XML布局:rtWesmc
<com.huawei.castpluskit.HiSightSurfaceViewrtWesmc
android:id="@+id/HiSightSurfaceView"rtWesmc
android:layout_width="match_parent"rtWesmc
android:layout_height="match_parent"rtWesmc
android:layout_centerInParent="true" />rtWesmc
另外应用层面,要求保证投屏过程中不能录屏、截屏、录音:rtWesmc
mHiView.setSecure(true);rtWesmc
再添加SurfaceHolder的回调,在surfaceCreated监听中设置投屏控件rtWesmc
SurfaceHolder surfaceHolder = mHiView.getHolder();rtWesmc
surfaceHolder.addCallback(mSurfaceHolderCallback);rtWesmc
private SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {rtWesmc
@OverridertWesmc
public void surfaceCreated(SurfaceHolder holder) {rtWesmc
isSurfaceReady = true;rtWesmc
if(isReceivePaused) {rtWesmc
mPlayerClient.setHiSightSurface(mHiView.getHolder().getSurface());rtWesmc
}rtWesmc
}rtWesmc
}rtWesmc
最后开始投屏:rtWesmc
mPlayerClient.play(new TrackControl(mProjectionDevice.getDeviceId()));rtWesmc
断开连接:rtWesmc
mPlayerClient.disconnectDevice(mProjectionDevice);rtWesmc
对绝大部分开发者而言,这都是一个相当简单快速的集成过程。从这些开发者的代码不难发现,华为在Kit以及系统层面,为简化开发难度,还是花了不少心思的。而对用户来说,投屏质量和效率都是能够得到保证的,用户不需要安装app,也没有复杂操作;而且延迟各方面的体验也都在同类的无线投屏方案中显得比较靠谱——这些也是开发者不需要关心的。rtWesmc
针对开发流程,最后再谈谈目前仍处在beta阶段的DevEco Studio工具。如前文所述这就是个来自华为的IDE,整体是为华为的全场景智慧化战略设想所做的。面向的当然包括了应用开发和设备开发,内部集成了华为的分布式能力。rtWesmc
rtWesmc
完整的DevEco Studio是基于Intellij开源代码,加上华为的开放能力支持。另外华为也基于Android Studio做了DevEco Toolkit插件,作为另一种形态提供给开发者使用。rtWesmc
DevEco Studio的某些特性,本身也是在为分布式生态构建提供便利,这是在分布式能力接入本身就比较简单的情况下,所做的一些加分项。比如说:rtWesmc
rtWesmc
前文就提到的,DevEco Studio针对这些分布式能力有集中管理和呈现的方案,开发者可以直接查看、管理这些Kit,并且在有需要时通过勾选就将某个Kit融入到开发中;甚至还能进行Kit的一键升级操作。这很大程度上提供了开发的便利性。rtWesmc
rtWesmc
另外,所谓的“拖拽式生成API代码”,即调用API功能的代码样例可以直接拖动到代码编辑区。若样例代码依赖某些特殊的包,则在拖动操作后,会自动引入依赖包、自动生成头部import。这些都还是颇具特色的。rtWesmc
在开发周期的调测方面,华为提供了远程真机,大概有5000多个华为机型,不同的系统版本、屏幕分辨率等可做调测。与此同时,华为另外还提供了云测和DFX诊断服务 、“非侵入式”的数据分析。rtWesmc
不言而喻,降低开发难度——不管是完善IDE的体验,还是降低接入Kit的技术难度——本质上都是为了吸引更多的开发者加入到这个生态中来。现阶段是华为1+8+N生态的扩展期,华为期望构建起的是以智能手机为中心,将所有周边智能设备通过分布式能力串联起来的生态。这是华为在万物互联方面的庞大视野,也是华为对万物互联样貌的理解。rtWesmc
这样的布局,显然打破了智能手机自身生态的局限,也并不局限在单纯的智能家居或者某种具体使用场景,描绘的是一幅令IoT真正构成统一生态的图景。现如今华为侧打造了这一生态的基础或平台,并正逐步补足和完善;而要让生态真正活跃、丰富起来,仍然要靠三方开发者的共同努力,这是值得期待的。rtWesmc
微信扫一扫,一键转发
关注“国际电子商情” 微信公众号
近日,Tokyo Electron(以下简称“TEL”)宣布,将在日本宫城县建造一座新的生产大楼,由TEL的制造子公司TEL宫城公司
近日,北京大学物理学院杨学林、沈波团队,联合宽禁带半导体研究中心等多个科研机构,在氮化镓外延薄膜中位错的原
数据中心/云计算可以说是人工智能领域的核心,占据了英伟达总收入的85%~90%。
近日,重庆市人民政府办公厅印发《重庆市推动经济持续向上向好若干政策举措》,提出支持科技领军企业、产业链龙
2月10日消息,据彭博社记者马克·古尔曼报道,苹果公司取消了一款与Mac连接使用的AR眼镜项目,但仍在积极推进独立
韩国媒体TheBell报道,三星正在为旗下自研处理器Exynos2600投入大量资源,以确保其按时量产。
尽管全球平板电脑市场在2024年的大部分时间都保持着两位数的增长,但在2024年Q4,平板电脑出货量仅同比增长3%。
2月7日,日本AR眼镜光学厂商Cellid宣布,公司通过定向增发完成总额1300万美元(约人民币9478.95万元)的融资。
近日,多家媒体发布消息称,瑞芯微前副总经理陈锋将出任Arm在中国的合资公司安谋科技首席执行官(CEO)一职。
美国市场研究机构Gartner发布2024年全球半导体厂商营收排行榜。
随着传统扩展方式的成本和复杂性上升,先进封装已成为满足人工智能(尤其是大型语言模型训练)性能需求的一种方式
2024年Q4,全球笔记本电脑出货量同比增长了6%,达到5450万台。
英飞凌位于曼谷南部沙没巴干府的新后道厂破土动工,该厂将扩大公司在亚洲的生产布局。
2024年,集成电路行业在变革与机遇中持续发展。面对全球经济的新常态、技术创新的加速以及市场需求的不断变化
雅加达,印尼- 2025年1月14日 - 全球技术解决方案供应商艾睿电子(Arrow Electronics)与印尼初创协会合作(STARFIN
无畏挑战 共创未来祥龙回首留胜景,金蛇起舞贺新程。在2025年元旦新年之际,深圳市凯新达科技有限公司(以下简
最新Wi-Fi HaLow片上系统(SoC)为物联网的性能、效率、安全性与多功能性设立新标准;
配套USB网关,轻松实现Wi-
随着与三安光电的碳化硅合资工厂落地重庆,2024年6月,意法半导体与重庆市彭水自治县同步启动了可持续发展合作
凯新达科技 自由之旅 征途同行
NVIDIA Jetson Orin™ Nano Super 开发者套件是一款尺寸小巧且性能强大的超级计算机,重新定义了小型边
德州仪器今日推出了全新的集成式汽车芯片,能够帮助各个价位车辆的驾乘人员,实现更安全、更具沉浸感的驾驶体验
广州飞虹半导体科技有限公司成立于广州越秀区,诚信经营20多年。主要研发、生产、经营:场效应管、三极管等半
近日,半导体存储品牌企业江波龙与工业和信息化部电子第五研究所(中国赛宝实验室,以下简称“电子五所”)在江波龙
深圳迈巨微电子有限公司深耕锂电池管理芯片领域,围绕电池健康和安全,电池电量计算二个核心技术能力,提供完善的
点击查看更多
北京科能广告有限公司深圳分公司 版权所有
分享到微信
分享到微博
分享到QQ空间
推荐使用浏览器内置分享
分享至朋友圈