Visualizzazione post con etichetta Rfid. Mostra tutti i post
Visualizzazione post con etichetta Rfid. Mostra tutti i post

giovedì 26 settembre 2013

Nexus 7 ed Rfid

Un piccolo problemino con Nexus 7: nonostante tutti i Nexus condividano il medesimo chip ed antenna per l'NFC/RFID su Nexus 7 non sempre viene riconosciuto il tag


la soluzione e' semplice: l'antenna non e' grande quanto la dimensione del dispositivo ed e' ubicata poco sopra la E della scritta Nexus. Per leggere i tag e' quindi necessario strusciarli  nella posizione esatta dell'antenna

lunedì 9 settembre 2013

Lettura di RFID Mifare con API di Android

In questo post viene descritto come leggere i tag Rfid Mifare Classic (13.56 MHz) disponendo di un telefono con antenna NFC come il Nexus S (attenzione che per leggere



L'interno con l'hardware NFC di un Nexus S (IFixIt)


Si parte da un progetto vuoto (Hello World) e si effettuano le modeste modifiche indicate in giallo nel listato seguente


Per prima cosa si deve modificare il file Manifest per dichiarare l'uso del sensore NFC e si deve dichiare una nuova intent che si apre quando viene passato un tag sotto il lettore

Manifest.xml
------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test4"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="16" />

    <uses-permission android:name="android.permission.NFC"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.test4.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


        <activity android:label="@string/event_verify" android:name="verifytagscanact">
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED"/>
            </intent-filter>
            <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/filter_nfc"/>
        </activity>

    </application>

</manifest>
------------------------------------------------
Si deve creare poi una nuova cartella xml nelle risorse e si crea un nuovo file filter_nfc

/xml/filter_nfc.xml
------------------------------------------------
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>
</resources>
------------------------------------------------

la Main Activity e' composta da un solo Adapter che apre una nuova intent. A questo punto si apre la funzione OnNewIntent che legge il contenuto del tag

MainActivity.java
------------------------------------------------
package com.example.test4;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.nfc.Tag;
import android.nfc.NfcAdapter;
import android.nfc.tech.MifareClassic;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.util.Log;
import android.widget.Toast;
import java.math.BigInteger;

public class MainActivity extends Activity {

    NfcAdapter adapter;
    PendingIntent pendingIntent;
    IntentFilter writeTagFilters[];
    String[][] techListsArray;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = NfcAdapter.getDefaultAdapter(this);

        pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
        try {
            tagDetected.addDataType("*/*");
        }
        catch (MalformedMimeTypeException e) {
            throw new RuntimeException("fail", e);
        }
        tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
        writeTagFilters = new IntentFilter[] { tagDetected };

        techListsArray = new String[][] { new String[] { MifareClassic.class.getName() } };

    }

    static String bin2hex(byte[] data) {
        return String.format("%0" + (data.length * 2) + "X", new BigInteger(1,data));
    }

    @Override
    protected void onNewIntent(Intent intent){
        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        byte[] tagId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        Toast.makeText(getApplicationContext(), bin2hex(tag.getId()), Toast.LENGTH_SHORT).show();


    }

    public void onPause() {
        super.onPause();
        adapter.disableForegroundDispatch(this);
    }

    public void onResume() {
        super.onResume();
        adapter.enableForegroundDispatch(this, pendingIntent, writeTagFilters, techListsArray);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}


------------------------------------------------


giovedì 5 settembre 2013

Creazione di post automatici su Facebook con RFID (6)


Riprendendo il filone degli esperimenti precedenti in questo caso il lettore Rfid e' legato ad una Arduino che si occupa del carico di lavoro per l'interfaccia Web
Le connessioni per il lettore RFID sono

MOSI: Pin 11 / ICSP-4
MISO: Pin 12 / ICSP-1
SCK: Pin 13 / ISCP-3
SS: Pin 6 
RST: Pin 7

La scheda Arduino ha ovviamente montato lo Shield Ethernet



----------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <RFID.h>


#define SS_PIN 6
#define RST_PIN 7
RFID rfid(SS_PIN, RST_PIN); 

int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "m.xxxxxnifi.it";    


IPAddress ip(192,168,0,177);
EthernetClient client;

void setup() {
  Serial.begin(9600);
   SPI.begin(); 
  rfid.init();
  
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
    }
    else
    {
      Serial.println("IP Acquisito");
    }
  delay(1000);
  


}

void loop()
{
 if (rfid.isCard()) {
        if (rfid.readCardSerial()) {
                serNum0 = rfid.serNum[0];
                serNum1 = rfid.serNum[1];
                serNum2 = rfid.serNum[2];
                serNum3 = rfid.serNum[3];
                serNum4 = rfid.serNum[4];
                String Id = String(rfid.serNum[0],HEX)+String(rfid.serNum[1],HEX)+String(rfid.serNum[2],HEX)+String(rfid.serNum[3],HEX)+ String(rfid.serNum[4],HEX);
                Serial.println(Id);
                if (client.connect(server, 80)) {
                        Serial.println("connected");
                        client.println("GET /luca/xxxxxxx/rfid_server2.php?rfid="+Id+" HTTP/1.1");
                        client.println("Host: www.google.com");
                        client.println("Connection: close");
                        client.println();
                        } 
                        else {
                        Serial.println("connection failed");
                        }
              } 
          }
 rfid.halt();
 }
----------------------------------------


----------------------------------------
<?
require_once '../src/facebook.php';
//Luca
if ($_GET["rfid"] == "f479abb492")
    {
    $accessToken = "CAAJkNq2LttoBAJywtmNSbVHqFPubOjYmQ2yyUG4kpibD75BHid9J7xsvif8osSOc4ewgK4aYerrLZBsZCQM5wykRTYVLDkCJXlXYl3gi8WFRQ8U4p4y4ZAXYsdamz6RVdRJZAe4vZA80mWBayuG0qc4IAj2TMDmQXKiv1OrKp8CwKjD6Rz2ZCAqp8yxxxxxxxx";
    print "Luca<br>";
    }

$appid = '673135956xxxxxx';
$appsecret = 'dde6cfb07dbb769c7efe949xxxxxx';
$msg = $_GET["msg"];
$title = 'Dove sono ??';
$uri = 'http://debiaonoldcomputers.blogspot.com/';
$desc = 'Sono ad Arcetri';
$pic = 'http://wwxxxxxxxxxxxxxxxxxmes/Boozook/images/testa.gif';
$action_name = 'Link';
$action_link = 'http://www.geo.unifi.it/';

$facebook = new Facebook(array(
 'appId' => $appid,
 'secret' => $appsecret,
 'cookie' => false,
 ));
 $user = $facebook->getUser();
$attachment = array(
'access_token' => $accessToken,
'message' => $msg,
'name' => $title,
'link' => $uri,
'description' => $desc,
'picture'=>$pic,
'actions' => json_encode(array('name' => $action_name,'link' => $action_link))
);
$status = $facebook->api("/me/feed", "post", $attachment);
print "Ok";
?> 


martedì 3 settembre 2013

Rfid su Nexus S

Sono riuscito ad farmi prestare un tag Rfid da 13.56 MHz per testare la capacita' NFC di Nexus S. La storia racconta che la funzione di lettura/scrittura di Rfid era stata implementata all'interno di Android senza documentarla e che e' stata scoperta (e sfruttata) da alcuni utilizzatori




Per la prova ho usato un normale tag di sola lettura da 13.56 Mhz ed il programma NFC Reader, del quale sono disponibili anche i sorgenti su GitHub


L'antenna fa il suo lavoro anche se non e' molto sensibile (il tag va letteralmente strusciato sulla cover del telefono)



Lettore RFID RC522 su Arduino

Il lettore RFID RC522 e' forse il sistema meno costoso per leggere i tag Rfid a 13.56 MHz in quanto il suo costo arriva al minimo anche a 5 dollari su E-Commerce cinesi

L'interfaccia e' a sette cavi
MOSI: Pin 11 / ICSP-4
MISO: Pin 12 / ICSP-1
SCK: Pin 13 / ISCP-3
SS: Pin 10
RST: Pin 9

(possono essere modificati da programma i pin 9 e 10)

oltre ovviamente ai due collegamenti di alimentazione a GND e 3.3V


La mia versione del lettore mostra le scritte solo sul lato superiore e quindi, quando montato sulla breadboard, non si riesce a leggere la pedinatura. Per comodita' metto questa foto del medesimo lettore ma con le scritte sul lato inferiore per facilitare il montaggio


La programmazione della scheda viene effettuata mediante la libreria che si trova a questo indirizzo

Per la lettura di un tag si puo' impiegare l'esempio CardRead compreso nella libreria stessa (attenzione: ogni lettura viene confrontata con l'ultima acquisita e se uguale non mostra niente a schermo se non una fila di puntini)

versione corta
------------------------------------------
#include <SPI.h>
#include <RFID.h>

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN); 

// Setup variables:
    int serNum0;
    int serNum1;
    int serNum2;
    int serNum3;
    int serNum4;

void setup()

  Serial.begin(9600);
  SPI.begin(); 
  rfid.init();
  
}

void loop()
{
    
    if (rfid.isCard()) {
        if (rfid.readCardSerial()) {
                serNum0 = rfid.serNum[0];
                serNum1 = rfid.serNum[1];
                serNum2 = rfid.serNum[2];
                serNum3 = rfid.serNum[3];
                serNum4 = rfid.serNum[4];
                String Id = String(rfid.serNum[0],HEX)+String(rfid.serNum[1],HEX)+String(rfid.serNum[2],HEX)+String(rfid.serNum[3],HEX)+ String(rfid.serNum[4],HEX);
                Serial.println(Id);
             } 
          }
        
    rfid.halt();
}
-----------------------------------

-----------------------------------
/**
* Read a card using a mfrc522 reader on your SPI interface
* Pin layout should be as follows (on Arduino Uno):
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SS: Pin 10
* RST: Pin 9
*
* Script is based on the script of Miguel Balboa. 
* New cardnumber is printed when card has changed. Only a dot is printed
* if card is the same.
*
* @version 0.1
* @author Henri de Jong
* @since 06-01-2013
*/

#include <SPI.h>
#include <RFID.h>

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN); 

// Setup variables:
    int serNum0;
    int serNum1;
    int serNum2;
    int serNum3;
    int serNum4;

void setup()

  Serial.begin(9600);
  SPI.begin(); 
  rfid.init();
  
}

void loop()
{
    
    if (rfid.isCard()) {
        if (rfid.readCardSerial()) {
            if (rfid.serNum[0] != serNum0
                && rfid.serNum[1] != serNum1
                && rfid.serNum[2] != serNum2
                && rfid.serNum[3] != serNum3
                && rfid.serNum[4] != serNum4
            ) {
                /* With a new cardnumber, show it. */
                Serial.println(" ");
                Serial.println("Card found");
                serNum0 = rfid.serNum[0];
                serNum1 = rfid.serNum[1];
                serNum2 = rfid.serNum[2];
                serNum3 = rfid.serNum[3];
                serNum4 = rfid.serNum[4];
               
                //Serial.println(" ");
                Serial.println("Cardnumber:");
                Serial.print("Dec: ");
Serial.print(rfid.serNum[0],DEC);
                Serial.print(", ");
Serial.print(rfid.serNum[1],DEC);
                Serial.print(", ");
Serial.print(rfid.serNum[2],DEC);
                Serial.print(", ");
Serial.print(rfid.serNum[3],DEC);
                Serial.print(", ");
Serial.print(rfid.serNum[4],DEC);
                Serial.println(" ");
                        
                Serial.print("Hex: ");
Serial.print(rfid.serNum[0],HEX);
                Serial.print(", ");
Serial.print(rfid.serNum[1],HEX);
                Serial.print(", ");
Serial.print(rfid.serNum[2],HEX);
                Serial.print(", ");
Serial.print(rfid.serNum[3],HEX);
                Serial.print(", ");
Serial.print(rfid.serNum[4],HEX);
                Serial.println(" ");
             } else {
               /* If we have the same ID, just write a dot. */
               Serial.print(".");
             }
          }
    }
    
    rfid.halt();
}

-----------------------------------

martedì 2 luglio 2013

Lettore RFID EM4100

Oltre al precedente lettore Parallax ho acquistato anche questo modello che legge i medesimi tag ma essendo commercializzato dalla Cina (dealextreme) ha un prezzo inferiore ai 20 Euro. Sulla confezione e sul lettore non e' riportato nessun codice identificativo
Le connessione riguardano una porta USB per la sola alimentazione ed una porta seriale standard DB9 (per la quale e' necessario l'adattore seriale-usb)

In alcuni siti si legge che questo lettore si dovrebbe comportare come una interfaccia HID ed emulare la tastiera e non dovrebbe aver bisogno di nessun driver. Nel mio caso ho provato sia su Linux che su Windows ma l'unico sistema per ottenere la lettura del dato e' connettersi alla porta seriale DB9

La comunicazione avviene su porta seriale con i parametri 9600 8N1



Parallax Rfid Card Reader 28340

Per fare qualche esperimento con gli RFid mi sono comprato  Parallax Rfid Card Reader
In realta' pensavo di ordinare la versione seriale da accoppiare ad Arduino (codice 28140) ma in realta' ho acquistato la versione USB (28340) per cui la uso con Raspberry

Il lettore legge il formato di Rfid a 125KHz a sola lettura (EM-4100) ed i dati vengono inviati sulla seriale virtuale rappresentata dalla porta USB come 2400 8N1

Per Linux non e' necessario installare nessun driver, su Windows invece la periferica non viene riconosciuta al volo



come indicato dal manuale, in caso di corretta lettura viene inviata una stringa di 12 caratteri in cui il codice
Rfid (composta da 10 caratteri numerici) e' compreso dal secondo all'undicesimo carattere

Stranamente alla prima lettura viene sempre restituita una stringa di 2 caratteri... dopo di cio' il lettura funziona in modo corretto ed e' anche sufficientemente veloce
---------------------------------------------------------------
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3 as lite
import sys
import serial

ser = serial.Serial('/dev/ttyUSB0', 2400)
con = lite.connect('birra.db')


with con:
 cur = con.cursor()    
 cur.execute("DROP TABLE IF EXISTS birra")
 cur.execute("CREATE TABLE birra(Rfid TEXT, Gratis INT)")
 cur.execute("INSERT INTO birra VALUES('1100560289',1)")

while (1):
 id = ser.readline()
 if len(id) == 12:
r = id[:10]
print "Id = ",id
cur.execute("SELECT * FROM birra WHERE Rfid='"+r+"'")
  while True:
  row = cur.fetchone()

    if row == None:
    break

   
  if row[1] == 1: 
    print "Birra gratis" 
cur.execute("UPDATE birra SET Gratis=0 WHERE Rfid='"+r+"'")
  else:
    print "Birra da pagare"


Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...