zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在Salesforce中创建Approval Process
    用C#基于WCF创建TCP的Service供Client端调用
    用 C# 实现一个简单的 Rest Service 供外部调用
    在Salesforce中将 Decimal 数据转换成美元格式
    在Asp.Net MVC中PartialView与EditorFor和DisplayFor的区别
    在Salesforce中对某一个Object添加自定义的Button和Link
    【LeetCode】227. Basic Calculator II
    【LeetCode】226. Invert Binary Tree
    【LeetCode】225. Implement Stack using Queues
    【LeetCode】224. Basic Calculator
  • 原文地址:https://www.cnblogs.com/qidian10/p/2006976.html
Copyright © 2011-2022 走看看