掌桥专利:专业的专利平台
掌桥专利
首页

一种射频识别验证方法、溯源系统以及屠宰的追溯系统

文献发布时间:2024-01-17 01:18:42


一种射频识别验证方法、溯源系统以及屠宰的追溯系统

技术领域

本发明属于信息管理技术领域,特别是涉及一种射频识别验证方法、溯源系统以及屠宰的追溯系统。

背景技术

近年来,食品安全问题时常发生,引起了人们对食品来源和加工流程的关注。因此,建立一个可靠的食品溯源系统变得越来越重要。特别是在肉类产品生产中,从养殖到屠宰、加工、运输、销售等各个环节的质量控制和追溯信息记录至关重要。

现有的屠宰追溯系统主要通过条形码、二维码等方式实现产品信息的记录与查询,但这些方式存在一定的局限性。如条形码和二维码易被损坏、篡改,以及环境影响较大(如潮湿、油脂污染等)。此外,这些方法在数据存储和读写速度方面也存在不足。

在公开号为CN109583768A的专利中公开了一种用于生猪屠宰的追溯系统,包括屠宰去头追溯控制器、中间件服务器、挂钩标签读写模块和电子耳标读写模块,屠宰去头追溯控制器与挂钩标签读写模块相连接用于采集挂钩上的电子标签信息,屠宰去头追溯控制器与电子耳标读写模块相连接用于采集佩戴在生猪上的电子标签信息,屠宰去头追溯控制器与中间件服务器相连接实现数据存储功能。此方案中需要近距离读取电子标签中的信息,不仅电子标签中的信息容易伪造,而且难以实现批量自动化追溯。

发明内容

本发明的目的在于提供一种射频识别验证方法、溯源系统以及屠宰的追溯系统,通过对屠宰农产品置入加密后的标签,并通过分频分区识别读取的方式准确高效读取屠宰农产品的身份信息,从而提高屠宰农产品品质追溯的可靠程度。

为解决上述技术问题,本发明是通过以下技术方案实现的:

本发明提供一种射频识别验证方法,包括,

向每个标签分配身份编号和响应频率;

根据每个所述标签的所述身份编号和所述响应频率生成每个所述标签的身份加密信息;

向所述标签发送用于写入的对应的所述身份加密信息;

向所述标签发送若干次第一检测信号,根据所述标签对所述第一检测信号的响应信号获取所述标签的适配收发频率以及所述标签相对于所述识别终端的方位角和距离;

根据所述标签的适配收发频率将所述标签分类至若干个频率域;

在每个所述频率域内,根据所述标签相对于所述识别终端的方位角和距离将所述频率域内的所述标签划分为若干个位置域;

向每个所述位置域内发送若干次第二检测信号,根据所述位置域内所述标签对所述第二检测信号的响应信号得到所述位置域内每个所述标签内存储的身份加密信息;

根据所述标签的所述适配收发频率对所述标签的所述身份加密信息进行解密识别得到所述标签的身份编号。

本发明还公开了一种射频识别验证方法,包括,

接收并向标签写入上述的身份加密信息;

接收上述的第一检测信号和第二检测信号并发射响应信号。

本发明还公开了一种溯源系统,包括,

信息写入单元,用于向每个标签分配身份编号和响应频率;

根据每个所述标签的所述身份编号和所述响应频率生成每个所述标签的身份加密信息;

向所述标签写入对应的所述身份加密信息;

标签置入单元,用于向被追溯物品置入标签;

识别终端,用于向所述标签发送若干次第一检测信号,根据所述标签对所述第一检测信号的响应信号获取所述标签的适配收发频率以及所述标签相对于所述识别终端的方位角和距离;

根据所述标签的适配收发频率将所述标签分类至若干个频率域;

在每个所述频率域内,根据所述标签相对于所述识别终端的方位角和距离将所述频率域内的所述标签划分为若干个位置域;

向每个所述位置域内发送若干次第二检测信号,根据所述位置域内所述标签对所述第二检测信号的响应信号得到所述位置域内每个所述标签内存储的身份加密信息;

根据所述标签的所述适配收发频率对所述标签的所述身份加密信息进行解密识别得到所述标签的身份编号;

追溯单元,根据所述标签的身份编号对所述被追溯物品进行追溯。

本发明还公开了一种基于内置标签屠宰农产品的追溯系统,包括,

信息写入单元,用于向每个标签分配身份编号和响应频率;

根据每个所述标签的所述身份编号和所述响应频率生成每个所述标签的身份加密信息;

向所述标签写入对应的所述身份加密信息;

标签置入单元,用于向屠宰农产品置入标签;

识别终端,用于向所述标签发送若干次第一检测信号,根据所述标签对所述第一检测信号的响应信号获取所述标签的适配收发频率以及所述标签相对于所述识别终端的方位角和距离;

根据所述标签的适配收发频率将所述标签分类至若干个频率域;

在每个所述频率域内,根据所述标签相对于所述识别终端的方位角和距离将所述频率域内的所述标签划分为若干个位置域;

向每个所述位置域内发送若干次第二检测信号,根据所述位置域内所述标签对所述第二检测信号的响应信号得到所述位置域内每个所述标签内存储的身份加密信息;

根据所述标签的所述适配收发频率对所述标签的所述身份加密信息进行解密识别得到所述标签的身份编号;

追溯单元,根据所述标签的身份编号对所述屠宰农产品进行追溯。

本发明在运行的过程中依靠包含信息写入单分配每个标签的身份编号和响应频率,之后使用身份编号和响应频率生成每个标签的身份加密信息,将对应的身份加密信息写入标签。接下来通过标签置入单元将标签置于屠宰农产品上。之后通过识别终端发送多次第一检测信号并获取标签适配的收发频率、方位角和距离,之后根据标签适配的收发频率将标签分类至不同频率域,并且还在每个频率域内根据标签相对于识别终端的方位角和距离将标签划分至不同位置域,通过向每个位置域发送多次第二检测信号获取位置域内标签存储的身份加密信息。之后根据标签的适配收发频率对身份加密信息进行解密,以识别标签的身份编号。最后通过追溯单元根据标签身份编号进行追溯屠宰农产品。本系统通过对屠宰农产品置入加密标签并使用分频分区识别读取方式,可以准确高效地读取屠宰农产品的身份信息,从而提高品质追溯的可靠程度。本系统通过对屠宰农产品置入加密标签并使用分频分区识别读取方式,可以准确高效地读取屠宰农产品的身份信息,从而提高品质追溯的可靠程度。

当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明所述一种射频识别验证方法于一实施例的执行步骤示意图一;

图2为本发明所述一种溯源系统于一实施例的功能模块及信息流向示意图;

图3为本发明所述一种基于内置标签屠宰农产品的追溯系统于一实施例的功能模块及信息流向示意图;

图4为本发明所述步骤S1于一实施例的执行步骤示意图;

图5为本发明所述步骤S2于一实施例的执行步骤示意图;

图6为本发明所述步骤S4于一实施例的执行步骤示意图;

图7为本发明所述步骤S41于一实施例的执行步骤示意图;

图8为本发明所述步骤S7于一实施例的执行步骤示意图;

图9为本发明所述步骤S73于一实施例的执行步骤示意图;

图10为本发明所述一种射频识别验证方法于一实施例的执行步骤示意图二。

附图中,各标号所代表的部件列表如下:

1-信息写入单元,2-标签置入单元,3-识别终端,4-追溯单元。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

为了对农产品进行流转追溯,需要对置入标签的农产品进行准确高效的识别。有鉴于此,本发明提供以下方案。

请参阅图1至3所示,本发明提供了一种追溯系统及一种基于内置标签屠宰农产品的追溯系统,为了便于表述,以下结合一种射频识别验证方法对一种基于内置标签屠宰农产品的追溯系统进行说明。

RFID技术中,终端(也称为读写器)通过发送无线电信号来识别标签。终端和标签之间的通信是无线电通信,终端发送的信号被标签接收后,标签将存储的信息编码成无线电信号返回给终端。整个过程类似于一次问答交互,终端发送询问信号,标签接收并返回存储的信息。具体来说,终端通过射频天线产生一定频率的无线电信号,并将其发送到空中。当标签处于终端的工作范围内时,标签的天线接收到终端发送的信号,并将其转换为电信号送入标签芯片中。标签芯片解码信号,将存储的信息编码成无线电信号并发送回终端。终端接收到标签发送的信号后,进行解码和处理,将标签存储的信息读取出来。

由于禽类尤其是生态养殖禽类不仅较为分散并且还会聚集,这就导致无法使用传统的射频识别技术对大量的禽类进行快速准确识别。为了提高识别效率,本方案在硬件上使用UHF RFID标签和对应的读取设备,具有较远的读取距离和高速的数据传输速率,适用于需要远距离读取标签的应用场景。

为了实现对屠宰农产品尤其是数量较多分布密集的禽类的准确识别和溯源,本系统从功能模块上划分可以包括信息写入单元1、标签置入单元2、识别终端3以及追溯单元4。在实施的过程中首先由信息写入单元1执行步骤S1向每个标签分配身份编号和响应频率。接下来可以执行步骤S2根据每个标签的身份编号和响应频率生成每个标签的身份加密信息,最后可以执行步骤S3向标签写入对应的身份加密信息。此处的加密信息在后续的解密过程中依靠已知的响应频率可以解密得出,可以避免标签中的内容被篡改后的识别错误。

接下来由标签置入单元2向屠宰农产品置入标签,当然并不现定于使用自动化设备实现,也可以是一个虚拟的功能单元,指令人工实现此步骤。

之后由识别终端3执行步骤S4向标签发送若干次第一检测信号,根据标签对第一检测信号的响应信号获取标签的适配收发频率以及标签相对于识别终端的方位角和距离。接下来可以执行步骤S5根据标签的适配收发频率将标签分类至若干个频率域。接下来可以执行步骤S6在每个频率域内,根据标签相对于识别终端的方位角和距离将频率域内的标签划分为若干个位置域。接下来可以执行步骤S7向每个位置域内发送若干次第二检测信号,根据位置域内标签对第二检测信号的响应信号得到位置域内每个标签内存储的身份加密信息。最后可以执行步骤S8根据标签的适配收发频率对标签的身份加密信息进行解密识别得到标签的身份编号。在此过程中避免多个标签之间的响应信号相互干扰,在同时检测多个标签的过程中依旧能够保持识别的准确性。

最后由追溯单元4根据标签的身份编号对屠宰农产品进行追溯,此处的追溯可以是根据此农产品的身份编号查找农产品源头。

上述步骤在实施的过程中,旨在实现对屠宰农产品,特别是大量密集分布的禽类的准确识别和溯源。系统主要包括信息写入单元、标签置入单元、识别终端和追溯单元。首先,信息写入单元为每个标签分配身份编号和响应频率,并生成相应的身份加密信息。标签置入单元将标签放置在屠宰农产品上,可以自动化或人工实现。识别终端通过发送检测信号获取标签的适配收发频率、方位角和距离,并将标签分类至频率域和位置域。最后,根据标签的适配收发频率解密识别标签的身份编号。整个过程避免了多个标签之间的信号干扰,确保了准确识别。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

Tag tag1, tag2, tag3;

Terminal terminal;

// 向标签分配身份编号和响应频率

tag1.id = 1;

tag1.frequency = 10;

tag2.id = 2;

tag2.frequency = 20;

tag3.id = 3;

tag3.frequency = 30;

// 生成加密信息

string encrypt(int id, int frequency) {

  // ... 实现加密算法

  return encrypted_message;

}

// 发送加密信息

void send_encrypted_message(Tag tag, string message) {

  // ... 实现向标签发送信息的代码

}

// 为每个标签生成加密信息并发送

send_encrypted_message(tag1, encrypt(tag1.id, tag1.frequency));

send_encrypted_message(tag2, encrypt(tag2.id, tag2.frequency));

send_encrypted_message(tag3, encrypt(tag3.id, tag3.frequency));

// 发送第一检测信号

void send_first_detection_signal(Tag tag) {

  // ... 实现向标签发送第一检测信号的代码

}

// 获取标签适配收发频率、方位角和距离

struct TagInfo {

  int frequency;

  float azimuth;

  float distance;

};

TagInfo get_tag_info(Tag tag) {

  // 发送若干次第一检测信号,并获取响应信号

  // ... 实现获取标签信息的代码

  return tag_info;

}

// 获取所有标签的适配收发频率、方位角和距离

vector tag_infos = {

  get_tag_info(tag1),

  get_tag_info(tag2),

  get_tag_info(tag3)

};

请参阅图4所示,由于对农产品的编号通常是顺序编号,同时禽类等农产品在屠宰过程中通常会进行堆放。为了避免标签之间由于响应频率接近导致的干扰,上述步骤S1在实施的过程中首先可以执行步骤S11获取第一检测信号、第二检测信号以及响应信号的可用频率范围得到待分配响应频段。接下来可以执行步骤S12在待分配响应频段内间隔抽取多个频率作为待选频率。接下来可以执行步骤S13将待选频率按照频率数值大小进行排序得到待选频率的顺序列表。接下来可以执行步骤S14按照使用顺序向每个标签赋予身份编号。接下来可以执行步骤S15将标签的身份编号划分为多个编号单元组。接下来可以执行步骤S16依次从每个单元组内随机抽取身份编号排列得到标签的身份编号的乱序列表。最后可以执行步骤S17根据标签的身份编号的乱序列表以及待选频率的顺序列表进行匹配得到每个标签的身份编号对应的响应频率。通过分组随机的方式避免响应频率接近的标签密集堆放。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

vector candidate_frequencies;

for (int f = min_frequency; f <= max_frequency; f += frequency_interval) {

  candidate_frequencies.push_back(f);

}

// 按照频率大小排序

sort(candidate_frequencies.begin(), candidate_frequencies.end());

// 定义标签列表

vector tags = {

  tag1,

  tag2,

  tag3

};

// 给每个标签赋予身份编号

for (int i = 0; i < tags.size(); i++) {

  tags[i].id = i + 1;

}

// 定义编号单元组的大小

int unit_size = 2;

// 将标签的身份编号划分为多个编号单元组

vector> id_units;

for (int i = 0; i < tags.size(); i += unit_size) {

  vector id_unit;

  for (int j = i; j < i + unit_size && j < tags.size(); j++) {

    id_unit.push_back(tags[j].id);

  }

  id_units.push_back(id_unit);

}

// 依次从每个单元组内随机抽取身份编号排列得到标签的身份编号的乱序列表

vector id_list;

for (int i = 0; i < id_units.size(); i++) {

  random_shuffle(id_units[i].begin(), id_units[i].end());

  id_list.insert(id_list.end(), id_units[i].begin(), id_units[i].end());

}

请参阅图5所示,为了避免标签中的信息被篡改后而不知导致的错误,对于每个标签,首先可以执行步骤S21将标签的身份编号按照设定的格式生成得到身份编号信息。接下来可以执行步骤S22将标签的响应频率按照设定的格式生成得到响应频率信息。接下来可以执行步骤S23将身份编号信息和响应频率信息按照设定的顺序排列得到标签的待写入明文信息。最后可以执行步骤S24按照设定的不可逆运算方式获取待写入明文信息的数字摘要作为标签的身份加密信息。为了生成数字摘要,可以使用SHA-256哈希算法,该算法可以从C++的库中获得。当然也可以使用MD5算法,这样会降低解码的难度,同样也会降低破解的难度。在解码的过程中由于响应频率信息和身份编号信息的信息量较小且具有固定的范围,因此可以通过查彩虹表的方式进行反推即可得到。但是由于响应频率信息和身份编号信息的范围是外部攻击者不得而知的,因此其破解难度极高,可以视为无法破解。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

struct Tag {

    int id; // 身份编号

    int frequency; // 响应频率

    string plaintext; // 待写入明文信息

    string ciphertext; // 身份加密信息

};

// 格式化身份编号

string formatId(int id) {

    stringstream ss;

    ss << setfill('0') << setw(4) << id;

    return ss.str();

}

// 格式化响应频率

string formatFrequency(int frequency) {

    stringstream ss;

    ss << setfill('0') << setw(8) << frequency;

    return ss.str();

}

// 计算数字摘要

string computeHash(string plaintext) {

    unsigned char digest[MD5_DIGEST_LENGTH];

    char hash[2*MD5_DIGEST_LENGTH+1];

    MD5((const unsigned char *) plaintext.c_str(), plaintext.size(),digest);

    for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {

        sprintf(&hash[i*2], "%02x", (unsigned int)digest[i]);

    }

    return hash;

}

int main() {

    // 模拟生成标签信息

    vector tags;

    for(int i = 1; i <= 10; i++) {

        Tag tag;

        tag.id = i;

        tag.frequency = rand() % 1000;

        tag.plaintext = formatId(tag.id) + formatFrequency(tag.frequency);

        tag.ciphertext = computeHash(tag.plaintext);

        tags.push_back(tag);

    }

    // 输出标签信息

    for(int i = 0; i < tags.size(); i++) {

        Tag tag = tags[i];

        cout << "Tag " << i+1 << ":" << endl;

        cout << "    ID: " << formatId(tag.id) << endl;

        cout << "    Frequency: " << formatFrequency(tag.frequency) << endl;

        cout << "    Plaintext: " << tag.plaintext << endl;

        cout << "    Ciphertext: " << tag.ciphertext << endl;

    }

    return 0;

}

请参阅图6所示,为了获取分布在不同区域的标签的响应频率和位置的关系,上述的步骤S4在实施的过程中首先可以执行步骤S41向标签按照待选频率分次发送第一检测信号。接下来可以执行步骤S42在每次向标签发送第一检测信号后检测标签的响应信号。接下来可以执行步骤S43根据每次向标签发送第一检测信号后检测标签的响应信号得到不同适配收发频率下的标签的响应频率、响应方位角以及响应间隔时间。最后可以执行步骤S44根据标签的响应方位角和响应间隔时间得到不同适配收发频率下的标签相对于识别终端的方位角和距离。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

struct Tag {

    int responseFrequency;

    double responseAzimuth;

    double responseInterval;

};

void detectResponse(Tag& tag, int candidateFrequency) {

    // 向标签发送第一检测信号

    sendFirstDetectionSignal(candidateFrequency);

    // 检测标签的响应信号

    bool responseDetected = false;

    double startTime = getCurrentTime();

    while(!responseDetected && (getCurrentTime() - startTime 

        if(receiveResponseSignal(tag.responseFrequency)) {

            responseDetected = true;

        }

    }

}

void getResponseInfo(Tag& tag) {

    for(int i = 0; i < NUM_CANDIDATE_FREQUENCIES; i++) {

        detectResponse(tag, candidateFrequencies[i]);

        int index = findIndex(tag.responseFrequency, responseFrequencyTable);

        tag.responseAzimuth = responseAzimuthTable[index];

        tag.responseInterval = responseIntervalTable[index];

    }

}

void calculatePosition(Tag tag, double& azimuth, double& distance) {

    azimuth = tag.responseAzimuth - TERMINAL_AZIMUTH;

    distance = tag.responseInterval * SPEED_OF_SOUND / 2;

}

请参阅图7所示,由于连续发射的第一检测信号之间可能会导致串扰,这种串扰通常是频率越接近越容易导致干扰,为了尽量避免此种情况,上述的步骤S41在具体实施的过程中首先可以执行步骤S411获取待选频率的顺序列表中待选频率的数量。接下来可以执行步骤S412根据待选频率的顺序列表中待选频率的数量,间隔设定的数量获取待选频率的顺序列表中待选频率的抽取间隔数量,其中待选频率的抽取间隔数量不超过待选频率的顺序列表中全部待选频率的数量的一半。接下来可以执行步骤S413按照待选频率的顺序列表中待选频率的顺序,每次抽取一个待选频率以及间隔待选频率的抽取间隔数量的待选频率组成一个待选频率组合。接下来可以执行步骤S414将待选频率组合按照抽取的顺序排列得到待选频率的发送顺序。最后可以执行步骤S415向标签按照待选频率的发送顺序分次发送第一检测信号。通过以上方式将相邻两次发射的第一检测信号的频率尽量错开。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

struct FrequencyCombination {

    vector frequencies;

    int interval;

};

int getInterval(int numFrequencies) {

    int interval = numFrequencies / 2;

    if(interval < MIN_INTERVAL) {

        interval = MIN_INTERVAL;

    }

    return interval;

}

vector getFrequencyCombinations(vectorcandidateFrequencies) {

    vector combinations;

    int numFrequencies = candidateFrequencies.size();

    int interval = getInterval(numFrequencies);

    for(int i = 0; i < numFrequencies; i++) {

        vector combination = {candidateFrequencies[i]};

        for(int j = i + interval; j < numFrequencies; j += interval){

            combination.push_back(candidateFrequencies[j]);

        }

        combinations.push_back({combination, interval});

    }

    return combinations;

}

void detectFrequencies(Tag& tag, vector frequencies) {

    for(int frequency : frequencies) {

        sendFirstDetectionSignal(frequency);

        // 等待标签的响应信号

        bool responseDetected = false;

        double startTime = getCurrentTime();

        while(!responseDetected && (getCurrentTime() - startTime 

            if(receiveResponseSignal(tag.responseFrequency)) {

                responseDetected = true;

            }

        }

请参阅图8所示,为了提高信息的收发效率,需要让第二检测信号的强度和检测接收灵敏度增加这就导致识别终端的指向性较强,每次只能够对一部分区域进行有效的信号收发,为了在有限的信号收发区域内提高单次标签识别的数量,上述的步骤S7在具体实施的过程中首先可以执行步骤S71根据不同适配收发频率下的标签相对于识别终端的方位角和距离对每个标签进行标注,得到每个适配收发频率下标签的二维的位置描述,位置描述包括标签相对于识别终端的方位角和距离。接下来可以执行步骤S72根据每个适配收发频率下标签的二维的位置描述得到每个适配收发频率下标签的位置向量。接下来可以执行步骤S73对于每个适配收发频率,按照每个适配收发频率下标签的位置向量得到第二检测信号的发射对准位置。最后可以执行步骤S74对于每个发射对准位置,按照对应的适配收发频率发射第二检测信号。作为补充说明,多个接收响应频率相同的标签在对同一个第二检测信号进行响应的过程中,其发送的响应信号会被接收终端全部接收,通过数字解码即可以识别出每个标签对应的身份编号。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

class Frequency {

private:

    vector tags; // 标签列表

    vector positionVector; // 标签位置向量

public:

    Frequency() {}

    void addTag(Tag tag) {

        tags.push_back(tag);

    }

    void calculatePositionVector() {

        // 根据每个标签的方位角和距离计算位置向量

        for (int i = 0; i < tags.size(); i++) {

            double azimuth = tags[i].getAzimuth();

            double distance = tags[i].getDistance();

            // 计算位置向量的x和y分量

            double x = distance * cos(azimuth);

            double y = distance * sin(azimuth);

            // 添加到位置向量列表中

            positionVector.push_back(x);

            positionVector.push_back(y);

        }

    }

    vector getPositionVector() const {

        return positionVector;

    }

    int getNumTags() const {

        return tags.size();

    }

};

class Terminal {

private:

    vector frequencies; // 适配收发频率列表

public:

    Terminal() {}

    void addFrequency(Frequency frequency) {

        frequencies.push_back(frequency);

    }

    void emitSecondDetectionSignal() const {

        // 对于每个适配收发频率

        for (int i = 0; i < frequencies.size(); i++) {

            Frequency frequency = frequencies[i];

            vector positionVector = frequency.getPositionVector();

            // 计算位置向量的平均值

            double xSum = 0;

            double ySum = 0;

            for (int j = 0; j < positionVector.size(); j += 2) {

                xSum += positionVector[j];

                ySum += positionVector[j+1];

            }

            double xAvg = xSum / frequency.getNumTags();

            double yAvg = ySum / frequency.getNumTags();

            // 发射第二检测信号

            cout << "Emitting second detection signal at position ("<< xAvg << ", " << yAvg << ") for frequency " << i << endl;

        }

    }

};

请参阅图9所示,对于每个适配收发频率,上述的步骤S73在实施的过程中首先可以执行步骤S731在全部的位置向量中选取若干个作为核心位置向量。

接下来可以执行步骤S732获取核心位置向量与其它位置向量的向量差的模长。接下来可以执行步骤S733将每个其它位置向量与向量差的模长最小的核心位置向量配组。接下来可以执行步骤S734将每个核心与配组的其它位置向量组成一个无线电对准基团。接下来可以执行步骤S735获取每个无线电对准基团的几何中心。接下来可以执行步骤S736持续更新核心位置向量以及无线电对准基团的几何中心。接下来可以执行步骤S737判断核心位置向量与无线电对准基团的几何中心的距离是否在设定值以内。若否则接下来可以返回执行步骤S736,若是则接下来可以执行步骤S738将核心位置向量对应的位置作为第二检测信号的发射对准位置。

为了更加准确展示以上步骤的技术内容,提供一下代码,受限于篇幅仅展示部分核心代码内容。

#include 

#include 

#include 

// 定义向量结构体

struct Vector {

    double x, y, z;

};

// 计算两个向量的差

Vector operator-(const Vector& a, const Vector& b) {

    return {a.x - b.x, a.y - b.y, a.z - b.z};

}

// 计算向量的模长

double norm(const Vector& a) {

    return std::sqrt(a.x * a.x + a.y * a.y + a.z * a.z);

}

int main() {

    // 定义位置向量

    std::vector position_vectors;

    // TODO:从输入或文件读取位置向量

    // 定义适配收发频率列表

    std::vector frequencies;

    // TODO:从输入或文件读取适配收发频率列表

    // 遍历适配收发频率列表

    for (auto frequency : frequencies) {

        // 定义核心位置向量列表

        std::vector core_vectors;

        // TODO:从全部位置向量中选取若干个作为核心位置向量

        // 定义无线电对准基团列表

        std::vector> radio_alignments;

        // 遍历其它位置向量

        for (auto other_vector : position_vectors) {

            // 初始化最小向量差的模长为一个较大的值

            double min_norm = std::numeric_limits::max();

            // 初始化配组核心位置向量为空

            Vector core_vector = {0, 0, 0};

            // 遍历核心位置向量

            for (auto core : core_vectors) {

                // 计算向量差的模长

                double cur_norm = norm(core - other_vector);

                // 更新最小向量差的模长和配组核心位置向量

                if (cur_norm < min_norm) {

                    min_norm = cur_norm;

                    core_vector = core;

                }

            }

            // 将其它位置向量和配组核心位置向量组成一个无线电对准基团

            std::pair radio_alignment = {core_vector,other_vector};

            // 将无线电对准基团加入列表

            radio_alignments.push_back(radio_alignment);

        }

        // 获取每个无线电对准基团的几何中心

        std::vector centers;

        for (auto alignment : radio_alignments) {

            Vector center = {(alignment.first.x + alignment.second.x)/ 2.0,

                             (alignment.first.y + alignment.second.y)/ 2.0,

                             (alignment.first.z + alignment.second.z)/ 2.0};

            centers.push_back(center);

        }

        // 持续更新核心位置向量以及无线电对准基团的几何中心

        bool within_distance = false;

        while (!within_distance) {

            // TODO:计算核心位置向量和无线电对准基团的几何中心的距离,并判断是否在设定值以内

            if (!within_distance)

        // 若在设定值以内,则将核心位置向量对应的位置作为第二检测信号的发射对准位置

        else {

            // TODO:获取核心位置向量对应的位置,并作为第二检测信号的发射对准位置

        }

    }

}

return 0;

从标签的视角对本系统进行说明,请参阅图10所示,本方案还提供一种射频识别验证方法,在实施的过程中首先可以执行步骤S01接收并向标签写入身份加密信息。接下来可以执行步骤S02至步骤S05接收第一检测信号和第二检测信号并发射响应信号。详细的过程可以参见步骤S1至步骤S8,在此不作赘述。

综上所述,本发明中的信息输入模块用于为每个标签分配唯一的身份编码和响应频率。接着,系统会根据这些信息生成每个标签的加密身份数据。然后,将相应的加密信息写入各个标签。其次,标签植入模块负责将这些标签植入到屠宰农产品中。识别终端会向标签发送多次第一探测信号,并根据标签的响应信号获取标签的适配接收-发送频率,以及标签相对于识别终端的方向角和距离。接下来,系统会根据标签的适配接收-发送频率将标签划分到不同的频率区域。在每个频率区域内,根据标签相对于识别终端的方向角和距离,进一步将标签划分到若干个位置区域。随后,向每个位置区域发送多次第二探测信号,并根据区域内标签对第二探测信号的响应信号,获取每个标签内储存的加密身份信息。之后,根据标签的适配接收-发送频率对加密身份信息进行解密识别,以得到标签的身份编码。最后,追踪模块会根据标签的身份编码对屠宰农产品进行追溯。该系统通过在屠宰农产品中植入加密标签,利用分频分区识别技术准确且高效地读取农产品的身份信息,从而提高了屠宰农产品品质追溯的速度和可靠性。

附图中的流程图和框图显示了根据本申请的多个实施例的装置、系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。

也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行相应的功能或动作的硬件,例如电路或ASIC(专用集成电路,Application Specific Integrated Circuit)来实现,或者可以用硬件和软件的组合,如固件等来实现。

技术分类

06120116123753