Arborescence des pages

Vous regardez une version antérieure (v. /wiki/display/ESUPNFC/Loterie+ESUP) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 23) afficher la version suivante »

En bref - fonctionnement du jeu

Lors des JRES 2021 (2022) à Marseille et en présentant un badge/périphérique RFID (en privlé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 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.

Contexte

Dans le cadre de l'Appel À Projets (AAP) Services Numériques Aux Étudiants ESUP-SGC 2022/2023, des articles promotionnels et pédagogiques (porte-cartes anti-rfid) ont été acquis.

Ces articles sont à destination des établissements partenaires de l'AAP afin de les accueillir lors du workshop de octobre/novembre 2022 à l'Université de Rouen Normandie, sous un temps possiblement pluvieux.

Ils sont également à destination des établissements de l'ESR pour promouvoir ESUP-Portail et plus spécifiquement ici de fait ESUP-SGC.

Lors des JRES 2021 (2022), quelques-uns de ces articles sont disponibles sur le stand ESUP-Portail.

Afin de mettre en avant la solution ESUP-SGC (et ESUP-NFC-TAG) nous proposons ainsi lors de ces JRES une 'loterie' en utilisant le badgeage de dispositifs RFID.

Dans la suite de cette page, nous vous détaillons la mise en place de cette 'loterie' via la plateforme esup-sgc/esup-nfc-tag de démonstration.

Cette page illustre ainsi l'intégration d'un dispositif de badgeage en utilisant la solution générique esup-nfc-tag.

Cahier des charges

On dispose de :

  • 10 parapluies
  • 40 couteaux "suisses"
  • 100 porte-cartes (multiple)
  • 400 porte-carte simples

A cela, dans le cadre des 20 ans d'ESUP-Portail, on ajoute dans le jeu environ 300 goodies "spécial 20 ans" ESUP 

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

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

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

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).


Spécifications

Une salle de badgeage Esup Goodies est présentée pour une liste minime d'eppn codée en dur.

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) : 

  • (csn % 59)==16 -> parapluie
  • (csn % 31)==2 -> couteau
  • (csn % 5)==2 -> porte-cartes multiple
  • (csn % 3)==0 -> porte-carte simple
  • (csn % 3)==1 -> goodies 20 ans

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

Aucune donnée personnelle n'est récupérée (et récupérable), le listing des identifiants de cartes n'est utilisé que pour la durée du jeu ; il est détruit juste après les JRES.

L'usage est un peu détourné puisqu'ici on n'identifie pas les utilisateurs. 

On utilise le CSN de toutes puces lisibles par un dispositif RFID ; on demande aux congressistes de ne jouer qu'une seule fois et de présenter un seul périphériques (carte multi-service de l'établissement en priorité).

Implémentation

On utilise donc esup-nfc-tag en implémentant à la fois le webService TagIdCheck et le webService AppliExtRestWs via un script python esup-goodies.py

Ce script python est porté par un serveur apache en CGI : 

   ScriptAlias "/esup-goodies" "/var/www/cgi-bin/esup-goodies.py"
   <Location /esup-goodies>
      Deny from all
      # IP eup-nfc-tag-server                                                                                                                                                                 
      Allow from 10.0.12.2
   </Location>


Le script python est ainsi le suivant : 

#!/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
    file = open('/var/www/log/goodies.txt',"r")
    for line in file:
        if re.search(csn, line):
            alreadyChecked = True
    file.close()

    csnAsInt = int(csn, 16)
    if csnAsInt%59==16:
        print('{"csn":"-", "eppn":"parapluie", "firstname":"%s", "lastname":"Parapluie !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    elif csnAsInt%31==2:
        print('{"csn":"-", "eppn":"couteau", "firstname":"%s", "lastname":"Couteau !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    elif csnAsInt%5==2:
        print('{"csn":"-", "eppn":"porte-cartes", "firstname":"%s", "lastname":" Porte cartes !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    elif csnAsInt%3==0:
        print('{"csn":"-", "eppn":"porte-carte-simple", "firstname":"%s", "lastname":"Porte carte simple", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    elif csnAsInt%3==1:
        print('{"csn":"-", "eppn":"mystere", "firstname":"%s", "lastname":"Goodies 20 ans !", "locations":"esup-goodies"}' % ('Gagné' + ('[RE]' if alreadyChecked else '')))
    else:
        print('{"csn":"-", "eppn":"perdu", "firstname":"%s", "lastname":":''-(", "locations":"esup-goodies"}' % ('Perdu' + ('[RE]' if alreadyChecked else '')))

    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 ( src/main/resources/META-INF/spring/applicationContext-custom.xml ) : 

    <bean id="tagIdCheckEsupGoodies" class="org.esupportail.nfctag.service.api.impl.TagIdCheckRestWs">
        <property name="description" value="ESUP Goodies"/>
        <property name="tagIdCheckUrl" value="https://esup-sgc-demo.esup-portail.org/esup-sgc-demo.esup-portail.org?tagIdCheck=tagIdCheck"/>
    </bean>

    <bean id="esupGoodiesExtApi" class="org.esupportail.nfctag.service.api.impl.AppliExtRestWs">
        <property name="isTagableUrl" value="https://esup-sgc-demo.esup-portail.org/esup-sgc-demo.esup-portail.org?isTagable=isTagable"/>
        <property name="validateTagUrl" value="https://esup-sgc-demo.esup-portail.org/esup-sgc-demo.esup-portail.org?validateTag=validateTag"/>
        <property name="getLocationsUrl" value="https://esup-sgc-demo.esup-portail.org/esup-sgc-demo.esup-portail.org?locations=locations"/>
        <property name="description" value="Esup Goodies WS"/>
    </bean>


Enfin, après prise en compte  on déclare une 'application' esup-nfc-tag via l'interface de celui-ci :

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.

 


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

Les % de chances données ci-dessus sont théroiques, ils sont fonction des numéros de série des cartes qui ne sont pas forcément aléatoires pour les lots donnés et les types de cartes RFID.

L'université de rouen ne dispose par exemple que de cartes avec des CSN pairs (sans doute lié à la technologie Mifare Desfire).

Voici un script pour donner les % de gains selon un échantillon de numéros de série CSN (récupérés en base de esup-sgc chez nous à univ-rouen pour le test) : 

#!/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)
    if csnAsInt%59==16:
        nbParapluie+=1
    elif csnAsInt%31==2:
        nbCouteau+=1
    elif csnAsInt%5==2:
        nbPorteCartes+=1                                    
    elif csnAsInt%3==0:
        nbPorteCarte+=1
    elif csnAsInt%3==1:
        nbGoodiesMyst+=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-carte : " +  str(round(nbPorteCarte*100.0/total,2)) + "%\n"
print "goodies 20ans : " +  str(round(nbGoodiesMyst*100.0/total,2)) + "%\n"
print "perdu : " +  str(round(nbPerdu*100.0/total,2)) + "%\n"


Sur l'"échantillon" rouennais, on a le résultat suivant : 

Total : 147153

parapluies : 1.75%

couteaux : 3.18%

porte-cartes : 18.98%

porte-carte : 25.27%

goodies 20ans : 25.44%

perdu : 25.38%





  • Aucune étiquette