Нужен USB сниффер на Arduino

Sin_city
Offline
Зарегистрирован: 13.04.2019

Есть компьютер и фискальный регистратор. Работают по USB, все ОК.

Нам интересно знать, что продает касса. Нужно установить в разрыв (проводов) платы Ардуино (теоретически не только их) и:

а) Аккуратно все передавать "как было". Чтобы система работала как и раньше. Либо мы создаем повторитель, либо, что еще лучше "провода как были, так и идут". Мы к нужным параллельно подключаемся.

б) Нужно знать, что пошло в продажи. 

в) Соответственно, нужно знать, попал чек в фискалку (но 99% что должен попать).

P.S. Информацию не модифицируем.

г) При некоторых чеках (например там нужны нам товар) мы передаем эту информацию в еще 1 порт. Либо RS232, либо USB.

Есть вопросы.

Собственно, USB сниффер не такая уж редкая вешь. И в сети есть хорошее видео (на Ютубе).

Там исполнитель взял 2 платы - Леонардо + USB Host Shield

Есть вопросы:

1. Почему он взял 2 платы - почему 1 не хватает? Какие еще расклады у меня (по части Ардуино) есть.

2. У него это работает как повторитель (то есть получили сигнал, сохрали значение, отбили на другом порту) или же речь идет о параллельном подключение (идут 2 или 4 провода, к 3 из 4 параллельно подключились и слушаем. Если например "наша слушалка накроется", то работать все будет "как прежде", так как провода никто не перерезал.

3. Как этот "бутерброд" будет отображаться на компьютере? как некое новое устройство или как?

P.S. Мне желательно сделать с "параллельным подключением" и без "нового устройства". Т.е. если фискальный регистратор имеет какой то HID ID, то пусть он и сохраняется.....

Посоветуйте варианты или предложите Ваши услуги.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а софтовый виртуальный хаб вас не устроит?

Sin_city
Offline
Зарегистрирован: 13.04.2019

А работать он на чем будет? На компьютере от ККТ?

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Леонардо он взял потому что она позволяет "крутить" свой USB, шилд, потому что у леонардо USB один.

Не только не хватает одной платы, а нужна именно леонардо. 

Можно и параллельно логировать данные, только вот с ардуино вы и USB2 можете не потянуть. Так что при кажущейся простоте задачи, она вовсе не простая и не дешевая.

Ну и вы лукавите, поскольку всегда можете получить чек из базы в которую регистратор эти чеки кладет. Так что цель у вас другая :) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sin_city пишет:

А работать он на чем будет? На компьютере от ККТ?

на компьютере где установлена программа по работе с ФР

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Ну и вы лукавите, поскольку всегда можете получить чек из базы в которую регистратор эти чеки кладет. Так что цель у вас другая :) 

тоже подумалось о цели, все чеки доступны в отчете оператора фискальных данных )))

Sin_city
Offline
Зарегистрирован: 13.04.2019

У оператор ФД доступны все чеки, если "посмотреть". Глазами в смысле.

Автоматические API не дают, например "Платформа ОФД". Но не это самое главное........

Там большая проблема всю кассовую ленту поднять. Да, отдельный чек с номером и суммой - пожалуйста, из любой точки земного шара.

На комп с ФР ничего установить нельзя. Может и можно, да не хочу. Работает касса сейчас как-то (и хорошо, что работает).

Зачем в нее ставить снифферы которые непонятно как будут работать внутри Винды - не понятно. Доступ к БД кассы, но это вмешательство в работу кассы, несанкционированное. Хотя наверное и допустимое.

Сделать я хочу то что я хочу.

Как понял я:

1. Леонардо определяется компом как USB устройство, Uno как COM устройство. Это основная разница

2. В любой Ардуино плате всего 1 USB порт (сделан как USB или как COM). И если мне нужно 2-3, то нужно делать "бутерброд" из 2-3 плат.

Ну понятно и приемлемо. Не понятно как платы общаются друг с другом. Я видел видео - через UART.... Но тут я уже сам впадаю в ступор, если она женяться друг с дружкой по USB, то у меня.... USB лишнего не будет что ли?

А можно 2 платы Ардуино поженить через SPI?

3. Корпуса для Ардуино. Сделаю я (если сделаю) бутерброд, состоящий из 2-3 Ардуино. Можно ли где то (думаю да) на 3D принтере заказать хороший и грамотный корпус для этого устройства? Думаю да, кто из 3D (типографий или как они называются) сможет сделать то что мне нужно?

amateur
Offline
Зарегистрирован: 19.11.2017

Для парсинга USB хватит одной Nano с библиотекой usbdrv.Подключение параллельное. Инфу можно сохранять куда-то (СД,ЕЕПРОМ) или слать по последовательному порту.

3д печать - Фаблаб(название города). 300-500 рублей.

sadman41
Offline
Зарегистрирован: 19.10.2016

Сниффануть байтстрим - особого ума не надо. Протокол раздолбать - вот основная проблема всех времён и народов.

Sin_city
Offline
Зарегистрирован: 13.04.2019

Ну может у меня получится, может нет. Протокол раздолбать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Сниффануть байтстрим - особого ума не надо. Протокол раздолбать - вот основная проблема всех времён и народов.

протокол на ФР вроде как описан

Sin_city
Offline
Зарегистрирован: 13.04.2019

Взял я 2 USB провода и попробовал соиденить "напрямую" все 4 USB провода. Без какого либо Ардуино.

Подключил мышку к 2-м компам. Не очень получается, так как начинается конфликт между компами за мышку. Комп с Win 10 побеждает.

Разумеется, если комп 1, то больших проблем нет. Любой свисток определяет мышь....

Вопросы следующие:

1. Ардуино Нано у меня нет, есть Ардуино Уно. Больших проблем не вижу (между Уно и Нано).

2. Я беру и разрезаю USB провод (уже разрезал). Как посоветуете его вообще включить в Уно (Нано)?

Ну +5 вольт и земля понятно, тут даже спрашивать нечего. А вот именно управляющие провода USB (называются обычно D+ и D-) с ними что?

Их нужно подать на I2C шину (контакты PC5 и PC4) или на SPI шину (PB2-PB5)? Или вообще нужно покупать преобразователь типа I2C - USB или SPI - USB

3. Самый глупый вопрос. А поключаю Уно (Нано) паралельно "подглядываю" или я "перерезаю провода" и сначала получаю сигнал в Ардуино, обрабатываю его и отправляю в дальше (в компьютер или фискальный регистратор соответственно) "аккуратно перекладываю с 1 пина на другой".

 

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Помоему этой ветке в теме "закажу проект" не место. ТС вы или ищите исполнителя, или задавайте вопросы в другом месте. 

amateur
Offline
Зарегистрирован: 19.11.2017

Sin_city пишет:

Ну +5 вольт и земля понятно, тут даже спрашивать нечего. А вот именно управляющие провода USB (называются обычно D+ и D-) с ними что?

  • digital pin 2: USB D+
  • digital pin 3: USB pull-up
  • digital pin 4: USB D-
  • 5V: USB VBUSGND: USB 

Про подключение. Ардуино паралелльно в схеме. Провод идет без разрыва(электрически), а физически к d+ d- с  двух сторон обрезанного кабеля подключены в arduino.

Sin_city
Offline
Зарегистрирован: 13.04.2019

amateur спасибо

1. Зачем поддтяжка к питанию? Ну может нужна зачем... Вам лучше знать.

2. Схему предположим сколхозил. А теперь как снифить USB (какой командой) и более того, куда это хозяйство писать. Что посоветуете?

svm
Offline
Зарегистрирован: 06.11.2016

Самый простой вариант - вытащить ФН из кассы, подключить к переходнику USB-COM и считать информацию в текстовый файл. А дальше или вручную анализировать или программку написать. Информация там только необходимая Вам. Ничего лишнего. Сейчас за кассовые аппараты никто не отвечает, поэтому можете лазить в нем сколько угодно. В крайнем случае если спалите ФН попадете  на деньги. Но если не подключать его на горячую, то ничего не случиться.

amateur
Offline
Зарегистрирован: 19.11.2017
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
// библиотека для работы с протоколом USB
#include <usbdrv.h>
// библиотека для работы с Serial-портом
#include <uart.h>

// PID      8 бит идентификатор
// ADDR     7 бит адрес устройства
// Endpoint 4 бита номер конечной точки
// CRC      5 бит контрольная сумма
// итого 3 байта
#define IN_SIZE       3

// PID  8 бит идентификатор
// DATA 64 бита данные
// CRC  16 бит контрольная сумма
// итого 11 байт
#define USB_BUFSIZE   11

// количество принятых пакетов хранимых в памяти
// должно быть четным и соблюдаться условие
// (IN_SIZE + USB_BUFSIZE)*FIFO_BUF_SIZE < 255
#define FIFO_BUF_SIZE 10

// RX буфер: 3 байта запроса IN + 11 байт данных DATAx
unsigned char usbRxBuf[USB_BUFSIZE];

unsigned char FIFOBuf[(IN_SIZE+USB_BUFSIZE)*FIFO_BUF_SIZE];

// номер текущей записываемой пары IN-DATA (0-FIFO_BUF)
unsigned char CurWritePos = 0;
// номер текущей прочитываемой пары IN-DATA (0-FIFO_BUF)
unsigned char CurReadPos  = 0;

// массив символов для декодирования скан-кодов при не нажатой клавиши Shift
unsigned char masskey[] = "abcdefghijklmnopqrstuvwxyz1234567890-=[]\\X;'`,./";

// массив символов для декодирования скан-кодов при зажатой клавиши Shift
unsigned char masskeyShift[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}|X:\"~<>?";

void setup()
{
  // открываем последовательный порт
  Serial.begin(115200);
  // настраиваем прерывание
  usbInit();
  // печатаем о готовности устройства
  Serial.print("UART init complet");
  // разрешаем прерывания
  sei();
}

void loop()
{
  // если сработало прерывание
  // то переменная CurWritePos изменит своё значение
  if (CurWritePos != CurReadPos) {
    // вызываем функцию printResult
    printResult(FIFOBuf + CurReadPos*(USB_BUFSIZE+IN_SIZE) + IN_SIZE, USB_BUFSIZE);
    CurReadPos++;
    if (CurReadPos >= FIFO_BUF_SIZE) {
    CurReadPos = 0;
    }
  }
}

void printResult(uchar *datakey, uchar len)
{
  bool shift = 0;
  // если во время очередного нажатия на клавишу
  // была нажата кнопка Shift
  if ((*(datakey + 1) == 0x2) || (*(datakey + 1) == 0x20))
  shift = 1;
  else
  shift = 0;
  // если 4 или 3 байт из массива данных пришёл не нулевой
  // значит нажата одна из клавиш
  if (*(datakey + 4) != 0) {
  // вызываем функцию печати 2-го символа
  printKey(*(datakey + 4), shift);
  } else if (*(datakey + 3) != 0) {
         // вызываем функцию печати 1-го символа
         printKey(*(datakey + 3), shift);
         }
}

void printKey(uchar key, bool shift)
{
  // если нажата одна из клавиш английского алфавита
  if (key >= 0x4 && key <= 0x27) {
    // если нажат Shift декодируем скан-коды как заглавные буквы
    if (shift == 1) {
      Serial.write(masskeyShift[key-4]);
    } else {
      // если нет декодируем скан-коды как строчные буквы
      Serial.write(masskey[key-4]);
    }
  } else if (key == 0x28) {
    // если пришел скан-код клавиши Enter
    Serial.print("\r\n");
  } else if (key == 0x2B) {
    // если пришел скан-код клавиши Tab
    Serial.print("\t");
  } else if (key == 0x2C) {
    // если пришел скан-код клавиши Space
    Serial.print(" ");
  } else if (key >= 0x2d && key <= 0x38) {
    // если пришел сканд-код из знаков пунктуации
    if (shift == 1)
    Serial.write(masskeyShift[key - 9]);
    else
    Serial.write(masskey[key - 9]);
  } else {
    // если пришёл скан-код которого мы не знаем
    // печатаем его без декодирования
    printHex(key);
  }
}

Sin_city пишет:

amateur спасибо

1. Зачем поддтяжка к питанию? Ну может нужна зачем... Вам лучше знать.

2. Схему предположим сколхозил. А теперь как снифить USB (какой командой) и более того, куда это хозяйство писать. Что посоветуете?

Подтяжка- необязательно. Это для улучшения стабильности.

 

Sin_city
Offline
Зарегистрирован: 13.04.2019

Спасибо большое. Скорее всего получится)))