C#读写FDX-B ISO11784/85协议动物标签源码

news2024/10/5 14:20:21

          一个FDX-B ISO11784/85协议动物标签内包括了以下信息:

  1. 11位的前导码;
  2. 38位的SN序号;
  3. 10位国家代码;
  4. 1位data block标识;
  5. 14位保留位;
  6. 1位Animal动物标识;
  7. 以上64位数据的crc16ccitt校验码,共16位;
  8. 24位扩展位;
  9. 以上信息每隔8位再插入1位‘1’,总计128位数据。

本示例使用的发卡器: EM4305 EM4469 ISO11784/85协议125K低频FXD-B动物标签读写发卡器-淘宝网 (taobao.com)

以标签信息为:900202300000001  为例解析

国家编码:900
国家编码转二进制:1110000100 (高位在前低位在后)
SN序列号:202300000001
SN序列号转二次制:10111100011010000001010000011100000001  (高位在前低位在后)

1、首先发送11位前导码:10000000000
2、加入0到7位SN码 再1位‘1’:10000000110000000000
3、加入8到15位SN码 再加1位‘1’:10000011110000000110000000000
4、加入16到23位SN码 再加1位‘1’:10000010110000011110000000110000000000
5、加入24到31位SN码 再加1位‘1’:10001101010000010110000011110000000110000000000
6、加入32到37位SN码、0、1两位国家编码、再加1位‘1’:10010111110001101010000010110000011110000000110000000000
7、加入2到9位国家编码再加1位‘1’:11110000110010111110001101010000010110000011110000000110000000000
8、加入1位data blocks标识位、7位保留位再加1位‘1’:
9、加入7位保留位、1位Animal标识位再加1位‘1’:
10、计算以上由38位SN码、10位国家代码、14位保留码、1位data block标识位、1位Animal标识位 总计64位8字节的 crc16ccitt 校验码。
11、加入8位crc16ccitt 低字节校验码再加1位‘1’
12、加入8位crc16ccitt 高字节校验码再加1位‘1’
13、加入8位扩展信息再加1位‘1’
14、加入8位扩展信息再加1位‘1’
15、加入8位扩展信息再加1位‘1’
16,以上总计128位数据,写入EM4305卡片的5、6、7、8四个块,即为FDX-B协议标签。

C#读FDX-B协议动物标签

 private void button1_Click(object sender, EventArgs e)
        {
            byte status;                          //存放返回值
            int j;
            byte myctrlword = 0x00;               //控制字
            byte[] oldpicckey = new byte[4];      //密码
            byte[] mypiccserial = new byte[4];    //卡序列号
            byte[] mypiccdata = new byte[70];     //读卡数据缓冲:卡无线转输分频比、卡内容长度(字节数),及最多返回12个块的数据
            byte[] mypiccblockflag = new byte[2]; //指定读哪一块
            string bitstr;

            textBox1.Text = "0000";
            textBox2.Text = "000000000000";
            textBox3.Text = "00000";
            textBox4.Text = "00000000";
            
            mypiccblockflag[0] = 224;
            mypiccblockflag[1] = 1;

            status = em4305_read(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, mypiccdata);
            if (status == 0)
            {
                idr_beep(30);
                string blockdata = "";
                for (int i = 0; i < mypiccdata[1]; i++)
                {
                    bitstr ="00000000"+ Convert.ToString(mypiccdata[2 + i], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    blockdata =bitstr+ blockdata;
                }
                byte[] info = new byte[14];
                if (checkgetbitinf(blockdata, info))
                {
                    string Serialnumberbit = "";
                    bitstr = "00000000" + Convert.ToString(info[1], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Serialnumberbit = bitstr + Serialnumberbit;
                    bitstr = "00000000" + Convert.ToString(info[2], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Serialnumberbit = bitstr + Serialnumberbit;
                    bitstr = "00000000" + Convert.ToString(info[3], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Serialnumberbit = bitstr + Serialnumberbit;
                    bitstr = "00000000" + Convert.ToString(info[4], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Serialnumberbit = bitstr + Serialnumberbit;
                    bitstr = "00000000" + Convert.ToString(info[5], 2);
                    string conutrybit = "";
                    conutrybit = bitstr.Substring(0, 2);
                    bitstr = bitstr.Substring(bitstr.Length - 6);
                    Serialnumberbit = bitstr + Serialnumberbit;
                    Int64 SerialnumberId = Convert.ToInt64(Serialnumberbit, 2);
                    textBox2.Text = SerialnumberId.ToString("D12");

                    bitstr = "00000000" + Convert.ToString(info[6], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    conutrybit = bitstr + conutrybit;
                    Int16 conutryid = Convert.ToInt16(conutrybit, 2);
                    textBox1.Text = conutryid.ToString("D4");
                    
                    bitstr = "00000000" + Convert.ToString(info[7], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    string Reservedbit = bitstr.Substring(0, 7);

                    if (bitstr.Substring(7, 1) == "1") { checkBox3.Checked = true; } else { checkBox3.Checked = false; }

                    bitstr = "00000000" + Convert.ToString(info[8], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    if (bitstr.Substring(0, 1) == "1") { checkBox4.Checked = true; } else { checkBox4.Checked = false; }
                    Reservedbit = Reservedbit + bitstr.Substring(1, 7);
                    Int16 Reserved = Convert.ToInt16(Reservedbit, 2);
                    textBox3.Text = Reserved.ToString("D5");

                    string Extensionbit = "";
                    bitstr = "00000000" + Convert.ToString(info[11], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Extensionbit = bitstr + Extensionbit;
                    bitstr = "00000000" + Convert.ToString(info[12], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Extensionbit = bitstr + Extensionbit;
                    bitstr = "00000000" + Convert.ToString(info[13], 2);
                    bitstr = bitstr.Substring(bitstr.Length - 8);
                    Extensionbit = bitstr + Extensionbit;
                    Int32 Extension = Convert.ToInt32(Extensionbit, 2);
                    textBox4.Text = Reserved.ToString("D8");
                }
                else
                {
                    MessageBox.Show("不是有效的FDX-B协议标签!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            } 
            else { MessageErrInf(status); }
        }

C#写FDX-B协议动物标签

 private void button2_Click(object sender, EventArgs e)
        {
            Int16 conutryid = Convert.ToInt16(textBox1.Text.Trim());
            Int64 SerialnumberId = Convert.ToInt64(textBox2.Text.Trim());
            Int16 Reserved = Convert.ToInt16(textBox3.Text.Trim());
            Int32 Extension = Convert.ToInt32(textBox4.Text.Trim());

            if (conutryid > 1023){
                MessageBox.Show("Country国家代码的取值范围是:0~1023!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textBox1.SelectionStart = 0;
                textBox1.SelectionLength = textBox1.Text.Trim().Length;
                textBox1.Select();
                return;
            }

            if (SerialnumberId > 274877906943)
            {
                MessageBox.Show("SerialNumber序列号的取值范围是:0~274877906943!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textBox2.SelectionStart = 0;
                textBox2.SelectionLength = textBox2.Text.Trim().Length;
                textBox2.Select();
                return;
            }

            if (Reserved > 16383)
            {
                MessageBox.Show("Reserved保留信息的取值范围是:0~16383!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textBox3.SelectionStart = 0;
                textBox3.SelectionLength = textBox3.Text.Trim().Length;
                textBox3.Select();
                return;
            }

            if (Extension > 16777215)
            {
                MessageBox.Show("Extension扩展信息的取值范围是:0~16777215!", "示例提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                textBox4.SelectionStart = 0;
                textBox4.SelectionLength = textBox4.Text.Trim().Length;
                textBox4.Select();
                return;
            }

            string Extensionbit = "000000000000000000000000"+Convert.ToString(Extension, 2);
            Extensionbit = Extensionbit.Substring(Extensionbit.Length - 24);

            string Reservedbit = "00000000000000" + Convert.ToString(Reserved, 2);
            Reservedbit = Reservedbit.Substring(Reservedbit.Length - 14);
            if (checkBox4.Checked) { Reservedbit = "1" + Reservedbit; } else { Reservedbit = "0" + Reservedbit; }
            if (checkBox3.Checked) { Reservedbit =  Reservedbit+"1"; } else { Reservedbit =  Reservedbit+"0"; }

            string conutrybit = "0000000000" + Convert.ToString(conutryid, 2);
            conutrybit = conutrybit.Substring(conutrybit.Length - 10);

            string Serialnumberbit = "00000000000000000000000000000000000000" + Convert.ToString(SerialnumberId, 2);
            Serialnumberbit = Serialnumberbit.Substring(Serialnumberbit.Length - 38);

            string fdxbitstr = "10000000000";       //前导码
            fdxbitstr = "1" + Serialnumberbit.Substring(30, 8) + fdxbitstr;
            fdxbitstr = "1" + Serialnumberbit.Substring(22, 8) + fdxbitstr;
            fdxbitstr = "1" + Serialnumberbit.Substring(14, 8) + fdxbitstr;
            fdxbitstr = "1" + Serialnumberbit.Substring(6, 8) + fdxbitstr;
            fdxbitstr = "1" + conutrybit.Substring(8, 2) + Serialnumberbit.Substring(0, 6) + fdxbitstr;
            fdxbitstr = "1" + conutrybit.Substring(0, 8) + fdxbitstr;
            fdxbitstr = "1" + Reservedbit.Substring(8, 8) + fdxbitstr;
            fdxbitstr = "1" + Reservedbit.Substring(0, 8) + fdxbitstr;

            byte[] info = new byte[8]; 
            for (int i = 0; i < 8; i++)
            {
                string thisbit = fdxbitstr.Substring((i + 1) * 9 - 9, 9);
                if (thisbit.Substring(0, 1) == "1")
                {
                    info[7 - i] = (byte)Convert.ToInt16(thisbit.Substring(1, 8), 2);
                }
            }
            ushort crc16ccitt = GetCrc16Ccitt(info);
            string crcbit = "0000000000000000" + Convert.ToString(crc16ccitt, 2);
            crcbit = crcbit.Substring(crcbit.Length - 16);
            fdxbitstr = "1" + crcbit.Substring(8, 8) + fdxbitstr;
            fdxbitstr = "1" + crcbit.Substring(0, 8) + fdxbitstr;

            fdxbitstr = "1" + Extensionbit.Substring(16, 8) + fdxbitstr;
            fdxbitstr = "1" + Extensionbit.Substring(8, 8) + fdxbitstr;
            fdxbitstr = "1" + Extensionbit.Substring(0, 8) + fdxbitstr;

            byte[] writebuf = new byte[16];
            for (int i = 0; i < 16; i++)
            {
                string thisbit = fdxbitstr.Substring((i + 1) * 8 - 8, 8);
                writebuf[15 - i] = (byte)Convert.ToInt16(thisbit, 2);
            }

            byte status;                          //存放返回值
            byte myctrlword = 0x00;               //控制字
            byte[] oldpicckey = new byte[4];      //密码
            byte[] mypiccserial = new byte[4];    //卡序列号
            byte[] mypiccblockflag = new byte[2]; //指定读哪一块

            mypiccblockflag[0] = 224;
            mypiccblockflag[1] = 1;

            status = em4305_write(myctrlword, mypiccserial, oldpicckey, mypiccblockflag, writebuf);
            if (status == 0)
            {
                if (checkBox2.Checked){
                    em4305_lock(myctrlword, mypiccserial, oldpicckey, mypiccblockflag);
                }

                string seriaStr = "";
                for (int i = 0; i < 4; i++)
                {
                    seriaStr = seriaStr + mypiccserial[i].ToString("X2");
                }
                idr_beep(30);
                MessageBox.Show("卡号:" + seriaStr + "写FDX-B协议标签成功!", "提示:", MessageBoxButtons.OK , MessageBoxIcon.Information );
                if (checkBox1.Checked)
                {
                    SerialnumberId = SerialnumberId + 1;
                    textBox2.Text = SerialnumberId.ToString("D12");
                }
            }
            else { MessageErrInf(status); }

        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频矩阵源码系统打包.源码

Masayl是一款基于区块链技术的去中心化应用程序开发平台&#xff0c;可帮助开发者快速、便捷地创建去中心化应用程序。Masayl拥有丰富的API和SDK&#xff0c;为开发者们提供了支持。此外&#xff0c;Masayl还采用了高效的智能合约技术&#xff0c;确保应用程序的稳定、安全和高…

项目集管理—项目集治理

一、概述 项目集治理是实现和执行项目集决策&#xff0c;为支持项目集而制定实践&#xff0c;并维持项目集监督的绩效领域。 本章包括&#xff1a; 项目集治理实践项目集治理角色项目集治理设计与实施 项目集治理包括为了满足组织战略和运营目标的要求&#xff0c;对项目集实…

【虹科案例】虹科数字化仪在激光雷达大气研究中的应用

01 莱布尼茨研究所使用激光雷达进行大气研究 图 1&#xff1a;在 Khlungsborn 的 IAP 办公室测试各种激光器 大气研究使用脉冲激光束通过测量大气中 100 公里高度的多普勒频移和反向散射光来测量沿光束的温度和风速。返回的光信号非常微弱&#xff0c;会被阳光阻挡&#xff0c…

90后的心声:都别卷了,上年纪了真的卷不动.....

内卷&#xff0c;是现在热度非常高的一个词汇&#xff0c;随着热度不断攀升&#xff0c;隐隐到了“万物皆可卷”的程度。 内卷的来源 内卷最早的“出处”是几张名校学霸的图片。 大学生们刷爆朋友圈的几张“内卷”图片是这样的&#xff1a;有的人骑在自行车上看书&#xff0c…

如何处理亿级图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …

系统架构师之高内聚低耦合

一、概念&#xff1a; 标记耦合&#xff08;Stamp Coupling&#xff09;和数据耦合&#xff08;Data Coupling&#xff09;是软件设计中两种不同的耦合类型&#xff0c;它们之间的区别如下&#xff1a; 标记耦合&#xff1a;标记耦合是指模块之间通过参数传递标记或标识符来进…

对安装Linux的服务器进行缓存清除

安装Linux的服务器缓存过高导致服务器运行速度慢 第一步&#xff0c;查看当前服务器中Linux系统的状态。 命令&#xff1a;free -h 第二步&#xff1a;备份内存缓冲区中的数据到磁盘中。 命令&#xff1a;sync 在大多数情况下&#xff0c;不需要手动使用sync命令&#xff0…

跨境电商如何进行仓储物流管理?

跨境电商如何进行仓储物流管理&#xff1f; 01跨境电商仓储物流管理痛点在哪&#xff1f; 供应链不稳定&#xff1a;因为要涉及多个国家的生产和供应环节&#xff0c;跨境物流的过程中还需要遵守目的地国家和货物品类的规定&#xff0c;这会增加仓储和物流成本&#xff0c;并…

创新需求:台灯加装语音识别芯片,打造智能化生活方式

为了满足人们对于智能化生活的需求&#xff0c;现在有一种创新的需求——为台灯加装语音识别芯片&#xff0c;从而实现远程控制、语音操控等更为智能的功能。 科技行业的快速发展&#xff0c;使得语音识别芯片也越来越普及。它们可以使电子产品具有智能化、人性化的交互方式。…

【Java系列】MyBatis-Plus常见面试题

问题列表 Q1&#xff1a;MyBatis-Plus是什么&#xff1f;它有什么优点&#xff1f; MyBatis-Plus是MyBatis框架的一个扩展库&#xff0c;它提供了一系列方便的API和工具&#xff0c;可以简化常见的数据库操作。MyBatis-Plus的优点包括&#xff1a; 提高开发效率&#xff1a;My…

第1章:SpringMVC简介

一、SpringMVC 1.Java语言学习流程 2.SpringMVC的主要内容 二、SpringMVC简介 1.什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型&#xff0c;视图&#xff0c;控制器划分M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用…

用Python构建大数据推荐系统:一个世界500强企业的成功案例

推荐系统是大数据时代的利器&#xff0c;它能够为企业提升用户体验、增加用户粘性、促进销售转化、提高营销效率等。但是&#xff0c;搭建一个成功的推荐系统并不容易&#xff0c;它需要综合考虑多方面的因素&#xff0c;并根据业务场景、用户需求、数据变化等不断地进行迭代和…

Nginx:Tomcat部署及优化(一)

Nginx&#xff1a;Rewrite 一、Tomcat介绍1.1 Tomcat 简介1.2 Tomcat 核心的组件1.2.1 什么是 servlet1.2.2 什么是 JSP 1.3 Tomcat 功能组件结构1.3.1 Container 结构分析 1.4 Tomcat 请求过程 二、Tomcat 服务部署三、Tomcat 虚拟主机配置四、Tomcat多实例部署 一、Tomcat介绍…

带你学透SQL语言的核心——DML操作

0️⃣写在前面 DML&#xff08;Data Manipulation Language&#xff09;是SQL语言的核心部分&#xff0c;其主要用于对数据库的数据进行增删改查。在学习数据时&#xff0c;学习DML操作是必不可少的一部分。 文章目录 0️⃣写在前面1️⃣添加数据2️⃣修改数据3️⃣删除数据4️…

chatgpt赋能python:Python教程:如何取出一个三位整数123的各个位并输出?

Python教程&#xff1a;如何取出一个三位整数123的各个位并输出&#xff1f; 如果您正在学习Python编程语言&#xff0c;那么您一定会遇到需要处理数字的情况。Python是一种非常方便的语言&#xff0c;可以帮助您轻松地提取一个三位整数的各个位数&#xff0c;并将其输出。在本…

Hopfield神经网络与受限波尔兹曼机

神经网络可分为两大类&#xff1a; 一类是多层神经网络、卷积神经网络&#xff1a;可用于模式识别另一类是相互连接型网络&#xff1a;可通过联想记忆去除输入数据中的噪声。 深度学习目录&#xff1a; 自适应线性单元 (Widrow and Hoff, 1960)神经认知机 (Fukushima, 1980)…

海睿思分享 | 企业如何加强采购风险控制

企业运营的主要流程&#xff0c;不会因为企业人员规模或者业务规模大小的差异&#xff0c;而出现巨大的差异。千万亿市值的上市公司、不足百人的新兴公司&#xff0c;面对的经营风险本质上不会有明显的区别。今天我们一起分享企业经营管理中常见的风险应对策略。 对于企业而言…

专业分析┃微电子专业介绍及发展前瞻

不知道提到微电子&#xff0c;你最先想到的是什么&#xff1f;芯片&#xff1f;卡脖子&#xff1f;摩尔定律&#xff1f; 因为近两年芯片被限制的原因&#xff0c;大家经常可以从各路媒体上看到“芯片”一词。微电子作为一个学科&#xff0c;简单的说&#xff0c;就是研究如何…

C++,Qt部分面试和笔试题

面试这么多次&#xff0c;C这块基础太差了&#xff0c;乘着还有印象总结下相关的面试问答和笔试题&#xff0c;后续会不断更新内容 目录 问答题1.计算机网络七层体系结构2.C中关键字static和const的使用3.QList和QVector for循环输出速度比较4.构造函数能否为虚函数5.谈谈你对面…

【Mysql】 表的增删查改

文章目录 【Mysql】表的增删查改Create --创建数据Retireve -- 读取数据select 列where条件order by -- 结果排序limit -- 分页 Update -- 更新数据Delete -- 删除数据deletetruncate -- 截断表 插入查询结果聚合函数group by 子句 【Mysql】表的增删查改 CRUD : Create(创建)…