python - 将 RFID 标签与 Python Flask 中的 MFRC522 模块链接,以使用 Raspberry pi3 访问学生数据库

标签 python html css rfid

我大约 2 个月前才开始学习 Python,因为我正在从事一个大学元素。

我想创建一个“大学”网页,可以读取 RFID 卡标签以根据卡标签的唯一 ID 号访问不同的 HTML 文件(学生文件)。代码本身没有显示任何错误,但问题是:当我将标签放入扫描仪时,我希望访问的 HTML 没有出现。扫描仪本身在与元素无关的基本读写文件中工作,因此我确定扫描仪正在工作。所以,问题是:是否有更好的方法来解决这个问题,并提供一个链接建议来研究让这个想法发挥作用?

编辑:我将重新表述这个问题,有没有人知道一种方法可以将 Flask 服务器与 RFID 标签中的读写文件连接起来,并使用特定的第三方模块?

功能:一旦 RFID 标签显示在扫描仪中,显示必须根据特定 RFID 标签上的编程进行更改。

Python Flask 文件中的相关信息如下:

import RPi.GPIO as GPIO
from flask import Flask, render_template
import SimpleMFRC522


#HTML & CSS to Python Flask Connection (Web Server)

frame_python = Flask(__name__)

@frame_python.route('/')
def frame_main():
    return render_template('Main.html') .... # cut it short cuz not needed


#RFID Student section

@frame_python.route('/Student/Student_Welcome')
def frame_stud_welcome():
    
     
    reader = SimpleMFRC522.SimpleMFRC522() #information from a different file below
    id = reader.read()
    a = 81143208559            #Variables a,b and c are the uid# of the card tags
    b = 628549754026
    c = 985039970922
    
    try:
     if a == id:
      return render_template('stud1_welcome.html')
     elif b == id:
      return render_template('stud2_welcome.html')
     elif c == id:
      return render_template('stud3_welcome.html')
    
    finally:
        GPIO.cleanup()


if __name__ == '__main__':
    frame_python.run(host='0.0.0.0',port=8080,debug=True)
    
    
    
    
    
#Faculty Section    

stud1_welcome.html 文件:

  <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width">
            <meta name="description" content="Middle C, Christ at the center!">
            <meta name="keywords" content="HTML, CSS, MySQL, Python & Flask Python add-on">
            <meta name="author" content="name">
            
            <title>Smart Campus Information Board | Welcome!</title>
            <link rel="stylesheet" href="/static/style.css">
        </head>
        
    
    <section id="background">
    
        <body>
          
            <header>
                <div class="container">
                 <div id="Branding">
                  <h1><span class="highlight">Smart Campus</span> Information Board</h1>
                </div>
            </header>
        
        <section id="logo">
            <div class="container">
                <img src="/static/img/AMA_logo.png">
                <h3>AMA International University Bahrain</h3>
                <p>Student ID accepted! Welcome Student 1!</p>
            </div>    
        </section>
        
        
        <section id="choices">
            <div class="container">
                <form>
                  <button type="Back to Menu" class="button_1"><a href="{{ url_for('frame_main') }}">Guest</a></button>
                </form>
            </div>    
        </section>
        
    </section>
        
         <footer>
        <p>SCIB Designs, 2019</p>
         </footer>
        </body>
     </html>   
            
            
                       

SimpleMFRC522() 是一个包含我从教程 (https://pimylifeup.com/raspberry-pi-rfid-rc522/) 中获取的库的​​文件。

# Code by Simon Monk https://github.com/simonmonk/

import MFRC522
import RPi.GPIO as GPIO
  
class SimpleMFRC522:

  READER = None;
  
  KEY = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
  BLOCK_ADDRS = [8, 9, 10]
  
  def __init__(self):
    self.READER = MFRC522.MFRC522()
  
  def read(self):
      id, text = self.read_no_block()        
      while not id:
          id, text = self.read_no_block()  
      return id, text

  def read_id(self):
    id = self.read_id_no_block()
    while not id:
      id = self.read_id_no_block()
    return id

  def read_id_no_block(self):
      (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL)
      if status != self.READER.MI_OK:
          return None
      (status, uid) = self.READER.MFRC522_Anticoll()
      if status != self.READER.MI_OK:
          return None
      return self.uid_to_num(uid)
  
  def read_no_block(self):
    (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL)
    if status != self.READER.MI_OK:
        return None, None
    (status, uid) = self.READER.MFRC522_Anticoll()
    if status != self.READER.MI_OK:
        return None, None
    id = self.uid_to_num(uid)
    self.READER.MFRC522_SelectTag(uid)
    status = self.READER.MFRC522_Auth(self.READER.PICC_AUTHENT1A, 11, self.KEY, uid)
    data = []
    text_read = ''
    if status == self.READER.MI_OK:
        for block_num in self.BLOCK_ADDRS:
            block = self.READER.MFRC522_Read(block_num) 
            if block:
            		data += block
        if data:
             text_read = ''.join(chr(i) for i in data)
    self.READER.MFRC522_StopCrypto1()
    return id, text_read
    

    
  def write(self, text):
      id, text_in = self.write_no_block(text)        
      while not id:
          id, text_in = self.write_no_block(text)  
      return id, text_in


  def write_no_block(self, text):
      (status, TagType) = self.READER.MFRC522_Request(self.READER.PICC_REQIDL)
      if status != self.READER.MI_OK:
          return None, None
      (status, uid) = self.READER.MFRC522_Anticoll()
      if status != self.READER.MI_OK:
          return None, None
      id = self.uid_to_num(uid)
      self.READER.MFRC522_SelectTag(uid)
      status = self.READER.MFRC522_Auth(self.READER.PICC_AUTHENT1A, 11, self.KEY, uid)
      self.READER.MFRC522_Read(11)
      if status == self.READER.MI_OK:
          data = bytearray()
          data.extend(bytearray(text.ljust(len(self.BLOCK_ADDRS) * 16).encode('ascii')))
          i = 0
          for block_num in self.BLOCK_ADDRS:
            self.READER.MFRC522_Write(block_num, data[(i*16):(i+1)*16])
            i += 1
      self.READER.MFRC522_StopCrypto1()
      return id, text[0:(len(self.BLOCK_ADDRS) * 16)]
      
  def uid_to_num(self, uid):
      n = 0
      for i in range(0, 5):
          n = n * 256 + uid[i]
      return n

最佳答案

我不知道你在做什么,但只要看看第三方模块的源代码我就可以告诉你 SimpleMFRC522.read() 返回一个元组。当您这样做时:

id = reader.read()

id 现在是一个元组,而不是单个值 - 这就是您的 if 语句未执行的原因。

我的猜测是您可以通过执行以下操作之一来解决此问题:

  • 使用 id = reader.read_id()
  • 使用 id, _ = reader.read()

关于python - 将 RFID 标签与 Python Flask 中的 MFRC522 模块链接,以使用 Raspberry pi3 访问学生数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034938/

相关文章:

python - Django self join ,如何将此查询转换为ORM查询

html - 如何使用 svg 路径基于焦点坐标绘制椭圆?

html - 找出边界来自哪里

html - 为什么显示: table behave differently in Firefox and in Chrome?

jquery - 具有可调整大小的元素的可调整大小的 jQuery UI 小部件

jquery - 页面布局问题/设计问题

css - 在不使用 css 位置的情况下将 div 固定到底部

python - 标记文本,但将复合连字符的单词放在一起

python - sqlalchemy 无法识别我的 mysql 数据库

python - 为什么我使用 4th Runge-Kutta 的代码没有给我预期的值?