• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Raspberry czytniki kart zbliżeniowych prefix

Object Storage Arubacloud
0 głosów
537 wizyt
pytanie zadane 6 kwietnia 2020 w Inne języki przez PGR Obywatel (1,360 p.)
Witam

Zakupiłem ostatnio raspberry 4 oraz dwa czytnika kart zbliżeniowych (Unique). Oba czytniki podłączyłem do RB poprzez złącza USB. Czytniki działają na zasadzie klawiatury HiD wiec po zbliżeniu karty do RB zostaje wysłany kod karty oraz znak końca linij. RB następnie wysyła do bazy odpowiednie informacje. Tutaj pojawia się mój problem jako że do RB ma podłączony 2 czytniki potrzebuje wiedzieć z którego czytnika została wysłana informacja o zbliżeniu karty. Niestety moje czytniki nie mają możliwości dodania ani prefix-a ani sufixa-a. Jako że czytniki są podłączone na dwóch różnych portach USB pomyślałem że może tak rozwiąże swój problem. Mógłbym zmapować urządzenia z wykorzystaniem reguł udev (linux) dzięki temu ponazywałbym urządzenia. Tylko nie mam pomysłu jak napisać program który do kodu przychodzącego z czytnika dodaje ciąg znaków aby oznaczyć urządzenie.

Proszę o poradę jak się zabrać do tego problemu a czym poczytać.

2 odpowiedzi

0 głosów
odpowiedź 6 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
0 głosów
odpowiedź 7 kwietnia 2020 przez PGR Obywatel (1,360 p.)
Przeglądnąłem dokumentacje udev oraz ten wątek ale dalej nie wiem jak się do tego zabrać. Postaram się jeszcze raz przedstawić problem bo nie jestem pewien czy się dobrze zrozumieliśmy.

Do RB mam podłączone 2 czytniki kart (roboczo nazwijmy je cz001 i cz002). Na Rb jest uruchomimy notatnik. Po zbliżeniu karty do czytnika cz001 w notatniku pojawia się numer kart (np.1234) oraz enter. Oczywiście jak zbliżymy tą samą kartę do czytnika cz002 to w notatniku ujrzymy identyczny numer (1234). Chciałbym aby po zbliżeniu karty do czytnika cz001 numer jaki pojawi się w notatniku to 0011234 a po zbliżeniu tej samej karty do czytnika cz002 ten numer wyglądał tak 0021234.
komentarz 7 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
W systemie GNU/Linux, każde z urządzeń obsługiwane jest przez oddzielny plik. Stąd informacja z pierwszego czytnika pojawi się na (nazwy plików dowolne) /dev/hid/0 a dane z drugiego na /dev/hid/1. Sam decydujesz przez konfigurację udev, jakie to są pliki lub dowiązania. udev rozwiąże Ci wyłącznie problem rozróżniania 2 czytników w zależności od tego jakie to są porty USB. Nie potrafi dodać lub zmienić danych czytanych z urządzenia (no bo nie od tego jest).

Oczywiście możesz napisać program który będzie czytał z tych 2 urządzeń i będzie prezentował liczbę tak jak sobie tego życzysz (czyli z prefiksem: numer czytnika).
komentarz 7 kwietnia 2020 przez PGR Obywatel (1,360 p.)
No i właśnie mi o taki program chodzi. Tak na moją logikę muszę napisać warunek który sprawdza z którego urządzenia została wysłana informacja i na postawie tego warunku będzie dodawał odpowiedni ciąg znaków. Tylko skąd mogę uzyskać informacje z jakiego urządzenia dany kod został wysłany?
komentarz 7 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)

Tylko skąd mogę uzyskać informacje z jakiego urządzenia dany kod został wysłany?

Właśnie przez nazwę jednego z 2 plików urządzeń które będzie czytał program. Pierwszy plik to pierwsze urządzenie, drugi to drugie. W udev możesz się jedynie upewnić że dany port USB mapowany jest na odpowiedni plik urządzenia. Bez konfiguracji, system będzie Ci mapował w kolejności podłączenia.

komentarz 10 kwietnia 2020 przez PGR Obywatel (1,360 p.)
Bardzo dziękuje za pomoc. Problem rozwiązany.
komentarz 10 kwietnia 2020 przez PGR Obywatel (1,360 p.)

Mam jeszcze jedne problem. Urządzenie jest mapowane po adresem usb11. Napisałem taki kod aby zapisać do zmiennej a numer karty.

using namespace std;

#include<iostream>
#include<stdio.h>
#include<fstream>


int main()
{
	int	a;
	fstream usb11;
	usb11.open("/dev/usb11",ios::in);
		
	if(usb11.good()==false){
		cout<<"blad"<<endl;
	}
	usb11>>a;
	cout<<a<<endl;

}

Jednak po uruchomieniu program nie zwraca numeru karty. Rozumie że gdy uruchamiam program plik jest pusty dlatego program zwraca mi 0. Dlatego testowo zamknąłem odczytywanie oraz wyświetlanie wyników w nieskończonej pętli. Jednak nawet po przyłożeniu karty cały czas wynik jest równy 0.   

using namespace std;

#include<iostream>
#include<stdio.h>
#include<fstream>


int main()
{
	int	a;
	fstream usb11;
	usb11.open("/dev/usb11",ios::in);
		
	if(usb11.good()==false){
		cout<<"blad"<<endl;
	}
        while(true){
	        usb11>>a;
	        cout<<a<<endl;
        }
}

 

komentarz 10 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)

Spekuluję (bo nie znam wszystkich danych), że nie masz uprawnień do czytania z plików urządzeń. Sprawdź prawa na plikach. Zobacz czy możesz je odczytywać. Jeśli nie, tu opisałem jak konfigurować dostęp do innego urządzenia wejściowego: https://www.youtube.com/watch?v=YqjWA3JQjjo

Do jakości kodu programów, nie będę się teraz odnosił bo to na etapie braku działania, rzecz drugorzędna. Spróbuj po prostu zrobić:

cat /dev/usb11

Jeśli daje błędy, to problem leży w prawach dostępu.

komentarz 10 kwietnia 2020 przez PGR Obywatel (1,360 p.)
edycja 10 kwietnia 2020 przez PGR

Wynik z cat

pi@raspberrypi:~ $ cat /dev/usb11
�       "�2		!!"A�

Jutro pokombinuje z tymi prawami.

komentarz 11 kwietnia 2020 przez PGR Obywatel (1,360 p.)

Po zapozaniu się z filmikiem napisałem plik z regułami nazwałem 99-usbcz.rules i umieściłem /lib/udev/rules.d/ oraz /etc/udev/rules.d/. 

SUBSYSTEMS=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="0009", OWNER="root", MODE="0660", GROUP="plugdev", ATTR{serial}=="08FF20140315", KERNEL=="1-1.3.1", SYMLINK+="usb11"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="08ff", ATTRS{idProduct}=="0009", OWNER="root", MODE="0660", GROUP="plugdev", ATTR{serial}=="08FF20140315", KERNEL=="1-1.3.2", SYMLINK+="usb12"


Oczywiście mój użytkownik jest w grupie plugdev. Po podłączeniu czytnika pojawia się on w /dev/ pod nazwą usb11. Jednak program po uruchomieniu zwraca mi wartość 0. Podejrzewam że mam złe napisane wczytywanie danych z urządzenia dlatego program nie działa prawidłowo. Po wywołaniu w konsoli cat wyniki jest identyczny jak wczoraj. Przeszukuje internet ale nie mogę znaleźć informacji jak dane są przechowywane w takich plikach jak usb11 oraz jak mogę z nich prawidłowo odczytać dane.

komentarz 11 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)
Takie pliki są albo blokowe albo znakowe. Niestety ale nie posiadając tych konkretnych urządzeń, będzie mi trudno pomóc. Ogólnie jednak widzę że reguły które masz, nie uwzględniają ID_PATH. Podłączając urządzenia w innej kolejności, będziesz miał zmianę w urządzeniach. Zerknij do linku na stacku.
komentarz 11 kwietnia 2020 przez PGR Obywatel (1,360 p.)
edycja 11 kwietnia 2020 przez PGR
Do reguł dodałem "KERNEL=="1-1.3.1"" bo z tego co zauważyłem jest to numer portu (wniosek z własnych prób). Wiec jeżeli czytnik zawsze podłącze do właściwego portu po powinien on się nazywać zawsze tak samo.

Jest może jakiś innym sposób aby jednoznaczne określić z którego urządzenia numer kart został przysłany?

Przykładowo jeżeli kod karty przyszedł z czytnika 1 funkcja zapisuje dane do zmiennej a jeżeli z czytnika 2 zapisuje do zmiennej b

Podobne pytania

0 głosów
0 odpowiedzi 457 wizyt
pytanie zadane 20 kwietnia 2019 w Systemy operacyjne, programy przez kubekszklany Gaduła (3,190 p.)
0 głosów
0 odpowiedzi 232 wizyt
pytanie zadane 18 stycznia 2019 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
+1 głos
0 odpowiedzi 402 wizyt

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...