Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
8 / 8 / 6
Регистрация: 25.12.2013
Сообщений: 192
1
.NET 4.x

Считать Touch Memory

28.02.2015, 18:33. Показов 2456. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем. Нашел считыватель ключей iButton RDS-01 USB (см на картинке его вид). А почему бы не сделать авторизацию в ПО через Touch Memory подумал я. На форму кинул SerialPort, подключился к нему и далее не знаю что делать. В интернете инфо не нашел. Подскажите пожалуйста как далее работать. Думаю, таймер должен лпрашивать устройство, в ответ получать команду пусто или ID таблетки Touch Memory.
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2015, 18:33
Ответы с готовыми решениями:

Touch memory ds1961s
Доброго времени суток. Не подскажете, совместим ли данный ключ, с ключом от домофона типа ds1990 и...

jquery touch - tap,touch,live
Здравствуйте, задача написать простой web калькулятор который будет кроссбраузерным и будет...

Create an in memory bitmap and draw directly to the memory
Здравствуйте! У меня есть пара вопросов. Знаю, что рисовать в HDC можно только с одного потока. Но...

Оцените сборку пожалуйста. Нужно в основном считать считать и считать
Процессор Intel I7 8700K Вентилятор THERMALRIGHT MACHO DIRECT Материнская плата ASRock Z370 Pro...

6
8 / 8 / 6
Регистрация: 25.12.2013
Сообщений: 192
14.11.2015, 16:50  [ТС] 2
Решил опять вернуться к данной теме. Знаю, что общение идет по интерфейсу 1-wire. После открытия COM порта и прилажениии таблетки придет массив битов. Пробовал так
C#
1
2
3
4
5
6
SerialPort serialPort = new SerialPort("COM1", 38400, Parity.Odd, 8); 
serialPort.Open();
 
byte[] buffer = new byte[512];
int bytesRead = serialPort.Read(buffer, 0, buffer.Length);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));
Но получаю в кодировке ASCII ??? или UTF-8 вообще ироглефы
0
8 / 8 / 6
Регистрация: 25.12.2013
Сообщений: 192
19.11.2015, 20:55  [ТС] 3
У меня таблетки фирмы Eltis, прочитал что это от компании Dallas, а значит работает по протоколу 1-Wire. Обмен данными происходит за счёт поочерёдного прижимания линии к земле, информация при этом кодируется длительностью таких сигналов. Происходит это примерно так:

Reset — мастер прижимает линию к земле как минимум на 480 микросекунд, это говорит о начале передачи данных.
Presence — через некоторое время ключ отвечает импульсом около 120 микросекунд, что подтверждает его наличие на линии.
Команда — мастер посылает команду из восьми бит, при этом логическая единица — это 1-15 микросекунд, а ноль — 60-120.


Далее всё зависит от посланной команды. Обычно это 33h — "READ ROM", чтение серийного номера, после которого мастер читает 64 бита (1 байт — тип устройства, 6 байт — сам номер, 1 байт — CRC). Чтение каждого бита инициализируется мастером, для этого он посылает импульс в 1-15 микросекунд. Если после этого линия прижата к земле со стороны ключа на 60-120 микросекунд, то прочитан ноль, иначе — единица.

Вот нашел часть кода, но C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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;
      }
Помогите правильно перевести в C#. Я не могу провести Reset порта и во время отправки команды
C#
1
serialPort2.Write("0x33");
выдает ошибку, что Время ожидания операции записи истекло.

Добавлено через 21 час 42 минуты
Есть у кого нибудь мысли??? За работу готов пополнить счет на телефоне
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
19.11.2015, 22:05 4
Цитата Сообщение от malta87 Посмотреть сообщение
Есть у кого нибудь мысли???
Мысли может и есть, а вот такого устройства точно нет. А не имея железки для проверки, копаться дистанционно-занятие малополезное.
Цитата Сообщение от malta87 Посмотреть сообщение
За работу готов пополнить счет на телефоне
Тогда вам в платный раздел. Если так, тема будет перенесена.
Вы уверены, что хотите продолжить: Yes, No?
0
8 / 8 / 6
Регистрация: 25.12.2013
Сообщений: 192
13.01.2016, 21:53  [ТС] 5
Цитата Сообщение от insite2012 Посмотреть сообщение
Вы уверены, что хотите продолжить: Yes, No?
Да уверен. Мне нужно уже закрыть данный вопрос.
Кликните здесь для просмотра всего текста

принцип работы 1-Wire.
Обмен данными происходит за счёт поочерёдного прижимания линии к земле, информация при этом кодируется длительностью таких сигналов. Происходит это примерно так:

Reset — мастер прижимает линию к земле как минимум на 480 микросекунд, это говорит о начале передачи данных.
Presence — через некоторое время ключ отвечает импульсом около 120 микросекунд, что подтверждает его наличие на линии.
Команда — мастер посылает команду из восьми бит, при этом логическая единица — это 1-15 микросекунд, а ноль — 60-120.


Далее всё зависит от посланной команды. Обычно это 33h — "READ ROM", чтение серийного номера, после которого мастер читает 64 бита (1 байт — тип устройства, 6 байт — сам номер, 1 байт — CRC). Чтение каждого бита инициализируется мастером, для этого он посылает импульс в 1-15 микросекунд. Если после этого линия прижата к земле со стороны ключа на 60-120 микросекунд, то прочитан ноль, иначе — единица.

Как видите, прочитать ключ достаточно легко. Имитировать ключ гораздо сложнее, тем более многие домофоны используют разные хитрости. Вот основные подводные камни:

Нужно всегда реагировать на reset, даже если он послан во время передачи данных. Импульс длиннее 480 микросекунд говорит о том, что надо начать всё сначала.
Момент прикладывания ключа с его точки зрения — это тоже reset, ведь до этого питания не было. Поэтому теоретически домофон может и не посылать reset, и следует периодически отвечать сигналом presence по своей инициативе.
Ключи могут реагировать и на другие команды: 0Fh как альтернатива 33h, SKIP ROM (CCh), MATCH ROM (55h) и самое хитрое, о чём я расскажу отдельно ниже, — SEARCH ROM (F0h). Некоторые домофоны могут послать самые разные комбинации таких команд, чтобы убедиться в том, что ключ настоящий.
Бывает и обратная ситуация — домофон посылает команду, на которую ключ реагировать не должен. Дело в том, что некоторые программируемые ключи на них всё-таки реагируют, и так происходит ещё одна проверка. Необходимо полностью игнорировать всё, что идёт за этими командами, пока не будет послан reset.
Для отсчёта времени лучше использовать асинхронный таймер в микроконтроллере, т.к. счёт идёт на микросекунды. Однако, установка кварца при этом будет излишней.


Про SEARCH ROM (F0h) — это команда поиска всех 1-Wire устройств на шине. Дело в том, что теоретически можно подключить параллельно много ключей и получить список всех серийных номеров. В реальности для iButton такое не используется, ведь к домофону всегда прикладывается один ключ. Однако, некоторые домофоны посылают эту команду, ожидая найти один единственный серийный номер. Алгоритм весьма интересный. Каждое из устройств на шине одновременно посылает бит своего серийного номера, при чём два раза (т.е. мастер должен прочитать два бита). Сначала обычным образом, а затем инвертированным. Что же получается в итоге? Если у устройства в серийном номере стоит единица, то посылается «10». Если ноль, то «01». И всё отлично, пока у всех устройств эти биты совпадают. А если нет… Выше я написал, что при чтении наличие длинного сигнала — это 0, а отсутствие — это 1, т.е. 0 является доминантным. Таким образом, при возникновении конфликтов читаются два нуля. После получения «10», «01» или «00» мастер должен послать в линию только что прочитанный бит. В случае с «00» он таким образом выбирает, с какой группой устройств работать далее. В результате после N итераций получается бинарное дерево из N серийных номеров.
Ответить на такую команду получается несколько сложнее, чем на обычный READ ROM. Нужно посылать каждый бит дважды — обычный и инвертированный, а затем проверять — совпадает ли с ним полученный от мастера ответ, и если не совпадает, то игнорировать дальнейшие команды.

0
8 / 8 / 6
Регистрация: 25.12.2013
Сообщений: 192
25.01.2016, 21:30  [ТС] 6
НУЖНА ПОМОЩЬ
раньше было ради любопытства, а сейчас срочно внедрить надо в ПО
0
Эксперт .NET
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
26.01.2016, 16:02 7
В чём именно помощь нужна-то? Протокол простой как две копейки. Примеров в сети по работе с ним предостаточно.

Добавлено через 17 минут
На сайте производителя есть куча примеров, как работать с этим протоколом через последовательный порт:
МаксимИнтегратед
0
26.01.2016, 16:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2016, 16:02
Помогаю со студенческими работами здесь

Ipod touch
Подскажите пожалуйста, сколько держит батарея на ipod touch 4 в игровом режиме?

Button (Touch out)
Здравствуйте! Ситуация такая... Есть баттн. Нажимаешь его и в таком состоянии перемещаешь палец за...

Touch Input
Здравствуйте, как сделать в Unity распознование 1 нажатия в любой точке экрана? Что бы можно было...

Работа с Touch
Здравствуйте уважаемые форумчане, я новичок по работе с Touch. Такой вопрос есть кубик на середине...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru