Łączymy RFID i NFC ze sklepem opartym o django-oscar

Można wiele pisać o Django. Zamiast pisać ciągle o tworzeniu aplikacji webowych warto zająć się dla odmiany sprzętem ze świata realnego. Tak więc w tym artykule Pokaże jak można połączyć technologię RFID, NFC, czy QRkody ze sklepem napisanym w Django :)

Technologię RFID można wykorzystać do różnych celów. Logistyka, kontrola, czy logowanie czasu pracy, karty identyfikacji użytkowników i wiele innych. Wystarczy prosty klips, naklejka, czy brelok, w którym znajduje się pasywny układ radiowy. Po zbliżeniu do czytnika w układzie indukuje się prąd, dzięki któremu układ odpowiada czytnikowi. W najprostszych standardach RFID będzie to tylko unikalny numer identyfikacyjny.

W sklepie zamiast metek z ceną można zastosować mały brelok - tag RFID i sprzęgnąć go z wersją internetową sklepu. Sprzedawca prezentuje produkt kładąc go na czytniku (duża tacka, podstawka), a na ekranie obok pojawia się strona prezentująca produkt - cenę, opis, informacje np. o promocjach, dostępnych wersjach czy dodatkach. Czytnik RFID mógłby zastąpić też urządzenia do sprawdzania cen wiszące w niektórych sklepach. Pomysłów jest wiele.

NFC to komunikacja radiowa krótkiego zasięgu stosowana w smartphonach i niektórych tabletach. Jest ona zgodna ze standardem RFID o nazwie Mifare. Zasada działania jest taka sama, z tym że czytnikiem jest komórka, a na tagach można zapisywać i odczytywać własne dane. Zamiast umieszczać czytniki w sklepie to klient może zeskanować token. Standard NFC obejmuje zapis adresu URL, adresu email, zakładki adresowej, czy tekstu. Token NFC tak jak QRCode mogą kierować na podstronę produktu w internetowym sklepie.

W moduł NFC wyposażone są niektóre smartphony z Androidem i Windows Phone. Najtańsze zaczynają się od 350-400 PLN. Na chwilę obecną NFC nie jest tak rozpowszechnione i rozpoznawalne jak np. QRkody i dość często występują właśnie w połączeniu z nimi.

Jednym z nowych pomysłów na zastosowanie tagów NFC i QRkodów są sklepy-plakaty umieszczane w przejściach, czy na stacjach metra, pociągów, czy autobusów. Na plakacie wydrukowane są produkty wraz z QRkodami i opcjonalnie doklejonymi tagami NFC. Klient skanuje tagi albo QRKody co przenosi go na stronę sklepu i automatycznie dodaje do koszyka zeskanowany produkt. Szybkie płatności online i np. drobne zakupy zrobione - z dostawą po pracy albo do czegoś w rodzaju paczkomatu. W bardziej zaawansowanych "wirtualnych" sklepach-plakatach dostępne są dedykowane aplikacje skracające proces zakupowy (zamiast ze skanera QRkodów przechodzić na stronę WWW i z powrotem dedykowana aplikacja ma wbudowany skaner i koszyk na jednym ekranie). Prostsze wersje mają jednak tą zaletę że nie trzeba przygotowywać żadnej aplikacji mobilnej.

Czytnik RFID i wyświetlanie strony produktu

Proste czytniki tagów Unique 125 kHz udają klawiaturę i nie wymagają dodatkowego oprogramowania. Dzięki temu łatwo połączyć je bezpośrednio z aplikacją webową. Taki czytnik opisałem w oddzielnym artykule. W skrócie przy odczycie czytnik wypisuje 10-znakowy identyfikator taga i "wciska" Enter - przejście do nowej linii. Jeżeli otworzymy przeglądarkę, stronę z formularzem i ustawimy pole input na aktywne to odczyt taga wpisze identyfikator i wyśle formularz.

W tym artykule wykorzystałem django-oscar - sklep napisany w Django. Cały kod projektu do pobrania na końcu artykułu.

Żeby rozpoznać produkt po numerze identyfikacyjnym taga trzeba ten numer zawczasu przypisać do produktu. Zakładając że będzie tylko jeden tag (zazwyczaj będzie ich wiele dla jednego produktu) to można zrobić to dodając zwykły CharField:

class Product(abstract_models.AbstractProduct):
    token = models.CharField("RFID Token", blank=True, max_length=10)
Następnie przydałby się jakiś widok z formularzem:
class RFIDProductRedirectView(generic.TemplateView):
    template_name = 'rfid.html'

    def post(self, request, **kwargs):
        try:
            product = self._get_product(request.POST.get('rfid_token', None))
        except Product.DoesNotExist:
            url = self._get_fail_url()
        else:
            url = self._get_success_url(product)
        return HttpResponseRedirect(url)

    def _get_product(self, rfid_token):
        return Product.objects.get(token=rfid_token)

    def _get_success_url(self, product):
        return reverse('catalogue:detail',
                       kwargs={'product_slug': product.slug, 'pk': product.pk})

    def _get_fail_url(self):
        return reverse('rfid')

rfid_view = RFIDProductRedirectView.as_view()
Prosty widok obsługujący formularz (w sumie powinien to być FormView). Jeżeli uda się dopasować odczytany "token" (identyfikator) do produktu to użytkownik zostanie przekierowany na widok szczegółowy. Szablon też jest prosty:
{% extends "layout.html" %}

{% block content %}
    <form method="post" action="./">
    {% csrf_token %}
        <input type="text" name="rfid_token" class="rfid-input">
    </form>
{% endblock %}

{% block extrascripts %}
    {{ block.super }}
    <script>
    $(function() {
        prepareRFIDForm();

        function prepareRFIDForm() {
            var input = $('.rfid-input');
            input.focus();
            input.val('');
        }
    });
    </script>
{% endblock %}

Szablon jest tylko prototypowy. Ma formularz i ustawia fokus na polu formularza po załadowaniu strony. W produkcyjnej aplikacji trzeba znacznie lepiej zaprojektować cały interfejs tak by był niezawodny - jak połączenie z siecią zostanie utracone to strona nie powinna się wysypać. Także niezależnie co użytkownik zrobi aplikacja nadal powinna pozwalać na skanowanie tagów (w powyższym przykładzie po przekierowaniu już się nie da). Aplikacja bezobsługowa nie wymagająca użycia myszki, czy klawiatury - np. stworzona z wykorzystaniem Ember.js czy Angular.js.

Działa to mniej więcej tak:

NFC/QRCode i wirtualne zakupy z plakatu

Tagi NFC np. w postaci naklejek są oferowane w dużych ilościach przez wyspecjalizowane firmy. Znajdziemy je także np. na Allegro. Do zapisu adresu URL można użyć komórki z modułem NFC i aplikacji takiej jak np. Tagstand Writer (Android).

Naklejka z tagiem NFC

Wystarczy że oba elementy będą kierować na URL, który doda przedmiot do koszyka i poinformuje o tym użytkownika. Oczywiście koszyk musi przetrwać wychodzenie i wchodzenie na stronę sklepu w czasie skanowania kolejnych produktów (to zapewnia akurat oscar).

Widok wygląda następująco:

class AddToBasketFromLink(generic.View):
    def get(self, request, **kwargs):
        pk = self.kwargs.get('product', None)
        self._add_product_to_basket(pk)
        url = self._get_basket_url()
        return HttpResponseRedirect(url)

    def _add_product_to_basket(self, pk):
        try:
            product = self._get_product(pk)
        except Product.DoesNotExist:
            messages.add_message(self.request, messages.ERROR, 'No such product')
        else:
            self._add_to_basket(product)
            messages.add_message(self.request, messages.SUCCESS, 'Product added to basket')

    def _get_product(self, pk):
        return Product.objects.get(pk=pk)

    def _add_to_basket(self, product):
        self.request.basket.add_product(product)

    def _get_basket_url(self):
        return reverse('basket:summary')

add_to_basket_from_link = AddToBasketFromLink.as_view()

Widok wyszukuje produkt po PK z odnośnika. Jak to się uda to dodaje go do koszyka (oscar zapewnia request.basket i metodę add_product), po czym przekierowuje na stronę koszyka.

Działa to mniej więcej tak (pomijając pytanie którą przeglądarkę użyć):

Jako że taki plakatowy sklep wymaga dostępu do internetu warto i o to zadbać - np stosując router wifi i modem LTE albo zwykły 3G. Do tego instrukcja jak taki plakatowy sklep działa.

Projekt Django, którego fragmenty zaprezentowałem powyżej można pobrać i pobawić się samemu (kod znajduje się w rfidshop/apps/catalogue).

Bezpieczeństwo RFID i NFC

Temat bezpieczeństwa RFID i NFC jest bardzo rozległy. Proste tagi Unique, na których nic nie można zapisać są bezpieczne przez modyfikacją. Niezabezpieczone tagi NFC można przeprogramować. Oba tagi można próbować zastąpić własnym kierującym na stronę ze złośliwym oprogramowaniem. Projektując wykorzystanie NFC/RFID trzeba też przemyśleć kwestie związane z ich bezpieczeństwem.

RkBlog

Django, 5 August 2013

Comment article
Comment article RkBlog main page Search RSS Contact