Hacking BISA bus otomatis untuk kontrol suara



Mobil modern bukan hanya alat transportasi, tetapi juga gadget canggih dengan fungsi multimedia dan sistem kontrol elektronik untuk unit dan banyak sensor. Banyak produsen mobil menawarkan fungsi asisten gerak, asisten parkir, pemantauan dan kontrol mobil dari telepon. Hal ini dimungkinkan karena penggunaan bus CAN di mobil tempat semua sistem terhubung: mesin, sistem rem, setir, multimedia, iklim, dll.

Mobil saya 2011 Skoda Octavia. Itu tidak menawarkan kemampuan kontrol dari telepon, jadi saya memutuskan untuk memperbaiki kelemahan ini, dan pada saat yang sama menambahkan fungsi kontrol suara. Sebagai pintu gerbang antara bus CAN dan telepon, saya menggunakan Raspberry Pi dengan pelindung CAN BUS dan router WiFi TP-Link. Protokol komunikasi agregat otomatis ditutup, dan Volkswagen membalas semua surat saya dengan dokumentasi protokol. Oleh karena itu, satu-satunya cara untuk mengetahui bagaimana perangkat berkomunikasi dalam mobil dan mempelajari cara mengelolanya adalah merekayasa balik protokol CAN bus VW.

Saya bertindak secara bertahap:

  1. Pengembangan pelindung CAN untuk Raspberry Pi
  2. Menginstal perangkat lunak untuk bekerja dengan bus CAN
  3. Koneksi ke bus CAN mobil
  4. Pengembangan sniffer dan studi tentang protokol bus CAN
  5. Pengembangan aplikasi telepon
  6. Kontrol suara dengan Homekit dan Siri

Di akhir jendela kontrol suara video.

Pengembangan pelindung CAN untuk Raspberry Pi


Di sini, skema perisai diambil oleh lnxpps.de/rpie , ada juga deskripsi kesimpulannya, 2 sirkuit mikro MCP2515 dan MCP2551 digunakan untuk berkomunikasi dengan CAN. 2 kabel CAN-High dan CAN-Low terhubung ke perisai. Di SprintLayout 6 saya menyebarkan papan, siapa pun bisa datang dengan CANBoardRPi.lay berguna (dalam foto judul prototipe perisai di papan tempat memotong roti).





Menginstal perangkat lunak untuk bekerja dengan bus CAN


Pada Raspbian yang berusia 2 tahun, saya perlu menambal bcm2708.c untuk menambahkan dukungan CAN (mungkin ini tidak diperlukan sekarang). Untuk bekerja dengan bus CAN, Anda perlu menginstal paket utilitas can-utils dari github.com/linux-can/can-utils , lalu muat modul dan naikkan antarmuka can:

# initialize
insmod spi-bcm2708
insmod can
insmod can-dev
insmod can-raw
insmod can-bcm
insmod mcp251x
# Maerklin Gleisbox (60112 and 60113) uses 250000
# loopback mode for testing
ip link set can0 type can bitrate 125000 loopback on
ifconfig can0 up

Kami memverifikasi bahwa antarmuka CAN telah naik dengan perintah ifconfig :



Anda dapat memverifikasi bahwa semuanya berfungsi dengan mengirim perintah dan menerimanya.

Di satu terminal kami mendengarkan:

root@raspberrypi ~ # candump any,0:0,#FFFFFFFF

Di terminal lain, kami mengirim:

root@raspberrypi ~ # cansend can0 123#deadbeef

Proses instalasi yang lebih rinci dijelaskan di sini lnxpps.de/rpie .

Koneksi ke bus CAN mobil


Setelah sedikit mempelajari dokumentasi terbuka pada bus CAN VW, saya menemukan bahwa saya menggunakan 2 bus.

Bus CAN dari unit daya , yang mentransmisikan data dengan kecepatan 500 kbit / s, menghubungkan semua unit kontrol yang melayani unit ini.

Misalnya, perangkat berikut dapat dihubungkan ke bus CAN unit daya:

  • unit kontrol mesin
  • Unit kontrol ABS
  • unit kontrol stabilisasi saja,
  • unit kontrol gearbox,
  • unit kontrol airbag,
  • instrument cluster.

Bus CAN dari sistem Comfort dan sistem perintah informasi , yang memungkinkan transfer data pada kecepatan 100 kbit / detik antara unit kontrol yang melayani sistem ini.

Misalnya,
perangkat berikut ini dapat dihubungkan ke bus CAN dari sistem Comfort dan sistem informasi <command :

  • Unit kontrol iklim atau sistem pendingin udara,
  • unit kontrol di pintu mobil,
  • Unit kontrol sistem kenyamanan,
  • unit kontrol dengan tampilan untuk radio dan sistem navigasi.

Memiliki akses ke yang pertama Anda dapat mengontrol lalu lintas (dalam versi saya di mekanika, Anda setidaknya dapat mengontrol cruise control), memiliki akses ke yang kedua Anda dapat mengontrol radio, iklim, penguncian pusat, power window, lampu, dll.

Kedua bus terhubung melalui gateway, yang terletak di area di bawah kemudi, konektor diagnostik OBD2 juga terhubung ke gateway, sayangnya lalu lintas dari kedua bus tidak dapat didengar melalui konektor OBD2, Anda hanya dapat mengirim perintah dan meminta status. Saya memutuskan bahwa saya hanya akan bekerja dengan bus Comfort, dan konektor di pintu pengemudi ternyata menjadi tempat paling nyaman untuk terhubung ke bus.



Sekarang saya dapat mendengarkan semua yang terjadi pada CAN CAN dan mengirim perintah.

Pengembangan sniffer dan studi tentang protokol bus CAN




Setelah saya mendapat akses untuk mendengarkan bus CAN, saya perlu mendekripsi siapa yang melintas ke siapa dan apa. Format paket CAN ditunjukkan pada gambar.



Semua utilitas dari can-utils yang ditetapkan dapat mengurai paket CAN dan hanya memberikan informasi yang bermanfaat, yaitu:

  • ID
  • Panjang data
  • Data

Data ditransmisikan dalam bentuk tidak terenkripsi, ini memfasilitasi studi protokol. Pada Raspberry Pi, saya menulis sebuah server kecil yang mengalihkan data dari candump ke TCP / IP untuk mengurai aliran data di komputer dan menunjukkannya dengan indah.

Untuk macOS, saya menulis aplikasi sederhana yang untuk setiap alamat perangkat menambahkan sel ke tablet dan di sel ini saya sudah bisa melihat data apa yang berubah.



Saya menekan tombol power window, saya menemukan sel di mana data berubah, lalu saya menentukan perintah mana yang sesuai dengan menekan, menekan ke atas, menahan ke atas, menahan ke bawah.

Anda dapat memverifikasi bahwa perintah itu berfungsi dengan mengirimkannya dari terminal, misalnya, perintah untuk mengangkat kaca kiri ke atas:

cansend can0 181#0200

Tim yang mengirimkan perangkat melalui CAN bus di mobil VAG (Skoda Octavia 2011), diterima dengan teknik terbalik:

// Front Left Glass Up
181#0200
// Front Left Glass Down
181#0800
// Front Right Glass Up
181#2000
// Front Right Glass Down
181#8000
// Back Left Glass Up
181#0002
// Back Left Glass Down
181#0008
// Back Right Glass Up
181#0020
// Back Right Glass Down
181#0080
// Central Lock Open
291#09AA020000
// Central Lock Close
291#0955040000
// Update Light status of central lock (   /          ,       ,    )
291#0900000000

Saya terlalu malas untuk mempelajari semua perangkat lain, jadi dalam daftar ini, hanya yang menarik bagi saya.

Pengembangan aplikasi telepon


Menggunakan perintah yang diterima, saya menulis aplikasi untuk iPhone yang membuka / menutup jendela dan mengontrol kunci pusat.

Pada Raspberry Pi I meluncurkan 2 server kecil, yang pertama mengirim data dari candump ke TCP / IP, yang kedua menerima perintah dari iPhone dan mengirimkannya dapat dikirim.


Sumber aplikasi kontrol otomatis untuk iOS
//
//  FirstViewController.m
//  Car Control
//
//  Created by Vitaliy Yurkin on 17.05.15.
//  Copyright (c) 2015 Vitaliy Yurkin. All rights reserved.
//

#import "FirstViewController.h"
#import "DataConnection.h"
#import "CommandConnection.h"

@interface FirstViewController () <DataConnectionDelegate>
@property (nonatomic, strong) DataConnection *dataConnection;
@property (nonatomic, strong) CommandConnection *commandConnection;
@property (weak, nonatomic) IBOutlet UILabel *Door_1;
@property (weak, nonatomic) IBOutlet UILabel *Door_2;
@property (weak, nonatomic) IBOutlet UILabel *Door_3;
@property (weak, nonatomic) IBOutlet UILabel *Door_4;
@property (weak, nonatomic) IBOutlet UIButton *CentralLock;
- (IBAction)lockUnlock:(UIButton *)sender;
@end

@implementation FirstViewController

- (void)viewDidLoad {
    self.dataConnection = [DataConnection new];
    self.dataConnection.delegate = self;
    [self.dataConnection connectToCanBus];
    
    self.commandConnection = [CommandConnection new];
    [self.commandConnection connectToCanBus];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)doorStatusChanged:(char)value {
    /*
     1 - Front Left Door
     2 - Front Right Door
     4 - Back Left Door
     8 - Back Right Door
     
     3 - Front Left&Right Door = 1 + 3
     5 - Front& Back left Door = 1 + 4
     */
    
    // Front Left Door
    if (value & 1) {
        self.Door_1.backgroundColor = [UIColor yellowColor];
        self.Door_1.text = @"";
        NSLog(@"1");
    }
    else {
        self.Door_1.backgroundColor = [UIColor lightGrayColor];
        self.Door_1.text = @"";
    }
    
    // Front Right Door
    if (value & 2) {
        self.Door_2.backgroundColor = [UIColor yellowColor];
        self.Door_2.text = @"";
        NSLog(@"2");
    }
    else {
        self.Door_2.backgroundColor = [UIColor lightGrayColor];
        self.Door_2.text = @"";
    }
    
    // Back Left Door
    if (value & 4) {
        self.Door_3.backgroundColor = [UIColor yellowColor];
        self.Door_3.text = @"";
        NSLog(@"4");
    }
    else {
        self.Door_3.backgroundColor = [UIColor lightGrayColor];
        self.Door_3.text = @"";
    }
    
    // Back Right Door
    if (value & 8) {
        self.Door_4.backgroundColor = [UIColor yellowColor];
        self.Door_4.text = @"";
        NSLog(@"8");
    }
    else {
        self.Door_4.backgroundColor = [UIColor lightGrayColor];
        self.Door_4.text = @"";
    }
}

BOOL firstStatusChange = YES;
BOOL lastStatus;

-(void) centralLockStatusChanged:(BOOL)status {
    // At first status changes set lastStatus variable
    if (firstStatusChange) {
        firstStatusChange = NO;
        // Invert status, to pass the next test
        lastStatus = !status;
    }
    
    // Change Lock image only if status changed
    if (!(lastStatus == status)) {
        // Check status
        if (status) {
            [self.CentralLock setBackgroundImage:[UIImage imageNamed:@"lock_close"] forState:UIControlStateNormal];
        }
        else {
            [self.CentralLock setBackgroundImage:[UIImage imageNamed:@"lock_open"] forState:UIControlStateNormal];
        }
        lastStatus = status;
    }
}


// Front Left Glass
- (IBAction)frontLeftUp:(UIButton *)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#0200"];
}
- (IBAction)frontLeftDown:(id)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#0800"];
}

// Front Right Glass
- (IBAction)frontRightUp:(UIButton *)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#2000"];
}
- (IBAction)frontRightDown:(id)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#8000"];
}

// Back Left Glass
- (IBAction)backLeftUp:(UIButton *)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#0002"];
}
- (IBAction)backLeftDown:(id)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#0008"];
}

// Back Right Glass
- (IBAction)backRightUp:(UIButton *)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#0020"];
}
- (IBAction)backtRightDown:(id)sender {
    [self.commandConnection sendMessage:@"cansend can0 181#0080"];
}

- (IBAction)lockUnlock:(UIButton *)sender {
    // If central lock closed
    if (lastStatus) {
        // Open
        [self.commandConnection sendMessage:@"cansend can0 291#09AA020000"];

        int64_t delayInSeconds = 1; // 1 sec
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self.commandConnection sendMessage:@"cansend can0 291#0900000000"];
        });
        
    }
    else {
        // Close
        [self.commandConnection sendMessage:@"cansend can0 291#0955040000"];
        int64_t delayInSeconds = 1; // 1 sec
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self.commandConnection sendMessage:@"cansend can0 291#0900000000"];
        });
    }
    
}
@end


Ada cara untuk tidak menulis aplikasi Anda untuk telepon, tetapi untuk memanfaatkan siap pakai dari dunia rumah pintar, Anda hanya perlu menginstal sistem otomatisasi Z-Way pada perintah Raspberry Pi :

wget -q -O - razberry.z-wave.me/install | sudo bash

Setelah itu, kami menambahkan perangkat CAN kami ke sistem otomatisasi Z-Way


dan kami mengontrol


pengatur jendela sebagai sakelar normal: Aplikasi seluler untuk Z-Way: ZWay Home Control dan ZWay Control.

Kontrol suara dengan Homekit dan Siri


Dalam salah satu artikel saya, saya menggambarkan proses pemasangan Homebridge pada Raspberry Pi untuk kontrol suara sistem otomatisasi rumah Z-Way . Setelah menginstal Homebridge, Anda akan dapat mengontrol suara dengan Siri. Saya yakin bahwa untuk Android ada banyak aplikasi yang memungkinkan suara mengirim permintaan HTTP untuk mengontrol Z-Way.

Saya lampirkan video ke kontrol suara regulator jendela.

Source: https://habr.com/ru/post/id399043/


All Articles