• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
871 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 (156,480 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 (156,480 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 (156,480 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 (156,480 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 (156,480 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 594 wizyt
pytanie zadane 20 kwietnia 2019 w Systemy operacyjne, programy przez kubekszklany Gaduła (3,250 p.)
0 głosów
0 odpowiedzi 253 wizyt
pytanie zadane 18 stycznia 2019 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
+1 głos
0 odpowiedzi 665 wizyt

93,188 zapytań

142,204 odpowiedzi

322,027 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2581p. - dia-Chann
  2. 2537p. - Łukasz Piwowar
  3. 2528p. - Łukasz Eckert
  4. 2514p. - CC PL
  5. 2476p. - Tomasz Bielak
  6. 2445p. - Łukasz Siedlecki
  7. 2443p. - rucin93
  8. 2418p. - Michal Drewniak
  9. 2373p. - Marcin Putra
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2016p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...