Esup NFC Tag

Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Info
titleEn bref - fonctionnement du jeu

Lors des JRES 2021 (2022) à Marseille et en présentant un badge/périphérique RFID (en privlégiant privilégiant la carte multi-services de votre établissement si vous en disposez) au stand Esup-Portail, en fonction du numéro de série de ce badge, vous gagnerez peut-être gagnez un des goodies ESUP-Portail.

Ce jeu s'appuie sur esup-sgc / esup-nfc-tag ; la description de cette mise en place est décrite dans cette page et fait ainsi office également de documentation illustrative technique du projet.

Aucune donnée personnelle n'est récupérée, utilisée et conservée.

...

On souhaite ainsi implémenter une loterie par badgeage de cartes pour distribuer ces lots à environ 800 personnes (environ 2000 personnes sont attendues aux JRES pendant 3 jours).

Les chances de gagner doivent donc être fonction de ce nombre de joueurs potentiels et sont fonction du stock de chaque lot.

  • 1 chance sur 59 51 de gagner un parapluie
  • puis 1 chance sur 31 de 3 chances sur 51 de gagner un couteau "suisse"
  • puis 1 chance sur 5 de 7 chances sur 51 de gagner un porte-cartes (multiple)
  • puis 1 chance sur 3 de gagner un porte-carte simple
  • 17  chances sur 51 de gagner le goodies "spécial 20 ans" ESUP
  • 23  chances sur 51 de puis encore 1 chance sur 3 de gagner le goodies "spécial 20 ans" ESUP

Le badgeage peut être fait sur toute carte/dispositif RFID par les membres ESUP tenant le stand (après authentification Shibboleth via la fédération ESR) via un téléphone NFC disposant de ESUP-NFC-TAG-DROID disponible sur le Google Play ESUP-Portail.

...

Via le numéro de série de la carte, on fait une opération de modulo pour attribuer un lot (les modulos ont été choisis arbitrairement)

  • si (csn % 5951) == 16 0 -> parapluie
  • si (csn % 31)==2 51) de 1 à 3 -> couteau
  • si (csn % 5)==2 51) de 4 à 10 -> porte-cartes multiple
  • si (csn % 51) de 11 à 27 -> goodies 20 ans
  • si 3)==0 -> porte-carte simple (csn % 3)==1 -> goodies 20 ans51) de 29 à 50 -> porte-carte simple

A chaque badgeage, on garde en mémoire le csn dans un fichier pour indiquer si la carte a déjà été utilisée lors du jeu.

...

Bloc de code
languagepy
themeRDark
#!/usr/bin/python
# -*- coding: utf-8 -*-

import cgi
import re

args = cgi.parse()

print "Content-type: application/json"
print

if 'locations' in args.keys():
    if args['eppn'][0] in ('bonamvin@univ-rouen.fr', 'lemaida3@univ-rouen.fr', 'esupdem@univ-rouen.fr'):
        print '["Esup Goodies"]'
    else:
        print '[]'

elif 'isTagable' in args.keys():
    print 'OK'

elif 'validateTag' in args.keys():
    print 'OK'

elif 'tagIdCheck' in args.keys():
    csn = args['csn'][0]
    alreadyChecked = False
    suffix = ''
    file = open('/var/www/log/goodies.txt',"r")
    for line in file:
        if re.search(csn, line):
            alreadyChecked = True
            suffix = '[RE]'
    file.close()

    csnAsInt = int(csn, 16)
    ifmodCsn csnAsInt%59==16= csnAsInt%51
    if modCsn in range(0,1):
        print('{"csn":"-", "eppn":"parapluie", "firstname":"%s", "lastname":"Parapluie !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')suffix))
    elif csnAsInt%31==2 modCsn in range(1,4):
        print('{"csn":"-", "eppn":"couteau", "firstname":"%s", "lastname":"Couteau !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    elif csnAsInt%5==2suffix))
    elif modCsn in range(4,11):
        print('{"csn":"-", "eppn":"porte-cartes", "firstname":"%s", "lastname":" Porte cartes !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else ''suffix)))
    elif csnAsInt%3==0modCsn in range(11,28):
        print('{"csn":"-", "eppn":"porte-carte-simple"mystere", "firstname":"%s", "lastname":"PorteGoodies 20 carteans simple!", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else ''suffix)))
    elif csnAsInt%3==1modCsn in range(28,51):
        print('{"csn":"-", "eppn":"mystereporte-carte-simple", "firstname":"%s", "lastname":"GoodiesPorte 20carte ans !simple", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    else:suffix))
    else:
        # impossible - ne devrait pas arriver ;-)
        print('{"csn":"-", "eppn":"perdu", "firstname":"%s", "lastname":":''-( ??? ", "locations":"esup-goodies"}' % ('Perdu' + ('[RE]' if alreadyChecked else ''suffix)))

    if not alreadyChecked:
        file = open('/var/www/log/goodies.txt',"a")
        file.write(csn + "\n")
        file.close()

else:
    print '[]'



On déclare ces 2 implémentations de WS dans la configuration d'esup-nfc-tag-server ( src/main/resources/META-INF/spring/applicationContext-custom.xml ) : 

...

Les utilisateurs 'login@univ-ville1.fr', 'autrelogin@univ-ville1.fr', 'login@univ-ville2.fr' peuvent ainsi badger des cartes et voir apparaitre sur leur téléphone et simultanément sur un ou des écrans si le badgeage est gagnant et pour quel lot gagné.

 


Statistiques - vérification des % de gain en fonction d'un échantillon de CSN

...

L'université de rouen ne dispose par exemple que de cartes avec des CSN pairs (peutPeut-être lié à la technologie Mifare Desfire ?).

...

Bloc de code
languagepy
themeRDark
#!/usr/bin/python
# -*- coding: utf-8 -*-
  
nbParapluie = 0
nbCouteau = 0
nbGoodiesMyst = 0
nbPorteCartes = 0
nbPorteCarte = 0
nbPerdu = 0
total = 0
 
 
file = open('/tmp/csn.txt',"r")
for csn in file:
    csnAsInt = int(csn, 16), 16)
    modCsn = csnAsInt%51
    if csnAsInt%59==16 modCsn in range(0,1):
        nbParapluie+=1
    elif csnAsInt%31==2 modCsn in range(1,4):
        nbCouteau+=1
    elif csnAsInt%5==2 modCsn in range(4,11):
        nbPorteCartes+=1                                    
    elif csnAsInt%3==0 modCsn in range(11,28):
        nbPorteCartenbGoodiesMyst+=1   
    elif csnAsInt%3==1modCsn in range(28,51):
        nbGoodiesMystnbPorteCarte+=1    
    else:
        nbPerdu+=1
    total+=1
     
file.close()
     
print "Total : " + str(total) + "\n"
print "parapluies : " +  str(round(nbParapluie*100.0/total,2)) + "%\n"
print "couteaux : " +  str(round(nbCouteau*100.0/total,2)) + "%\n"
print "porte-cartes : " +  str(round(nbPorteCartes*100.0/total,2)) + "%\n"
print "porte-cartegoodies 20ans : " +  str(round(nbPorteCartenbGoodiesMyst*100.0/total,2)) + "%\n"
print "goodiesporte-carte 20ans : " +  str(round(nbGoodiesMystnbPorteCarte*100.0/total,2)) + "%\n"
print "perdu (censé être à 0) : " +  str(round(nbPerdu*100.0/total,2)) + "%\n"


Sur l'échantillon rouennais (récupérés en base de esup-sgc à univ-rouen), on a le résultat suivant : 

Bloc de code
languagetext
themeRDark
Total : 147153
parapluies : 1.75%97%
couteaux : 35.18%87%
porte-cartes : 18.98%13.82%
goodies 20ans : 33.51%
porte-carte : 2544.27%
goodies 20ans : 25.44%
perdu84%
perdu (censé être à 0) : 250.38%0%