微软BizTalk RFID作为BizTalk Server R2的一个组件,其为RFID应用提供了功能强大的平台,含有RFID器件设备的标准接入协议及管理工具,对RFID传感信号的处理引擎,并包括完整的逻辑处理能力。BizTalk RFID 基础框架可以和诸如企业资源配置(ERP) 系统,以及其他一些专有业务系统很有效地配合在一起进行业务处理。这种良好的适应性使得应用该框架组建的RFID应用只需要进行非常少量的程序改动就可以和原有的业务系统软件配合得天衣无缝。而诸如.NET Framework、SQL Server等开发工具,为RFID应用的后台处理提供了开发、部署和管理平台。通过作者的介绍,使读者能了解.NET平台下RFID应用的开发方法和技巧。
一、平台的配置
微软BizTalk RFID平台有两种工作模式:异步模式,此模式不在本文讨论范围;同步模式,是本文主要讨论和实现的工作模式;
下面详细介绍RFID Manager中Provider和Devices的配置过程:
1.配置Provider
打开RFID Manager,选择Device Providers,右击并选择 New Provider;弹出对话框,在Name处填写 Provider名称(可随意命名)此处为:Raifu;在File Name处,选择 Browse,选择对应的RFID硬件设备商提供的DLL文件,然后点击 Register,可以看见Provider Properties 的详细信息;点击OK,Provider配置完成。
2.配置Devices
选择Devices,右击并选择 New Devices ;选择Add single Device,并点击Next;选择Add Provider:此处选中在配置Provider时设置的名字并点击Next;选择Conect using: 此处选择TCP 协议;Name or IP address:填写RFID设备的IP地址,此处为:192.168.7.66;Port:填写RFID设备的端口号,此处为:1969 并点击Next;选择组:默认(可以另建新设备组),并点击Next;Password:无,并点击Next;点击OK,Devices配置完成。
至此,RFID Manager配置完成。如图1 所示。
二、步骤与方法
1.建立工程
打开VS2005,并新建一个工程,同时填加一些必要的控件,最终的界面效果如图2所示。
图2界面设计
2.填加必要的引用
using Microsoft.SensorServices.Rfid.Management;
using Microsoft.SensorServices.Rfid.Design;
using System.IO.SensorServices.Rfid.Client;
using Microsoft.SensorServices.Rfid;
using Microsoft.SensorServices.Rfid.Utilities;
using Microsoft.SensorServices.Rfid.Dspi;
3.在From1_load中进行必要的初始化
详细代码如下:
private void Form1_Load(object sender, EventArgs e)
{
DeviceManagerProxy deviceManager = new DeviceManagerProxy();
try
{
cbDevices.Items.Clear();
DeviceDefinition[] devices = deviceManager.GetAllDevices();
if (devices != null)
{
for (int i = 0; i < devices.Length; i++)
{
cbDevices.Items.Add(devices[i].Name);
//枚举出系统中所有的逻辑设备,并添加到图(2)中,
//Device处的下拉框内。
}
}
}
catch (Exception ex)
{
ShowException(ex);
}
//初始化显示表函数;
InitDataTable();
}
4.获得天线范围内的电子标签号
在图2的 Get Tags按钮中添加如下代码:
private void btnGetTags_Click(object sender, EventArgs e)
{
using (DeviceConnection dc = new DeviceConnection(deviceName))
{ //实例逻辑设备
try
{
dc.Open(); //打开逻辑设备
TagDataSelector selector = new TagDataSelector();
selector.IsId = true;
selector.IsTime = true;
selector.IsType = true;
ICollection<TagReadEvent> c1 = dc.GetTags(selector);
foreach(TagReadEvent tag in c1)
{//取出所有读到的有效电子标签,并添加到表里。
DataRow row = dtTags.NewRow();
row["TagId"]=HexUtilities.HexEncode(tag.GetId());
row["Source"] = tag.Source;
row["Time"] = tag.Time;
row["Type"] = tag.Type;
dtTags.Rows.Add(row);
}
gridTags.DataSource = dtTags; //将标签号添加到表上;
}
catch (Exception ex)
{
ShowException(ex);
}
finally
{
dc.Close(); //关闭逻辑设备;
}
}
}
运行程序,结果如图2所示。
在如图2的界面中,首先在Devices处的列表框内选择逻辑设备,此处选择Raifu Device(为配置时设置的逻辑设备名);然后按下“Get Tags”按钮,可以看到如图3所示的结果。我们看到天线范围内的有效电子标签号为:BBBBBBBB,类型(即电子标签协议)为EPC Class1-G2。
图3
5.写电子标签号
在如图3所示的界面中,首先在“Write Tag” 按钮里添加如下代码:
private void btnWriteTag_Click(object sender, EventArgs e)
{
using (DeviceConnection dc = new DeviceConnection(deviceName))
{ // 实例逻辑设备
try
{
dc.Open();
byte[] AccessPassword ={ 0x0, 0x0, 0x0, 0x0 }; //密码默认为全零
byte[] tagId = HexUtilities.HexDecode(txtWriteTagID.Text);
string SourceName = "2"; //即设备工作的天线号
dc.WriteTagId(SourceName, tagId, AccessPassword, null, null, null);
} //函数为微软提供的接口,这里后三个参数默认为Null
catch (Exception ex)
{
ShowException(ex);
}
finally
{
dc.Close(); //关闭逻辑设备
}
}
}
在写电子标签号时,同读电子标签一样,先要选择逻辑设备,然后在TagID后的文本框内填写新的电子标签号,此处为:AAAAAAAA,最后按下“Write Tag”按钮,若没有异常抛出,说明写新电子标签号成功。点击“Get Tags”按钮,可以看到写新的标签号“AAAAAAAA”显示在表单里,结果如图4 所示。
图4添加新标签之后的效果
6.写用户区数据
首先声明一个全局数组变量public byte[] tagId,用来存放用户数据区要写入新数据的电子标签号,获得界面上电子标签的方法如下:
Private void gridTags_CellMouseClick(object sender,DataGridViewCellMouseArgs e)
{
tagId=HexUtilities.HexDecode(this.gridTags.Rows[e.RowIndex].Cells[0].FormattedValue.ToString()); //将从表里获得的标签号处理后放入 tagId数组中;
}
在“WriteUserData”按钮里添加如下代码:
private void button2_Click(object sender, EventArgs e)
{
using (DeviceConnection dc = new DeviceConnection(deviceName))
{
try
{
dc.Open(); //打开逻辑设备
txtPrintTagID.Clear();
byte[] AccessPassword ={ 0x0, 0x0, 0x0, 0x0 };//密码默认为全零;
int offset = Convert.ToInt32(WriteStart.Text );//起始长度;
byte[] writedata = HexUtilities.HexDecode(WriteData.Text);
dc.WritePartialTagData(tagId, writedata, seek, offset);
//此函数为微软提供的函数接口,详细看参看微软帮助文档;
}
catch (Exception ex)
{
ShowException(ex);
}
finally
{
dc.Close(); //关闭逻辑设备;
}
}
}
运行程序,同样先选择逻辑设备,在Data后的文本框内,填写要写入用户区的数据,此处假设写入的数据为:ABCD1234。 按下“WriteUserData”按钮,若没有异常抛出,则说明写用户数据区成功。在后面的获得用户数据区可以看到刚才写入的数据:“ABCD1234”,如图5 所示。
图5写数据区运行效果
特别需要说明的是,根据EPC Class1 G2 的协议标准,这里Length为字,如果Length为2,则要写入的数据为4个字节,即32bit数据,而一个16进制的字符只占用4bit,而这里的长度假设为2,所以这里必须写8个16进制的字符。Start为用户区的起始地址,只要不超范围即可,可以参考电子标签厂家的协议文档。同样在步骤7中,读取用户区数据时,开始地址,读取的长度参数与此处类似。
7.获得用户区数据
获得将被读取用户数据区数据的电子标签,详细见步骤6处的说明。
在“GetUserData”按钮添加如下代码:
private void button1_Click(object sender, EventArgs e)
{
using (DeviceConnection dc = new DeviceConnection(deviceName))
{
try
{
dc.Open(); //打开设备
txtPrintTagID.Clear();
int offset= Convert.ToInt32(txtStart.Text); //读取的数据开始地址;
int length= Convert.ToInt32(txtLength.Text);// 读取的数据长度
byte[] data = dc.GetPartialTagData(tagId, seek , offset, length);
//此函数为微软提供的函数接口,详细看参看微软帮助文档;
txtData.Text = HexUtilities.HexEncode(data);//转化为16进制
}
catch (Exception ex)
{
ShowException(ex);
}
finally
{
dc.Close();
}
}
}
运行程序,点击“GetUserData”按钮,可以看到如图5所示的结果。
至此作者详细介绍完了在BizTalkk 平台下RFID技术的基本应用,实现了读电子标签号、写电子标签号、写电子标签用户区及读电子标签用户区的基本方法,在实际的应用中,不仅仅局限于此,其他的一些方法与技巧,有待读者去研究。
三、结语
希望通过笔者的介绍,对读者在BizTalk平台上进行RFID开发能起到抛砖引玉的作用,同时笔者也相信,随着RFID标准的逐步完善,电子标签成本的不断降低,RFID技术的应用必将得到持续、广泛的应用,成为新的科技焦点。
|