mifare Ic卡俗称M1卡的密码验证问题

最近调式M1,得到UID,选择指令都成功。然后进入三次验证时一直不成功
新卡KEYA,KEYB都是默认密码,用的AS3911进入调式,各位弄个的兄弟,来看看,帮帮我,也看看大家。

1个回答

测下验证时间是否正确,用的D8读卡器?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
mifare one卡芯片怎么加密?

最近在研究ic卡全加密,但是不知道M1卡芯片怎么加密? 日常使用的普通ic卡的芯片已经被加密了吗? 希望有高手能够作答。

M1卡ID号算法转换规则: 求大神指导第三步怎么走到第四步的?求教

M1卡ID号算法转换规则: 1、读出的ID是:8E E5 6A E8 2、首位颠倒后的结果是:E8 6A E5 8E 3、前补8个F的结果是:FFFFFFFFE86AE58E 4、转成10进制: -395647602 5、取绝对值:395647602

MFRC522 对Mifare1 S50卡控制块的读写操作

求高手解答,我用MFRC522可以读写Mifare1 S50的数据块,但是无法对控制块的读写。比如对于控制块的控制字节,任何情况下只需要验证密码A即可,但是每次的读取都是16字节,且读出的控制块内容全部为0,该如何操作是好!!! 比如我想读取或者写入扇区1、块3的控制字节,该如何操作。

安卓NFC开发中能否用NfcA类来对Mifare Classic卡操作??

测试机型:Nexus5 问题:因为手机用的不是NXP的方案,不支持MifareClassic卡,但是NfcA和Mifare的标准是一样的,所以猜测能否这样做?有大神可以指教下吗?

安卓开发中可以用NfcA类来操作Mifare Classic卡吗???

测试机型Nexus5 问题1:Mifare Classic卡被手机认成NfcA标签,NfcA类关于IO的只有一个transceive函数。可以用这个函数对卡进行操作吗???

想问mifare协议下几个byte的含义

![图片说明](https://img-ask.csdn.net/upload/201901/05/1546659991_722466.png) 如图框住的几个byte,想知道指令含义以及说明文档是哪个

公司要做卡系统,求卡号生成算法!

公司要做卡系统,对卡号要求:第一:不能重复,要唯一;第二:长度可控制,要在12位到18位之间;第三:不能让别人猜出来(没有绝对,只要很难猜就行)。 其实UUID很适合,但是太长了,而且我们做的是在电视遥控器上用,为了用户输入方便,要求全是数字的。上网查了太多的资料,但是没有一个有明确的答复的!我用的是java开发平台。最好有些示范性代码!谢谢! [b]问题补充:[/b] 对于congjl2002的回答,我觉得是一个思路,但是能保证不重复吗? [b]问题补充:[/b] 目前,我是这样做的,不知道可不可以。 首选在卡是一批一批生成的,将卡的批次加入到卡号里面,其它卡号中随机生成,只要保证同一批次的没有重复号就可以了。最后根据congjl的建议,对生成的号码加密后,生成几位校验码再插入其中,这样就安全了 

我想制作一个电子阅读器用stm32f103rct6,求住制作流程,网上有一个,不是很懂求指教

这是我从网上down的方法,有点不懂,关键就是编程还有MF RC522模块设计,求大虾指教,谢谢 1 硬件设计 1.1 硬件结构设计 RFID阅读器基于STM32单片机设计,芯片型号选择为STM32F103RBT6。该芯片为LQFP64封装, 内部有128 KB Flash和20 KB RAM,采用32位的ARM CortexTM-M3内核, 最高支持主频72 MHz,拥有2个SPI接口、 2个USART接口、1个USB接口、2个I2C接口和7个定时器。支持SWD和JTAG调试模式及IAP和ISP编程。 STM32单片机支持J-Link在线调试,J-Link调试有两种模式:JTAG调试和SWD调试。在线调试的便捷性,可以极大缩短程序的开发周期,提高开发效率。本系统采用的调试模式为SWD模式,只需2根SWDIO和SWCLK信号线,相比JTAG模式更加节约I/O口资源。阅读器的硬件结构框图如图1所示。 1.2 电源模块设计 系统可使用直流电源或电池供电,外部直流电源电压为8.4 V;电池电压为7.2 V,2 600 mA/h的锂电池。电源模块设计原理图如图2所示。 电源模块工作原理:当插座J1连接外部直流电源时,电流可经过D4给电池充电,直流电源经开关JP1连接IRF7404的G极,使IRF7404的D极与S极断开,则系统使用外部直流电源供电;当不使用直流电源、按下开关时,D4可将CD_POWER与电池断开,IRF7404的G极为低电平, IRF7404导通, 则系统使用电池供电。SYS_ POWER电压经过LM2576S-3.3转换为3.3 V为系统的各模块供电。 1.3 MF RC522模块设计 MF RC522是阅读器的读卡芯片,工作频率为13.56 MHz,工作模式支持ISO 14443A标准,芯片内部驱动器可以直接驱动阅读器的天线,无需其他电路。MF RC522具有3种接口模式:SPI接口模式、UART模式和I2C总线模式[3]。其中SPI模式的通信速度最快,可达到10 Mb/s。 MF RC522与主机接口模式有关的两个引脚为IIC和EA:当IIC引脚拉高时,表示当前模式为I2C模式,若IIC引脚为低电平时,再通过EA引脚电平来区分。EA为高电平时,表示SPI模式;为低电平时,则表示UART模式[4]。本设计中MF RC522与MCU采用SPI通信,与AT45DB161共享一个MCU的SPI2接口。 在系统中,MF RC522和天线电路一起作为单独模块使用,以便于更换与维修。天线模块与主板之间通过插座连接。 天线是阅读器中的一个重要组成部分。其作用是向外发射一组固定频率的电磁波,为射频卡提供能量、传递数据。 本系统中使用的是PCB天线,天线的设计关系到阅读器的读写距离,甚至关系到阅读器是否能正常与射频卡通信。RC522的天线设计须注意以下两点:(1)为了让射频卡能获取足够大的能量驱动本身的集成电路,设计天线时应该保证向外辐射足够大的电磁波; (2)为了提高读卡数据的准确性,需要考虑调谐电路的通频带,确保调制信号的准确性。 天线的匹配电路可分为:天线线圈、LC谐振电路和EMC滤波电路。RC522的天线匹配电路如图3所示,其中RQ为品质因素Q的匹配电阻,Lant为天线的电感。 1.4 显示模块设计 阅读器选用2.8英寸的TFT LCD触摸屏。在本系统中移植了GUI模块,使得人机交流界面操作更加便捷、友善。触摸屏为四线电阻屏,使用ADS7843作为A/D转换芯片。ADS7843是内置12位模/数转换、低导通电阻模拟开关的串行接口芯片,模/数转换输出范围0~4 095,工作电压2.7 V~5 V,参考电压VREF为1 V~VCC,转换电压的输入范围为0~VREF,最高转换速率为125 kHz[5]。ADS7843与MCU的接口为SPI1。 驱动层的程序基于硬件平台,主要是为中间服务层提供硬件驱动接口函数,完成底层的硬件操作。编写STM32的内部资源驱动程序时,调用了ST公司的固件库函数。 中间服务层主要是为上层应用程序提供库支持和服务接口。中间服务层的程序在驱动层程序上开发,并封装驱动程序的接口。如FATS文件系统是在AT45DB161的驱动程序上移植,为上层的应用程序提供文件创建、写入、读出、删除等服务;GUI模块是在LCD显示驱动程序上开发,将LCD驱动的画点画线函数封装成不同的控件,在控件上加载相应的数据结构,为界面应用程序提供控件的创建、销毁等操作。 应用层程序是面向用户,通过调用中间服务函数和库函数来完成相应的数据处理和控制功能等。 2.2 Free RTOS实时操作系统 Free RTOS是一个轻量级的操作系统,基本满足较小系统的需要。该操作系统完全免费且源码公开,同时具有可移植、可裁减、调度策略灵活的特点。 在本设计中Free RTOS的任务之间的关系如图5所示。 2.3 GUI模块 GUI模块是一个中间服务层程序,为显示应用程序提供控件显示服务。如控件的显示位置、尺寸、颜色以及控件响应的回调函数入口地址等。在本系统中GUI控件包含有文本框、编辑框、进度条、图像框、下拉列表、按钮等。每个控件都可以注册一个回调函数,这个函数对应了该控件的响应功能函数。 2.4 FAT文件系统 FatFs文件系统是中间服务层程序,建立在AT45DB161驱动程序上,文件系统提供了磁盘I/O接口和应用程序接口。磁盘I/O接口函数位于diskio.c文件,常用的接口函数有读磁盘disk_read()和写磁盘disk_write()。这两个函数分别调用AT45DB161驱动程序的读扇区和写扇区函数。在文件系统中一个扇区的大小为512 B,与AT45DB161的页大小一致。 为了使FatFs文件系统与Windows的文件系统兼容,要使用FAT32格式来格式化磁盘。f_open()函数与f_close()函数必须要成对出现,即打开一个文件操作完成后必须要关闭这个文件。在对文件进行操作前必须先调用f_mount(0,&Fs)函数对工作区进行注册,操作完成后也需要调用f_mount(0,NULL)函数对工作区进行注销。 2.5 MF RC522驱动程序流程 本系统中使用的射频卡为Mifare1 S50,也简称为M1卡,该卡有16个扇区,每个扇区有4个块,每个块可存储16 B的数据。MF RC522对M1卡进行读写控制,分别有寻卡、防碰撞、选卡、认证、读块和写块等过程。 MF RC522驱动程序流程如下: (1)寻卡:寻找感应区内所有符合ISO14443A标准的卡,寻卡成功后,返回卡的类型。 (2)防碰撞:通过防碰撞命令查看多张M1卡之间是否发生碰撞,若发生碰撞,使用防碰撞算法进行处理;若未发生碰撞,则MF RC522与M1卡进行通信,如果通信成功,读出M1卡中的序列号。 (3)选卡:根据M1卡的序列号进行选卡。 (4)密码验证:密码验证模式有验证A密钥和验证B密钥,通过这两种模式来验证块地址、密码和卡片序列号。 (5)读数据块:根据提供的块地址读取块数据。 (6)写数据块:根据提供的块地址写入块数据,操作完成后命令M1卡进入休眠状态。 2.6 AT45DB161D驱动程序 AT45DB161D是一个外部Flash存储器,拥有2 MB的容量,分为4 096个页,可配置为每页512 B,还拥有2个512 B的缓冲区。在主存储器正在编程时,缓冲区允许接收数据,且支持数据流式写入。AT45DB161的初始化包括STM32的引脚配置和SPI2接口配置,初始化之后才能进行读写操作。读写页操作流程如下: (1)读页操作流程 ①检测AT45芯片是否忙。若忙,则继续读忙,直到芯片空闲;若芯片空闲,则执行流程②。 ②向AT45芯片写入命令0x53和页地址。0x53命令是将Flash中整页的数据读到缓冲区1中。 ③向AT45芯片写入命令0xD4和页偏移地址及数据长度。0xD4命令是读缓冲区1中的数据。 ④读页操作完成。 (2)写页操作流程 ①检测AT45芯片是否忙。若忙,则继续读忙,直到芯片空闲;若芯片空闲,则执行流程②。 ②向AT45芯片写入命令0x84、页偏移地址及需要写入的数据。0x84命令是将数据写到缓冲区1中。 ③向AT45芯片写入命令0x83和页地址。0x83命令是将缓冲区1中的数据写到Flash指定的页。使用0x83命令,写入前不需要对页进行擦除操作。 ④写页操作完成。 3 性能测试与实验分析 3.1手持式阅读器的功能测试 需要测试的功能有对M1卡读写、文件读写、与PC机数据通信等功能。为了便于测试上述功能,将本设计应用在校园消费系统上进行测试。测试步骤如下: (1)用串口线将RFID阅读器与PC机相连。运行PC机的上位机程序,设置串口参数为:波特率9 600 b/s,数据位8 bit,停止位1 bit,无校验位,无流控制。 (2)对M1卡读写功能测试。通过上位机软件发送指令和数据至阅读器,阅读器将指定数据写入M1卡。然后再将M1卡数据读出,传回给上位机软件显示,并比较写入数据和读出数据,如图6所示。 (3)文件读写测试。由于读M1卡的数据以文件的形式存放在阅读器的外部Flash中,该Flash由文件系统管理。用USB线连接阅读器和PC机,阅读器以盘符的形式在PC机上显示,从磁盘中将文件复制到PC机上,用上位机软件打开读出软件,记录测试数据。 (4)与PC机数据通信测试。以上两项测试通过则表明阅读器能与PC机进行正常通信。 3.2 性能测试与分析 系统的性能测试主要是锂电池的续航时间及RFID有效读卡距离等。系统性能测试如表1所示。 (1)锂电池的续航时间需要分别测试最长待机时间和连续工作时间。 ①最长待机时间测试:将锂电池充满电,阅读器使用电池供电,将阅读器开机而不使用,记录待机时间。 ②连续工作时间测试:将锂电池充满电,阅读器使用电池供电,编写一个测试程序,让阅读器定时每30 s读取M1卡信息。记录工作时间。 ③用万用表分别测量阅读器的待机消耗电流和工作消耗电流,并记录电流值。 (2)RFID有效读卡距离。将阅读器固定不动,M1卡平行放在阅读器天线平面的正上方200 mm处,将M1卡缓慢向阅读器移动,直到阅读器能正确读取M1卡中数据为止。测量卡与阅读器天线之间的距离并记录数据。 通过对上述的系统功能、性能进行验证,分析实验测出的相应数据,系统的功能基本能达到了初期预设的技术指标。 本文设计的阅读器有良好的人机交流界面,可通过触控操作,显示屏可显示M1卡中存储信息。经过实验证明,在70 mm的范围内能准确读写M1卡中的数据。该阅读器具有超长待机和低功耗的功能。经过实际功能测试,已成功地将该设计应用于校园消费系统。 专注

在使用mfcuk出现的问题

mfcuk - 0.3.8 Mifare Classic DarkSide Key Recovery Tool - 0.3 by Andrei Costin, zveriu@gmail.com, http://andreicostin.com WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_skgt.mfd' WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_ratb.mfd' WARN: cannot open template file './data/tmpls_fingerprints/mfcuk_tmpl_oyster.mfd' INFO: Connected to NFC reader: ACS / ACR122U PICC Interface mfcuk: ERROR: connecting to MIFARE Classic tag mfcuk: ERROR: selecting tag on the reader ACS / ACR122U PICC Interface 我用的设备是acr122-a9

rfid卡读卡器到底是通过什么来判定卡片的商家

rfid卡读卡器到底是通过什么来判定卡片的商家,如:nxp,复旦微? rFID卡读卡器到底是通过什么来判定卡的类型?如nxp:70卡、50卡、Mifare UltraLight卡、Mifare Light卡……?????

android HCE模拟卡怎么与读卡器进行数据交互?

读卡器中的协议为ISO 14443,HCE模拟卡应该怎么与读卡器进行数据交互?

关于arduino怎么连接两个RFID模块的问题

毕业设计我要做一个基于rfid的巡更系统,为此我要连接至少两个的RFID读写模块。 但网上的示例都是只用一个的,引脚的插得位置也是一样的,我不太清楚引脚都是怎么定义的。 我用的是mfrc522的模块。 以下面代码为例,我只知道#define RST_PIN 9 和#define SS_PIN 10 是定义RST和SS引脚的,但剩下的SCK MOSI MISO 是怎么定义的。本来我以为剩下的是可以公用的,就用一个面包板连接起来,但发现不行。 现在可能是要定义这些的引脚,但我不知道哪部分代码是定义这些引脚的。 求大神指点一下。 ``` #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // 可配置,见典型引脚布局以上 #define SS_PIN 10 // Configurable, see typical pin layout above MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance /* Set your new UID here! */ #define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // Initialize serial communications with the PC 初始化与PC串行通信 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) 如果没有串口打开,什么也不做(添加基于atmega32u4 Arduinos) SPI.begin(); // Init SPI bus 初始化SPI总线 mfrc522.PCD_Init(); // Init MFRC522 card Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!")); //警告:这个例子改写你的UID变卡UID,小心使用! // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory. 准备关键所有按键都设置在芯片ffffffffffff H从工厂交货。 for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } // Setting the UID can be as simple as this: 设置UID可以这么简单: //void loop() { // byte newUid[] = NEW_UID; // if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { // Serial.println("Wrote new UID to card."); // } // delay(1000); //} // But of course this is a more proper approach 当然,这是一个更恰当的方法 void loop() { // Look for new cards, and select one if present 寻找新卡,并选择一个如果存在 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } // Now a card is selected. The UID and SAK is in mfrc522.uid.现在选择卡片。UID和SAK是mfrc522.uid。 // Dump UID转储的UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Dump PICC type 转为PICC类型 // MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Serial.print(F("PICC type: ")); // Serial.print(mfrc522.PICC_GetTypeName(piccType)); // Serial.print(F(" (SAK ")); // Serial.print(mfrc522.uid.sak); // Serial.print(")\r\n"); // if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI // && piccType != MFRC522::PICC_TYPE_MIFARE_1K // && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { // Serial.println(F("This sample only works with MIFARE Classic cards.")); // return; // } // Set new UID 设置新的UID byte newUid[] = NEW_UID; if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn't get confused / /停止PICC和重新选择那么DumpToSerial不混乱 mfrc522.PICC_HaltA(); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { return; } // Dump the new memory contents 转为新的内容储存 Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); } ```

如何对使用联合的C结构建模Go绑定?

<div class="post-text" itemprop="text"> <p>I'm currently writing a <a href="https://github.com/fuzxxl/freefare" rel="nofollow">Go wrapper</a> for the <a href="http://code.google.com/p/libfreefare" rel="nofollow">libfreefare</a>. The API of the libfreefare contains the following function:</p> <pre><code>struct mifare_desfire_file_settings { uint8_t file_type; uint8_t communication_settings; uint16_t access_rights; union { struct { uint32_t file_size; } standard_file; struct { int32_t lower_limit; int32_t upper_limit; int32_t limited_credit_value; uint8_t limited_credit_enabled; } value_file; struct { uint32_t record_size; uint32_t max_number_of_records; uint32_t current_number_of_records; } linear_record_file; } settings; }; int mifare_desfire_get_file_settings (MifareTag tag, uint8_t file_no, struct mifare_desfire_file_settings *settings); </code></pre> <p>What is the ideomatic solution for wrapping such a function? If the <code>struct mifare_desfire_file_settings</code> wouldn't contain any unions, my wrapper would probably look like this:</p> <pre><code>type DESFireFileSettings struct { // all fields exported, no methods } func (t DESFireTag) FileSettings(fileNo byte) (DESFireFileSettings, error) </code></pre> <p>How should I proceed?</p> </div>

使用RC522写入block 0,写特殊指令0x40和0x43时超时。

使用树莓派SPI驱动RC522模块,读取block 0数据成功,但是写入block 0失败。参照网上资料,写入block 0前需要先写入两个特殊指令0x40和0x43,但是当我通过调用函数 ``` MFRC522_WriteReg(BitFramingReg, 0x07) MFRC522_ToCard(PCD_TRANSCEIVE, 0x40) //0x40 MFRC522_WriteReg(BitFramingReg, 0x00) MFRC522_ToCard(PCD_TRANSCEIVE, 0x43) //0x43 ``` 写入这两个命令时总是报错超时失败。但是其他request,select等流程调用 这两个函数都能成功,是在不知哪里有问题。怀疑是不是买的卡片不支持写入block 0,但是买的时候确实说是支持的。 下面是具体代码: ``` RC522.py: import RPi.GPIO as GPIO import spi import signal import time class MFRC522: PCD_IDLE = 0x00 # cancel current command PCD_AUTHENT = 0x0E # authent PCD_RECEIVE = 0x08 # receive data PCD_TRANSMIT = 0x04 # send data PCD_TRANSCEIVE = 0x0C # send & receive data PCD_RESETPHASE = 0x0F # reset PCD_CALCCRC = 0x03 # CRC calculate PICC_REQIDL = 0x26 # detect cards, not slepp PICC_REQALL = 0x52 # detect cards, all PICC_ANTICOLL = 0x93 # anti collision PICC_SElECTTAG = 0x93 # select card PICC_AUTHENT1A = 0x60 # authent A PICC_AUTHENT1B = 0x61 # authent B PICC_READ = 0x30 # read block PICC_WRITE = 0xA0 # write block PICC_DECREMENT = 0xC0 # dec money PICC_INCREMENT = 0xC1 # inc money PICC_RESTORE = 0xC2 # send data to buf PICC_TRANSFER = 0xB0 # save date from buf PICC_HALT = 0x50 # idle status Reserved00 = 0x00 # register CommandReg = 0x01 CommIEnReg = 0x02 DivlEnReg = 0x03 CommIrqReg = 0x04 DivIrqReg = 0x05 ErrorReg = 0x06 Status1Reg = 0x07 Status2Reg = 0x08 FIFODataReg = 0x09 FIFOLevelReg = 0x0A WaterLevelReg = 0x0B ControlReg = 0x0C BitFramingReg = 0x0D CollReg = 0x0E Reserved01 = 0x0F Reserved10 = 0x10 ModeReg = 0x11 TxModeReg = 0x12 RxModeReg = 0x13 TxControlReg = 0x14 TxAutoReg = 0x15 TxSelReg = 0x16 RxSelReg = 0x17 RxThresholdReg = 0x18 DemodReg = 0x19 Reserved11 = 0x1A Reserved12 = 0x1B MifareReg = 0x1C Reserved13 = 0x1D Reserved14 = 0x1E SerialSpeedReg = 0x1F Reserved20 = 0x20 CRCResultRegM = 0x21 CRCResultRegL = 0x22 Reserved21 = 0x23 ModWidthReg = 0x24 Reserved22 = 0x25 RFCfgReg = 0x26 GsNReg = 0x27 CWGsPReg = 0x28 ModGsPReg = 0x29 TModeReg = 0x2A TPrescalerReg = 0x2B TReloadRegH = 0x2C TReloadRegL = 0x2D TCounterValueRegH = 0x2E TCounterValueRegL = 0x2F Reserved30 = 0x30 TestSel1Reg = 0x31 TestSel2Reg = 0x32 TestPinEnReg = 0x33 TestPinValueReg = 0x34 TestBusReg = 0x35 AutoTestReg = 0x36 VersionReg = 0x37 AnalogTestReg = 0x38 TestDAC1Reg = 0x39 TestDAC2Reg = 0x3A TestADCReg = 0x3B Reserved31 = 0x3C Reserved32 = 0x3D Reserved33 = 0x3E Reserved34 = 0x3F NRSTPD = 22 MAX_LEN = 18 MI_OK = 0 MI_NOTAGERR = 1 MI_ERR = 2 MI_TIMEOUT = 3 def __init__(self, dev='/dev/spidev0.0', spd=1000000): self.dev0 = spi.openSPI(device=dev, speed=spd) GPIO.setmode(GPIO.BOARD) GPIO.setup(self.NRSTPD, GPIO.OUT) GPIO.output(self.NRSTPD, 1) self.MFRC522_Init() def MFRC522_WriteReg(self, addr, val): spi.transfer(self.dev0, ((addr<<1)&0x7E, val)) def MFRC522_ReadReg(self, addr): val = spi.transfer(self.dev0, (((addr<<1)&0x7E) | 0x80, 0)) return val[1] def MFRC522_SetRegBitMask(self, reg, mask): tmp = self.MFRC522_ReadReg(reg) self.MFRC522_WriteReg(reg, tmp | mask) def MFRC522_ClearRegBitMask(self, reg, mask): tmp = self.MFRC522_ReadReg(reg) self.MFRC522_WriteReg(reg, tmp & (~mask)) def MFRC522_ToCard(self, command, sendData): retStatus = self.MI_OK backData = [] backLen = 0 irqEn = 0x00 waitIRq = 0x00 lastBits = None n = 0 i = 0 if command == self.PCD_AUTHENT: irqEn = 0x12 waitIRq = 0x10 if command == self.PCD_TRANSCEIVE: irqEn = 0x77 waitIRq = 0x30 self.MFRC522_WriteReg(self.CommIEnReg, irqEn|0x80) # enable interupt self.MFRC522_ClearRegBitMask(self.CommIrqReg, 0x80) # clear interupt flags self.MFRC522_SetRegBitMask(self.FIFOLevelReg, 0x80) # init FIFO self.MFRC522_WriteReg(self.CommandReg, self.PCD_IDLE) # cancel current command for i in range(len(sendData)): self.MFRC522_WriteReg(self.FIFODataReg, sendData[i]) self.MFRC522_WriteReg(self.CommandReg, command) if command == self.PCD_TRANSCEIVE: self.MFRC522_SetRegBitMask(self.BitFramingReg, 0x80) i = 2000 while True: n = self.MFRC522_ReadReg(self.CommIrqReg) i -= 1 if ~((i!=0) and ~(n&0x01) and ~(n&waitIRq)): break self.MFRC522_ClearRegBitMask(self.BitFramingReg, 0x80) if i != 0: if (self.MFRC522_ReadReg(self.ErrorReg) & 0x1B) == 0x00: if n & irqEn & 0x01: retStatus = self.MI_NOTAGERR if command == self.PCD_TRANSCEIVE: n = self.MFRC522_ReadReg(self.FIFOLevelReg) lastBits = self.MFRC522_ReadReg(self.ControlReg) & 0x07 if lastBits != 0: backLen = (n-1)*8 + lastBits else: backLen = n*8 if n == 0: n = 1 if n > self.MAX_LEN: n = self.MAX_LEN for i in range(n): backData.append(self.MFRC522_ReadReg(self.FIFODataReg)) else: retStatus = self.MI_ERR else: retStatus = self.MI_TIMEOUT return (retStatus, backData, backLen) def _CalulateCRC(self, indata): self.MFRC522_ClearRegBitMask(self.DivIrqReg, 0x04) self.MFRC522_SetRegBitMask(self.FIFOLevelReg, 0x80) for i in range(len(indata)): self.MFRC522_WriteReg(self.FIFODataReg, indata[i]) self.MFRC522_WriteReg(self.CommandReg, self.PCD_CALCCRC) i = 255 while True: n = self.MFRC522_ReadReg(self.DivIrqReg) i -= 1 if ~((i != 0) and ~(n&0x04)): break crc = [] crc.append(self.MFRC522_ReadReg(self.CRCResultRegL)) crc.append(self.MFRC522_ReadReg(self.CRCResultRegM)) return crc # function : read block # parameter : blockAddr(0~63) # return : retStatus # backData[16] def MFRC522_ReadBolock(self, blockAddr): retStatus = self.MI_OK # cmd: 0x0c # buf: 0x30 blockAddr crc[2] buf = [] buf.append(self.PICC_READ) buf.append(blockAddr) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 8*self.MAX_LEN): retStatus = self.MI_ERR return (retStatus, backData) # function : write block # parameter : blockAddr(0~63) # writeData[16] # return : retStatus def MFRC522_WriteBlock(self, blockAddr, writeData): retStatus = self.MI_OK # cmd: 0x0c # buf: 0xA0 blockAddr crc[2] buf = [] buf.append(self.PICC_WRITE) buf.append(blockAddr) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or ((backData[0]&0x0F) != 0x0A) or (backLen != 4): retStatus = self.MI_ERR if status == self.MI_OK: # cmd: 0x0c # buf: writeData[16] crc[2] buf2 = [] for i in range(16): buf2.append(writeData[i]) crc = self._CalulateCRC(buf2) buf2.append(crc[0]) buf2.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf2) if (status != self.MI_OK) or ((backData[0]&0x0F) != 0x0A) or (backLen != 4): retStatus = self.MI_ERR return retStatus def MFRC522_Init(self): self.MFRC522_Reset() self.MFRC522_WriteReg(self.TModeReg, 0x8D) self.MFRC522_WriteReg(self.TPrescalerReg, 0x3E) self.MFRC522_WriteReg(self.TReloadRegL, 30) self.MFRC522_WriteReg(self.TReloadRegH, 0) self.MFRC522_WriteReg(self.TxAutoReg, 0x40) self.MFRC522_WriteReg(self.ModeReg, 0x3D) self.MFRC522_AntennaOn() def MFRC522_Reset(self): # reg: 0x01 # buf: 0x0F self.MFRC522_WriteReg(self.CommandReg, self.PCD_RESETPHASE) def MFRC522_AntennaOn(self): # reg: 0x14 # buf: 0bxxxxxx11 temp = self.MFRC522_ReadReg(self.TxControlReg) if not(temp & 0x03): self.MFRC522_SetRegBitMask(self.TxControlReg, 0x03) def MFRC522_AntennaOff(self): # reg: 0x14 # buf: 0bxxxxxx00 self.MFRC522_ClearRegBitMask(self.TxControlReg, 0x03) # function : detect card # parameter : reqMode: detect mode # 0x52 = detect all cards # 0x26 = detect not sleep cards # return : retStatus # backData: card type, 2 bytes # 0x4400 = Mifare_UltraLight # 0x0400 = Mifare_One(S50) # 0x0200 = Mifare_One(S70) # 0x0800 = Mifare_Pro(X) # 0x4403 = Mifare_DESFire def MFRC522_Request(self, reqMode): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x07) # cmd: 0x0c # buf: 0x26/0x52 buf = [] buf.append(reqMode) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 0x10): retStatus = self.MI_ERR return (retStatus, backData) # function : anticoll # parameter : # return : retStatus # backData(Uid, 4 bytes) def MFRC522_Anticoll(self): retStatus = self.MI_OK serNumCheck = 0 self.MFRC522_WriteReg(self.BitFramingReg, 0x00) # cmd: 0x0c # buf: 0x93 0x20 buf = [] buf.append(self.PICC_ANTICOLL) buf.append(0x20) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status==self.MI_OK) and (len(backData)==5): for i in range(4): serNumCheck ^= backData[i] if serNumCheck != backData[4]: retStatus = self.MI_ERR else: retStatus = self.MI_ERR return (retStatus, backData) # function : select card # parameter : Uid # return : retStatus def MFRC522_Select(self, Uid): retStatus = self.MI_OK serNumCheck = 0 # cmd: 0x0c # buf: 0x93 0x70 Uid[4] check crc[2] buf = [] buf.append(self.PICC_SElECTTAG) buf.append(0x70) for i in range(4): buf.append(Uid[i]) serNumCheck ^= Uid[i] buf.append(serNumCheck) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backLen != 0x18): retStatus = self.MI_ERR return retStatus # function : auth sectorkey # parameter : authMode(PICC_AUTHENT1A/PICC_AUTHENT1B) # blockAddr # sectorkey(6 bytes) # Uid(4 bytes) # return : retStatus def MFRC522_Auth(self, authMode, blockAddr, sectorkey, Uid): retStatus = self.MI_OK # cmd: 0x0e # buf: authMode blockAddr sectorkey[6] Uid[4] buf = [] buf.append(authMode) buf.append(blockAddr) for i in range(6): buf.append(sectorkey[i]) for i in range(4): buf.append(Uid[i]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT, buf) if (status != self.MI_OK) or not(self.MFRC522_ReadReg(self.Status2Reg)&0x08): retStatus = self.MI_ERR return retStatus # function : idle # parameter : # return : retStatus def MFRC522_Halt(self): retStatus = self.MI_OK # cmd: 0x0c # buf: 0x50 0x00 crc[2] buf = [] buf.append(self.PICC_HALT) buf.append(0) crc = self._CalulateCRC(buf) buf.append(crc[0]) buf.append(crc[1]) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) retStatus = status return retStatus def MFRC522_WriteCmd40(self): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x07) # cmd: 0x0c # buf: 0x40 buf = [] buf.append(0x40) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backData[0] != 0x0a): retStatus = status return retStatus def MFRC522_WriteCmd43(self): retStatus = self.MI_OK self.MFRC522_WriteReg(self.BitFramingReg, 0x00) # cmd: 0x0c # buf: 0x43 buf = [] buf.append(0x43) (status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, buf) if (status != self.MI_OK) or (backData[0] != 0x0a): retStatus = status return retStatus def MFRC522_StopCrypto1(self): self.MFRC522_ClearRegBitMask(self.Status2Reg, 0x08) def MFRC522_CloseSPI(self): spi.closeSPI(self.dev0) main.py: import RPi.GPIO as GPIO import MFRC522 import signal rc = MFRC522.MFRC522() dataBlock0 = [0x65, 0xa0, 0x8a, 0xe1, 0xae, 0x08, 0x04, 0x00, 0x01, 0x69, 0x21, 0x1a, 0x3c, 0xeb, 0xa9, 0x1d] sectorkey = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff] def read_block0(): (status, tagType) = rc.MFRC522_Request(rc.PICC_REQIDL) if status != rc.MI_OK: print("MFRC522_Request error") return print("MFRC522_Request success, tagType: %#x %#x" %(tagType[0], tagType[1])) (status, Uid) = rc.MFRC522_Anticoll() if status != rc.MI_OK: print("MFRC522_Anticoll error") return print("MFRC522_Anticoll success, Uid: %#x %#x %#x %#x" %(Uid[0], Uid[1], Uid[2], Uid[3])) status = rc.MFRC522_Select(Uid) if status != rc.MI_OK: print("MFRC522_Select error") return print("MFRC522_Select success") status = rc.MFRC522_Auth(rc.PICC_AUTHENT1A, 1, sectorkey, Uid) if status != rc.MI_OK: print("MFRC522_Auth error") return print("MFRC522_Auth success") (status, dataBlock0) = rc.MFRC522_ReadBolock(0) if status != rc.MI_OK: print("MFRC522_ReadBolock error") return print("MFRC522_ReadBolock success, block0: %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x %#x" %(dataBlock0[0], dataBlock0[1], dataBlock0[2], dataBlock0[3], dataBlock0[4], dataBlock0[5], dataBlock0[6], dataBlock0[7], dataBlock0[8], dataBlock0[9], dataBlock0[10], dataBlock0[11], dataBlock0[12], dataBlock0[13], dataBlock0[14], dataBlock0[15])) rc.MFRC522_StopCrypto1() def write_block0(): (status, tagType) = rc.MFRC522_Request(rc.PICC_REQIDL) if status != rc.MI_OK: print("MFRC522_Request error") return print("MFRC522_Request success, tagType: %#x %#x" %(tagType[0], tagType[1])) (status, Uid) = rc.MFRC522_Anticoll() if status != rc.MI_OK: print("MFRC522_Anticoll error") return print("MFRC522_Anticoll success, Uid: %#x %#x %#x %#x" %(Uid[0], Uid[1], Uid[2], Uid[3])) status = rc.MFRC522_Select(Uid) if status != rc.MI_OK: print("MFRC522_Select error") return print("MFRC522_Select success") status = rc.MFRC522_Halt() print("MFRC522_Halt %d" %status) status = rc.MFRC522_WriteCmd40() if (status != rc.MI_OK): print("MFRC522_ToCard 0x40 error, status:%d" %status) return print("MFRC522_ToCard 0x40 success") status = rc.MFRC522_WriteCmd43() if (status != rc.MI_OK): print("MFRC522_ToCard 0x43 error, status:%d" %status) return print("MFRC522_ToCard 0x43 success") status = rc.MFRC522_WriteBlock(0, dataBlock0) if status != rc.MI_OK: print("MFRC522_WriteBlock error") return print("MFRC522_WriteBlock success") rc.MFRC522_StopCrypto1() def closeSPI(): rc.MFRC522_CloseSPI() if __name__ == '__main__': while True: action = input("Enter action r/w: ") if action == 'r': read_block0() elif action == 'w': write_block0() elif action == 'q': closeSPI() break print("exit procedure") ``` 下面是执行解过,读取成功,但是写入报错超时: ![图片说明](https://img-ask.csdn.net/upload/201910/28/1572228464_990828.png)

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

立即提问
相关内容推荐