综合案例2.0-智能刷卡门禁系统

  • 简介
  • 准备
  • 硬件连接图
  • 代码流程
  • 功能实现
    • 1、物联网平台开发
    • 2、设备端开发
      • 调试
    • 3、场景联动设定
      • 刷卡测试

简介

使用MFRC522 RFID传感器与舵机制作的刷卡门禁系统。使用阿里云平台场景联动功能,只识别设定的卡号,简单实现多卡识别。满足小区使用场景。

准备

本案例需要的硬件

器材 数量
HaaS506开发板 1
MFRC522 RFID传感器 1
SG90舵机 1
喇叭 1
SIM卡 1
RFID卡片 若干
杜邦线 若干

硬件连接图

代码流程

1、连接阿里云平台
2、上报门禁状态
3、读RFID卡号,上传阿里云平台
4、云平台判断卡号,控制门禁
5,开门后等待时间,关闭门禁,上传门禁状态

功能实现

1、物联网平台开发

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
2、创建产品属性(添加物模型)
选择产品功能定义编辑草稿

1、添加自定义功能
2、按照图2显示添加标识符数据类型(标识符要与代码一致)
3、点击发布上线

  • 点击确定

2、设备端开发

  • 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。

  • 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。

  • rc522传感器读卡案例参考

  • 舵机使用案例参考

  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)

# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.getDevImei()
...

改为

# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...

注意:代码中mp3文件需要自行添加

main.py

# coding=utf-8
from driver import PWM
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import kv
import mfrc522
import audio #当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgradeprint('***** connect lp succeed****')data_handle = {}data_handle['device_handle'] = device.getDeviceHandle()#当连接断开时,触发'disconnect'事件
def on_disconnect():print('linkkit is disconnected')#当iot云端下发属性设置时,触发'props'事件
def on_props(request):global servo_dataparams=request['params']params=eval(params)servo=params["open_door"]servo_data={}if servo ==1:param2 = {'freq':50, 'duty': 12 }pwm_lpg.setOption(param2) print('open zhe door')    servo_data["open_door"]= 1servo_data_str=ujson.dumps(servo_data)data={'params':servo_data_str}       device.postProps(data)aud.play('/data/pyamp/welcome.mp3')   time.sleep(3)  param2 = {'freq':50, 'duty': 5 }pwm_lpg.setOption(param2) time.sleep(1)servo_data["open_door"]= 0servo_data_str=ujson.dumps(servo_data)data={'params':servo_data_str}       device.postProps(data)else:pass#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):print('clound req id  is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):print('err msg is {} '.format(err))#网络连接的回调函数
def on_4g_cb(args):global g_connect_statuspdp = args[0]netwk_sta = args[1]if netwk_sta == 1:g_connect_status = Trueelse:g_connect_status = False#网络连接
def connect_network():global net,on_4g_cb,g_connect_status#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.net = network.NetWorkClient()g_register_network = Falseif net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:g_register_network = Trueelse:g_register_network = Falseif g_register_network:#注册网络连接的回调函数on(self,id,func);  1代表连接,func 回调函数  ;return 0 成功net.on(1,on_4g_cb)    net.connect(None)else:print('网络注册失败')while True:if g_connect_status:print('网络连接成功')breaktime.sleep_ms(20)#动态注册回调函数
def on_dynreg_cb(data):global deviceSecret,device_dyn_resigter_succeddeviceSecret = datadevice_dyn_resigter_succed = True# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):global on_dynreg_cb,device,deviceSecret,device_dyn_resigter_succedkey = '_amp_customer_devicesecret'deviceSecretdict = kv.get(key)if isinstance(deviceSecretdict,str):    deviceSecret = deviceSecretdict if deviceSecretdict is None or deviceSecret is None:key_info = {'productKey': productKey  ,'productSecret': productSecret ,'deviceName': deviceName}# 动态注册一个设备,获取设备的deviceSecret#下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,if not device_dyn_resigter_succed:device.register(key_info,on_dynreg_cb)   def upload_uid():global uid_datauid_data["rfid"]= uiduid_data_str=ujson.dumps(uid_data)data={'params':uid_data_str}      device.postProps(data)def do_read():global uid,uid_datardr=mfrc522.MFRC522()uid = ''try:while True:(stat, tag_type) = rdr.request(rdr.REQIDL)if stat == rdr.OK:(stat, raw_uid) = rdr.anticoll()if stat == rdr.OK:  uid=hex(raw_uid[0])[2:]+hex(raw_uid[1])[2:]+hex(raw_uid[2])[2:]+hex(raw_uid[3])[2:]     print(' - uid   : ',uid)aud.play('/data/pyamp/ding.mp3') time.sleep(1)upload_uid()else:print('read error')time.sleep(1)           except KeyboardInterrupt:print("Bye")if __name__ == '__main__':ICCID=Noneg_connect_status = Falsenet = Nonedevice = NonedeviceSecret = NonedeviceName = NoneproductKey = "your productKey "productSecret = "your productSecret "device_dyn_resigter_succed = False# 连接网络connect_network()# 获取设备的IMEI 作为deviceName 进行动态注册deviceName = modem.info.getDevImei()#获取设备的ICCIDICCID=modem.sim.getIccid()#初始化物联网平台Device类,获取device实例device = Device()if deviceName is not None and len(deviceName) > 0 :#动态注册一个设备dyn_register_device(productKey,productSecret,deviceName)else:print("获取设备IMEI失败,无法进行动态注册")while deviceSecret is None:time.sleep(0.2)print('动态注册成功:' + deviceSecret)key_info = {'region' : 'cn-shanghai' ,'productKey': productKey ,'deviceName': deviceName ,'deviceSecret': deviceSecret ,'keepaliveSec': 60,}#打印设备信息print(key_info)#device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数device.on(device.ON_CONNECT,on_connect)device.on(device.ON_DISCONNECT,on_disconnect)device.on(device.ON_PROPS,on_props)device.on(device.ON_SERVICE,on_service)device.on(device.ON_ERROR,on_error)device.connect(key_info)#上报信息servo_data={}pwm_lpg = PWM()pwm_lpg.open("pwm_lpg")param2 = {'freq':50, 'duty': 5 }pwm_lpg.setOption(param2) time.sleep(1)servo_data["open_door"]= 0servo_data_str=ujson.dumps(servo_data)data={'params':servo_data_str}       device.postProps(data)#音频实例化aud=audio.Audio()aud.set_pa()        #开启使能aud.setVolume(10)    #设置音量print('witing read ------ ')uid_data={}do_read()

mfrc522.py


from driver import SPI
from driver import GPIOclass MFRC522:OK = 0NOTAGERR = 1ERR = 2REQIDL = 0x26REQALL = 0x52AUTHENT1A = 0x60   #验证A密钥AUTHENT1B = 0x61   #验证B密钥def __init__(self):self.spi=SPI()self.spi.open('SPI0')self.rst=GPIO()self.rst.open('rst')self.rst.write(0)   self.rst.write(1)self.init()def _wreg(self, reg, val):writeBuf=bytearray([int(0xff & ((reg << 1) & 0x7e)),int(0xff & val)])self.spi.write(writeBuf,2)def _rreg(self, reg):readBuf=bytearray(1)writeBuf=bytearray([int(0xff & (((reg << 1) & 0x7e) | 0x80))])self.spi.write(writeBuf,1)self.spi.read(readBuf,1)return readBuf[0]def _sflags(self, reg, mask):self._wreg(reg, self._rreg(reg) | mask)def _cflags(self, reg, mask):self._wreg(reg, self._rreg(reg) & (~mask))def _tocard(self, cmd, send):recv = []bits = irq_en = wait_irq = n = 0stat = self.ERRif cmd == 0x0E:irq_en = 0x12wait_irq = 0x10elif cmd == 0x0C:irq_en = 0x77wait_irq = 0x30self._wreg(0x02, irq_en | 0x80)self._cflags(0x04, 0x80)self._sflags(0x0A, 0x80)self._wreg(0x01, 0x00)for c in send:self._wreg(0x09, c)self._wreg(0x01, cmd)if cmd == 0x0C:self._sflags(0x0D, 0x80)i = 2000while True:n = self._rreg(0x04)i -= 1if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):breakself._cflags(0x0D, 0x80)if i:if (self._rreg(0x06) & 0x1B) == 0x00:stat = self.OKif n & irq_en & 0x01:stat = self.NOTAGERRelif cmd == 0x0C:n = self._rreg(0x0A)lbits = self._rreg(0x0C) & 0x07if lbits != 0:bits = (n - 1) * 8 + lbitselse:bits = n * 8if n == 0:n = 1elif n > 16:n = 16for _ in range(n):recv.append(self._rreg(0x09))else:stat = self.ERRreturn stat, recv, bitsdef _crc(self, data):self._cflags(0x05, 0x04)self._sflags(0x0A, 0x80)for c in data:self._wreg(0x09, c)self._wreg(0x01, 0x03)i = 0xFFwhile True:n = self._rreg(0x05)i -= 1if not ((i != 0) and not (n & 0x04)):breakreturn [self._rreg(0x22), self._rreg(0x21)]def init(self):self.reset()self._wreg(0x2A, 0x8D)self._wreg(0x2B, 0x3E)self._wreg(0x2D, 30)self._wreg(0x2C, 0)self._wreg(0x15, 0x40)self._wreg(0x11, 0x3D)self.antenna_on()def reset(self):self._wreg(0x01, 0x0F)def antenna_on(self, on=True):if on and ~(self._rreg(0x14) & 0x03):self._sflags(0x14, 0x03)else:self._cflags(0x14, 0x03)def request(self, mode):self._wreg(0x0D, 0x07)(stat, recv, bits) = self._tocard(0x0C, [mode])if (stat != self.OK) | (bits != 0x10):stat = self.ERRreturn stat, bitsdef anticoll(self):ser_chk = 0ser = [0x93, 0x20]self._wreg(0x0D, 0x00)(stat, recv, bits) = self._tocard(0x0C, ser)if stat == self.OK:if len(recv) == 5:for i in range(4):ser_chk = ser_chk ^ recv[i]if ser_chk != recv[4]:stat = self.ERRelse:stat = self.ERRreturn stat, recvdef select_tag(self, ser):buf = [0x93, 0x70] + ser[:5]buf += self._crc(buf)(stat, recv, bits) = self._tocard(0x0C, buf)return self.OK if (stat == self.OK) and (bits == 0x18) else self.ERRdef auth(self, mode, addr, sect, ser):return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]def stop_crypto1(self):self._cflags(0x08, 0x08)def read(self, addr):      #读块数据data = [0x30, addr]data += self._crc(data)(stat, recv, _) = self._tocard(0x0C, data)return recv if stat == self.OK else Nonedef write(self, addr, data):buf = [0xA0, addr]buf += self._crc(buf)(stat, recv, bits) = self._tocard(0x0C, buf)if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):stat = self.ERRelse:buf = []for i in range(16):buf.append(data[i])buf += self._crc(buf)(stat, recv, bits) = self._tocard(0x0C, buf)if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):stat = self.ERRreturn stat

board.json

{"name": "haas506","version": "2.0.0","io": {"pwm_lpg": {"type": "PWM","port": 3},"KEY1": {"type": "GPIO","port": 44,"dir": "irq","pull": "pullup","intMode": "rising"},      "led1": {"type": "GPIO","port": 7,"dir": "output","pull": "pulldown"},"led_g": {"type": "GPIO","port": 32,"dir": "output","pull": "pulldown"},"cs": {"type": "GPIO","port": 15,"dir": "output","pull": "pullup"},"rst":{"type":"GPIO","port": 31,"dir": "output","pull":"pullup"},         "SPI0": {"type": "SPI","port": 0,"mode": "master","freq": 2000000},"serial1": {"type": "UART","port": 0,"dataWidth": 8,"baudRate": 115200,"stopBits": 1,"flowControl": "disable","parity": "none","timeout": 1000},"serial2": {"type": "UART","port": 1,"dataWidth": 8,"baudRate": 9600,"stopBits": 1,"flowControl": "disable","parity": "none","timeout": 1000},"serial3": {"type": "UART","port": 2,"dataWidth": 8,"baudRate": 115200,"stopBits": 1,"flowControl": "disable","parity": "none","timeout": 1000}},"debugLevel": "ERROR","repl": "enable","replPort": 0}
调试

1、阿里云平台,打开实时刷新,刷卡后卡片号码会即时上报

3、场景联动设定

点击规则引擎场景联动,点击创建规则

进行规则设定,如下图所示,云端识别到卡号,就发送一条开门命令。

点击保存

启动场景联动

刷卡测试

使用预设卡片刷卡时,舵机会转动,将门打开,其他卡片不行

5.8 综合案例2.0-智能刷卡门禁系统(仅支持2.2以上版本)相关推荐

  1. 5.18 综合案例2.0-家庭入侵报警系统(仅支持2.2以上版本)

    综合案例2.0-家庭入侵报警系统 简介 无源蜂鸣器 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 调试 3.物联网应用开发 3.1新建'普通项目' 3.2关联产品和设备 3 ...

  2. 用 ESP32 + HaaS Python 打造 RFID 智能刷卡门禁系统

    简介    我们每天进小区人行通道的时候,都会带一张卡或者一个小扣子,进小区以前往往要把小扣子靠近一下闸机,然后门才开,那这一套闸机系统是怎么实现的呢? 本章课程将一步步教会大家如何去学习并且打造一套 ...

  3. haas506 2.0开发教程-hota(仅支持2.2以上版本)

    haas506 2.0开发教程-hota 1.hota.py升级 案例说明 (1)获取URL (2)功能代码 (3)输出log 2.hota.pac升级 案例说明 (1)获取URL (2)功能代码 ( ...

  4. 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    综合案例2.0 - 蓝牙遥控小车1- 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1.MLT-BT05 4.0 蓝牙模块 2.ASRPRO-2 ...

  5. 5.31 综合案例2.0 - 在线音乐盒

    综合案例2.0 - 在线音乐盒 一.案例说明 二.准备器件 三.案例连线 四.代码 代码说明 复制 五.测试 一.案例说明 用python写一个在线音乐播放器,MP3云喇叭 本案例制作一个联网下载声音 ...

  6. 5.38 综合案例2.0 -语音助手(短信,蓝牙,M2M设备间通信)

    综合案例2.0 - 语音助手 效果展示 案例说明 原理 器件 语音助手功能实现 1,ASRPRO-2m模块 下载代码连线 模块编程说明 2,模块与开发板接线 3,语音助手代码 功能1:语音发短信说明 ...

  7. 5.24 综合案例2.0-雷达避障系统(仅支持2.2以上版本)

    综合案例2.0-雷达避障系统 简介 AJ-SR04M- T-X超声波测距模块 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 3.调试 简介 近年来,随着智能汽车.智能机器人 ...

  8. 5.25 综合案例2.0-居家隔离监控系统(2.2版本接口有更新)

    综合案例2.0-居家隔离监控系统 简介 AJ-SR04M- T-X超声波测距模块 准备 硬件连接图 代码流程 功能实现 1.物联网平台开发 2.设备端开发 3.调试 4.创建钉钉机器人 5.IoT S ...

  9. 5.20 综合案例2.0-甲醛浓度检测系统(2.2版本接口有更新)

    综合案例2.0-甲醛浓度检测系统 简介 电化学甲醛模组 准备 硬件连接图 代码流程 1.物联网平台开发 2.设备端开发 调试 3.物联网应用开发 3.1新建'普通项目' 3.2关联设备 3.3创建we ...

最新文章

  1. 禁止/启用angularjs相关缓存的方法
  2. spring手动控制事务开启_“上帝视角”图解Spring事务的传播机制原理
  3. hdu 2686(多线程dp)
  4. 编程练习:Matlab 一个小任务(-)
  5. ubuntu 环境下调试mysql源码_【转】Ubuntu 16.04下 Mysql 5.7.17源码编译与安装
  6. 高等数学下-赵立军-北京大学出版社-题解-练习11.3
  7. 高等数学上-赵立军-北京大学出版社-题解-练习5.3
  8. 使用内存回流的方法来实现将image的内容转换为 byte[]
  9. iOS 打包.framework(包括第三方、图片、xib、plist文件)详细步骤及需要注意的地方...
  10. 【C语言重点难点精讲】C语言预处理
  11. C++:构造函数之初始化列表
  12. JDBC基本知识总结概括及8个阶段优化过程:
  13. Android 系统(42)---使用BatteryHistorian分析和优化应用电量
  14. 就问你慌不慌:每天都有 一百万 程序员在投简历
  15. Python实现将一个长度为n的列表划分 ,每个子列表中包含m个元素
  16. r0~r15寄存器作用
  17. PostGIS测试 - 坐标系统(spatial_ref_sys)
  18. 【Unity学习笔记】Canvas Scaler组件
  19. win10家庭版(阉割版)打开远程桌面服务
  20. access 有效性规则和有效性文本

热门文章

  1. 从IO看数据库底层实现原理
  2. 《Visual C# 程序设计》课程学习(10)——第10章 Windows 窗体应用程序开发
  3. 基于JAVA台球收费管理系统设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署
  4. 网桥接口非混杂模式下数据包转发
  5. 11 | DDD实践:如何用DDD重构中台业务模型
  6. 关于类似新浪微博的后台问题
  7. php 数组 合并相同元素,php合并数组中相同元素的方法
  8. 人工智能、机器学习与深度学习
  9. stm32---段式屏LCD时序图HT1621B驱动
  10. 【Python爬虫】 验证码图像识别 --- 第三弹 (极验验证码识别)