The Octane SDK includes the core library by acting as a wrapper for extraction, modifying, and the application of a Reader's Low Level Reader Protocol (LLRP) settings, as well as high-level control over Reader settings, tag query, and tag-write operation.

1. Environment

1.1. Device

  • down Octanesdk.zip, contains the libraries, technical reference.

1.2. Theory

1.2.1. Backscatter Power

the power is affected by the antenna design, impedance matching, and the changes in reflection coefficient as a function of tag modulator state.

Propagation effects such as absorption and scattering; Antenna effects such as impedance mismatch, polarization mismatch; Multipath propagation and undesired signals in the environment can combine with the primary backscatter.

1.2.2. RF Phase

the reader's transmit circuits, the tag's reflection characteristic, and the reader's receiver circuits.

  • Phase estimates should only be compared on a single antenna and channel. RF phase is a function of frequency and antenna path.
  • Gen2 UHF RFID employs a slotted-aloha media access scheme, which means that the order in which tags are inventoried will be random. The time between successive inventories of the same tag will depend on reader mode, tag population size, and environmental conditions (e.g. interference levels).

1.2.2.1. velocity
  • If two time-phase pairs are measured for the same tag, one at (t0, 0) and one at (t1, 1), the radial distance traversed by the tag is: assumes that the tag moves less than half a wavelength in the radial direction between observations (dRADIAL < $\lambd$/2).

1.2.3. Doppler Shift

Doppler frequency shift is the shift in frequency of the received signal at the reader due to relative motion between the reader and the tag.

1.2.4. Inventroy, Antenna Switching, and Frequency Hopping Effects
  • Phase estimates should only be compared on a single antenna and channel.

  • Gen2 UHF RFID employs a slotted-aloha media access scheme, which means that the order in which tags are inventoried will be random. The time between successive inventories of the same tag will depend on reader mode, tag population size, and environmental conditions (e.g. interference levels).

  • requirements for successful reading of a passive tag with the backscatter scheme:

    • the tag power(sensitivity) threshold Pts, minimum received power to turn on the RFID chip.
    • the reader sensitivity threshold Prs, the minimum level of the tag signal that the reader can detect and resolve.

    • the mac protocol for the C1G2 system is based on Slotted ALOHA, where each frame has a number of slots and each active tag will reply in a randomly selected slot per frame;
    • the reader powers up and transmits a continuous wave(CW) to energize the tags.

2. Setting Relative

2.1. Query Services

2.2. Command Service

2.4. Reading Type

  • Synchronously

the observed tag data is stored in Reader memory and a report of all observed tags is sent only when commanded by the client application;

// wait until the tag query has ended before sending the tag report
settings.Report.Mode=ReportMode.WaitForQuery;
Reader.ApplySettings(settings);
//Read tags for 5 seconds
TagReport tagReport=Reader.QueryTags(5)
  • Asynchronously

the reader report reach tag to the client application, as soon as it is observed.

//send a tag report for every tag read
settings.Report.Mode=ReportMode.Individual;
//assign the TagsReported handler, this specifies which function to call when tags reports are avaible;
Reader.TagsReport+=new EventHandler<TagsReportedEventArgs>(OnTagsReported);
Reader.Start();
//wait for the user to press enter
Console.WriteLine("Press enter when done.");
Console.ReadLine();
Reader.Stop();
Reader.Disconnect(); static void OnTagsReported(object sender, TagsReportedEventArgs args){
//This function is called asynchronously when tag reports are available,loop through each tag in the report and print the data
foreach(Tag tag in args.TagReport.Tags){
//Todo
}
}
  • using periodic trigger

During polling, the reader initiates a scan for tags for a specified period of time and then waits for a set period before scanning again, which is sufficient and reduces both network and RF congestion.

settings.Report.Mode=ReportMode.Individual;
// Reading tags for 5 seconds every 10 seconds
settings.AutoStart.Mode=AutoStartMode.Periodic;
settings.AutoStart.PeriodInMs=10000;
settings.AutoStop.Mode=AutoStopMode.duration;
settings.AutoStop.DurationInMs=5000;

2.5. Filter

2.5.1. SingleTag

using GEN 2 filtering, either EPC, User, TID or a combination of these to read certain tags based on their data;

  • to have all the tags in the read-zone and backscatter their data to the reader, then use filtering in the application layer.
  • configure the reader that it commands only tags matching the filter to response while the others will stay silent;
// setup a tag filter only the tags that match this filter will respond;
settings.Filters.Mode=TagFilterMode.OnlyFilter1;
//apply the filger to the EPC memory bank
settings.Filters.TagFilter1.MemoryBand=MemoryBank.Epc;
// start matching at address 0*20, since the first 32-bits of the EPC memory bank are the CRC and control bits;
settings.Filters.TagFilter1.BitPointer=0x20;
//our filter is 16-bits long(the first word of the EPC)
settings.Filters.TagFilter1.BitCount=16;
//only match tags with EPCs that start with 3008
settings.Filters.TagFilter1.TagMask="3008";
//include tags that match this filter, and alternatively,we could exlude tags that match the filter
settings.Filters.TagFilter1.FilterOp=TagFilterOp.Match;
2.5.2. User Memory

the Impinj Monza 4 tags offer up to 512 bits of user memory, query the user memory using exception handling.

//Define how we want to perform the read
ReadUserMemoryParams readParams=new ReadUserMemoryParams();
//use antenna #1
readParams.AntennaPortNumber=1;
//No access password required for this tag
readParams.AccessPassword=null;
//start reading from the base of user memory(address 0)
readParams.WordPointer=0;
//read 32 words of user memory(512 bits)
readParams.WordCount=32;
//read the first tag we see,or choose a specific tag by EPC or other identifier;
readParams.Target=null;
readParams.TimeoutInMs=5000;
//Perform the read and check the results
ReadUserMemoryResult result=Reader.ReadUserMemory(readParams);
if(result.ReadResult.Result==AccessResult.Success){
//todo
}
Reader.Disconnect();
2.5.2. Read Serialized TID
static string ReadTid(string epc){
//Read the TID memory bank
ReadTidMemoryParams readParams=new ReadTidMemoryParams();
// No password set
readParams.AccessPassword=null;
readParams.AntennaPortNUmber=0;
readParams.TargetTag=epc;
readParams.WordCount=2;
readParams.TimeoutInMs=5000;
ReadTidMemoryResult result=Reader.ReadTidMemory(readParams);
return result.ReadResult.ReadData;
}
settings.Report.IncludeAntennaPortNumber=true;
settings.Report.IncludeSerializedTid=true;
settings.Report.Mode=ReportMode.Individual;
Reader.ApplySettings(settings);
TagReport tagReport=Reader.QueryTags(5);
foreach(Tag tag in tagReport.Tags){
if(tag.IsSerialzedTidPresent){
tid=tag.SerializedTid;
}else{
tid=ReadTid(tag.Epc);
}
}
Reader.Disconnect();

2.6. Tag Access

covers modifying tag data including writing and locking of EPC, user memory and passwords, killing a tag;

  • program EPC
epcParams.NewEpc="new EPC";
ProgramEpcParams epcParams=new ProgramEpcParams();
ProgramEpcResult result=Reader.ProgramEpc(epcParams);
if(result.WriteResult.Result==AccessResult.Success){
TagReport report=Reader.QueryTags(2);
}
  • user memory
ProgramUserBlockParams writeParams=new ProgramUserBlockParams();
writeParams.NewUserBlock="new user data";
ProgramUserBlockResult result=Reader.ProgramUserBlock(writeParams);
if(result.WriteResult.Result==AccessResult.Success){
#pass;
}
  • Kill Tags
ProgramKillPasswordParams pwParams=new ProgramKillPasswordParams();pwParams.TargetTag=TARGET_TAG;pwParams.NewKillPassword=NEW_KILL_PW; #new kill passwordProgramKillPasswordResult pwResult=Reader.ProgramKillPassword(pwParams);if(pwResult.WriteResult.Result==AccessResult.Success){	#todo	KillTagParams killParmas=new KillTagParams();	killTagResult killResult=Reader.KillTag(killParams);	if(killResult.KillResult.Result==AccessResult.Success){	#todo	}}

3. GPIO

The inputs allow external devices to trigger the reader, like light sensors, motion detectors, pressure mats etc. The output allow the reader to affect external devices such as access gates, indicator lights, conveyors .etc.

Settings settings=Reader.QueryFactorySettings();settings.Report.IncludeAntennaPortNumber=true;settings.Report.Mode=ReportMode.Individual;// starting reading tags when GPI #1 goes highsettings.GPis[1].IsEnable=true;settings.GPis[1].DebounceInMs=50;settings.AutoStart.Mode=AutoStartMode.GpiTrigger;settings.AutoStart.GpiPortNumber=1;settings.AutoStart.GpiLevel=true;//stop reading tags when gpi #1 goes lowsettings.AutoStop.Mode=AutoStopMode.GpiTrigger;settings.AutoStop.GpiPortNUmber=1;settings.AutoStop.GpiLevel=false;reader.ApplySettings(settings);

4. Subscribe

  • Subscribe to reader events
Reader.GpiChanged+=new EventHandler<GpiChangedEventArgs>(OnGpiEvent);Reader.AntennaChanged+=new EventHandler<AntennaChangedEventArgs>(OnAntennaEvent);static void OnGpiEvent(object sender, GpiChangedEventArgs args){	//todo}static void OnAntennaEvent(object sender, AntennaChangedEventArgs args){	//Todo}
  • Power Ramp

find the lowest power level that still finds all tags, the transmit power is steadily increased.

FeatureSet features=Reader.QueryFeatureSet();minTx=features.TxPowers.Entries.First().Dbm;maxTx=features.TxPowers.Entries.Last().Dbm;for(double power=minTx; power<=maxTx; power+=1.0){	settings.Antennas[1].TxPowerInDbm=power;	Reader.ApplySettings(settings);	TagReport report=Reader.QueryTags(2);	foreach(Tag tag in report.Tags){		//todo	}}

5. Classes

5.1. methods

  • void Connect(string readerIp); void Disconnect(); void Start(); void Stop();
  • void ResumeEventsAndReport():
  • FeatureSet QueryFeatureSet(): return featureSet (supported modes, powers, frequencies, and optional features);
  • Settings QuerySettings(): return current feature settings;
  • Settings QueryFactorySettings(): return reader factory settings, vary by model and region;
  • void ChangeSettings(Settings settings):
  • Status QueryStatus(StatusRefresh refreshWhat): return the reader stauts including antennas, RFID operations, and GPI/O;
  • Status QueryStatus():
  • TagReport QueryTags(seconds):
  • void setGpo(int portNubmer, bool level):
  • ProgramAccessPasswordResult ProgramAccessPassword(...):
  • ProgramKillPasswordResult ProgramKillPassword()
  • ProgramUserBlockResult ProgramUserBlock();

5.2. Callbacks

  • OnConnectionChange(ConnectionChangedEventArgs);
  • OnConnected(ConnectiolnChangedEventArgs);
  • OnConnectionLost(ConnectionChangedEventArgs);
  • OnGpiChanged(GpiChangedEventArgs);
  • OnGpiXChanged(GpiChangedEventArgs);
  • OnReportBufferOverflowed(ReportBufferOverflowedEventArgs);
  • OnStarted(StartedEventArgs);
  • OnTagsReported(TagsReportedEventArgs);

5.3. Property

  • ReaderMode: controls modulation and data rate under different environments;

    • AutoSetDenseReader, AutSetSingleReader, MaxThroughput, etc.
  • SearchMode: controls whether tags are singulated repeatedly or once;
    • ReaderSelected, DualTarget, SingleTarget, etc.
  • TagPopulationEstimate: estimate how many tags will be in the reader's field of view at one time;
  • Filters: control which tags the reader singulated and reports;
  • Filters.Mode: how the reader combine the two filters;
  • Filters.TagFilter1.MemoryBank: Reserved, Epc, Tid, User;
  • Filters.TagFilter1.BitPointer: the bit offset in the specified memory bank at which the tag mask begins;
  • Filters.TagFilter1.BitCount: the number of bits contained within the tag mask;
  • Filter.TagFilter1.TagMask: a hex string representing the bit pattern to match.
  • Antennas[port].PortNumber;
  • Antennas[port].IsEnable;
  • Antennas[port].TxPowerInDbm: the amout of transmit power to use on the antenna, 10.00db~30.0db;
  • Antennas[port].RxSensitivityInDbm: the minimum signal strength that must receive by the reader;
  • LowDutyCyble: low duty cyble is used in situation where the field of view is empty most of time; 用于没有很多标签的时候周期性扫描;
  • Report: controls how often the reader sends a report of tags singulated and which optional fields are reported;
  • Report.Mode; Report.IncludePeakRssi; Report.InlcudeAntennaPortNumber;
  • Report.IncludeFirstSeenTime; IncludelastSeenTime; IncludeSeenCount; IncludePhaseAngle;

6. 学习资源

【硬件模块】RFIDSetting的更多相关文章

  1. Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块

    一直想写一份技术文档,但因为自感能力有限而无从下笔,近期做了个关于Android平台下实现与C语言的通讯来操作蓝牙模块的项目,中间碰到了很多问题,也在网上查了很多资料,在完毕主要功能后.也有一些人在网 ...

  2. about家庭智能设备部分硬件模块功能共享【协同工作】solution

    本人设备列表: Onda tablet {Android} wifi Desktop computer {win7.centos7} 外接蓝牙adapter PS interface 键盘.鼠标{与同 ...

  3. 【硬件模块】UWB介绍

    From: https://liudongdong1.github.io/ UWB超宽带定位技术属于无线定位技术的一种.无线定位技术是指用来判定移动用户位置的测量方法和计算方法,即定位算法.目前最常用 ...

  4. 【硬件模块】华为NBIOT 使用记录

    From: https://liudongdong1.github.io/ 1. background Low power wide area network (LPWAN) has become a ...

  5. 如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)

    当前进展: 一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计 ...

  6. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  7. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  8. 如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢?

    一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! ...

  9. [自娱自乐] 3、超声波测距模块DIY笔记(三)

    前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射功率太低问题,对 ...

随机推荐

  1. 源码解析Java Attach处理流程

    前言 当Java程序运行时出现CPU负载高.内存占用大等异常情况时,通常需要使用JDK自带的工具jstack.jmap查看JVM的运行时数据,并进行分析. 什么是Java Attach 那么JVM自带 ...

  2. P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题

    刷了n次用了奇淫技巧才拿到rk1,亥 这道题是网络流二十四题中「餐巾计划问题」的加强版. 于是怀着试一试的心情用费用流交了一发: 哇塞,过了9个点!(强烈谴责出题人用*造数据 下面是费用流解法简述: ...

  3. Spark的安装和使用

    根据Spark2.1.0入门:Spark的安装和使用在虚拟机安装Spark,并进行测试 实验3  Spark读取文件系统的数据 将文件上传hdfs (1)在spark-shell中读取Linux系统本 ...

  4. @classmethod和@staticmethod修饰符

    @classmethod和@staticmethod 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直 ...

  5. C++引用的概念以及基本使用

    引言 引用是C++的新增内容,在实际开发中会经常使用:C++用的引用就如同C语言的指针一样重要,但它比指针更加方便和易用. 我们知道,参数的传递本质上是一次赋值的过程,即将一块内存上的数据复制到另一块 ...

  6. 自动化测试(1)selenium+python+chrome 连接测试

    环境准备: python版本:3.8.4 开发工具:pycharm 使用chrome和对应的webdriver http://npm.taobao.org/mirrors/chromedriver/ ...

  7. U 跳转中加入变量参数的写法

    href="{:U('Message/news?id='.$vo['messageid'].'')}" 就是在U方法里如果参数是变量就用 '.$i.'代替 {$i} <a h ...

  8. 硬核万字长文,深入理解 Java 字节码指令(建议收藏)

    Java 字节码指令是 JVM 体系中非常难啃的一块硬骨头,我估计有些读者会有这样的疑惑,"Java 字节码难学吗?我能不能学会啊?" 讲良心话,不是我谦虚,一开始学 Java 字 ...

  9. 复杂多变场景下的Groovy脚本引擎实战

    一.前言 因为之前在项目中使用了Groovy对业务能力进行一些扩展,效果比较好,所以简单记录分享一下,这里你可以了解: 为什么选用Groovy作为脚本引擎 了解Groovy的基本原理和Java如何集成 ...

  10. 自学linux——7.Linux的自有服务(进阶篇)

    linux自有服务 1.设置主机名 (1)临时设置主机名,需要切换用户(su)使之生效 #hostname主机名 (2)永久设置主机名,需要重启 先找到一个文件[主机名的配置文件]/etc/sysco ...