Звездочка в коде ключа
Звездочка, появляющаяся на экране дубликатора после прочтения кода, означает, что контрольная сумма (CRC) не совпадает.
Ключ DS1990A и другие ключи Dallas имеют контрольное число для проверки прочитанного кода, это самый первый байт.
Он рассчитывается по специальной формуле из остальных 7 байт.
Если записать такой код на заготовку, то домофоны не будут реагировать на такой ключ, так как данное несовпадение служит сигналом, что при чтении кода ключа произошла ошибка (например, был плохой контакт в лузе) и какой-то байт прочитан неверно.
Дубликатор считывает ключ и отображает несовпадение в виде символа звездочки или сообщения BAD CRC.
Тем самым прибор дает понять, что контрольная сумма байт данного кода не соответствует той, что должна быть.
В большинстве случаев это признак того, что ключ просто прочитан с ошибкой. Выйдите в режим чтения и прочитайте ключ ещё раз.
В программе iKeyBase есть галка «исправлять СRC» — в данном случае контрольная сумма, считанная из ключа, будет пересчитана и исправлена.
Однако, это не гарантирует, что ключ начнет работать, т.к. это всего лишь контрольная сумма остальных байт.
Исправится только CRC, программа пересчитает его и заменит, после чего ключ будет читаться панелью, но если ошибка была не в самой контрольной сумме, а в коде ключа, то дверь он открывать всё равно не будет — код ключа окажется незнакомым домофону.
Контрольная сумма нужна только для проверки чтения и в большинстве случаев не позволяет восстановить утраченное правильное значение в самом коде.
Форум РадиоКот • Просмотр темы — CRC8 OF DALLAS
Сообщения без ответов | Активные темы
ПРЯМО СЕЙЧАС: |
Автор | Сообщение |
---|---|
|
Заголовок сообщения: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 10:18:30 |
Открыл глаза
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
Доброго ремени суток! если есть у Вас опыт расчета CRC8 DALLAS,подскажите,плиз,как это делается правильно????.не примеры си или асма,а как говорится на пальцах)))мне хочется понять логику,а код я и сам в состоянии написать,понимая суть процесса. |
Вернуться наверх |
Профиль
|
Реклама | |
|
|
Jack_A
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 11:13:17 |
||
Карма: 62 Рейтинг сообщения: 0
|
Не совсем прямой ответ, но все же… Я в своих проектах сторонник табличного вычисления CRC, если памяти ROM хватает, зато вычисление быстрое. Только использую CRC16 , CRC8 — отстой, IMHO, не слишком надежен. |
||
Вернуться наверх | |||
Реклама | |
|
|
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 11:13:33 |
||
Карма: 46 Рейтинг сообщения: 0
|
Fnnfго что вы наплодите сто тем — лучше не будет. Если на ваш позавчирашний пост не ответили, подумайте, может вы написали не достаточно внятно или вообще муйню? С другой стороны можете взять мобильник и попросить танка загрузить вам знания. Из этой реальности вам загрузить знания не удастся. anton234ff писал(а): 1.почему указанный полином в даташите и спецификации 100000111. А где вы в спецификации нашли такие цифры??????????? anton234ff писал(а): а во всех примерах используется 0х8С(10001100)? Вообще-то не 8с. а X^8_X^5+X^4+X^0. Схема приведённая в даташите реально отражает процесс вычисления CRC. Код: crc <= (crc(0) xor datain) & crc (7 downto 5) & (crc(4) xor crc(0) xor datain) & (crc(3) xor crc(0) xor datain) & crc(2 downto 1); Что вам еще не понятно? Вот когда-то сделал екселевскую табличку для расчета CRC — заполнять зеленые поля. Мммммммм. может еще можно поиском попользоваться… А, кажется понял. Вы, наверное не в курсе, что существуют разные полиномы для расчета CRC! Последний раз редактировалось uldemir Вс ноя 18, 2012 21:24:35, всего редактировалось 1 раз. |
||
Вернуться наверх | |||
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 11:42:22 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
ваш сарказм,дорогой товарищ,мягко говоря,неуместен.есть сферы,в которых и я могу поумничать. |
Вернуться наверх | |
Реклама | |
|
|
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 11:57:57 |
||
Карма: 46 Рейтинг сообщения: 0
|
вы не ответили на первый вопрос: anton234ff писал(а): 1.почему указанный полином в даташите и спецификации 100000111 Покажите подробно где вы его увидели. p.s. впрочем, как говорил раньше, сделать так чтобы вы поняли логику я не могу. Могу только порекомендовать самостоятельно почитать умную книжку: http://rsdn.ru/article/files/classes/Se … cguide.pdf |
||
Вернуться наверх | |||
Реклама | |
|
|
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 12:12:35 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
по поводу указанного числа-наверное уже по запарке его вбил,хотя имел в виду то,что указал сегодня чуть ранее. |
Вернуться наверх | |
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 12:34:59 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
эту книжку я читал.как вообще считается контрольная сумма я вкурил.если указанная степень полинома равна 8,количество дополняющих нулей соответственно 8,и срс 8 бит.но 0х8с это никак не восьмая степень. |
Вернуться наверх | |
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 12:38:41 |
||
Карма: 46 Рейтинг сообщения: 0
|
18 — это маска по которой надо инвертировать биты, вроде, после сдвига. 8С — до сдвига, но так как старший бит уходит… то, похоже оптимальнее 18. |
||
Вернуться наверх | |||
urry
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 12:47:48 |
||
Карма: 22 Рейтинг сообщения: 0
|
|||
Вернуться наверх | |||
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 12:59:58 |
||
Карма: 46 Рейтинг сообщения: 0
|
А ну да, в википедии он назван как реверсивный. 01234567 8 8 76543210 откуда 18? А 18 это 8С до сдвига вправо. |
||
Вернуться наверх | |||
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 13:16:28 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
так,давайте подведем промежуточный итог.по алгоритму CRC-8 DALLAS контрольная сумма будет вычисляться все таки таким образом??? 0000111100000000 | 100110001 |
Вернуться наверх | |
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 13:36:39 |
||
Карма: 46 Рейтинг сообщения: 0
|
вы бы отступы сделали. а то не вижу логики. |
||
Вернуться наверх | |||
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 13:56:30 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
да,я их делал.при отправке сообщения что-то с форматированием произошло))) по моим представлениям примерно так |
Вернуться наверх | |
polyname
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 14:13:29 |
Карма: 1 Рейтинг сообщения: 0
|
вот проверенный код: Код: // CRC8 Dallas (021cb801000000a2=0x00) |
Вернуться наверх | |
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 14:35:13 |
||
Карма: 46 Рейтинг сообщения: 0
|
У меня получилось так-же. Код: 0000111100000000 | 100110001 |
||
Вернуться наверх | |||
shads
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 14:52:26 |
||
Карма: 8 Рейтинг сообщения: 0
|
anton234ff писал(а): если есть у Вас опыт расчета CRC8 DALLAS,подскажите,плиз, как говорится на пальцах)))мне хочется понять логику процесса. Вот тут в свое время GUDD-HEAD на пальцах объяснял мне….. И я все понял….. Потом написал свои процедуры и на асме и на С….. |
||
Вернуться наверх | |||
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 14:57:18 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
угу.есть калькулятор для расчета срс SCB-CALC.в поле результата третья ячейка выдает значение в формате СРС8.сколько ни бился с ручным расчетом,ни разу мои результаты не совпали с ответом данного калькулятора.даже в нашем случае на 00001111 ответ выдает 11101011. ((((((( |
Вернуться наверх | |
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 15:29:42 |
||
Карма: 46 Рейтинг сообщения: 0
|
не знаю. с моим калькулятором сходится. для 00001111 CRC 74 (00101110) |
||
Вернуться наверх | |||
anton234ff
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 15:33:12 |
Зарегистрирован: Ср янв 04, 2012 12:40:34 Рейтинг сообщения: 0
|
а как он называется?хочу найти и скачать |
Вернуться наверх | |
uldemir
|
Заголовок сообщения: Re: CRC8 OF DALLAS Добавлено: Вс ноя 18, 2012 16:04:27 |
||
Карма: 46 Рейтинг сообщения: 0
|
в моём первом сообщении этой темы после слов: «Вот когда-то сделал екселевскую табличку для расчета CRC — заполнять зеленые поля.» Ексель не нужен — оно работает под гугловским спредшитом. Ну и конечно считает только далласовский полином. Сделал когда сам разбирался с этими CRC. |
||
Вернуться наверх | |||
Кто сейчас на форуме |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2 |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |
Во время передачи информации от одного устройства к другому могут возникать различные ошибки (помехи в радио-эфире, электромагнитные наводки в проводах), приводящие к повреждению данных. Достаточно повредить один бит, и число может сильно измениться! Например передавали число 123
, которое выглядит как 0b01111011
, и неправильно передали один бит. Приёмник получил число 0b01011011
, что уже является числом 91
! Если речь идёт о дистанционном управлении каким-то устройством, то даже один “битый” бит в посылке может привести к серьёзной аварии. Как приёмнику понять, что принятые данные повреждены?
Контрольная сумма
Самый простой вариант – контрольная сумма. Перед отправкой данных передатчик суммирует все байты и отправляет их например последними в посылке. Благодаря такой штуке как переполнение переменной, даже в один байт можно бесконечно суммировать данные и получить в итоге конкретное число, олицетворяющее все передаваемые данные. Например, передаём набор байтов 201, 125, 47, 94, 10, 185
. Их суммой будет число 662
, если брать ячейку int
, или 150
, если это byte
. Осталось отправить контрольную сумму последним байтом (или двумя, если передаём int
число)! Приёмник получает посылку, в свою очередь суммирует все байты кроме последнего (или двух последних, если контрольная сумма 16-битная), а затем сравнивает это значение с полученной контрольной суммой. Если отличается хоть на 1 – данные повреждены. Причём повреждёнными при передаче могут быть как сами данные, так и контрольная сумма: в любом случае они не совпадут, а это означает, что передача произошла с ошибкой. Давайте рассмотрим пример “передачи и приёма” структуры, где будет использоваться конструкция, позволяющая разбивать любые данные на байтовый поток. Три таких конструкции мы рассмотрели в уроке про указатели и ссылки. Структуру используем для удобства упаковки и использования данных. Универсальная для любого типа данных функция расчёта хеш-суммы может выглядеть так:
byte getHash(byte* data, int length) { byte hash = 0; int i = 0; while (length--) { hash += *(data + i); i++; } return hash; }
И возвращать байт суммы. Создадим и заполним структуру данными и прогоним через эту функцию. В последний байт структуры запишем контрольную сумму:
// структура данных посылки struct MyData { byte channel; int val_i; float val_f; byte hash; // байт контрольной суммы }; void setup() { Serial.begin(9600); // создаём и заполняем дату MyData data; data.channel = 16; data.val_i = 12345; data.val_f = 3.1415; data.hash = 0; // расчёт суммы byte thisHash = getHash((byte*)&data, sizeof(data)); // пакуем в посылку data.hash = thisHash; // выведем для отладки Serial.println(thisHash); // выдаст 102 }
Теперь можно передать структуру приёмнику! Пример “синтетический”, так как кому и каким способом передавать данные мы не рассматриваем. Хотя, можно отправить по Serial, например с одной Ардуины на другую, как в уроке по парсингу Serial:
Serial.write((byte*)&data, sizeof(data));
Далее на приёмнике примем данные:
// структура данных посылки struct MyData { byte channel; int val_i; float val_f; byte hash; // байт контрольной суммы }; MyData rxData; void setup() { Serial.begin(9600); } void loop() { if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) { // приняли данные } }
Теперь нужно убедиться в том, что данные верны. Для этого прогоним их через ту же суммирующую функцию, но без учёта последнего байта, так как он сам является суммой:
byte thisHash = getHash((byte*)&rxData, sizeof(rxData) - 1);
Если значение совпадёт с переданным rxData.hash
– данные верны! Дополним предыдущий код:
void loop() { if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) { // читаем дату byte thisHash = getHash((byte*)&rxData, sizeof(rxData) - 1); // считаем сумму if (thisHash == rxData.hash) { // данные верны } else { // данные повреждены } } }
И по условию можем выполнять какие-то действия, например применить полученные данные к устройству или проигнорировать их. Достоинства контрольной суммы:
- Быстрое и простое вычисление на любой платформе
- Возможность сделать 8 и 16 бит без особых вмешательств в код (это ваше домашнее задание)
Недостатки контрольной суммы:
- Низкая надёжность по сравнению с другими алгоритмами
Низкая надёжность заключается в том, что контрольная сумма не учитывает порядок байтов в посылке, то есть не является уникальным “отпечатком” всех данных. Например, данные повредились так, что из вот такого пакета
data.channel = 16; data.val_i = 12345; data.val_f = 3.1415;
Превратились в такой:
data.channel = 15; data.val_i = 12346; data.val_f = 3.1415;
Но контрольная сумма всё равно будет 102
! Также контрольная сумма фактически игнорирует нули, то есть любой набор данных со всеми нулями и условно одной единичкой будет обрабатываться одинаково (например 0, 0, 0, 1, 0, 0
и 0, 1, 0, 0, 0, 0
), что также снижает надёжность. Поэтому рассмотрим более хитрый алгоритм, который называется CRC.
CRC
CRC (cyclic redundancy code) – циклический избыточный код. Алгоритм тоже выдаёт некое “число” при прохождении через него потока байтов, но учитывает все предыдущие данные при расчёте. Как работает данный алгоритм мы рассматривать не будем, об этом можно почитать на Википедии или здесь. Рассмотрим реализацию CRC 8 бит по стандарту Dallas, он используется в датчиках этой фирмы (например DS18b20 и домофонные ключи iButton). Данная реализация должна работать на всех платформах, так как это чисто C++ без привязки к архитектуре (компилятор сам разберётся):
byte crc8(byte *buffer, byte size) { byte crc = 0; for (byte i = 0; i < size; i++) { byte data = buffer[i]; for (int j = 8; j > 0; j--) { crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1); data >>= 1; } } return crc; }
Данная функция применяется точно так же, как предыдущая getHash()
, просто “скармливаем” ей данные в байтовом представлении и всё! Но есть пара моментов:
- При расчёте CRC перед отправкой нужно исключить байт самого CRC (последний), даже если он нулевой. То есть в примерах выше:
byte thisHash = crc8((byte*)&data, sizeof(data) - 1);
- При расчёте CRC на стороне приёмника можно прогнать все данные полностью, вместе с байтом CRC. В этом случае функция вернёт
0
, если данные верны! Это очень удобно использовать.
Финальный пример. Передатчик:
// структура данных посылки struct MyData { byte channel; int val_i; float val_f; byte crc; // байт crc }; void setup() { Serial.begin(9600); // создаём и заполняем дату MyData data; data.channel = 16; data.val_i = 12345; data.val_f = 3.1415; // расчёт CRC (без последнего байта) byte crc = crc8((byte*)&data, sizeof(data) - 1); // пакуем в посылку data.crc = crc; } void loop() { // отправляем Serial.write((byte*)&data, sizeof(data)); delay(1000); } byte crc8(byte *buffer, byte size) { byte crc = 0; for (byte i = 0; i < size; i++) { byte data = buffer[i]; for (int j = 8; j > 0; j--) { crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1); data >>= 1; } } return crc; }
Приёмник:
// структура данных посылки struct MyData { byte channel; int val_i; float val_f; byte crc; // байт crc }; MyData rxData; void setup() { Serial.begin(9600); } void loop() { if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) { // читаем дату byte crc = crc8((byte*)&rxData, sizeof(rxData)); // считаем crc посылки полностью if (crc == 0) { // данные верны } else { // данные повреждены } } } byte crc8(byte *buffer, byte size) { byte crc = 0; for (byte i = 0; i < size; i++) { byte data = buffer[i]; for (int j = 8; j > 0; j--) { crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1); data >>= 1; } } return crc; }
Также коллега поделился реализацией данного алгоритма на ассемблере для AVR, она работает чуть быстрее и весит чуть легче, что может быть критично например для ATtiny:
byte crc8_asm(byte *buffer, byte size) { byte crc = 0; for (byte i = 0; i < size; i++) { byte data = buffer[i]; // резкий алгоритм для AVR uint8_t counter; uint8_t buffer; asm volatile ( "EOR %[crc_out], %[data_in] \n\t" "LDI %[counter], 8 \n\t" "LDI %[buffer], 0x8C \n\t" "_loop_start_%=: \n\t" "LSR %[crc_out] \n\t" "BRCC _loop_end_%= \n\t" "EOR %[crc_out], %[buffer] \n\t" "_loop_end_%=: \n\t" "DEC %[counter] \n\t" "BRNE _loop_start_%=" : [crc_out]"=r" (crc), [counter]"=d" (counter), [buffer]"=d" (buffer) : [crc_in]"0" (crc), [data_in]"r" (data) ); } return crc; }
Функция используется точно так же, как предыдущая.
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
Некоторые пользователи при загрузке (или установке) файлов с каких-либо источников могут столкнуться с ошибкой CRC, проявляющей себя сообщением «Ошибка в данных (CRC)». Данная проблема обычно возникает в ситуации, когда система фиксирует несовпадение контрольных данных загружаемого файла, вследствие чего возникает сообщение об ошибке в данных CRC. В этой статье я расскажу, что это за ошибка, при каких условиях она возникает, а также поясню как её исправить.
- Что такое CRC
- Особенности возникновения ошибки
- Ошибка в данных CRC — проблемы с жёстким диском
- Как исправить ошибку CRC — альтернативные варианты
- Заключение
Что такое CRC
Прежде чем начать описывать, что делать в ситуации, когда появляется ошибка CRC, следует пояснить, что такое «CRC».
Как известно, CRC (Cycle Redundancy Check – в переводе «циклическая избыточная проверка») являет собой алгоритм создания и проверки «контрольной суммы файла». Последняя используется в слежении за целостностью передаваемых данных с целью профилактики их повреждения или потери.
Данный алгоритм на основе циклического кода вычисляет контрольную сумму файла и добавляет её к телу самого файла. При загрузке (копировании) данного файла система, обладая алгоритмом вычисления контрольной суммы, проверяет правильность полученных данных, и при возникновении нестыковок выдаёт сообщение об ошибке CRC (data error — cycle redundancy check ).
Алгоритм CRC был изобретён в далёком 1961 году, пережил несколько качественных улучшений, и ныне является универсальным средством для проверки целостности получаемых данных.
Особенности возникновения ошибки
Что же до причин возникновения данной дисфункции, то конкретные причины ошибки CRC могут быть следующими:
- Потеря или повреждение какого-либо из пакетов сетевых данных при их передаче;
- Потеря или повреждение данных на жёстком диске (к примеру, из-за плохих секторов);
- Физическое повреждение оптического диска с информацией (CD, DVD и др.);
- Нарушение целостности системного реестра;
- Случайный сбой при инсталляции программы;
- Неверная конфигурация файлов и так далее.
Для отображения кода CRC существует такая программа как HashTab, которая, после своей установки, в свойствах самого файла (кликаем правой клавишей мыши на файле, затем выбираем «Свойства) отображает значения контрольных сумм данного файла.
Ошибка в данных CRC — проблемы с жёстким диском
Итак, как исправить ошибку CRC? Поскольку она регулярно случается из-за проблем к доступу жёсткого диска, то рекомендую выполнить следующее:
Действие 1. Восстановите потерянные данные на жёстком диске. Если данная проблема возникла при попытке получения доступа к какому-либо файлу на жёстком диске, тогда стоит использовать различные программы для восстановления потерянных данных. В частности, можно попробовать в деле такие программные продукты как Power Data Recovery или BadCopy Pro, предназначенные именно для рассматриваемых мной задач.
К примеру, чтобы воспользоваться Power Data Recovery, необходимо скачать и установить приложение, в меню выбрать «Damaged Partition Recovery», и осуществить полное сканирование (Full Scan). Если потерянные данные удастся восстановить, тогда, первым делом, нужно будет скопировать их на надёжный и безопасный носитель.
Действие 2. Альтернативным вариантом восстановления доступа к данным на винчестере является использование системной утилиты проверки диска.
- Зайдите в Проводник, кликните правой клавишей мыши на проблемном диске (например, С:), в появившемся меню выберите «Свойства».
- Перейдите на вкладку «Сервис», кликните на «Выполнить проверку», поставьте галочки напротив двух опций проверки диска, нажмите на «Ок», а затем перезагрузите компьютер.
- После перезагрузки система автоматически задействует проверку целостности данных на жёстком диске, и попытается восстановить повреждённые сектора (может занять какое-то время).
Проверьте диск на наличие ошибок
Действие 3. Также можно запустить командную строку от имени администратора (нажать на кнопку «Пуск», в строке поиска написать cmd (не нажимая на ввод), кликнуть на появившийся вверху однотипный результат правой клавишей мыши, и выбрать «Запуск от имени администратора). В командной строке необходимо написать:
chkdsk c: /r /f — (вместо «с:» впишите имя другого проблемного диска при необходимости) затем нажать на ввод, и дождаться окончания проверки.
Как исправить ошибку CRC — альтернативные варианты
Кроме проблем с жёстким диском, ошибка CRC может возникать и по другим причинам. Потому чтобы пофиксить ошибку CRC сделайте следующее:
- Скачайте торрент-файл из другого источника. Если вы скачали какой-либо файл с торрентов и получили ошибку CRC, тогда запустите торрент-клиент, удалите закачку с ошибкой, а потом и сами некорректно загруженные файлы на жёстком диске. Попробуйте поискать альтернативную закачку той же программы на торрент-трекере, возможно проблемная закачка была создана не совсем корректно, или файлы в ней были повреждены. В некоторых ситуациях не будет лишним и переустановить торрент-клиент, причина ошибки CRC может быть и в нём;
- Если вы получили данную ошибку при попытке считывания данных с СД (ДВД) диска, тогда, для начала, необходимо аккуратно протереть поверхность диска мягкой тканью с целью удаления пыли или грязи на его поверхности, а затем попробовать считать его содержимое с помощью уже упомянутой программы BadCopyPro;
- Если данная ошибка возникла при установке какой-либо игры, будет проще загрузить её образ ещё раз (или сами файлы программы) из другого источника с помощью проверенных программ уровня Download Master, возможно, это поможет избавиться от ошибки CRC.
Заключение
Если у вас возникла ошибка в данных CRC, то, прежде всего, определитесь с условиями, при которых возникла данная ошибка. Наиболее часто она возникает при попытке закачки и установки образов дисков (или самых программ) из сети. Эффективным средством в этом случае будет использование альтернативных ресурсов для закачки данных файлов, что, в большинстве случаев, помогает эффективно решить указанную проблему. Если же вы имеете дело с дисфункцией в работе жёсткого диска, тогда необходимо использовать программы уровня Power Data Recovery или BadCopyPro, способных помочь в восстановлении доступа к нужным вам файлам.
Flipper Zero — проект карманного мультитула для хакеров в формфакторе тамагочи, который мы разрабатываем. Предыдущие посты [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14]
iButton — это общее название для формата электронного ключа в форм-факторе металлической “таблетки”. Еще его называют Dallas Touch Memory. Часто его ошибочно называют “магнитным” ключом, но это неправильно, ничего магнитного в нем нет. Внутри iButton полноценный микрочип, работающий по цифровому протоколу.
В статье разберем формат ключей iButton от физического устройства до протоколов, а также трюки, которые можно с ним делать при помощи Flipper Zero.
Что такое iButton
Название iButton — это продукт фирмы Dallas Semiconductor, в 1991 году выпустившей на рынок ключ под торговой маркой Touch Memory, потом замененной на iButton.
Схематическое устройство ключа iButton: в центре корпуса контакт плюс, потом пластиковая изоляция, и внешняя часть корпуса это минус
Обычно под словом iButton принято понимать именно физический формфактор ключа и считывателя — круглая таблетка с двумя контактами. Существуют разные вариации оправ самой таблетки. Кроме привычного пластикового держателя с отверстием бывают варианты в виде колец, кулонов и т.д.
Внутреннее устройство iButton: внутри металлической оболочки находится микрочип
Считыватель
При поднесении ключа к считывателю, контакты соприкасаются, и на ключ подается питание. Далее осуществляется передача ID ключа. Иногда ключ не считывается сразу, потому что внешние контуры ключа и считывателя не соприкоснулись. В этом случае нужно упереть ключ в одну из стенок считывателя.
Касание контактов iButton ключа с домофонным считывателем
В формфакторе «таблетки» iButton бывают не только простые ключи с ID, но и климатические датчики, устройства для хранения криптографических ключей со своей батарейкой, часами и прочими наворотами. Эти устройства выглядят так же как ключи, но ими не являются.
Как устроен iButton во Flipper Zero
Разработка контактной площадки iButton во Flipper Zero — это огромная боль. Дело в том, что не существует готовых контактных площадок для одновременного чтения и эмуляции. Если бы мы просто взяли существующие модули, из флиппера бы торчала огромная металлическая кнопка, и рядом такая же огромная площадка для считывания. Это бы многократно увеличило размер устройства.
Нам пришлось изобретать собственную конструкцию контактной площадки с нуля, которую можно было бы реализовать на печатной плате так, чтобы итоговый размер устройства не увеличился. Было решено использовать 3 подпружиненных пого-пина. В итоге было протестировано около 20 разных конструкций.
Прототипы конструкций контактной площадки iButton во Flipper Zero, которые мы печатали на 3D-принтере в процессе разработки
Самая большая сложность конструкции контактной площадки в эмуляции, когда флиппер сам выступает ключом и его нужно прикладывать к домофону. Каждый производитель изобретает собственную конструкцию считывателя, из-за этого постоянно находятся домофоны в которых конструкция не работает: пины просто не дотягиваются либо до центрального контакта Data+, либо до бокового контакта GND.
Левая часть контактной площадки используется для считывания и записи ключей, правая для эмуляции. Центральный пин GND общий для обоих режимов.
Финальная конструкция получилась компромиссной: 100% ключей считывается успешно, примерно 80% считывателей успешно работают с эмуляцией. В оставшихся 20% считывателей приходится корячиться, чтобы контакт достал до нужных стенок. Для этих редких случаев можно использовать внешние контакты GPIO, на которые выведены контакты ibutton: подключиться макетными проводами и ткнуть их в считыватель.
Режим считывателя
В режиме считывателя флиппер ожидает поднесения ключа, при этом готов прожевать сразу три типа ключей: Dallas, Cyfral, Metakom. Флиппер сам определит тип ключа при чтении. Название протокола ключа отобразится на экране над ID номером.
Чтение ключа ibutton формата Dallas. Прочитанный ключ сохраняется на SD-карту.
Для считывания ключа необходимо зайти в меню iButton —> Read и приложить читаемый ключ к контактной площадке. Считанный ключ можно сразу эмулировать, записать на болванку, либо сохранить на SD-карту. Хоть контактная площадка находится на задней стороне от экрана, можно быстро наловчиться читать ключи не разворачивая флиппер, просто на ощупь.
В режиме чтения iButton используются два правых контакта Flipper Zero
Режим эмуляции iButton
В режиме эмуляции ключа, Флиппер сам выступает ключом и программно эмулирует iButton из памяти. ID ключа для эмуляции во Flipper Zero можно добавить двумя способами:
- Считать существующий ключ — сохранить ID ключа на SD-карту и выбирать нужный ключ в любой момент
- Вручную ввести ID ключа — даже если в руках нет нужного ключа, но его ID известен, его можно ввести вручную. Так, например, можно сфотографировать ID ключа и отправить его другу с флиппером, без необходимости передавать физический ключ
Для запуска эмуляции ключа нужно зайти в меню iButton —> Saved, выбрать нужный ключ и запустить Emulate. На экране появится надпись с ID ключа, который эмулируется. После этого можно подносить Флиппер к считывателю. Важно помнить, что в этом режиме используются другие пины на контактной площадке Флиппера.
В режиме эмуляции Флиппер передает конкретный ID и эмулирует только один, заранее заданный, протокол ключа, так что его можно подносить только к конкретному домофону, который знает этот ключ. Перебирать сразу несколько ключей в этом режиме нельзя, так как нельзя однозначно убедиться, прочитал ли домофон наш ключ, и нельзя знать задержку в домофоне, между ошибкой чтения. Поэтому для дома, офиса, дачи, подвала нужно будет каждый раз выбирать конкретный ключ из меню.
В режиме эмуляции ключа iButton Флиппер нужно подносить к домофону как ключ. При этом нужно убедиться, что оба контакта коснулись контактной площадки считывателя.
iButton через внешний GPIO
Контакт iButton на нижней крышке также выведен на гребенку GPIO. Это можно использовать для подключения к нестандартным считывателям, ключам, любым устройствам работающим по протоколу 1-Wire вроде датчиков. Мы используем эти контакты для анализа сигналов через осциллограф. При этом, этот контакт не совсем честный GPIO, потому что имеет подтяжку к 5V.
Контакты iButton соединены с гребенкой GPIO. Порт iButton работает в режиме open-drain и подтянут к напряжению 5 В через резистор 1 кОм.
Протокол 1-Wire
В протоколе 1-Wire всегда есть главное устройство Master и ведомые Slave
Ключи Dallas обмениваются данными по протоколу 1-wire. Всего один контакт на передачу данных(!!) в обе стороны, от мастера к слейву и наоборот. Протокол 1-wire работает по модели Master-Slave. В этой топологии устройство Master всегда инициирует общение, а Slave следует его указаниям.
При контакте ключа (Slave) с домофоном (Master) чип внутри ключа включается, получив питание от домофона и происходит инициализация ключа, после чего домофон запрашивает ID ключа. Далее мы разберем подробно этот процесс.
Флиппер умеет работать в режимах Master и Slave. В режиме чтения ключа Флиппер выступает в роли считывателя, то есть работает как Master. А в режиме эмуляции ключа, флиппер прикидывается ключом, то есть работает в режиме Slave.
При чтении ключа Флиппер выступает мастером, а при эмуляции с домофоном работает как slave
Формат данных в ключе Dallas
Домофон считывает из iButton 8 байт (64 бита) информации, чтобы решить, открывать дверь или нет.
Структура данных этих 8 байт следующая:
- 1 байт — код семейства (Family Code), для iButton он всегда равен 0x01
- 6 байт — серийный номер ключа
- 1 байт — контрольная сумма СRC
Код семейства у ключей Dallas всегда 0x01. Если у вас этот код отличается, то скорее всего, это не ключ от домофона.
Серийный номер в некоторых случаях выгравирован на ключе, но может:
- Не содержать все 8 байт
- Иметь последовательность символов задом-наперед
- Иметь начало в непонятном месте
На оригинальном ключе iButton выгравирован ID, но его формат записи немного отличается от представления во Флиппере: сперва идет family code, потом инвертированный серийный номер, потом контрольная сумма
На картинке выше показан неочевидный пример гравировки ID на оригинальном ключе iButton. В нем читать байты нужно справа налево, контрольная сумма написана слева, а family code справа.
Ошибки чтения
При некорректном чтении ключа Flipper Zero сообщает об ошибках. Возможные ошибки:
- Некорректная контрольная сумма — ошибка в CRC
- Неправильный код семейства — когда family code отличается от 0x01, Флиппер ругается что это не ключ iButton.
Возможные ошибки при чтении ключей Dallas: неправильный байт CRC — CRC ERROR; байт Family-code не равен 0x01 — THIS IS NOT A KEY.
Ввод ID вручную
Если ID ключа известен, его можно ввести во Флиппер вручную. Это удобно когда самого физического ключа нет, например можно передать нужные байты просто в чате или скинув другу фото. На видео показан пример создания нового ключа Cyfral из 2 байт. Новый сгенерированный ключ сохраняется на SD-карту.
Создание нового ключа с помощью ручного ввода айдишника
При создании ключа нужно выбрать его тип: Dallas, Cyfral или Metakom. От этого будет зависеть длина ID и протокол, используемый при эмуляции. После ввода ID Флиппер предложит ввести имя нового ключа, либо использовать сгенерированное.
Запись ключей 1-Wire Dallas
Существуют ключи Dallas, которые можно записать и которые нельзя. Популярные перезаписываемые iButton болванки: RW1990, TM2004, TM01C. Процесс записи имеет свои нюансы, разберем их.
Запись болванки может требовать повышенного напряжения — например, для записи менее популярной RW2000 требуется напряжение 8 В (правда это Cyfral, но смысл понятен).
Некоторые болванки требуют финализиации — после финализации ключ больше не может быть перезаписан. Этим пользуются некоторые домофоны, пробуя перезаписать ключ перед считыванием, чтобы избежать поддельных ключей. Обычно для финализации используют импульс напряжения и специальную команду, которая может отличаться для разных ключей.
Существуют болванки, которые могут подходить ко всем типам ключей: Dallas/Cyfral/Metakom. Флиппер умеет записывать основные популярные болванки.
Запись ключа Dallas на болванку RW1990 с помощью Flipper Zero
Чтобы записать ключ на болванку, нужно выбрать желаемый ключ из меню iButton —> Saved —> Имя_ключа
и выбрать пункт Write. Далее прислонить перезаписываемый ключ к контактной площадке. После записи на болванку, флиппер проверяет корректность записи и показывает сообщение об успешной записи ID.
Русские народные ключи Cyfral, Metakom
Протоколы Metakom и Cyfral — отечественные разработки, распространенные только в СНГ. В отличие от ключей Dallas, они работают не по напряжению, а по току. Это менее распространенные и более дорогие ключи. Они очень чувствительны к параметрам ключа (частота, сила тока, амплитуда сигнала и пр.), из-за чего изготовление дубликатов бывает капризным процессом.
Cyfral и Metakom не принимают никакие команды. При подаче питания на ключ, он сразу начинает бесконечно посылать ID за счет изменения сопротивления. Таким образом, логические уровни определяются сопротивлением ключа. По документации ключей условно принимается, что информационные слова кода выдаются начиная с младшего бита.
Cyfral
Логические уровни в Cyfral, так же как и в Dallas имеют временные ограничения: если сопротивление остается низким около 50 мкс — это логический “0”, если 100 мкс — это логическая “1”.
Формат передаваемых данных специфичен.
Cyfral циклично отправляет 9 нибблов (1 ниббл = 4 бита): 1 стартовый и 8 ID. Ниббл может иметь всего 4 значения для ID и одно значение для стартового слова. Все остальные записи — некошерные.
В итоге ID записывается в 2 байта (Всего 8 нибблов ID. 4 ниббла = 16 состояний = 1 байт информации).
Бывает, что домофоны Cyfral занимаются проверкой ключа, подавая некорректные данные.
У Cyfral нет никаких контрольных сумм. Хочешь убедиться в целостности ID — прочитай ключ еще раз, а хочешь пять. Так как сигнал аналоговый, то чтение сигнала требует наличия АЦП или компаратора. Проще всего использовать компаратор, выход которого является низким или высоким уровнем напряжения.
С эмулированием ключа на практике проблем не возникает. Замыкания на землю (отсутствия сопротивления) вполне достаточно, чтобы ключ выдал логический «0».
Metakom
Ключ Metakom посылает 4 байта, где каждый байт заканчивается битом четности.
Metakom имеет 3 примитива передачи:
- Синхронизирующий бит
- Бит 0
- Бит 1
Структура посылки выглядит так:
- Синхронизирующий бит
- 4 байта информации, где каждый байт содержит:
- 1 бит четности
- 7 бит данных
На практике, эти домофоны в 99% случаев открываются с помощью универсального ключа, который легко гуглится.
Смотрим на 1-Wire через осциллограф
Захват сигнала осциллографом в момент чтения ключа Dallas
Линия передачи устроена по принципу «монтажного И» и может иметь одно из двух состояний: логический “0” и логическая “1”.
Устройства (ключи и домофон) имеют внутренние транзисторы, которые в нужное время подтягивают линию к нулю. Вся линия передачи переходит в состояние логического “0”, если любое из устройств перевело ее в нуль, т.е. если домофон перетянул линию в нуль — ключ об этом узнает, и наоборот.
С помощью перетяжек напряжения и удержания уровней 1-wire имеет 4 примитива для работы на шине:
- импульс сброса (RESET)
- импульс присутствия (PRESENCE)
- отправка бита 0
- отправка бита 1 и она же по совместительству чтение бита
Чтение ключа Dallas на Flipper. Состоит из команд Search ROM и Read ROM. Каждая команда имеет Reset sequence.
Чтение ключа на Flipper Zero устроено так: командой поиска проверяется наличие ключа, а затем происходит чтение ID. Это сделано, чтобы избежать случайных совпадений с другими ключами Cyfral/Metakom, тайминги которых могут случайно совпасть с требуемыми.
На осциллограмме виден длинный сигнал из 2 команд, где каждая состоит из:
- Инициализации команды:
- Импульс сброса
- Импульс присутствия
- Передачи команды для Slave
- Ответа Slave на принятую команду
Разберем более детально каждый из пунктов.
Reset sequence — инициализация команды. Состоит из Импульса Сброса и Импульса Присутствия. Импульс Сброса — уровень опускает Master. Импульс Присутствия — уровень опускает Slave.
Инициализация (reset sequence) состоит из двух импульсов:
- Импульс Сброса (Reset pulse)
- Импульса Присутствия (Presence pulse)
Для Импульса Сброса — линию к земле подтягивает Master (домофон).
Для Импульса Присутствия — линию к земле подтягивает Slave (ключ).
Некоторые домофоны не подают импульс сброса, так как отсутствие контакта между ключом и домофоном и есть сигнал сброса.
Команда чтения ID с ответом. Тайм-слот бита информации состоит из 2 участков: синхронизации и значения бита. В КОМАНДАХ за уровни напряжения на обоих участках отвечает Master. В ОТВЕТЕ на команду чтения за синхронизацию отвечает Master, за значение бита отвечает Slave.
После инициализации команды происходит обмен информацией:
- отправка команды для Slave
- ответ Slave на команду
Обмен информацией ведется тайм-слотами: один тайм-слот для обмена одним битом информации. Данные передаются бит за битом, начиная с младшего бита младшего байта.
Синхронизация Master и Slave происходит в одно действие: Master (домофон) подтягивает линию к низкому уровню. Далее через конкретное время, Master или Slave измеряет напряжение на линии и записывает бит информации (Master — при чтении ключа, Slave — при записи ключа). Правила выдержки временных интервалов для команд чтения и записи одинаковы. Каждый тайм-слот синхронизируется независимо, поэтому передача информации может приостанавливаться, не вызывая ошибок.
Важно, что все сигналы имеют конкретные временные ограничения, которые обязательно должны быть соблюдены! Бывает, что производители домофонов упарываются, и соблюдают какие-то свои временные задержки.
Еще у iButton есть режим Overdrive, в котором временные задержки сокращены, из-за чего передача информации происходит быстрее. Есть вероятность, что в дикой природе существуют домофоны, работающие в этом режиме… Но на практике они не встречались.
Стандартные команды 1-wire ключей Dallas
Для iButton характерны команды размером 1 байт (8 бит).
Зачастую домофон использует команды поиска и чтения ID (Search ROM и Read ROM).
Некоторые производители домофонов — люди оригинальные, поэтому придумывают разные последовательности команд, чтобы проверить, а действительно ли к домофону прикладывают ключ, а не эмулятор. Поэтому ознакомимся с существующими командами.
Стандартные команды iButton для Regular режима следующие:
Бонус про домофонные ключи
Бонус про домофонные ключи
Почему старые домофоны это плохо?
Некоторые старинные домофоны с ключами Dallas имеют в памяти базу ID ключей, заполненную не полностью. Незаполненные поля имеют некоторое значение, иногда соответствующее всем нулям (0x00) или всем единицам (0xFF). Для проверки домофона на дремучесть создаются два ключа: один со всеми нулями, другой со всеми единицами.
Эти ключи содержат неправильный код семейства (не 0x01) и неправильный CRC (вообще не контрольная сумма)!!! — Да, бывают и такие исключения.
Как почтальоны разносят по подъездам рекламу?
Никак, почтальоны разносят письма Но очевидно, что в почтовом отделении нет огромной связки с ключами для каждого подъезда. Часто используют универсальные ключи, они же “вездеходы”, подходящие на группу домофонов, например для всего района. Этот ключ может быть один на город, один на группу домов, может быть дефолтным для какой-то модели, а может и вовсе отсутствовать.
Что такое мастер ключ?
Обычно это ключ, который сам не открывает дверь, а позволяет добавлять в память новые ключи. Он записан в отдельную область памяти домофона. Такой ключ может одновременно для одних домофонов быть мастер-ключом, а для других обычным. Это всего лишь циферки, которые записаны в одну или другую область памяти домофона.
Играясь заблокировали домофон?
Такой вариант возможен, когда в домофоне есть “блокирующий ключ”. Он блокирует домофон для всех остальных ключей, пока не снимут блокировку с помощью мастер-ключа.
Какие болванки нам известны
В ходе работы с iButton мы зафиксировали некоторые известные нам “болванки” ключей. Вот они, на здоровье!
Наши соцсети
Все обновления по проекту первым делом публикуются в Telegeram-канале @zhovner_hub
_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Предзаказ Flipper Zero
Сейчас запущено производство первой партии Flipper Zero для бекеров заказавших устройство на Kickstarter. Вторая партия будет доступна для покупки осенью 2021. Вы можете зарезервировать устройство из второй партии заранее здесь shop.flipperzero.one Это важно для нас, чтобы более точно прогнозировать объемы производства.