本文介绍了在C#中使用Activex实现Web客户端读取RFID功能。
由于要在Web项目中采用RFID读取功能,所以有必要开发Activex,一般情况下开发Activex都采用VC,VB等,而本文采用C#编写Activex的方式实现。
本文方法参考网络
1.编写WindowsFromControls
2.发布WindowsFormControls为Activex
3.在web中使用该Activex
1、编写windows控件
如何编写不再详述(注意一个地方,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互操作注册,打上勾勾
然后编译,如果没有问题,那么测试下,应该可以读取RFID的ID到文本框了。
2.制作安装程序
跟普通的制作安装程序一样,新建一个安装程序,然后删掉里面的文件夹。
鼠标右键空白区域-》添加-》项目输出--》选择主输出
这样即可生成安装包了。
到现在其实已经可以用了,但为了方便我们可以进一步生成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了。