Remote Control远程控制
远程控制提供了一个框架,允许应用程序控制车辆内的某些安全模块
注意:并不是所有的车辆都有这种功能。即使它们支持远程控制,您也可能需要请求汽车制造商的许可权限才能使用它。
考虑一下的场景:
- 一个无线电应用程序想要调用车载无线电调谐器。它需要来选择无线电波段(AM/FM/XM/HD/DAB),调整无线电频率或改变电台,以及获得一般无线电信息等功能作决策。
- 一个气候控制应用需要打开空调,控制空气流通模式,改变风扇转速,设定所需的舱内温度。
-
用户概要文件应用程序希望记住用户最喜欢的设置,并在用户进入相同/另一个车辆时自动应用它。
目前,远程控制功能支持这些模块:
image.png
下表列出了每个控制模块中的控制项。


远程控制还可以允许移动应用程序发送模拟按钮按下事件,以便在车辆中使用以下常用按钮。
系统应列出所有可用RemoteControlCapabilities远程控制按钮。capability对象将有一个可通过getbuttoncapability()获得的buttoncapability列表


Integration综合
对于远程控制工作,头单元必须支持SDL核心版本4.4或更新。
SYSTEM CAPABILITY
在使用任何远程控制rpc之前,您必须检查head单元是否具有远程控制能力。当您可能遇到不支持它的头部单位时,此检查非常重要。
要检查此功能,请使用以下调用:
// First you can check to see if the capability is supported on the module
if (proxy.isCapabilitySupported(SystemCapabilityType.REMOTE_CONTROL){
// Since the module does support this capability we can query it for more information
proxy.getCapability(SystemCapabilityType.REMOTE_CONTROL, new OnSystemCapabilityListener(){
@Override
public void onCapabilityRetrieved(Object capability){
RemoteControlCapabilities remoteControlCapabilities = (RemoteControlCapabilities) capability;
// Now it is possible to get details on how this capability
// is supported using the remoteControlCapabilities object
}
@Override
public void onError(String info){
Log.i(TAG, "Capability could not be retrieved: "+ info);
}
});
}
GETTING DATA
可以检索与这些远程控制模块相关的当前数据。数据可以用来存储设置之前的设置,保存用户的首选项,等等。在检查系统支持远程控制的能力之后,我们可以实际检索数据。下面是一个关于无线电模块获取数据的例子。它也订阅对无线电数据的更新,这将在本指南中稍后讨论。
GetInteriorVehicleData interiorVehicleData = new GetInteriorVehicleData();
interiorVehicleData.setModuleType(ModuleType.RADIO);
interiorVehicleData.setSubscribe(TRUE);
interiorVehicleData.setOnRPCResponseListener(new OnRPCResponseListener() {
@Override
public void onResponse(int correlationId, RPCResponse response) {
GetInteriorVehicleData getResponse = (GetInteriorVehicleData) response;
//This can now be used to retrieve data
}
});
proxy.sendRPCRequest(interiorVehicleData);
SETTING DATA
当然,设置这些模块的能力是远程控制的重点。设置数据与获取数据类似。下面是一个设置ClimateControlData的例子。
Temperature temp = new Temperature();
temp.setUnit(TemperatureUnit.FAHRENHEIT);
temp.setValue((float) 74.1);
ClimateControlData climateControlData = new ClimateControlData();
climateControlData.setAcEnable(TRUE);
climateControlData.setAcMaxEnable(TRUE);
climateControlData.setAutoModeEnable(FALSE);
climateControlData.setCirculateAirEnable(TRUE);
climateControlData.setCurrentTemperature(temp);
climateControlData.setDefrostZone(DefrostZone.FRONT);
climateControlData.setDualModeEnable(TRUE);
climateControlData.setFanSpeed(2);
climateControlData.setVentilationMode(VentilationMode.BOTH);
climateControlData.setDesiredTemperature(temp);
ModuleData moduleData = new ModuleData();
moduleData.setModuleType(ModuleType.CLIMATE);
moduleData.setClimateControlData(climateControlData);
SetInteriorVehicleData setInteriorVehicleData = new SetInteriorVehicleData();
setInteriorVehicleData.setModuleData(moduleData);
proxy.sendRPCRequest(setInteriorVehicleData);
BUTTON PRESSES
远程控制的另一个独特之处是能够将模拟的按钮按到相关的模块上,模仿硬件本身的按钮。
ButtonPress buttonPress = new ButtonPress();
buttonPress.setModuleType(ModuleType.RADIO);
buttonPress.setButtonName(ButtonName.EJECT);
buttonPress.setButtonPressMode(ButtonPressMode.SHORT);
proxy.sendRPCRequest(buttonPress);
SUBSCRIBING TO CHANGES 订阅改变
还可以订阅与支持模块相关的数据的更改。要做到这一点,在获取数据的过程中,只需添加setSubscribe(Boolean)
若要取消订阅,请将该请求再次发送到False。设置订阅的代码示例在上面的GET示例中。
对订阅的响应将以通知的形式出现。您可以通过提供给SdlProxyALM对象的IProxyListenerALM接收此通知;当接收到RPC时,将调用ononinteriorvehicle数据的方法。
USING IPROXYLISTENERALM
@Override
public void onOnInteriorVehicleData(OnInteriorVehicleData response) {
//Perform action based on notification
}
SETTING NOTIFICATION LISTENER
proxy.addOnRPCNotificationListener(FunctionID.ON_INTERIOR_VEHICLE_DATA, new OnRPCNotificationListener() {
@Override
public void onNotified(RPCNotification notification) {
OnInteriorVehicleData onInteriorVehicleData = (OnInteriorVehicleData)notification;
//Perform action based on notification
}
});
网友评论