2010-04-01 17 views
20

Sto sperimentando con il BMW Java SDK sul nuovo BMW 116i Innovation Package. Cose fondamentali come accendere e spegnere le luci, avviare e fermare il motore funzionano bene. Quello che sto cercando di fare ora è scrivere un carlet che limiti la velocità al massimo configurato nel profilo del driver. L'identità del conducente verrà rilevata come al solito tramite il lettore RFID.Come limitare la velocità con BMW JSDK su 116i a livello di codice da Java?

Il mio problema è che sebbene io possa leggere la velocità dal contagiri, non posso veramente limitare la velocità. Ecco quello che ho a lavorare finora:

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

      } 
     }); 
    } 
} 

Questo sarà solo un segnale acustico per due secondi, se il conducente va più veloce rispetto al profilo driver consente.

La mia domanda è - esiste la possibilità di limitare effettivamente il limite (non solo un beep sciocco)?

+0

Se questo non è uno scherzo del pesce d'aprile, la mia prossima auto deve essere abilitata per JSDK! –

+1

Ho quasi contrassegnato questo per la cancellazione, essendo come siamo così vicini al 1 ° aprile (il giorno Internet diventa inutile). Ma, secondo http://java.sun.com/developer/technicalArticles/J2ME/TLA.html, a quanto pare in realtà esiste un SDK Java per le BMW. –

+0

Certamente * è * uno scherzo: D –

risposta

8

Come rallenti usando l'umano imperfetto? Freni! Stessa cosa con BMW SDK:

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

Questo può funzionare - frenare e controllare la velocità allo stesso tempo ... Tuttavia non penso che sia come dovrebbe essere fatto. C'è un settaggio di fabbrica con limite di velocità su 270, quindi deve esserci qualcosa di ripristinabile/riprogrammabile. – lexicore

+0

Questo è 270 km/h, giusto? O BMW sta andando a produrre aerei di nuovo? :) –

+0

Non è possibile frenare utilizzando la JVM, giusto? – Thilo

3

Penso (e spero) che questo è molto probabilmente non è possibile, e le ragioni sono che le case automobilistiche sarebbero in un sacco di problemi legali se hanno permesso "non-core" gadget come una JVM integrata nel sistema di intrattenimento/navigazione per interferire con i comandi del motore o dello sterzo. Questo è un rischio di sicurezza molto peggiore rispetto al tuo exploit medio del browser.

Le macchine Fly-by-wire sono abbastanza spaventose in quanto non sono disponibili parti accessibili per utenti finali/hacker.

+1

La messa a punto di terze parti richiede un'indennità speciale (il cosiddetto Bauartgenehmigung/Betriebserlaubnis) e un'assicurazione aggiuntiva. BMW non ha nulla a che fare con questo. – lexicore

+1

Sì ... "botnet" potrebbe avere il nuovo eccitante significato ...%) –

+1

Penso che questo sia un po 'più (peggio) della sintonizzazione tradizionale. Spero che la JVM non sia nemmeno fisicamente collegata a dispositivi che consentano la frenata o la guida.Tuning/hacking a parte, se lo fosse, un bug del software potrebbe causare problemi orribili. Credo che il limite di velocità impostato in fabbrica (270) debba essere applicato dall'elettronica interna del motore, un sistema completamente separato da questa JVM. Quella elettronica può essere sintonizzabile con la marcia giusta, ma questo è un problema separato. – Thilo

3

Il tuo grosso problema è che non stai prendendo in considerazione il rapporto di trasmissione attuale quando raggiungi il regime del motore. Stai guardando una velocità pari a 190, mentre il tach tornerà tra 700 e 7000. Hai bisogno di una funzione che prende i giri motore, il rapporto di trasmissione e il diametro del pneumatico, e restituisce la velocità effettiva.

Oppure si potrebbe ottenere la velocità dell'auto dal tachimetro o dal GPS.

+2

Hanno terminologia tedesca nell'API. Il tachimetro è per la velocità, il tasso di rotazione del motore è chiamato RevCounter. – lexicore

6
Wrench wrench = (Wrench) Toolkit.getToolkit().get(Instruments.WRENCH); 
wrench.hit(driver); 
Problemi correlati