WPS: Add an example python script for NFC operations
authorJouni Malinen <j@w1.fi>
Sat, 3 Nov 2012 20:43:15 +0000 (22:43 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 3 Nov 2012 20:43:15 +0000 (22:43 +0200)
wps-nfc.py uses nfcpy and python-wpactrl to provide NFC tag information
to wpa_supplicant for WPS operations.

Signed-hostap: Jouni Malinen <j@w1.fi>

wpa_supplicant/examples/wps-nfc.py [new file with mode: 0755]

diff --git a/wpa_supplicant/examples/wps-nfc.py b/wpa_supplicant/examples/wps-nfc.py
new file mode 100755 (executable)
index 0000000..753e9d1
--- /dev/null
@@ -0,0 +1,84 @@
+#!/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_tag_read(message):
+    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
+
+    if len(ifaces) < 1:
+        print "No wpa_supplicant control interface found"
+        return
+
+    for ctrl in ifaces:
+        try:
+            wpas = wpactrl.WPACtrl(ctrl)
+            print wpas.request("WPS_NFC_TAG_READ " + message.encode("hex"))
+        except wpactrl.error, error:
+            print "Error: ", error
+            pass
+
+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()