element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet & Tria Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • About Us
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      • Japan
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Vietnam
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Raspberry Pi
  • Products
  • More
Raspberry Pi
Blog Pi Passport: Schritt 6: Alles miteinander verbinden
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Raspberry Pi to participate - click to join for free!
Featured Articles
Announcing Pi
Technical Specifications
Raspberry Pi FAQs
Win a Pi
GPIO Pinout
Raspberry Pi Wishlist
Comparison Chart
Quiz
  • Share
  • More
  • Cancel
Group Actions
  • Group RSS
  • More
  • Cancel
Engagement
  • Author Author: charlotte_godley
  • Date Created: 7 Oct 2014 2:14 PM Date Created
  • Views 531 views
  • Likes 0 likes
  • Comments 0 comments
Related
Recommended
  • b+
  • raspberrypibplus
  • pipassport
  • explore-nfc
  • raspberry_pi
  • raspberry-pi
  • raspberrypi
  • nfc
  • deutsch
  • charlotte_godley
  • raspberry_pi_bplus

Pi Passport: Schritt 6: Alles miteinander verbinden

charlotte_godley
charlotte_godley
7 Oct 2014

Vergangene Woche habe ich erläutert, wie Sie eine Web-API mit Windows Azure, ASP.Net und C# erstellen können.
Diese Woche verbinden wir das Ganze mit unserer ursprünglichen Pi Passport Klassifizierung. Da unser System in verschiedene Ebenen unterteilt ist, sollten wir hier eigentlich nur die Datenebene anpassen müssen.
An dieser Stelle nochmal zur Erinnerung – so sah unser Projekt vor zwei Wochen aus:


Hier läuft quasi alles über zwei xml-Dateien, von denen eine Datei alle Daten zu unseren Aktivitäten und die andere Daten zur Person enthält.
Jetzt, da wir eine Web-API haben, werden Personen im Internet und Aktivitätenbeschreibungen dort oben gespeichert. Fragen und Antworten zu Aktivitäten kommen jedoch direkt auf den Pi, da wir den Interwebs nicht unbedingt entnehmen müssen, wie ein Benutzer eine Aktivität erreicht hat – wichtig ist nur, dass wir wissen, DASS er sie erreicht hat. Ein paar Hintergrundinformationen zur Aktivität sind an dieser Stelle ebenfalls hilfreich. Allerdings kann es passieren, dass das Ganze dadurch ein wenig unübersichtlich wird. Es ist wichtig, dass die IDs mit dem Server übereinstimmen, da am Ende sonst die Aktivitäten-IDs auf dem Pi von denen, die auf dem Server angegeben sind, abweichen.
Deshalb müssen wir hier Folgendes beachten:
- Ändern Sie Speichern/Laden von Personen, um Requests ausführen zu können.
- Ändern Sie Speichern/Laden von Aktivitäten, um Requests ausführen zu können und achten Sie darauf, dass die IDs zueinander passen.
- Ändern Sie die Parameter der Klassifizierung so, dass die URLs, die wir aufrufen müssen, zu den APIs passen.
- Passen Sie die Read-/Admin-Dateien so an, dass die Parameter zur Erstellung der Klassifizierung stimmen.
Lassen Sie uns mit dem LoadPi anfangen:

+ expand sourceview plain
  1. def LoadPi(self): 
  2.       dom=self.Load(self.pi,"piSyst") 
  3.       try: 
  4.            pi_tag=dom.getElementsByTagName("pi")[0] 
  5.       except: 
  6.            self.SavePi() 
  7.            dom=self.Load(self.pi,"piSyst") 
  8.            pi_tag=dom.getElementsByTagName("pi")[0] 
  9.  
  10.       a_q=requests.get(self.pi_url) 
  11.       a_data=a_q.json() 
  12.       a_dict={} 
  13.        for a in a_data: 
  14.            a_dict[a["ID"]]={"Description":a["Description"]} 
  15.       pid=pi_tag.getAttribute("ID") 
  16.       a_tags=pi_tag.getElementsByTagName("achievement") 
  17.       achievements={} 
  18.        if int(pid) in a_dict.keys(): 
  19.             achievements[pid]={"question":None,"answers":None,"Description":a_dict[int(pid)]["Description"]} 
  20.       else: 
  21.            desc=raw_input("Please enter a description for this pi:") 
  22.             post=requests.post(self.pi_url,data=json.dumps({"Description":desc}),headers={"Content-type":"application/json"}) 
  23.            id=str(int(post.json()["ID"])-1) 
  24.            achievements[id]={"question":None,"answers":None,"Description":desc} 
  25.            pi_tag.setAttribute("ID",str(id)) 
  26.            file=open(self.pi,'w') 
  27.            dom.writexml(file) 
  28.            a_q=requests.get(self.pi_url) 
  29.            a_data=a_q.json() 
  30.            a_dict={} 
  31.             for a in a_data: 
  32.                 a_dict[a["ID"]]={"Description":a["Description"]} 
  33.             for a in a_tags: 
  34.                 id=a.getAttribute("ID") 
  35.                 qtag=a.getElementsByTagName("question")[0] 
  36.                 question=qtag.childNodes[0].data 
  37.                 atag=a.getElementsByTagName("answer") 
  38.                 answers=[] 
  39.                 for an in atag: 
  40.                      answers.append(an.childNodes[0].data) 
  41.                  achievements[id]={"question":question,"answers":answers,"Description":a_dict[id]["Description"]} 
  42.  
  43.       return achievements 


An dieser Stelle müssen Sie Requests installieren. Das ist so ähnlich wie urllib, aber wesentlich einfacher zu verstehen. Über diesen Befehl finden Sie sie auf PyPip:
sudo pip install requests
Wir arbeiten uns hier Schritt für Schritt durch:

+ expand sourceview plain
  1.       dom=self.Load(self.pi,"piSyst") 
  2.       try: 
  3.            pi_tag=dom.getElementsByTagName("pi")[0] 
  4.       except: 
  5.            self.SavePi() 
  6.            dom=self.Load(self.pi,"piSyst") 
  7.            pi_tag=dom.getElementsByTagName("pi")[0] 
  8.  
  9.       a_q=requests.get(self.pi_url) 
  10.       a_data=a_q.json() 
  11.       a_dict={} 
  12.        for a in a_data: 
  13.            a_dict[a["ID"]]={"Description":a["Description"]} 
  14.       pid=pi_tag.getAttribute("ID") 
  15.       a_tags=pi_tag.getElementsByTagName("achievement") 
  16.       achievements={} 
  17.        if int(pid) in a_dict.keys(): 
  18.             achievements[pid]={"question":None,"answers":None,"Description":a_dict[int(pid)]["Description"]} 


In diesem ersten Abschnitt passiert Folgendes:
• Die dom wird geladen und das Pi Tag gesucht.
• Falls nicht vorhanden, wird das Pi gespeichert und das dom Tag erstellt, damit es beim nächsten Mal bereitsteht.
• Es wird ein Request an die entsprechende API geschickt, alle Aktivitäten aufzulisten.
• Das JSON-Objekt wird in ein Python-Verzeichnis geladen.
• Die Pi Aktivität auf dem Server wird überprüft und eine Instanz mit den Deets dieser Aktivität erstellt.

+ expand sourceview plain
  1. else: 
  2.            desc=raw_input("Please enter a description for this pi:") 
  3.             post=requests.post(self.pi_url,data=json.dumps({"Description":desc}),headers={"Content-type":"application/json"}) 
  4.            id=str(int(post.json()["ID"])-1) 
  5.            achievements[id]={"question":None,"answers":None,"Description":desc} 
  6.            pi_tag.setAttribute("ID",str(id)) 
  7.            file=open(self.pi,'w') 
  8.            dom.writexml(file) 
  9.            a_q=requests.get(self.pi_url) 
  10.            a_data=a_q.json() 
  11.            a_dict={} 
  12.             for a in a_data: 
  13.                 a_dict[a["ID"]]={"Description":a["Description"]} 
  14.             for a in a_tags: 
  15.                 id=a.getAttribute("ID") 
  16.                 qtag=a.getElementsByTagName("question")[0] 
  17.                 question=qtag.childNodes[0].data 
  18.                 atag=a.getElementsByTagName("answer") 
  19.                 answers=[] 
  20.                 for an in atag: 
  21.                      answers.append(an.childNodes[0].data) 
  22.                  achievements[id]={"question":question,"answers":answers,"Description":a_dict[id]["Description"]} 
  23.  
  24.       return achievements 


Weiter geht es mit diesem Abschnitt:
• Hier wird festgestellt, dass das Pi Tag nicht in den Serveraktivitäten gelistet ist.
• Sie werden aufgefordert, ein solches Tag zu erstellen, indem Sie der Aktivität eine Beschreibung hinzufügen. Diese wird dann mittels eines Post-Requests an den Server weitergeleitet.
• Um sicherzustellen, dass auch alles zueinander passt, wird die ID vom Server sowohl in das Aktivitätenverzeichnis als auch in die pi.xml-Datei übernommen.
• Jetzt fragt das System Sie nach einer Liste der Aktivitäten und erstellt daraus ein Verzeichnis.
• Anschließend geht es in die xml-Datei, aus der es alle lokalen Aktivitäten zieht. Die dazugehörigen Beschreibungen werden der Serveraktivitäten-Liste entnommen.
Lassen Sie uns noch den Initialisierer für die Klassifizierung ändern, bevor wir es vergessen:

+ expand sourceview plain
  1.   def __init__(self,pifile,people_url,pi_url,link_url): 
  2.       self.pi=pifile 
  3.       self.pi_url=pi_url 
  4.       self.people_api=people_url 
  5.       self.link_api=link_url 
  6.  
  7.       self.achievements=self.LoadPi() 
  8.       self.people=self.LoadPeople() 


Hier haben wir immer noch die Pi Datei – das ist eine xml thingymagig, die alle Daten zu jeder Aktivitätenfrage enthält. Allerdings haben wir auch noch drei API-Links: einen für Aktivitäten (pi_url), einen für Personen (people_api) und einen für Links (link_api).
Jetzt gehen wir zurück auf SavePi:


Die Vorgehensweise ist wieder ähnlich – wir speichern alle Aktivitäten in der Pi Datei und prüfen, ob sie auch auf dem Server vorkommen. Das tun wir, indem wir alle Aktivitäten auf den Server laden und prüfen, ob sie auch wirklich im Aktivitätenverzeichnis auftauchen. Wenn sie zwar auf dem Server, jedoch nicht im Verzeichnis gelistet werden, dann löschen Sie sie vom Server. Wenn es andersherum ist, dann erstellen Sie einen Eintrag auf dem Server.
Nun geht es weiter mit SavePeople:


Anstatt eine xml-Datei zu verwenden, machen wir jetzt Folgendes:
• Stellen Sie eine Verbindung mit der API für Personen her.
• Laden Sie alle hoch.
• Verbinden Sie sie mit der API für Links.
• Laden Sie alle Aktivitäten für die Personen, die wir gerade hochgeladen haben.
• Vergleichen Sie die aktuelle Personenliste mit dieser Liste.
• Wenn einige Personen nicht auf der Serverliste auftauchen, fügen Sie sie beiden APIs mittels Post-Requests hinzu.
Vielleicht fragen Sie sich, warum wir nicht prüfen, ob die Personen auch auf der Serverliste stehen: Wir vergleichen nur die aktuelle Liste, da wir davon ausgehen können, dass Personen auf der Serverliste nur vom System überschrieben werden können.
Fast fertig – jetzt fehlt nur noch LoadPeople:


Der Prozess ist hier so ziemlich der gleiche wie weiter oben, nur andersherum.
Jetzt müssen wir nur noch read.py und admin.py anpassen, um die Änderungen an den Klassifizierungsdefinitionen zu reflektieren. Dazu müssen Sie einfach nur den ursprünglichen NFC-Klassifizierungsaufruf ändern:
self=NFC('pi.xml','http://someurl.com/api/People','http://someurl.com/api/Achievements','http://someurl.com/api/Joins')
Endlich – wir sind fertig! Wenn Sie jetzt read.py ausführen, sollte jede Person zur Datenbank hinzugefügt werden.

  • Sign in to reply
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2026 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube