Android_SmartDeviceLink_Remote C

作者: 勇敢写信 | 来源:发表于2018-03-23 16:10 被阅读0次

    我的博客

    Remote Control远程控制

    远程控制提供了一个框架,允许应用程序控制车辆内的某些安全模块

    注意:并不是所有的车辆都有这种功能。即使它们支持远程控制,您也可能需要请求汽车制造商的许可权限才能使用它。
    考虑一下的场景:

    • 一个无线电应用程序想要调用车载无线电调谐器。它需要来选择无线电波段(AM/FM/XM/HD/DAB),调整无线电频率或改变电台,以及获得一般无线电信息等功能作决策。
    • 一个气候控制应用需要打开空调,控制空气流通模式,改变风扇转速,设定所需的舱内温度。
    • 用户概要文件应用程序希望记住用户最喜欢的设置,并在用户进入相同/另一个车辆时自动应用它。
      目前,远程控制功能支持这些模块:


      image.png

    下表列出了每个控制模块中的控制项。


    image.png
    image.png

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


    image.png
    image.png

    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
             }
        });
    

    相关文章

      网友评论

        本文标题:Android_SmartDeviceLink_Remote C

        本文链接:https://www.haomeiwen.com/subject/pkexcftx.html