Kontrola PINu v DB

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Kontrola PINu v DB

Příspěvek od Kony » 10 lis 2022, 16:04

Ahoj, pracuji na projektu podobnemu AlzaBoxu, kde zamestnanci budou mit PINy, ktere se budou denne menit.
Tyto PINy slouzi k otevirani koji s materialem.
DB :
ID(koje) | jmeno | PIN. | otevreno
1. Tomas 123. 0
2. Martin. 345. 1
3
4

Potreboval bych jak udelat to, ze zamestnanec vytuka na klavesnici PIN, tento PIN se prekontroluje v DB jestli existuje a pokud ano, tak sepne relay zamku ty koje kde je PIN uveden...
ale muze nastat situace, ze budou dve koje se stejnym PINem, v tom pripade by se meli otevrit obe. Koje budou otevirany pomoci relay a elektromagnetickeho zamku.

Mohl by mi prosim nekdo pomoct?? Jiz mam udelany php backend na zapis PINu do DB a manualni otevreni zamku kde pomoci 0 a 1 budu urcovat jestli ma byt relay sepnuty a nebo vypnuty.
Takze vlastne nyni ukol :
Po zadani PINu lrojdi DB, pokud najdes shodny PIN nastav hodnotu sloupec u dane koje otevreno na 1.

Ale tohle je asi na reseni PHP scriptu, kterymu jen podstrcim PIN

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Kontrola PINu v DB

Příspěvek od kiRRow » 10 lis 2022, 16:35

"Ale tohle je asi na reseni PHP scriptu, kterymu jen podstrcim PIN" už jen z principu toho kdo má do DB přístup, tak ano ...

rozhodni se kolik skříněk maximálně může mít společný pin, nebo jestli vůbec ... dle toho musíš vytvořit dostatečně velký buffer na ID skříněk které chceš otevřít + místo pro zakončovací znak (howgh - domluvil jsem znak), a nebo mít i id 00 a posílat vždy pevný počet IDček stím že nevyužité budou 00 a neotevře to nic.

to jestli má být zámek otevřený nebo zavřený je primárně záležitostí kontroléru co ho kontroluje, ten by si to měl hlavně pamatovat, to že to budeš mít zapasné v DB je tak dobré max pro to, že kontrolující jednotka se po restartu může mrknout do DB a otevřít ty zámky, které byly otevřeny před restartem

takže jak ? ... zapneš to, po startu by si to mělo vytvořit pole skříněk dle jejich ID a u každé si držet stav zámku ... pak budeš potřebovat PHP script co projede DB a sdělí v jakém stavu zámky mají být a vygeneruje ... co já vím dejme tomu 3čísla oddělená mezerou, zpracuješ a předáš to funkci co ovládá relé ... a pin se bude ťukat jak ? ...

jako moc jsem z toho nepobral jako ...

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Kontrola PINu v DB

Příspěvek od Kony » 10 lis 2022, 17:01

Otevreni zamku je na cca 10sekund, otevrou se dvere. Pak jak se dvere uzavrou tak se zmeni PIN.
Takze co tak premyslim je to pouze o SQL a PHP, kterymu podstrcim adresu "xxx. php? PIN=1234"ten script php projede DB a u vsech zaznamu kde bude stejny PIN nastavi u zaznamu v kolonce" otevreno"na hodnotu 1. Tim relay se otevre, protoze si bude kontrolovat v DB stavy, jakmile najde 1 tak se sepne,. A pak pomoci arduina zmenim hodnotu v DB na 0.

Pablo74
Příspěvky: 43
Registrován: 03 lis 2019, 17:00
Reputation: 0

Re: Kontrola PINu v DB

Příspěvek od Pablo74 » 10 lis 2022, 21:45

Jenom jdu okolo...

Četl jsem tohle vlákno třikrát, ale jaksi se v tom ztrácím. Co je míněno tímhle?
Tim relay se otevre, protoze si bude kontrolovat v DB stavy, jakmile najde 1 tak se sepne
Chápu to tak, že nějaký HW se bude periodicky dotazovat na stav databáze? Tj. se z ní bude neustále/opakovaně číst? A je nějak vyřešena možná (!) nekonzistence, kdy se bude v jeden okamžik do SQL zapisovat a současně z ní i číst?

Jak se budou řešit chybový stavy? Jak se vyřeší ověření, že fyzicky došlo k otevření/zavření? Jak se bude řešit výpadek proudu či HW chyba na straně toho zařízení?

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Kontrola PINu v DB

Příspěvek od KamilV » 10 lis 2022, 22:09

Pablo74 píše:
10 lis 2022, 21:45
kdy se bude v jeden okamžik do SQL zapisovat a současně z ní i číst?
Toto si řeší sama snad každá rozumná SQL databáze. Předpokládám tam MySQL. Tam je chování trochu rozdílné podle typu úložiště, InnoDB implementuje MVCC, MyISAM dělá při insertu/update zámek a selecty jsou v aktivním čekání...
Ať tak či onak, toto by mne trápilo nejmíň. Vlastně vůbec.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Kontrola PINu v DB

Příspěvek od ondraN » 11 lis 2022, 07:31

Pablo74 píše:
10 lis 2022, 21:45
Jenom jdu okolo...

...........................
Jak se budou řešit chybový stavy? Jak se vyřeší ověření, že fyzicky došlo k otevření/zavření? Jak se bude řešit výpadek proudu či HW chyba na straně toho zařízení?
Jako bys nevděl, že něco takového se ve světě arduina většinou neřeší. Ono to nějak funguje a to stačí ;)

Pablo74
Příspěvky: 43
Registrován: 03 lis 2019, 17:00
Reputation: 0

Re: Kontrola PINu v DB

Příspěvek od Pablo74 » 11 lis 2022, 16:40

Vycházel jsem z předpokladu, že je-li něco směrem k zaměstnancům chráněno PINem, jde o vážnou věc.

Nevím, jak často se budou PINy měnit (pochopil jsem že po otevření boxu a vyzvednutí materiálu v něm), zda to bude jednou či víckrát za den pro stejného zaměstnance. Od toho se odvíjí i vhodná distribuce PIN směrem k zaměstanci.

Výše jsem psal dotaz na SQL: pokud to poběží na PC serveru, tak OK, tam je jistě implementace možných kolizí vyřešena.
Stejně se musí vyřešit technicky po stránce HW i SW spousta situací: komunikace server <---> Arduino (?), příkaz k odemknutí, příkaz k zamknutí, čtení z dB, zápis do dB a to zřejmě asynchronně. Odchycení a vyhodnocení chybových stavů; max. počet pokusů o zadání PINu, nefunkční komunikace server <---> Arduino, atd.

Pořád mi ale vrtá hlavou, jak se bude realizovat tohle:
Tim relay se otevre, protoze si bude kontrolovat v DB stavy, jakmile najde 1 tak se sepne

Zaměstnanec naťuká PIN a k otevření (či identifikaci chyby v zadání PINu) by mělo dojít prakticky okamžitě, s minimální prodlevou. Takže se to musí implementovat inteligentně.

Ale jak říkám, jdu jen okolo a položil jsem tu pár postřehů a otázek, nic víc.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Kontrola PINu v DB

Příspěvek od KamilV » 11 lis 2022, 23:55

Ona není moc šikovná myšlenka toho bitové sloupce v DB, kde se relátka podle 0/1 spínají.
Protože ardu, na kterém ta relátka budou, se bude muset periodicky dotazovat databázového API, zda náhodou něco nemá sepnout.

Asi bych to stavěl takto:
Ardu č. 1 - jsou na něm relátka a běží na něm http server, requestem na jeho IP s parametrem identifikujícím relátko se sepne
Ardu č. 2 - s klávesnicí odesílající request s PINem na PC server
PC server - s databází, pokud na něj dorazí request s validním PINem, odešle request na Ardu č. 1

Takhle se nikde nikdo nedotazuje na nic periodicky a nehrozí, že se mi něco rozhodí při výpadku proudu, kdy relátko bude rozeplé, ale v DB by vysela hodnota 1...

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Kontrola PINu v DB

Příspěvek od Kony » 13 lis 2022, 21:02

no ted resim ardu s klavesnici,
kde po zadani pinu a zmacknuti # by se mel provest nejaky ukon.
kde po zadani pinu a zmacknuti * by se mel provest nejaky ukon.

Zkousim to takto :

Kód: Vybrat vše

 if (idx == '#') {
      Serial.println("ENTER");
    }

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Kontrola PINu v DB

Příspěvek od Kony » 13 lis 2022, 21:46

Mám to nyní takto "

Kód: Vybrat vše

#include "Wire.h"
#include "I2CKeyPad.h"

const uint8_t KEYPAD_ADDRESS = 0x20;
uint8_t lastKey;

I2CKeyPad keyPad;
byte relay = 255;
const byte relay1 = D3;
const byte relay2 = D4;
const byte relay3 = D5;
const byte relay4 = D6;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  Wire.setClock(400000);
  if (keyPad.begin(KEYPAD_ADDRESS) == false)
  {
    Serial.println("\nERROR: cannot communicate to keypad.\nPlease reboot.\n");
    while(1);
  }
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
  pinMode(D5, OUTPUT);
  pinMode(D6, OUTPUT);
}

void loop()
{
  char keys[] = "123A456B789C*0#DNF";  // N = Nokey, F = Fail
  uint8_t idx = keyPad.getKey();
  if (idx != lastKey & keys[idx] != 'N') {
    Serial.println(keys[idx]);
    lastKey = idx;
  switch (idx)
  {
    //******************
    case '1':
      relay = relay1;
      break;

    case '2':
      relay = relay2;
      break;

    case '3':
      relay = relay3;
      break;

    case '4':
      relay = relay4;
      break;

    //******************
    case '#':
      if (relay != 255)
      {
        digitalWrite(relay, HIGH);
      }
      break; 
    }
   }
  delay(100);
}}
A to mi nechce fungovat, ve vysledku bych chtel docilit toho, ze kdyz zadam "1234" a potvrdim křížkem, tak se rozsvítí LED1, když "6547" + # tak LED2 atd.... a kdyz zmacknu "*" tak se zadani smaze a zacne odznovu.... Samozrejme ty cisla PINu bych tahal z DB

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: luger a 17 hostů