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

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 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 sont fonction du stock de chaque lot.

  • 1 chance sur 51 de gagner un parapluie
  • 3 chances sur 51 de gagner un couteau "suisse"
  • 7 chances sur 51 de gagner un porte-cartes (multiple)
  • 17  chances sur 51 de gagner le goodies "spécial 20 ans" ESUP
  • 23  chances sur 51 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.


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 : 

  • si (csn % 51) == 0 -> parapluie
  • si (csn % 51) de 1 à 3 -> couteau
  • si (csn % 51) de 4 à 10 -> porte-cartes multiple
  • si (csn % 51) de 11 à 27 -> goodies 20 ans
  • si (csn % 51) 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.

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érique (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
    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)
    modCsn = csnAsInt%51
    if modCsn in range(0,1):
        print('{"csn":"-", "eppn":"parapluie", "firstname":"%s", "lastname":"Parapluie !", "locations":"esup-goodies"}' % (suffix))
    elif modCsn in range(1,4):
        print('{"csn":"-", "eppn":"couteau", "firstname":"%s", "lastname":"Couteau !", "locations":"esup-goodies"}' % (suffix))
    elif modCsn in range(4,11):
        print('{"csn":"-", "eppn":"porte-cartes", "firstname":"%s", "lastname":" Porte cartes !", "locations":"esup-goodies"}' % (suffix))
    elif modCsn in range(11,28):
        print('{"csn":"-", "eppn":"mystere", "firstname":"%s", "lastname":"Goodies 20 ans !", "locations":"esup-goodies"}' % (suffix))
    # range(28,51):
    else : 
        print('{"csn":"-", "eppn":"porte-carte-simple", "firstname":"%s", "lastname":"Porte carte simple", "locations":"esup-goodies"}' % (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 ) : 

    <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 (déploiement et redémarrage d'esup-nfc-tag-server), 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 le lot gagné.


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

Les % de gains donnés ci-dessus sont théoriques, ils sont fonction des numéros de série des cartes qui ne sont pas forcément aléatoires (et uniformément répartis) 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 (Peut-être lié à la technologie Mifare Desfire ?).

Voici un script pour donner les % de gains selon un échantillon de numéros de série CSN : 

#!/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)
    modCsn = csnAsInt%51
    if modCsn in range(0,1):
        nbParapluie+=1
    elif modCsn in range(1,4):
        nbCouteau+=1
    elif modCsn in range(4,11):
        nbPorteCartes+=1                                   
    elif modCsn in range(11,28):
        nbGoodiesMyst+=1   
    elif modCsn in range(28,51):
        nbPorteCarte+=1
    else:
        nbPerdu+=1
    total+=1
     
file.close()
     
print "Total : " + str(total)
print "parapluies : " +  str(round(nbParapluie*100.0/total,2)) + "%"
print "couteaux : " +  str(round(nbCouteau*100.0/total,2)) + "%"
print "porte-cartes : " +  str(round(nbPorteCartes*100.0/total,2)) + "%"
print "goodies 20ans : " +  str(round(nbGoodiesMyst*100.0/total,2)) + "%"
print "porte-carte : " +  str(round(nbPorteCarte*100.0/total,2)) + "%"
print "perdu (censé être à 0) : " +  str(round(nbPerdu*100.0/total,2)) + "%"


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

Total : 147153
parapluies : 1.97%
couteaux : 5.87%
porte-cartes : 13.82%
goodies 20ans : 33.51%
porte-carte : 44.84%
perdu (censé être à 0) : 0.0%



  • Aucune étiquette