C#用Activex实现Web客户端读取RFID功能

来源:网络时间:2011-06-22

C#用Activex实现Web客户端读取RFID功能

   由于要在Web项目中采用RFID读取功能,所以有必要开发Activex,一般情况下开发Activex都采用VC,VB等,但对这两块不是很熟悉,所以采用C#编写Activex的方式实现。

  本文方法参考网络

  1.编写WindowsFromControls

  2.发布WindowsFormControls为Activex

  3.在web中使用该Activex

  首先编写windows控件

C#用Activex实现Web客户端读取RFID功能

  如何编写不再详述(注意一个地方,GUID自己用vs工具生成一个,下面会用到。我的0CBD6597-3953-4B88-8C9F-F58B1B023413)

  重要的类:

  using System;

  using System.Runtime.InteropServices;

  namespace RFIDReader

  {

  public class ReadRfid

  {

  [DllImport("MasterRD.dll")]

  private static extern int rf_init_com(int port, int baud);

  [DllImport("MasterRD.dll")]

  private static extern int rf_request(short icdev, byte model, ref short TagType);

  [DllImport("MasterRD.dll")]

  private static extern int rf_write(int icdev, char _Adr, char _Data);

  [DllImport("MasterRD.dll")]

  private static extern int rf_anticoll(short icdev, byte bcnt, ref byte ppsnr, ref byte pRLength);

  [DllImport("MasterRD.dll")]

  private static extern int rf_ClosePort();

  public string CardNum

  {

  get

  { return getCardNum(); }

  }

  private string getCardNum()

  {

  int post = 4; //调用COM1口 int baud = 9600;

  int i = -1;

  byte model = 82;

  byte b1 = 4;

  short TagType = 4;

  byte[] buf1 = new byte[200];

  try

  {

  rf_init_com(post, baud);

  rf_request(0, model, ref TagType);

  rf_anticoll(0, 4, ref buf1[0], ref b1);

  string s1 = "";

  for (i = 0; i < b1; i++)

  {

  s1 = s1 + System.Convert.ToString(long.Parse(buf1[i].ToString()), 16).ToUpper();

  }

  rf_ClosePort();

  if (s1 == "0000")

  { throw (new Exception()); }

  return s1;

  }

  catch (Exception)

  {

  }

  return "";

  }

  }

  }

  view sourceprint?

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Runtime.InteropServices;

  namespace RFIDReader

  {

  [ComImport, GuidAttribute("<SPAN style="COLOR: #800000">0CBD6597-3953-4B88-8C9F-F58B1B023413</SPAN><SPAN style="COLOR: #800000"> </SPAN>")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

  public interface IObjectSafety

  {

  [PreserveSig]

  void GetInterfacceSafyOptions(

  int riid,

  out int pdwSupportedOptions,

  out int pdwEnabledOptions);

  [PreserveSig]

  void SetInterfaceSafetyOptions(

  int riid,

  int dwOptionsSetMask,

  int dwEnabledOptions);

  }

  }

  using System;using System.Collections.Generic;using System.ComponentModel;

  using System.Drawing;

  using System.Data;

  using System.Linq;

  using System.Text;

  using System.Windows.Forms;

  using System.Runtime.InteropServices; using CJ;

  namespace RFIDReader{

  [Guid("0CBD6597-3953-4B88-8C9F-F58B1B023413"), ProgId("RFIDReader.Reader"), ComVisible(true)]

  public partial class Reader : UserControl,IObjectSafety

  {

  public Reader()

  {

  InitializeComponent();

  }

  #region IObjectSafety 成员

  public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)

  {

  pdwSupportedOptions = 1;

  pdwEnabledOptions = 2;

  }

  public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)

  {

  throw new NotImplementedException();

  }

  #endregion

  private void timer1_Tick(object sender, EventArgs e)

  {

  ReadRfid rfid=new ReadRfid();

  string str = rfid.CardNum;

  if (str != "")

  {

  textBox1.Text = str; GetInfo();

  }

  }

  public int TimerSpan

  {

  get { return timer1.Interval; }

  set { timer1.Interval = value; }

  } public string CardNum

  {

  get { return textBox1.Text; }

  }

  private void GetInfo()

  {

  this.label1.Text = "cccc";

  }

  }

  }

  为了能够在所有客户端ie上显示控件,要在程序的AssemblyInfo.cs里添加如下语句

  [assembly: AllowPartiallyTrustedCallers()]

  下一步,右键该项目,属性,生成,将为com互操作注册,打上勾勾

  

C#用Activex实现Web客户端读取RFID功能

  然后编译,如果没有问题,那么测试下,应该可以读取RFID的ID到文本框了。

  2.制作安装程序

  跟普通的制作安装程序一样,新建一个安装程序,然后删掉里面的文件夹。

  鼠标右键空白区域-》添加-》项目输出--》选择主输出

C#用Activex实现Web客户端读取RFID功能

  这样即可生成安装包了。

  到现在其实已经可以用了,但为了方便我们可以进一步生成cab包。

  下载CABARC.exe。解压缩,到bin目录中执行如下doc命令

  cabarc n 生成的cab名.cab 安装文件.msi install.inf

  install.inf内容如下:

  [version]

  signature="$CHICAGO$"

  AdvancedINF=2.0

  [Setup Hooks]

  hook1hook1=hook1

  [hook1]

  run=msiexec.exe /i "%EXTRACT_DIR%ReaderInstaller.msi" /qn

  修改称自己的安装文件即可

  3.在web中使用。

  新建一个web项目,在default.aspx中输入一下代码即可使用

  <object id="RFIDReader" classid="clsid:0CBD6597-3953-4B88-8C9F-F58B1B023413"

  codebase="RFID/RFIDREADER.cab">

  </object> 这里的clsid就是自己生成的GUID编号

  这里的RFID使用的是MasterRD.dll和CFCom.dll不同产品使用可能不同,同时注意RFID的COM端口号,本例为测试例子,所以写死了COM口,客户端IE浏览时,需要将RFID的端口改成对应的。

  注意:如果发布到服务器上,客户端ie上无法显示控件,那么请将访问地址添加到ie的受信任站点,如果不能安装cab那么只能用户自己安装Activex了。

发表评论

最新评论(共0条)