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

2023-10-30 20:50

本文主要是介绍C#读写FDX-B ISO11784/85协议动物标签源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

          一个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); }}

这篇关于C#读写FDX-B ISO11784/85协议动物标签源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310503

相关文章

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2