C#通过Activex实现Web客户端读取RFID

 
由于要在Web项目中采用RFID读取功能,所以有必要开发Activex,一般情况下开发Activex都采用VC,VB等,但对这两块不是很熟悉,所以采用C#编写Activex的方式实现。
本文方法参考网络
1.编写WindowsFromControls
2.发布WindowsFormControls为Activex
3.在web中使用该Activex
 
首先编写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 "";
        }

    }
}
 
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace RFIDReader
{
    [ComImport, GuidAttribute("0CBD6597-3953-4B88-8C9F-F58B1B023413 ")]
    [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)]
publicpartialclass Reader : UserControl,IObjectSafety
{

public Reader()
{
InitializeComponent();
}

#region IObjectSafety 成员

publicvoid GetInterfacceSafyOptions(int riid, outint pdwSupportedOptions, outint pdwEnabledOptions)
{
pdwSupportedOptions
=1;
pdwEnabledOptions
=2;
}

publicvoid SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
thrownew NotImplementedException();
}

#endregion

privatevoid timer1_Tick(object sender, EventArgs e)
{
ReadRfid rfid
=new ReadRfid();
string str = rfid.CardNum;
if (str !="")
{
textBox1.Text
= str; GetInfo();
}
}
publicint TimerSpan
{
get { return timer1.Interval; }
set { timer1.Interval = value; }
}
publicstring CardNum
{
get { return textBox1.Text; }
}
privatevoid 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] 
hook1=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了。

参考文献http://www.cnblogs.com/yungboy/archive/2011/01/10/1932433.html

源文件下载地址:https://files.cnblogs.com/qidian10/RFIDReader.rar

posted @ 2011-04-06 16:42  jackchain  阅读(4532)  评论(10编辑  收藏  举报