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:- Pengembangan pelindung CAN untuk Raspberry Pi
- Menginstal perangkat lunak untuk bekerja dengan bus CAN
- Koneksi ke bus CAN mobil
- Pengembangan sniffer dan studi tentang protokol bus CAN
- Pengembangan aplikasi telepon
- 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:
insmod spi-bcm2708
insmod can
insmod can-dev
insmod can-raw
insmod can-bcm
insmod mcp251x
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 ~
Di terminal lain, kami mengirim:root@raspberrypi ~
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: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
Tim yang mengirimkan perangkat melalui CAN bus di mobil VAG (Skoda Octavia 2011), diterima dengan teknik terbalik:
181#0200
181#0800
181#2000
181#8000
181#0002
181#0008
181#0020
181#0080
291#09AA020000
291#0955040000
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
#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];
}
- (void)doorStatusChanged:(char)value {
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 = @"";
}
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 = @"";
}
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 = @"";
}
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 {
if (firstStatusChange) {
firstStatusChange = NO;
lastStatus = !status;
}
if (!(lastStatus == status)) {
if (status) {
[self.CentralLock setBackgroundImage:[UIImage imageNamed:@"lock_close"] forState:UIControlStateNormal];
}
else {
[self.CentralLock setBackgroundImage:[UIImage imageNamed:@"lock_open"] forState:UIControlStateNormal];
}
lastStatus = status;
}
}
- (IBAction)frontLeftUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0200"];
}
- (IBAction)frontLeftDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0800"];
}
- (IBAction)frontRightUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#2000"];
}
- (IBAction)frontRightDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#8000"];
}
- (IBAction)backLeftUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0002"];
}
- (IBAction)backLeftDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0008"];
}
- (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 (lastStatus) {
[self.commandConnection sendMessage:@"cansend can0 291#09AA020000"];
int64_t delayInSeconds = 1;
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 {
[self.commandConnection sendMessage:@"cansend can0 291#0955040000"];
int64_t delayInSeconds = 1;
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.