Мастер-ключ для домофона

Публикация 09.06.2017

Поговорим о ключах-таблетках для домофонов. Они бывают разных видов, но мы сегодня будем говорить о самом распространенном - работающим на 1 wire протоколе - DS-1990 (Dallas Touch Memory DS-90). Это ключи семейства iButton. Они очень просты по устройству, не имеют встроенной памяти, содержат только 64-битный id устройства.

iButton DS-1990

Простота устройства, дешевизна изготовления, надежность (нечему ломаться) привело к тому, что данные ключи стали использоваться повсеместно. Начиная от домофонов и заканчивая автомобильными сигнализациями.

Многие производители считывающих устройств поддерживают так называемые "мастер ключи" - т.е. универсальные коды ключей. Такие обычно выдают обслуживающим организациям для доступа в подъезд. Вот некоторые из них, что можно найти в открытом доступе:

01:BE:40:11:5A:36:00:E1
FF:FF:FF:FF:FF:FF
00:36:5A:11:40:BE
00:00:00:FE:D4:53
00:00:00:00:00:00
00:00:00:01:FF:FF
00:00:09:3С:E4:A9
00:00:FF:FF:FF:FF
00:00:AA:11:BE:00
00:00:0F:2E:B8:76
FF:FF:FF:FF:FF
36:5A:11:40:BE
01:FF:FF:FF:FF
36:5A:39:81:49
00:00:00:00:00
01:FF:FF:FF:FF
56:5A:11:40:BE
36:5A:39:81:49
00:00:00:00:00
0B:57:81:46:01
C9:8E

Соберем программатор для записи ключей. Нам потребуются болванки. В продаже часто встречаются DS1990 и TM2004. TM2004 - можно перезописывать, если не произведена финализация (подача 9 вольт). После финализации ключ сохраняется на вечно.
Программировать будем через Arduino Uno. Подключается ключ на 16 ногу и подтягивается к плюсу. Второй конец ключа на землю.

Программатор ключей iButtonПрограмматор ключей iButton

Скетч программы для Arduino записывает каждый бит отдельно:

include <OneWire.h>

#define pin 10

byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 };

OneWire  ds(pin);  // pin 10 is 1-Wire interface pin now

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte data[8];

  delay(1000); // 1 sec
  
  ds.reset();
  delay(50);
  ds.write(0x33); // "READ" command
  
  ds.read_bytes(data, 8);

  Serial.print("KEY ");
  for( i = 0; i < 8; i++) {
    Serial.print(data[i], HEX);
    if (i != 7) Serial.print(":");
  }

  // Check if FF:FF:FF:FF:FF:FF:FF:FF
  // If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
  if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
  {
    Serial.println("...nothing found!"); 
    return;
  }

  return; // remove when ready to programm

  // Check if read key is equal to the one to be programmed
  for (i = 0; i < 8; i++)
    if (data[i] != key_to_write[i])
      break;
    else
      if (i == 7)
      {
        Serial.println("...already programmed!");
        return;
      }

  Serial.println();
  Serial.print("Programming new key...");
  
  for (uint8_t i = 0; i < 8; i++)
  {
    ds.reset();
    data[0] = 0x3C; // "WRITE" command
    data[1] = i; // programming i-th byte
    data[2] = 0;
    data[3] = key_to_write[i];
    ds.write_bytes(data, 4);
    Serial.print(".");
  
    uint8_t crc = ds.read();
    
    if (OneWire::crc8(data, 4) != crc) {
        Serial.print("error!\r\n");
        return;
    }
    else
      Serial.print(".");
    
    send_programming_impulse();
  }
  
  Serial.println("done!");
}

void send_programming_impulse()
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH); 
  delay(60);
  digitalWrite(pin, LOW); 
  delay(5);
  digitalWrite(pin, HIGH); 
  delay(50); 
}

Если вы хотите просто считать код ключа, а не программировать его, то закомментируйте строку "remove when ready to programm". При подключении ключа в консоль вывалится считанный код.
Таким образом, можно создать дубликат любого ключа или сделать свой мастер-ключ, если вам известен его код.

Нео ключ доступа
* комментарии публикуются после модерации
30.12.2020 11:31
Какая именно поверхность ключа должна быть подключена к "+", а какая к "-"?