由於要在Web項目中採用RFID讀取功能,所以有必要開發Activex,一般情況下開發Activex都採用VC,VB等,但對這兩塊不是很熟悉,所以採用C#編寫Activex的方式實現。本文方法參考網路1.編寫WindowsFromControls2.發布WindowsFormControls為Activex3.在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.infinstall.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
源檔案:http://files.cnblogs.com/qidian10/RFIDReader.rar