如何使用Java编程从116i上的BMW JSDK程序化地限制速度?

23
我正在尝试使用BMW Java SDK在新的BMW 116i Innovation Package上进行实验。像打开和关闭车灯、启动和停止发动机这样的基本功能都可以正常工作。现在我想要做的是编写一个carlet,将速度限制为驾驶员配置文件中最大的速度。驾驶员身份仍然会通过RFID读卡器进行识别。
我的问题是虽然我可以从转速表读取速度,但我真的无法限制速度。以下是我目前已经完成的内容:
public class SpeenControllingCarlet extends GenericCarlet {

    public void start(final VehicleModel model) throws CarletException {
        RfidReader rfidReader = (RfidReader) model
                .getDevice(Devices.DRIVER_RFID_READER);
        Rfid rfid = rfidReader.getRfid();
        DriverProfile driverProfile = model.getDriverProfileRegistry()
                .getDriverProfile(rfid.toString());
        if (driverProfile == null) {
            return;
        }
        final Double maxAllowedSpeed = Double.valueOf(driverProfile
                .getCustomAttribute("maxAllowedSpeed", "190"));
        Tachometer tachometer = (Tachometer) mode.getDevice(Devices.TACHOMETER);
        tachometer.addSpeedListener(new SpeedListener() {
            public void onSpeedChanged(SpeedChangedEvent speedChangedEvent) {
                if (speedChangedEvent.getCurrentSpeed() > maxAllowedSpeed)
                {
                    Horn horn = (Horn) mode.getDevice(Devices.HORN);
                    horn.beep(440, 2000);
                }

            }
        });
    }
}

如果司机开车超过了司机档案允许的速度,这段代码将会哔哔声两秒钟。

我的问题是-是否有可能实际限制速度(而不仅仅是发出傻傻的嘟嘟声)?


如果这不是愚人节玩笑,那么我的下一辆车必须支持JSDK! - Daniel Vassallo
1
我差点就想将这个标记为删除,因为我们离愚人节(互联网变得毫无用处的那一天)已经如此之近了。但是,根据http://java.sun.com/developer/technicalArticles/J2ME/TLA.html上的内容,显然确实有适用于宝马汽车的Java SDK。 - Will Hartung
@Will Hartung,BMW有一个Java SDK,但它只允许控制媒体和定位设备。 - Vladimir Dyuzhev
1
它只允许控制定位设备,比如方向盘? - Gabe
4个回答

9

如何在使用不完美的人类时减速?你刹车!BMW SDK也是如此:

Brake brake = (Brake) mode.getDevice(Devices.BRAKE);
brake.apply(Brake.TO_THE_METAL);

这可能有效 - 同时刹车和检查速度... 但我认为不应该这样做。有一个工厂设置的速度限制在270,因此必须有可重置/可重新编程的东西。 - lexicore
那是270公里每小时,对吧?或者宝马又要重新生产飞机了? :) - Vladimir Dyuzhev
2
为什么不呢?!这正是JVM一直在做的事情! - Vladimir Dyuzhev
当然是公里每小时(我在德国)。抱歉我太过于“公制主义”了。 - lexicore
公里也在这里!加拿大!;) - Vladimir Dyuzhev

7
Wrench wrench = (Wrench) Toolkit.getToolkit().get(Instruments.WRENCH);
wrench.hit(driver);

3
我认为(也希望)这很可能是不可能的,原因是如果汽车制造商允许像娱乐/导航系统中内置的JVM之类的“非核心”小工具干扰发动机或转向控制,他们将陷入很多法律麻烦。这比普通浏览器漏洞更严重的安全风险。Fly-by-wire汽车本身已经够可怕的了,没有最终用户/黑客可访问的部件。

1
第三方调整需要特殊许可(所谓的Bauartgenehmigung/Betriebserlaubnis)和额外的保险。宝马与此无关。 - lexicore
1
是的...“僵尸网络”可能会有全新的令人兴奋的含义... %) - Vladimir Dyuzhev
1
我认为这比传统的调整要更糟糕一些。我希望JVM甚至没有与能够制动或转向的设备物理连接。除了调整/黑客之外,如果有软件漏洞可能会造成可怕的麻烦。我相信工厂设置的速度限制(270)必须由电机内部电子设备执行,这是与JVM完全分离的系统。使用正确的设备可以调整这些电子设备,但这是一个单独的问题。 - Thilo

3

您的一个大问题是,当您获取发动机转速时没有考虑当前的齿轮比。您看到的速度大约为190,而转速表会返回在700到7000之间的某个值。您需要一个函数,它接受发动机转速、齿轮比和轮胎直径,并返回实际速度。

或者您可以从车速表或GPS获取汽车的速度。


2
API中有德语术语。转速表是用于速度的,发动机转速称为RevCounter。 - lexicore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接