aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/examples/wps-nfc.py
blob: 39c206f1809cc85bfc58391ac72da97993732e03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/python
#
# Example nfcpy to wpa_supplicant wrapper for WPS NFC operations
# Copyright (c) 2012, Jouni Malinen <j@w1.fi>
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.

import os
import sys
import time

import nfc
import nfc.ndef

import wpactrl

wpas_ctrl = '/var/run/wpa_supplicant'

def wpas_connect():
    ifaces = []
    if os.path.isdir(wpas_ctrl):
        try:
            ifaces = [os.path.join(wpas_ctrl, i) for i in os.listdir(wpas_ctrl)]
        except OSError, error:
            print "Could not find wpa_supplicant: ", error
            return None

    if len(ifaces) < 1:
        print "No wpa_supplicant control interface found"
        return None

    for ctrl in ifaces:
        try:
            wpas = wpactrl.WPACtrl(ctrl)
            return wpas
        except wpactrl.error, error:
            print "Error: ", error
            pass
    return None


def wpas_tag_read(message):
    wpas = wpas_connect()
    if (wpas == None):
        return
    print wpas.request("WPS_NFC_TAG_READ " + message.encode("hex"))

def main():
    clf = nfc.ContactlessFrontend()

    try:
        while True:
            print "Waiting for a tag to be touched"

            while True:
                tag = clf.poll()
                if tag and tag.ndef:
                    break
                if tag:
                    print "Not an NDEF tag"
                    while tag.is_present:
                        time.sleep(0.2)

            if len(tag.ndef.message):
                message = nfc.ndef.Message(tag.ndef.message)
                print "message type " + message.type

                for record in message:
                    print "record type " + record.type
                    if record.type == "application/vnd.wfa.wsc":
                        print "WPS tag - send to wpa_supplicant"
                        wpas_tag_read(tag.ndef.message)
                        break
            else:
                print "Empty tag"

            print "Remove tag"
            while tag.is_present:
                time.sleep(0.2)

            print "Ok"

    except KeyboardInterrupt:
        raise SystemExit
    finally:
        clf.close()

    raise SystemExit

if __name__ == '__main__':
    main()