当前位置: 首页 > news >正文

NFC 数据传输

前言

    初次接触NFC协议,很多人都会感觉困惑,搜索相关资料,大多数都介绍协议的理论及应用领域,数据传输的内容却很少,但对与开发人员来说,除了理论知识外,数据传输也是非常重要环节,尤其是对底层开发人员来说,数据如何封包/解包才是重中之重,本文通过相关的示例展示,希望能给初次接触NFC开发底层开发者带来帮助.

一、NFC数据传输格式

       NFC数据交互格式采用的是NDEF,下面分解说明NDEF数据格式:

                    Bit7    Bit6    Bit5    Bit4    Bit3    Bit2    Bit1    Bit0
第1个字节    MB    ME     CF      SR      IL      [  TNF : bit0~bit2   ]
第2个字节    TYPE  LENGTH
第3个字节    PAYLOAD  LENGTH3
第4个字节    PAYLOAD  LENGTH2
第5个字节    PAYLOAD  LENGTH1
第6个字节    PAYLOAD  LENGTH0
第7个字节    ID  LENGTH
   =========== TYPE ============
   ============= ID =============
   ===========PYLOAD===========

其中:

MB:消息开始,标志指示这是否是NDEF消息的开始
ME:消息结束,标志指示这是否是消息中的最后一条记录。
CF:块标志,标志指示这是第一个记录块还是中间记录块。
SR:短记录位,如果PAYLOAD LENGTH字段为1字节(8位/ 0-255)或更小,则SR标志设置为1,这允许更紧凑的记录。
IL:ID长度字段,标志指示ID长度字段是否存在。如果将其设置为0,则ID长度字段将在记录中省略。
TNF:类型名称格式,它描述记录的类型,并设置对其余记录的结构和内容的期望

二、TNF数据类型

目前NFC支持七种TNF数据类型:
0x00:  Empty:表示该Record中没有数据,即相当于一个空的NFC Record;

0x01:  NFC Forum Well-Known Type:由NFC Forum定义的一些较为常用的数据类型,包括URI、TEXT等,其格式遵循NFC Forum RTD(Record Type Definition)规范。下文将详细介绍它。目前常用类型如下:
          URI Record Type:用于存储URI数据,对应Type字段取值为"U"。
          Text Record Type:用于存储文本数据,对应Type字段取值为"T"。
          Signature Record Type:用于存储数字签名数据,对应Type字段取值为"Sig"。
          Smart Poster Record Type:智能海报,用于存储与该海报相关的一些资讯信息,如图片、                相关介绍等,对应Type字段取值为"Sp"
        Generic Control Record Type:用于传递控制信息,对应Type字段取值为"Gc"
        External Type:为第三方组织定义的类型,目前NFC Forum没有定义相关的数据类型;


0x02:  MIME:它是Multipurpose Internet Mail Extensions的缩写,遵循RFC2046规范。例如,当TNF取值为MIME时,其Type字段取值可为"text/plain"或"image/png"等。

0x03:  Absolute URI:绝对URI,遵循RFC 3986规范。例如某文件的绝对URI为"http://baidu.com/tls.txt",而其相对URI则为"tls.txt"。

0x04:NFC Forum External Type:也由NFC Forum的RTD规范定义,下文将介绍它。

0x05: Unknown:代表Payload中的数据类型未知,它和MIME类型"application/octet-stream"有些类似,这种类型的数据由相应的应用程序来解析。

0x06:Unchanged:这种类型的数据用于NFC Record分片。例如一个大的数据需要通过多个NFC Record来承载,除第一个NFC Record分片外,该数据对应的其他NFC Record分片都必须设置TNF为Unchanged。

三、实例解析:

以下以短数据文本、URL为例来讲解,值得注意的是,payload的第一个直接在文本、URI数据中表示状态码,解释如下:
   文本数据状态码:
                Bit7    Bit6    Bit5    Bit4    Bit3    Bit2    Bit1    Bit0
1个字节    

      Bit7:   0为UTF-8, 1为UTF-16    

      Bit6:  固定为0    

      Bit0~Bit5:  为 language code 长度,如 “zh”、"en"、"rf-CA"、"jp" 等 US-ASCII编码格式
以下以短数据文本、URL为例来讲解,值得注意的是,payload的第一个直接在文本、URI数据中表示状态码,解释如下:

URI数据状态码:
                Bit7    Bit6    Bit5    Bit4    Bit3    Bit2    Bit1    Bit0
1个字节    URL Type 系数,如1:”http://www.” ; 2:“https://www.” 等

   

1、文体数据:  ”abc123456”
     NDEF数据为:d1 01 0c 54 02 7a 68 61 62 63 31 32 33 34 35 36
        d1:  信息头部 1101 0001;
                MB:1--信息开始
                ME:1--信息结束
                CF:0--第一个记录块
                SR:1--短记录,数据长度小于255个字节
                IL: 0--ID长度为0,表示不成在ID
                TNF:1--表示总所周知类型
        01:TNF类型长度;
        0c:payload长度 12个字节
        54:RTD类型,“T”的ASCLL码,文本类型
        02:文本数据状态码:0000010
                Bit7: 0---UTF8类型

                Bit0~bit5:2---语言码长度为2个字节
        7a 86:语言码;“zh”的ASCLL码值
         68 61 62 63 31 32 33 34 35 36: 分别为”abc123456”对应的ASCLL值


2、URI数据:  “https://www.baidu.com/”
     NDEF数据为:d1 01 0b 55 02 62 61 69 64 75 2e 63 6f 6d 2f
        d1:  信息头部 1101 0001;
                MB:1--信息开始
                ME:1--信息结束
                CF:0--第一个记录块
                SR:1--短记录,数据长度小于255个字节
                IL: 0--ID长度为0,表示不成在ID
                TNF:1--表示总所周知类型
        01:TNF类型长度;
        0b:payload长度 11个字节
        55:RTD类型,“U”的ASCLL码,URI类型
        02:URI数据状态码,表示URL类型为 “https://www.”
        62 61 69 64 75 2e 63 6f 6d 2f: 分别为”baidu.com/”对应的ASCLL码值;

四、示例代码

1、头文件ndef.h

#ifndef __NFC_NDEF_H__
#define __NFC_NDEF_H__#ifdef __cplusplus
extern "C" {
#endif#define NDEF_RECORD_SIZE 255
#define NDEF_ID_SIZE 32
#define NDEF_HEAD_SIZE 32
#define NDEF_LG_SIZE 8// NDEF NTF类型
typedef enum{TNF_NULL = 0,        // 空TNF_INSIDE_RTD = 1,  // NFC 论坛知名类型,包括UTF8、ASCII、URI...TNF_RFC2406 = 2,     // 定义于RFC 2046[RFC 2046]的媒体类型TNF_RFC3986 = 3,     // 定义于 RFC 3986[RFC 3986]的绝对 URITNF_OUTSIDE_RTD = 4, // NFC 论坛外部自定义类型TNF_UNKNOW = 5,      // 未知TNF_STATIC = 6,      // 不可更改(参考2.3.3节)TNF_DEFAULT = 7      // 保留
} TnfType;// NDEF TNF_INSIDE_RTD类型
typedef enum{RTD_UTF8 = 'T', // UTF8类型RTD_URI = 'U',  // URI类型
} RtdType;typedef enum{START_PACK,     // 分包开始包MIDDLE_PACK,    // 分包中间包END_PACK,       // 分包结束包START_END_PACK  // 不分包,开始包也是结束包
}PackType;// NDEF URI
typedef enum{RTD_URI_freeForm,     // 0x00     No prepending is done ... the entire URI is contained in the URI FieldRTD_URI_httpWWW,      // 0x01     http://www.RTD_URI_httpsWWW,     // 0x02     https://www.RTD_URI_http,         // 0x03     http://RTD_URI_https,        // 0x04     https://RTD_URI_tel,          // 0x05     tel:RTD_URI_mailto,       // 0x06     mailto:RTD_URI_ftpAnonymous, // 0x07     ftp://anonymous:anonymous@RTD_URI_ftpFtp,       // 0x08     ftp://ftp.RTD_URI_ftps,         // 0x09     ftps://RTD_URI_sftp,         // 0x0A     sftp://RTD_URI_smb,          // 0x0B     smb://RTD_URI_nfs,          // 0x0C     nfs://RTD_URI_ftp,          // 0x0D     ftp://RTD_URI_dav,          // 0x0E     dav://RTD_URI_news,         // 0x0F     news:RTD_URI_telnet,       // 0x10     telnet://RTD_URI_imap,         // 0x11     imap:RTD_URI_rtps,         // 0x12     rtsp://RTD_URI_urn,          // 0x13     urn:RTD_URI_pop,		  // 0x14     pop:RTD_URI_sip,		  // 0x15     sip:RTD_URI_sips,		  // 0x16     sips:RTD_URI_tftp,		  // 0x17     tftp:RTD_URI_btspp,		  // 0x18     btspp://RTD_URI_btl2cap,	  // 0x19     btl2cap://RTD_URI_btgoep,		  // 0x1A     btgoep://RTD_URI_tcpobex,	  // 0x1B     tcpobex://RTD_URI_irdaobex,	  // 0x1C     irdaobex://RTD_URI_file,		  // 0x1D     file://RTD_URI_URNEPC_id,    // 0x1E     urn:epc:id:RTD_URI_RUNEPC_tag,	  // 0x1F     urn:epc:tag:RTD_URI_RUNEPC_pat,	  // 0x20     urn:epc:pat:RTD_URI_RUNEPC_raw,	  // 0x21     urn:epc:raw:RTD_URI_RUN_raw,	  // 0x22     urn:epc:RTD_URI_RUN_nfc,      // 0x23     urn:nfc
} UriType;// NDEF首字节解码
typedef struct {unsigned char MB : 1;  // MB 标志是 1-bit 字段,置 1 表示 NDEF 消息的开始unsigned char ME : 1;  // ME 标志是 1-bit 字段,置 1 表示 NDEF 消息的结束unsigned char CF : 1;  // CF 标志是 1-bit 字段,置 1 表示 NDEF 消息分块传输unsigned char SR : 1;  // SR 标志是 1-bit 字段,置 1 表示PAYLOAD_LENGTH字段为单字节,payload 数据长度在255个字节以内unsigned char IL : 1;  // IL 标志是 1-bit 字段,置 1 表示在首部存在一个单字节ID_LENGTH字段unsigned char TNF: 3; // TNF标志是 3-bit 字段,指示TYPE字段值的结构
} NdefHead;// NDEF 参数  文本类结构体
typedef struct{NdefHead      Head;unsigned char TnfTypeLen;               // 类型长度unsigned int  PayloadLen;               // 有效数据长度unsigned char IdLen;                    // 类型ID长度unsigned char RtdType;                  // Rtd类型unsigned char Id[NDEF_ID_SIZE];         // 如果包含ID(记录头中的IL位设置为1),则ID字段的值。如果IL位设置为0,则忽略此字段unsigned char StatusCode;               // 内容状态码;如果RTD为"U",状态码为UriType;如果RTD为"T",则状态码为语言编码描述unsigned char PackType;                 // 包类型unsigned char LgCode[NDEF_LG_SIZE];     // 语言编码类型unsigned char Payload[NDEF_RECORD_SIZE];
} NdefFrame;typedef struct {unsigned int   Len;unsigned char  Data[NDEF_RECORD_SIZE + NDEF_ID_SIZE + NDEF_HEAD_SIZE + NDEF_LG_SIZE];
}NfcData_t;#ifdef __cplusplus
}
#endif#endif

2、C文件ndef.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include "ndef.h"const char *pUirVal[32] = {"","http://www.","https://www.","http://","https://","tel:","mailto:","ftp://anonymous:anonymous@","ftp://ftp.","ftps://","sftp://","smb://","nfs://","ftp://","dav://","news:","telnet://","imap:","rtsp://","urn:","pop:","sip:","sips:","tftp:","btspp://","btl2cap://","btgoep://","tcpobex://","irdaobex://","file://","urn:epc:id:","urn:epc:tag:","urn:epc:pat:","urn:epc:raw:","urn:epc:","urn:nfc"
};typedef union {unsigned long ul;unsigned char uc[4];
} VARLONG;static void depart_long_htol(unsigned long ul, unsigned char *str)
{VARLONG var;var.ul = ul;str[0] = var.uc[3];str[1] = var.uc[2];str[2] = var.uc[1];str[3] = var.uc[0];
}int nfc_ndef_package(NdefFrame *pNdef, NfcData_t *pNfc)
{unsigned int i;unsigned int payloadlenIndex = 0;if(pNdef == NULL || pNfc == NULL)return -1;// 当前只处理数据包为NDEF_RECORD_SIZE个字节以内的NDEFif(pNdef->PayloadLen > NDEF_RECORD_SIZE) {printf("pNdef->PayloadLen: %d > %d NDEF_RECORD_SIZE\r\n", pNdef->PayloadLen , NDEF_RECORD_SIZE);return -1;}unsigned char head = 0;head = (pNdef->Head.MB << 7);head |= (pNdef->Head.ME << 6);head |= (pNdef->Head.CF << 5);head |= (pNdef->Head.SR << 4);head |= (pNdef->Head.IL << 3);head |= pNdef->Head.TNF;// headpNfc->Data[pNfc->Len++] = head;// tnf lenpNfc->Data[pNfc->Len++] = pNdef->TnfTypeLen;payloadlenIndex = pNfc->Len;// payload lenif(pNdef->PayloadLen > 255) {pNfc->Len += 4;} else {pNfc->Len++;}// ID lenif(pNdef->Head.IL == 1) {pNfc->Data[pNfc->Len++] = pNdef->IdLen;}switch(pNdef->Head.TNF){case TNF_INSIDE_RTD:{// rtd typeswitch (pNdef->RtdType){case RTD_UTF8:{pNfc->Data[pNfc->Len++] = 0x54; //'T';// IDif(pNdef->Head.IL == 1) {for(i = 0; i < pNdef->IdLen; i++) {pNfc->Data[pNfc->Len++] = pNdef->Id[i];}}pNfc->Data[pNfc->Len++] = pNdef->StatusCode;unsigned char lglen = 0;lglen = pNdef->StatusCode & 0x1F;for(i = 0; i < lglen; i++)pNfc->Data[pNfc->Len++] = pNdef->LgCode[i];pNdef->PayloadLen += (1 + lglen);break;}case RTD_URI:{pNfc->Data[pNfc->Len++] = 0x55; //'U';// IDif(pNdef->Head.IL == 1) {for(i = 0; i < pNdef->IdLen; i++) {pNfc->Data[pNfc->Len++] = pNdef->Id[i];}}// uri typepNfc->Data[pNfc->Len++] = pNdef->StatusCode;pNdef->PayloadLen ++;break;}default:printf("RtdType: %d unkonw\r\n", pNdef->RtdType);return -1;}break;}case TNF_NULL:case TNF_RFC3986:case TNF_RFC2406:case TNF_OUTSIDE_RTD:case TNF_UNKNOW:case TNF_STATIC:case TNF_DEFAULT:default:printf("TNF: %d unkonw\r\n", pNdef->Head.TNF);return -1;}// payload for(i = 0; i < pNdef->PayloadLen; i++) {pNfc->Data[pNfc->Len++] = pNdef->Payload[i];}// payload lenif(pNdef->PayloadLen > 255) {depart_long_htol(pNdef->PayloadLen, &pNfc->Data[payloadlenIndex]);pNfc->Len += 4;} else {pNfc->Data[payloadlenIndex] = pNdef->PayloadLen;}return 0;
}int nfc_ndef_prase(NfcData_t *pNfc, NdefFrame *pNdef)
{unsigned int i = 0;unsigned int index = 0;if(pNdef == NULL || pNfc == NULL)return -1;unsigned char head = pNfc->Data[index++];pNdef->Head.MB = (head >> 7) & 0x01;pNdef->Head.ME = (head >> 6) & 0x01;pNdef->Head.CF = (head >> 5) & 0x01;pNdef->Head.SR = (head >> 4) & 0x01;pNdef->Head.IL = (head >> 3) & 0x01;pNdef->Head.TNF = head & 0x03;printf("MB:%d ME:%d CF:%d SR:%d IL:%d TNF:%d \r\n", pNdef->Head.MB,pNdef->Head.ME,pNdef->Head.CF,pNdef->Head.SR,pNdef->Head.IL,pNdef->Head.TNF);// 当前不解析长度大于255个字节的NDEF包if(pNdef->Head.MB != 1 && pNdef->Head.ME != 1 && pNdef->Head.SR != 1) {pNfc->Len = 0;return -1;}pNdef->TnfTypeLen = pNfc->Data[index++];pNdef->PayloadLen = pNfc->Data[index++];if(pNdef->Head.IL == 1){pNdef->IdLen = pNfc->Data[index++];}pNdef->RtdType = pNfc->Data[index++];switch(pNdef->Head.TNF){case TNF_INSIDE_RTD:{if(pNdef->Head.IL == 1) {for(i = 0; i < pNdef->IdLen; i++) {pNdef->Id[i] = pNfc->Data[index++];}}if(pNdef->RtdType == RTD_UTF8) {unsigned lgLen = 0;pNdef->StatusCode = pNfc->Data[index++];lgLen = (pNdef->StatusCode & 0x1F);// 跳过语言代码长度index += lgLen;for(i = 0; i < pNdef->PayloadLen; i++)pNdef->Payload[i] = pNfc->Data[index++];printf("%s\r\n", pNdef->Payload);} else if(pNdef->RtdType == RTD_URI){pNdef->StatusCode = pNfc->Data[index++];for(i = 0; i < pNdef->PayloadLen; i++)pNdef->Payload[i] = pNfc->Data[index++];printf("%s%s\r\n", pUirVal[pNdef->StatusCode], pNdef->Payload);}pNfc->Len = 0;break;}case TNF_NULL:case TNF_RFC3986:case TNF_RFC2406:case TNF_OUTSIDE_RTD:case TNF_UNKNOW:case TNF_STATIC:case TNF_DEFAULT:default:break;}return 0;}

3 、测试main.c

int main(int argc, char *argv[])
{int ret;unsigned int i = 0;unsigned int plen = 0;NdefFrame NdefInfo = {0};NfcData_t SendData = {0};NdefFrame NdefPrase = {0};NdefInfo.Head.MB = 1;NdefInfo.Head.ME = 1;NdefInfo.Head.CF = 0;NdefInfo.Head.SR = 1;NdefInfo.Head.IL = 0;NdefInfo.Head.TNF = 1;NdefInfo.TnfTypeLen = 1;// abc123456NdefInfo.RtdType = RTD_UTF8;NdefInfo.StatusCode = 0x02;NdefInfo.LgCode[0] = 0x7a;NdefInfo.LgCode[1] = 0x68;NdefInfo.Payload[NdefInfo.PayloadLen++] = 'a';NdefInfo.Payload[NdefInfo.PayloadLen++] = 'b';NdefInfo.Payload[NdefInfo.PayloadLen++] = 'c';memcpy(&NdefInfo.Payload[NdefInfo.PayloadLen], "123456", strlen("123456"));NdefInfo.PayloadLen += strlen("123456");ret = nfc_ndef_package(&NdefInfo, &SendData);if(ret != 0) {printf("=========nfc_ndef_packge error ========\r\n");return -1;}printf("send data len: %d \r\n", SendData.Len);for(i = 0; i < SendData.Len; i++){printf("0x%02x,", SendData.Data[i]);}printf("\r\n");ret = nfc_ndef_prase(&SendData, &NdefPrase);if(ret != 0) {printf( "nfc_ndef_prase err \r\n");}// https://www.baidu.comNdefInfo.PayloadLen = 0;NdefInfo.RtdType = RTD_URI;NdefInfo.StatusCode = 0x02;memcpy(&NdefInfo.Payload[NdefInfo.PayloadLen], "baidu.com/", strlen("baidu.com/"));NdefInfo.PayloadLen += strlen("baidu.com/");ret = nfc_ndef_package(&NdefInfo, &SendData);if(ret != 0) {printf("=========nfc_ndef_packge error ========\r\n");return -1;}printf("send data len: %d \r\n", SendData.Len);for(i = 0; i < SendData.Len; i++){printf("0x%02x,", SendData.Data[i]);}printf("\r\n");memset(&NdefPrase, 0, sizeof(NdefPrase));ret = nfc_ndef_prase(&SendData, &NdefPrase);if(ret != 0) {printf("nfc_ndef_prase err \r\n");}return 0;
}

4、编译 及 运行结果

gcc main.c ndef.c

./a.out

send data len: 19
0xd1,0x01,0x0c,0x54,0x02,0x7a,0x68,0x61,0x62,0x63,0x31,0x32,0x33,0x34,0x35,0x36,0x00,0x00,0x00,
MB:1 ME:1 CF:0 SR:1 IL:0 TNF:1
abc123456
send data len: 16
0xd1,0x01,0x0b,0x55,0x02,0x62,0x61,0x69,0x64,0x75,0x2e,0x63,0x6f,0x6d,0x2f,0x00,
MB:1 ME:1 CF:0 SR:1 IL:0 TNF:1
https://www.baidu.com/

相关文章:

NFC 数据传输

前言 初次接触NFC协议&#xff0c;很多人都会感觉困惑&#xff0c;搜索相关资料&#xff0c;大多数都介绍协议的理论及应用领域&#xff0c;数据传输的内容却很少&#xff0c;但对与开发人员来说&#xff0c;除了理论知识外&#xff0c;数据传输也是非常重要环节&#xff0c;尤…...

基于Streamlit的智能创业计划生成器开发实践

一、应用概述 在数字经济时代&#xff0c;创业者亟需高效工具进行系统化的商业规划。本文介绍的智能创业计划生成器基于Streamlit框架构建&#xff0c;整合了财务建模、时间轴规划、智能文档生成等核心功能。该工具通过模块化设计实现了九大创业要素的系统化配置&#xff0c;显…...

蓝桥杯单片机刷题——按键控制距离显示精度

设计要求 驱动超声波传感器&#xff0c;启动距离测量功能,并将其结果显示到数码管上&#xff0c;距离数据单位为m。 按键“S4”定义为“切换”按键&#xff0c;通过此按键切换距离的显示精度&#xff08;一位或两位小数&#xff09;。切换顺序如图所示。 数码管显示格式如下图…...

c++拷贝构造函数(深浅拷贝)+运算符重载

1拷贝构造函数 1.1定义 只有一个形参&#xff0c;且该形参是对本类类型对象的引用&#xff08;一般用const 修饰&#xff09;&#xff0c;在用已经存在的类类型对象穿件新对象是由编译器自动调用。&#xff08;是一种特殊构造&#xff0c;即初始化一个一模一样的新对象&#…...

操作系统 3.5-内存换入-请求调页

案例分析内存换入 内存换入分析&#xff1a; 内存换入&#xff08;Swapping&#xff09;是指操作系统将不常使用的内存页从物理内存&#xff08;RAM&#xff09;移动到磁盘上的交换空间&#xff08;Swap Space&#xff09;&#xff0c;以释放物理内存供其他进程使用。当需要访…...

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…...

使用platformio如何定位hard fault错误

这里写自定义目录标题 前言过程记录结语前言 hard fault是单片机开发过程中经常会遇到的问题,通常是内存溢出、野指针访问等导致,对于有经验的工程师,在代码改动不大的情况下,一般可以通过代码审查定位到问题原因,但也有很多情况下需要借助调试工具进行定位,像Keil就有比…...

全局异常处理器的基本使用

那使用全局异常处理器可以么&#xff1f; 是的&#xff0c;使用全局异常处理器是一个非常好的选择&#xff0c;因为它可以将异常处理逻辑集中化&#xff0c;避免在 Service 层或 Controller 层中重复编写异常处理代码。以下是使用全局异常处理器来处理添加用户时 username 唯一…...

python入门:简单介绍和python和pycharm软件安装/学习网址/pycharm设置(改成中文界面,主题,新建文件)

Python 目前是 AI 开发的首选语言 软件安装 python解释器 官网下载 Python |Python.org 勾选 Add python.exe to PATH 将python.exe添加到PATH 勾选这个选项会将Python的可执行文件路径添加到系统的环境变量PATH中。这样做的好处是&#xff0c;你可以在命令行中从任何位置直…...

众趣科技助力商家“以真示人”,让消费场景更真实透明

在当今的消费环境中&#xff0c;消费者权益保护问题日益凸显。无论是网购商品与实物不符、预定酒店民宿与图文描述差异大&#xff0c;还是游览景区遭遇“照骗”&#xff0c;这些问题不仅让消费者在消费和决策过程中倍感困扰&#xff0c;也让商家面临信任危机。 消费者在享受便…...

【Redis】string类型

目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作&#xff1a;【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式&#xff0c;…...

EPLAN许可证更新教程

随着电气设计软件的不断更新和优化&#xff0c;确保您的EPLAN许可证始终是最新版本对于顺畅的项目管理至关重要。本文将为您提供一份详尽的EPLAN许可证更新教程&#xff0c;帮助您轻松完成更新操作&#xff0c;确保您的软件始终保持最佳状态。 一、为什么需要更新EPLAN许可证&…...

学习笔记五——Rust 控制流全解析

&#x1f4da; 目录 什么是控制流&#xff1f;Rust 有什么特别&#xff1f;if 表达式完整语法loop / while / for 三种循环写法match 表达式 _ 通配符深入解释if let 表达式用法与场景Option、Some、None 全面通俗讲解 "Tom" 和 "Tom".to_string() 有啥本…...

远程桌面协议(RDP)详解:原理、优势与局限和优化方案分享

文章目录 导言一. RDP的工作原理二. RDP的优势三. RDP的局限性四. RDP的优化与替代方案五. 内网穿透远程访问总结 导言 远程桌面协议(RDP)是一种微软开发的专有协议&#xff0c;允许用户通过网络连接到另一台计算机&#xff0c;并像操作本地计算机一样进行操作。它广泛应用于远…...

Linux 系统管理常用命令

以下是 Linux 系统管理常用命令 的详细介绍&#xff0c;涵盖 IP地址查看、端口管理、进程监控 等核心操作&#xff0c;并附上实际示例&#xff1a; 一、查看网卡 IP 地址 1. 使用 ip 命令 # 查看所有网络接口信息&#xff08;包括 IP 地址&#xff09; ip addr show# 查看特定…...

蓝桥杯篇---客观题

文章目录 前言 前言 本文简单介绍了蓝桥杯中客观题各个部分的知识点。 一、单片机相关 IAP15F2K61S2单片机的定时器0具有4种工作模式&#xff0c;当采用外部12MHz晶振时&#xff0c;定时器最大定时长度65535us。8051单片机的P0口&#xff0c;当使用外部存储器时它是一个传输低…...

RK3568 基于Gstreamer的多媒体调试记录

文章目录 1、环境介绍2、概念理清3、提前准备4、GStreamer编译5、GStreamer基础介绍6、视频播放初体验7、视频硬编码7.1、h2647.2、h265 8、视频硬解码8.1、解码视频并播放解码视频并播放带音频 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x …...

ZYNQ笔记(五):AXI GPIO 中断

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;使用 AXI GPIO IP 核以中断方式实现按键 KEY 控制 LED 亮灭翻转&#xff08;两个都在PL端&#xff09; 目录 一、介绍 二、硬件设计 三、软件设计 四、效果 一、介绍 AXI GPIO 中断通常…...

C++23 多维下标运算符:探索 P2128R6 提案

文章目录 一、背景与动机二、语法与实现2.1 语法2.2 实现方式 三、应用场景3.1 多维数组3.2 自定义数据结构3.3 并行计算 四、性能影响4.1 编译时优化4.2 自定义数据结构的优化 五、总结 C23 引入了许多新特性&#xff0c;其中之一便是多维下标运算符&#xff08;P2128R6&#…...

原理图设计准备:页面栅格模板应用设置

一、页面大小的设置 &#xff08;1&#xff09;单页原理图页面设置 首先&#xff0c;选中需要更改页面尺寸的那一页原理图&#xff0c;鼠标右键&#xff0c;选择“Schmatic Page Properties”选项&#xff0c;进行页面大小设置。 &#xff08;2&#xff09;对整个原理图页面设…...

LeeCode 409.最长回文串

给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解释: 我们可以构造的…...

保护PCBA的不同方法:喷三防漆 vs 镀膜

PCBA&#xff08;印刷电路板组件&#xff09;的防护工艺中&#xff0c;喷三防漆和镀膜&#xff08;如Parylene气相沉积&#xff09;是两种常见技 术。它们在防护目的上类似&#xff0c;但在具体实现方式和应用场景上有显著差异。以下从外观、工艺、性 能、物理性质和成本五个…...

XILINX FPGA万兆光电口PXIE板卡设计

主要性能指标 1、 FPGA 型号&#xff1a; XC7K325-TFFG676-2 &#xff1b; 2、 网络端口速率 &#xff1a; 10Gbps/1Gbps/2.5Gbps &#xff1b; 3、 网络端口形式 &#xff1a; 3 路 SFP 万兆光电口 &#xff1b; 4、 内存数量&#xff1a; 4Gb 4 &#xff1b; 5、 内存带宽&…...

LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI

今天这篇文章我来分享LangChain4j实战-Java AI应用开源框架之LangChain4j和Spring AI。 在贝恩聊架构AI专栏中通过学习如何使用Java相关AI应用开源框架&#xff0c;到后续开发企业级Java AI应用&#xff0c;将大型语言模型和AI工具集成到现有系统中。我们将重点介绍如何使用Sp…...

机器学习十大算法全解析机器学习,作为人工智能的基石,涵盖了众多高效的算法。今天,我们就来深入探讨其中的十大核心算法!

1️⃣ 线性回归&#xff1a;通过最小化误差的平方和来寻找最佳函数匹配。 2️⃣ 逻辑回归&#xff1a;用于分类问题&#xff0c;通过逻辑函数来预测事件发生的概率。 3️⃣ 决策树&#xff1a;基于特征选择和阈值来构建树形结构&#xff0c;用于分类和回归。 4️⃣ 朴素贝叶…...

day26图像处理OpenCV

文章目录 一、OpenCV1.介绍2.下载3.图像的表示4.图像的基本操作4.1图片读取或创建4.1.1读取4.1.2创建 4.2创建窗口4.3显示图片4.3.1设置读取的图片4.3.2设置显示多久4.3.3释放 4.4.保存图片4.5图片切片&#xff08;剪裁&#xff09;4.6图片大小调节 5.在图像中绘值5.1绘制直线5…...

怎么查询SQL Server AlwaysOn

1. SQL Server AlwaysOn 是什么&#xff1f; SQL Server AlwaysOn 是 Microsoft 提供的高可用性&#xff08;High Availability, HA&#xff09;和灾难恢复&#xff08;Disaster Recovery, DR&#xff09;解决方案&#xff0c;包含以下两个核心技术&#xff1a; 组件描述故障…...

10分钟做了一个投资回报计算器,欢迎大家使用

一、背景 今天突然想算一下1万本金&#xff0c;2%利率存2年情况下的投资回报收益情况&#xff0c;但是发现手上没有计算器&#xff0c;想着自己做一个网页简单实现一下&#xff0c;于是有了这个小工具&#xff08;FutureValueCalculator——未来价值计算器&#xff09;。 二、…...

报错:mount: unknown filesystem type ‘vfat’

服务器重启之后 进入 Ctrl D 界面 界面报错是 FAILED to mount /boot/efi 输入密码进去之后 (py38) [rootlocalhost data]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 1.5T 0 disk ├─sda1 8:1 0 50M 0 part /bo…...

Java学习手册:面向对象编程核心概念

面向对象编程&#xff08;OOP&#xff09;是Java语言的核心编程范式&#xff0c;它强调通过对象之间的交互来实现程序功能。OOP的核心思想是将现实世界中的事物抽象为对象&#xff0c;通过对象的属性和行为来描述和操作这些事物。本文将深入探讨Java中面向对象编程的三大核心概…...

工厂模式(简单工厂,工厂方法,抽象工厂)

工厂模式 工厂模式是java中最常用的设计模式&#xff0c;主要是用来完成对象的创建&#xff0c;使得对象创建过程和对象使用过程分离。 简单来说是取消对象创建者和使用者的耦合&#xff0c;简化new 对象的创建。 优势 &#xff1a;对象的属性创建完整。 缺点&#xff1a; 创建…...

【实际项目分享】多相机取图存图问题

1、项目介绍 针对 ​​5路相机同步取图​​ 场景&#xff0c;设计了一套高并发、低延迟的图像数据管理方案&#xff0c;重点解决多线程环境下的数据竞争与存储效率问题。 2、设计目标​​ ​​高并发写入​​&#xff1a;支持5个相机线程同时写入数据&#xff0c;无锁冲突​​…...

LLMs基础学习(七)DeepSeek专题(1)

LLMs基础学习&#xff08;七&#xff09;DeepSeek专题&#xff08;1&#xff09; 文章目录 LLMs基础学习&#xff08;七&#xff09;DeepSeek专题&#xff08;1&#xff09;DeepSeek 相关资料官方资料与基础文档实践指南和技术解析 热启动与冷启动**热启动&#xff08;主流&…...

安装vllm

ubuntu 22.04, RTX3080, cuda 12.1, cudnn 8.9.7&#xff0c;cuda和cudnn的安装参考&#xff1a;https://blog.csdn.net/m0_52111823/article/details/147154526?spm1001.2014.3001.5501。 查看版本对应关系&#xff0c;下载12.1对应的whl包&#xff0c;https://github.com/vl…...

SVMSPro分布式综合安防管理平台--地图赋能智慧指挥调度新高度

SVMSPro分布式综合安防管理平台–地图赋能智慧指挥调度新高度 在智慧城市建设和公共安全需求日益增长的背景下&#xff0c;SVMSPro分布式综合安防管理平台凭借其强大的地图功能与多协议兼容能力&#xff0c;正在成为公安、司法、消防、城管、交通等领域的指挥调度“智慧大脑”…...

科技快讯 | OpenAI:向Plus和Pro用户推出ChatGPT记忆提升功能;我国成功发射通信技术试验卫星十七号;芯片国产化率超九成

继 OpenAI 后&#xff0c;谷歌 Gemini 模型将支持 Anthropic 的 MCP 协议 4月10日&#xff0c;谷歌DeepMind宣布将支持Anthropic的模型上下文协议&#xff08;MCP&#xff09;&#xff0c;以实现大语言模型与外部数据源的集成。MCP由Anthropic推出&#xff0c;旨在建立安全双向…...

【教学类-102-08】剪纸图案全套代码08——Python点状虚线优化版本02(有空隙)+制作1图2图6图24图

背景需求 代码实现了点状虚线的全套流程,但是图片中主体图案和虚线与左右两边粘连。 【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本01(无空隙)+制作1图2图6图24图-CSDN博客文章浏览阅读665次,点赞11次,收藏11次。【教学类-102-07】剪纸图案全套代码07…...

深入解析 Microcom:嵌入式串口调试利器

在嵌入式系统开发中&#xff0c;串口通信是调试和与外部设备交互的核心手段之一。Linux 系统中&#xff0c;Minicom 是一个广为人知的串口调试工具&#xff0c;但其依赖较多库&#xff08;如 libncurses&#xff09;&#xff0c;在资源受限的嵌入式环境中可能显得臃肿。 而 Mi…...

算法驱动的场景识别:规则引擎与机器学习的强大结合

引言 在智能驾驶系统、交通分析和安全监控等领域&#xff0c;场景识别是一项核心技术。传统的场景识别方法主要依赖人工标注&#xff0c;不仅耗时耗力&#xff0c;还容易受主观因素影响。随着技术的发展&#xff0c;算法驱动的场景识别方法逐渐兴起&#xff0c;通过结合规则引…...

typescript开发心得

语法知识点 回调地狱问题 用await&#xff0c;或者有些库提供了sync方法 yield 用法跟python的一样。 yield只能用于生成器里&#xff0c;生成器是function*&#xff0c;例如&#xff1a; export function* filter(rootNode: ts.Node, acceptedKind: ts.SyntaxKind) {for…...

淘宝开放平台 API 调用全解析:商品详情数据采集接口接入教程

一、引言 在电商领域蓬勃发展的当下&#xff0c;淘宝作为行业领军者&#xff0c;其平台上琳琅满目的商品蕴含着海量有价值的信息。无论是电商从业者想要精准把握竞品动态、优化自身商品策略&#xff0c;还是数据分析师试图挖掘消费趋势、洞察市场需求&#xff0c;亦或是科研人…...

SQL注入(SQL Injection)深度解析

SQL注入是一种利用Web应用程序与数据库交互机制缺陷的网络攻击技术&#xff0c;其核心在于通过恶意构造的输入参数篡改原始SQL查询逻辑&#xff0c;进而实现对数据库的非授权操作。以下从定义、攻击原理、技术分类、危害及防御体系多维度展开分析&#xff1a; 一、定义与本质 技…...

MCP基础学习四:MCP在AI应用中的集成(MCP在AI应用中的完整架构图)

MCP在AI应用中的集成 文章目录 MCP在AI应用中的集成一,学习目标二&#xff0c;学习内容1. 在AI应用中配置和使用MCP服务1.1 不同AI工具连接方式与部署模式1.1.1 了解不同的MCP传输模式1.1.2 掌握如何在AI客户端中配置MCP服务Cursor 客户端中配置MCP服务Cherry Studio AI客户端中…...

K8S-证书过期更新

K8S证书过期问题 K8S证书过期处理方法 Unable to connect to the server: x509: certificate has expired or is not yet valid 1、查看证书有效期&#xff1a; # kubeadm certs check-expiration2、备份证书 # cp -rp /etc/kubernetes /etc/kubernetes.bak3、直接重建证书 …...

蓝桥杯考前复盘

明天就是考试了&#xff0c;适当的停下刷题的步伐。 静静回望、思考、总结一下&#xff0c;我走过的步伐。 考试不是结束&#xff0c;他只是检测这一段时间学习成果的工具。 该继续走的路&#xff0c;还是要继续走的。 只是最近&#xff0c;我偶尔会感到迷惘&#xff0c;看…...

BERT - MLM 和 NSP

本节代码将实现BERT模型的两个主要预训练任务&#xff1a;掩码语言模型&#xff08;Masked Language Model, MLM&#xff09; 和 下一句预测&#xff08;Next Sentence Prediction, NSP&#xff09;。 1. create_nsp_dataset 函数 这个函数用于生成NSP任务的数据集。 def cr…...

mysql 与 sqlite 数学运算 精度 问题

mysql 与 sqlite 数学运算 精度 问题 在 Excel 中&#xff0c;浮点运算得到的结果可能不准确 https://learn.microsoft.com/zh-cn/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result 本文讨论 Microsoft Excel 如何存储和计算浮点数。 由于存在舍入或…...

MySQL的数据库性能分析利器Percona toolkit

目录 简介使用场景 使用示例Mysql 慢查询分析诊断临时开启慢SQL持久化开启慢SQL日志 使用包管理器安装包管理器安装 percona-release使用相应的包管理器安装 Percona Toolkit pt-query-digest 安装安装 pt-query-digest案例实战之慢查询分析诊断查看慢SQL日志使用pt-query-dige…...

力扣HOT100之链表: 148. 排序链表

这道题直接用蠢办法来做的&#xff0c;直接先遍历一遍链表&#xff0c;用一个哈希表统计每个值出现的次数&#xff0c;由于std::map<int, int>会根据键进行升序排序&#xff0c;因此我们将节点的值作为键&#xff0c;其在整个链表中的出现次数作为值&#xff0c;当所有元…...

Azure AI Foundry 正在构建一个技术无障碍的未来世界

我们习以为常的街道和数字世界&#xff0c;往往隐藏着被忽视的障碍——凹凸不平的路面、不兼容的网站、延迟的字幕或无法识别多样化声音的AI模型。这些细节对某些群体而言&#xff0c;却是日常的挑战。正如盲道不仅帮助视障者&#xff0c;也优化了整体城市体验&#xff0c;信息…...