Remote Control遠程控制
遠程控制提供了一個框架辣恋,允許應用程序控制車輛內(nèi)的某些安全模塊
注意:并不是所有的車輛都有這種功能亮垫。即使它們支持遠程控制,您也可能需要請求汽車制造商的許可權限才能使用它伟骨。
考慮一下的場景:
- 一個無線電應用程序想要調(diào)用車載無線電調(diào)諧器饮潦。它需要來選擇無線電波段(AM/FM/XM/HD/DAB),調(diào)整無線電頻率或改變電臺携狭,以及獲得一般無線電信息等功能作決策继蜡。
- 一個氣候控制應用需要打開空調(diào),控制空氣流通模式逛腿,改變風扇轉(zhuǎn)速稀并,設定所需的艙內(nèi)溫度。
-
用戶概要文件應用程序希望記住用戶最喜歡的設置单默,并在用戶進入相同/另一個車輛時自動應用它碘举。
目前,遠程控制功能支持這些模塊:
image.png
下表列出了每個控制模塊中的控制項雕凹。
遠程控制還可以允許移動應用程序發(fā)送模擬按鈕按下事件殴俱,以便在車輛中使用以下常用按鈕政冻。
系統(tǒng)應列出所有可用RemoteControlCapabilities遠程控制按鈕。capability對象將有一個可通過getbuttoncapability()獲得的buttoncapability列表
Integration綜合
對于遠程控制工作线欲,頭單元必須支持SDL核心版本4.4或更新明场。
SYSTEM CAPABILITY
在使用任何遠程控制rpc之前,您必須檢查head單元是否具有遠程控制能力李丰。當您可能遇到不支持它的頭部單位時苦锨,此檢查非常重要。
要檢查此功能趴泌,請使用以下調(diào)用:
// 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
可以檢索與這些遠程控制模塊相關的當前數(shù)據(jù)舟舒。數(shù)據(jù)可以用來存儲設置之前的設置,保存用戶的首選項嗜憔,等等秃励。在檢查系統(tǒng)支持遠程控制的能力之后,我們可以實際檢索數(shù)據(jù)吉捶。下面是一個關于無線電模塊獲取數(shù)據(jù)的例子夺鲜。它也訂閱對無線電數(shù)據(jù)的更新,這將在本指南中稍后討論呐舔。
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
當然币励,設置這些模塊的能力是遠程控制的重點。設置數(shù)據(jù)與獲取數(shù)據(jù)類似珊拼。下面是一個設置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
遠程控制的另一個獨特之處是能夠?qū)⒛M的按鈕按到相關的模塊上,模仿硬件本身的按鈕澎现。
ButtonPress buttonPress = new ButtonPress();
buttonPress.setModuleType(ModuleType.RADIO);
buttonPress.setButtonName(ButtonName.EJECT);
buttonPress.setButtonPressMode(ButtonPressMode.SHORT);
proxy.sendRPCRequest(buttonPress);
SUBSCRIBING TO CHANGES 訂閱改變
還可以訂閱與支持模塊相關的數(shù)據(jù)的更改仅胞。要做到這一點,在獲取數(shù)據(jù)的過程中昔头,只需添加setSubscribe(Boolean)
若要取消訂閱饼问,請將該請求再次發(fā)送到False。設置訂閱的代碼示例在上面的GET示例中揭斧。
對訂閱的響應將以通知的形式出現(xiàn)。您可以通過提供給SdlProxyALM對象的IProxyListenerALM接收此通知;當接收到RPC時峻堰,將調(diào)用ononinteriorvehicle數(shù)據(jù)的方法讹开。
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
}
});