我使用的UHF读写器动态库是32位的,所以需要jdk也是32位的,不然运行就会报错。上位机应用程序通过UHFREADER86.DLL操作EPCC1-G2格式电子标签读写器

安装32位JDK

可以去官网下载jdk-1.8(x86)的安装包

创建java项目

可以创建java基础项目。也可以使用springboot项目,我这边使用的是springboot

导入jna依赖包

 <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.7.0</version>
</dependency>

放置动态库

springboot项目可直接放在resource目录下,也可以自行创建目录

动态库调用的几个方法

使用jna调取C语言的动态库,找到文档中需要调用的方法

1. 连接读写器设备方法:

int OpenComPort(int Port, unsigned char *ComAdr, unsigned char Baud,int *FrmHandle);

2. 关闭指定连接设备

int CloseSpecComPort(int  FrmHandle);

3. 带缓存的询查方法

int InventoryBuffer_G2(unsigned char *ComAdr, unsigned char QValue, unsigned char Session,unsigned char MaskMem,unsigned char *MaskAdr,unsigned char MaskLen,unsigned char * MaskData, unsigned char MaskFlag, unsigned char AdrTID, unsigned char LenTID, unsigned char TIDFlag, unsigned char Target, unsigned char InAnt, unsigned char Scantime, unsigned char Fastflag, int * BufferCount, int *TagNum,int FrmHandle);

4. 读取缓存数据方法

int ReadBuffer_G2(unsigned char *ComAdr, int *Totallen, int *CardNum, unsigned char *pEPCList, int FrmHandle);

5. 查询缓存的标签数量

Int GetBufferCnt_G2(unsigned char *ComAdr , int *Count,int FrmHandle);

6. 清理缓存数据

Int ClearBuffer_G2(unsigned char *ComAdr ,int FrmHandle);

java使用jna调用

编写jna调用类

package com.ljd.bowei.service;import com.ljd.bowei.common.util.StrUtil;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;/*** <p> 描述:UHF 读写器动态库使用 </p>* 4.其他返回值定义* #define  InventoryReturnEarly_G2       0x01 询查时间结束前返回* #define  InventoryTimeOut_G2           0x02 指定的询查时间溢出* #define  InventoryMoreData_G2          0x03 本条消息之后,还有消息* #define  ReadermoduleMCUFull_G2        0x04 读写模块存储空间已满* #define  AccessPasswordError           0x05 访问密码错误* #define  DestroyPasswordError          0x09 销毁密码错误* #define  DestroyPasswordCannotZero     0x0a 销毁密码不能为全0* #define  TagNotSupportCMD              0x0b 电子标签不支持该命令* #define  AccessPasswordCannotZero      0x0c 对该命令,访问密码不能为0* #define  TagProtectedCannotSetAgain    0x0d 电子标签已经被设置了读保护,不能再次设置* #define  TagNoProtectedDonotNeedUnlock 0x0e 电子标签没有被设置读保护,不需要解锁* #define  ByteLockedWriteFail           0x10 有字节空间被锁定,写入失败* #define  CannotLock                   0x11 不能锁定* #define  LockedCannotLockAgain       0x12 已经锁定,不能再次锁定* #define  ParameterSaveFailCanUseBeforeNoPower  0x13 参数保存失败,但设置的值在读写模块断电前有效* #define  CannotAdjust                  0x14 无法调整* #define  InventoryReturnEarly_6B         0x15 询查时间结束前返回* #define  InventoryTimeOut_6B            0x16 指定的询查时间溢出* #define  InventoryMoreData_6B       0x17 本条消息之后,还有消息* #define  ReadermoduleMCUFull_6B        0x18 读写模块存储空间已满* #define  NotSupportCMDOrAccessPasswordCannotZero 0x19 电子不支持该命令或者访问密码不能为0* #define  CMDExecuteErr                 0xF9 命令执行出错* #define  GetTagPoorCommunicationCannotOperation 0xFA 有电子标签,但通信不畅,无法操作* #define  NoTagOperation                 0xFB 无电子标签可操作* #define  TagReturnErrorCode              0xFC 电子标签返回错误代码* #define  CMDLengthWrong                0xFD 命令长度错误* #define  IllegalCMD                    0xFE 不合法的命令* #define  ParameterError                0xFF 参数错误* #define  CommunicationErr              0x30 通讯错误* #define  RetCRCErr                     0x31 CRC校验错误* #define  RetDataErr                   0x32 返回数据长度有错误* #define  CommunicationBusy              0x33 通讯繁忙,设备正在执行其他指令* #define  ExecuteCmdBusy                0x34 繁忙,指令正在执行* #define  ComPortOpened               0x35 端口已打开* #define  ComPortClose                   0x36 端口已关闭* #define  InvalidHandle                  0x37 无效句柄* #define  InvalidPort                 0x38 无效端口* #define  RecmdErr                        0XEE返回指令错误* 5.错误代码定义* #define  OtherError                   0x00  其它错误,全部捕捉未被其它代码覆盖的错误* #define  MemoryOutPcNotSupport       0x03  存储器超限或不被支持的PC值,规定存储位置不存在或标签不支持PC值* #define  MemoryLocked                   0x04  存储器锁定,存储位置锁定或永久锁定,且不可写入* #define  NoPower                       0x0b  电源不足,标签电源不足,无法执行存储写入操作* #define  NotSpecialError            0x0f  非特定错误,标签不支持特定错误代码** @author wlp* @version 1.0.0* @date 2021/11/4 17:25*/
public interface UHFReaderLibrary extends Library {UHFReaderLibrary INSTANCE = Native.load( "/UHFReader86.dll", UHFReaderLibrary.class);/*** <p> 方法描述: 连接到指定串口* 该函数用于指定串口初始化,并通过连接串口和读写器以创建通信连接。数据传输协议是默认波特率57600bps,8位数据,1位停止位,没有奇偶校验位。* 在调用其它函数之前,您必须先连接串口和读写器。* </p>** @param Port      同上* @param ComAdr    同上* @param Baud      同上* @param FrmHandle 同上* @return int 如果该函数调用成功,返回一个零值* @author wlp* @date 2021/11/4 17:37*/int OpenComPort(int Port, PointerByReference ComAdr, String Baud, IntByReference FrmHandle);/*** <p> 方法描述: 关闭指定串口  该函数用于关闭指定串口。</p>** @param FrmHandle 输入变量,与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。* @return int 如果该函数调用成功,返回一个零值。否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。* @author wlp* @date 2021/11/4 17:38*/int CloseSpecComPort(int FrmHandle);/*** <p> 方法描述: 该命令用于获取读写器存储区中所有标签信息。响应完成后,缓存中的数据并不丢失,可以多次提取。</p>** @param ComAdr    输入变量,读写器地址;* @param Totallen  输出变量,返回的pEPCList数组字节大小;* @param CardNum   输出变量,返回的标签张数;* @param pEPCList  输出数组,大小是Totallen个字节,读取的标签信息;*                  缓存中每个电子标签的EPC/TID数据。*                  pEPCList*                  Ant Len    EPC/TID  RSSI    Count*                  0xXX    0xXX    nBytes  0xXX    0xXX* @param FrmHandle 输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。* @return int* @author wlp* @date 2021/11/4 18:53*/int ReadBuffer_G2(PointerByReference ComAdr, IntByReference Totallen, IntByReference CardNum, byte[] pEPCList, int FrmHandle);/*** <p> 方法描述: 该命令用于清空读写器存储区中所有标签信息。</p>** @param ComAdr    输入变量,读写器地址* @param FrmHandle 输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。* @return int 如果该函数调用成功,返回一个零值。* @author wlp* @date 2021/11/4 18:51*/int ClearBuffer_G2(PointerByReference ComAdr, int FrmHandle);/*** <p> 方法描述: 该命令用于获取缓存区中的标签数量</p>** @param ComAdr    输入变量,读写器地址.;* @param Count     输出变量,缓存区中的标签数量;* @param FrmHandle 输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。* @return int* @author wlp* @date 2021/11/5 15:46*/int GetBufferCnt_G2(PointerByReference ComAdr, IntByReference Count, int FrmHandle);/*** <p> 方法描述: 带缓存询查命令,询查命令的作用是检查有效范围内是否有符合协议的电子标签存在</p>** @param ComAdr      输入变量,读写器地址。* @param QValue      输入变量,Q值,范围0-15;* @param Session     输入变量,Session值,范围0-3;* @param MaskMem     输入变量,一个字节,掩码区。0x01:EPC存储区;0x02:TID存储区;0x03:用户存储区。* @param MaskAdr     输入数组,2个字节,掩码的起始位地址(单位:Bits)。范围0~16383。* @param MaskLen     一个字节,掩码的位长度(单位:Bits)。* @param MaskData    输入数组,掩码数据。MaskData数据字节长度是MaskLen/8。如果MaskLen不是8的整数倍,则MaskData数据字节长度为[MaskLen/8]取整再加1。不够的在低位补0。* @param MaskFlag    输入变量,一个字节,掩码标记位,MaskFlag=1掩码,MaskFlag=0不掩码。* @param AdrTID      输入变量,询查TID区的起始字地址。* @param LenTID      输入变量,询查TID区的数据字数。LenTID取值为0~15。* @param TIDFlag     输入变量, TIDFlag=1:表示询查TID区; TIDFlag=0:表示询查EPC;* @param Target      1个字节,查询EPC标签时使用的Target值 0x00:Target值使用A; 0x01:Target值使用B;* @param InAnt       1个字节,本次要进行查询的天线号,本模块固定0x80;* @param Scantime    1个字节,本次命令查询的最大时间,范围3-255(*100ms);* @param FastFlag    快速查询的标志位,为0时不启用,为1时启用,此时要指定Target,Inant,Scantime 3个参数。* @param BufferCount 输出变量,缓存中记录的标签总数,相同 EPC/TID数据的标签将被视为同一张标签。若未清空缓存,标签数量为多次询查操作的数量累加。* @param TagNum      输出变量,本次询查中读取标签的次数,不区分是否多次读取同一张标签。* @param FrmHandle   输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。* @return int 如果该函数调用成功,返回值:* 0x01   询查时间结束前返回* 0x02 询查时间结束使得询查退出* 0x03  如果读到的标签数量无法在一条消息内传送完,将分多次发送。如果Status为0x0D,则表示这条数据结束后,还有数据。* 0x04   还有电子标签未读取,电子标签数量太多,MCU存储不了* 返回其他值,请查看其他返回值定义,返回的错误代码请查看错误代码定义。* @author wlp* @date 2021/11/5 16:19*/int InventoryBuffer_G2(PointerByReference ComAdr, byte QValue, byte Session, byte MaskMem, byte[] MaskAdr,byte MaskLen, byte[] MaskData, byte MaskFlag, byte AdrTID, byte LenTID, byte TIDFlag,byte Target, int InAnt, int Scantime, byte FastFlag, IntByReference BufferCount,IntByReference TagNum, int FrmHandle);
}class Test {public static void main(String[] args) throws InterruptedException {UHFReaderLibrary instance = UHFReaderLibrary.INSTANCE;IntByReference frmHandle = new IntByReference();PointerByReference comAdr = new PointerByReference();// 打开连接int openNum = instance.OpenComPort(4, comAdr, "57600", frmHandle);if (openNum == 0) {System.out.println("连接成功");} else {System.out.println("连接失败---》" + Integer.toHexString(openNum));}// 询查参数byte[] MaskAdr = new byte[2];byte[] MaskData = new byte[100];byte QValue = 4;byte Session = 1;byte MaskMem = 0;byte MaskLen = 0;byte MaskFlag = 0;byte AdrTID = 0;byte LenTID = 6;byte TIDFlag = 0;byte Target = 0;int InAnt = 0x80;int Scantime = 3;byte Fastflag = 1;IntByReference BufferCount = new IntByReference();IntByReference TagNum = new IntByReference();// 调用询查方法int InventoryBuffer_G2 = instance.InventoryBuffer_G2(comAdr, QValue, Session, MaskMem, MaskAdr, MaskLen, MaskData,MaskFlag, AdrTID, LenTID, TIDFlag, Target, InAnt, Scantime, Fastflag, BufferCount, TagNum, frmHandle.getValue());Thread.sleep(3000);System.out.println("缓存中记录的标签总数---->" + BufferCount.getValue());System.out.println("本次询查中读取标签的次数---->" + TagNum.getValue());// 获取缓存中的标签数IntByReference Count = new IntByReference();instance.GetBufferCnt_G2(comAdr, Count, frmHandle.getValue());System.out.println("缓存区中的标签数量---->" + Count.getValue());IntByReference Totallen1 = new IntByReference(16);byte[] pEPCList = new byte[Totallen1.getValue()];IntByReference CardNum1 = new IntByReference();// 读取缓存数据int readNum = instance.ReadBuffer_G2(comAdr, Totallen1, CardNum1, pEPCList, frmHandle.getValue());System.out.println("读取数据失败--->" + Integer.toHexString(readNum));System.out.println(bytesToHexString(pEPCList));// 清除缓存instance.ClearBuffer_G2(comAdr, frmHandle.getValue());int closeNum = instance.CloseSpecComPort(frmHandle.getValue());if (closeNum == 0) {System.out.println("关闭连接成功");} else {System.out.println("关闭连接失败" + Integer.toHexString(closeNum));}}public static String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder();if (src == null || src.length <= 0) {return null;}for (byte b : src) {int v = b & 0xFF;String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}
}

最后得到的数据:010cc2046700a208200806800009dc01

epc的格式

Ant

Len

EPC/TID

RSSI

Count

0xXX

0xXX

nBytes

0xXX

0xXX

解析后的标签epc: c2046700a208200806800009

UHF读写器jna调用 UHFReader x86相关推荐

  1. 记录大坑:用Xamarin引入UHF读写器dll,报错: 所生成项目的处理器架构“MSIiL”与引用的Reader.dll处理器架构“x86”不匹配

    哎,太少人用VS的Xamarin开发了,而我正是摸索中的一个开发者,我都记不清楚遇到多少坑了,心累. 说回正事: 当你用Xamarin引入UHFRIFD读写器dll时,绝对报错,Xamarin框架问题 ...

  2. Andriod安卓下开发UHF读写器

    Andriod系统下通过引用yoworeaderuhf.jar包,可以快速的将UHF读写器YW-602H接入到Andriod设备中. Andriod安卓开发的API接口有: 2.1 byte[] YW ...

  3. google浏览器下开发UHF超高频读写器

    在google浏览器下采用js脚本开发UHF超高频读写器, API接口有如下所示: .1.UHF读卡器寻卡,符合18000-6C,G2的卡和标签 G2_Inventory(isEPC) G2_Inve ...

  4. 西门子PLC300编程实例程序70例 含RFID读写器专用功能块 西门子PLC300编程应用实例程序

    西门子PLC300编程实例程序70例 含RFID读写器专用功能块 西门子PLC300编程应用实例程序70例含RFID读写器专用功能块 西门子PLC300编程应用实例程序 共70个例程: 1.两个CPU ...

  5. 工业RFID读写器选择指南

    工业RFID读写器在工业领域上可提升自动化.现代化工业生产的效率,那么企业在选择工业读写器的时候,需要注重哪些方面,如何选择呢?以下是ANDEWELL给大家准备的工业RFID读写器选择指南! 1.根据 ...

  6. 明华读卡器 java_Java调用明华RF读写器DLL文件过程解析

    这篇文章主要介绍了Java调用明华RF读写器DLL文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先jdk必须得是32位的,IDE也必 ...

  7. UHF射频读写器实现对EPCC1-G2电子标签的寻卡,读卡,写卡功能

    HX9809U-L超高频读写器: 读写器厂家提供SDK,采用动态链接加载的方式.方式如下`: 1.头文件定义相关变量 class CUHFDlg : public CDialog{// Constru ...

  8. 精密型工业级UHF超高频RFID读写器|读卡器JT7300的MODBUS协议说明

    JT7300外形采用工业设计,坚固耐用,符合恶劣的工业产线环境,防护等级达到IP66.射频采用自主知识产权砥发芯局...配以高性能标签识别篡法.采用标准接口RS232(可定制RS485或 Modbus ...

  9. acr38u PHP调用,ACS ACR38智能卡读写器驱动下载_ACS ACR38智能卡读写器驱动官方下载-太平洋下载中心...

    ACR38智能卡读写器是一款USB全速设备,专为在计算机环境下使用而设计.此系列读写器产品将现代设计与最先进的技术融为一体,为一些特殊环境提供了一个恰当的解决方案.ACR38是网络安全.电子支付系统. ...

最新文章

  1. Juniper批量新增用户命令工具
  2. Hibernate抓取策略
  3. csv.writer写入文件有多余的空行
  4. Android studio Error occurred during initialization of VM 问题解决
  5. windows ce6.0系统 支持双网卡吗_MacBook双系统不求人,自己来
  6. Ionic4 Camera插件在iOS13上选取视频失败 上传时候提示权限不足
  7. 汉化后的eclipse改成英文版
  8. 微信小程序 java网上购物商城系统
  9. JS 获取当前浏览器版本,验证浏览器版本是否高于谷歌80
  10. 硬件设计分享-⑨电感与磁珠
  11. Excel :模拟投币实验
  12. JVM常见命令之jstack
  13. Electron教程(七)结语
  14. 一招教你怎么注册/登陆芒果xo悠闲社区网
  15. 12306 火车票订票助手
  16. 百度与中国联通达成战略合作,携手加速区块链基础设施建设
  17. 修改npm全局安装包的位置路径
  18. 微信小程序教程-调用服务器接口
  19. qt-qss之QScrollArea使用
  20. 28推精英会专访IT博主卢松松

热门文章

  1. 1、Linux基本命令
  2. 高逼格关闭Win10防火墙
  3. 中央空调的安装维护教学实训QY-JDW03
  4. 在线编辑html表格控件,jQuery在线表格编辑插件
  5. javascript深入了解匿名函数和闭包
  6. 到现在还有人不知道JavaScript匿名函数嘛
  7. 移动APP测试点、思路分析总结(精炼)
  8. 函数组:SCMS_CONV 字符内码转化
  9. 机器学习深度学习云GPU资源与对比
  10. WP8 win8 电脑或安卓自带字体 SegoeWP字体