1. 程式人生 > >話說RFID以前很火所以整理一下一年前自己處理的RFID程式,放原始碼

話說RFID以前很火所以整理一下一年前自己處理的RFID程式,放原始碼

一開始覺得他是個很神奇的東西。 包含串列埠通訊和網路通訊。 由於網路通訊裝置太貴,所以國內的裝置基本上都是在外接一個比較便宜的模組在裡面。   本案例應該適用於大多數的RFID模組。 首先我們先放上RFID API:如下  using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Rfid {     public class EPCSDKHelper     {         [DllImport("EPCSDK.dll")]         public static extern IntPtr OpenComm(int portNo);         [DllImport("EPCSDK.dll")]         public static extern void CloseComm(IntPtr hCom);         [DllImport("EPCSDK.dll")]         public static extern bool ReadFirmwareVersion(IntPtr hCom, out int main, out int sub, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool GetReaderParameters(IntPtr hCom, int addr, int paramNum, byte[] parms, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool SetReaderParameters(IntPtr hCom, int addr, int paramNum, byte[] parms, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool StopReading(IntPtr hCom, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool ResumeReading(IntPtr hCom, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool IdentifySingleTag(IntPtr hCom, byte[] tagId, byte[] antennaNo, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool IdentifyUploadedSingleTag(IntPtr hCom, byte[] tagId, byte[] devNos, byte[] antennaNo);         [DllImport("EPCSDK.dll")]         public static extern bool IdentifyUploadedMultiTags(IntPtr hCom, out byte tagNum, byte[] tagIds, byte[] devNos, byte[] antennaNos);         [DllImport("EPCSDK.dll")]         public static extern bool ReadTag(IntPtr hCom, byte memBank, byte address, byte length, byte[] data, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool WriteTagSingleWord(IntPtr hCom, byte memBank, byte address, byte data1, byte data2, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool FastWriteTagID(IntPtr hCom, int bytesNum, byte[] bytes, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool FastWriteTagID_Lock(IntPtr hCom, int bytesNum, byte[] bytes, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool InitializeTag(IntPtr hCom, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool LockPassWordTag(IntPtr hCom, byte passwd1, byte passwd2, byte passwd3, byte passwd4, byte lockType, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool UnlockPassWordTag(IntPtr hCom, byte passwd1, byte passwd2, byte passwd3, byte passwd4, byte lockType, byte ReaderAddr);         [DllImport("EPCSDK.dll")]         public static extern bool KillTag(IntPtr hCom, byte passwd1, byte passwd2, byte passwd3, byte passwd4, byte ReaderAddr);     } }   我們看到OpenComm他還是一串列埠方式開啟的。   我們要記錄每個裝置的資訊所以我們需要一個裝置類 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using RfidService.Common; namespace Rfid {     public class RfidDevice     {         ///         /// 開啟監聽現成         ///         private Thread _mThread = null;         ///         /// 暫停事件         ///         private readonly ManualResetEvent _mManualReset = null;         ///         /// 串列埠號         ///         private readonly int _comNo = 0;         ///         /// 時間間隔         ///         private readonly int _timeTick = 0;         ///         /// 是否多卡讀取         ///         private bool _multiFlag = false;         ///         /// RFID資料         ///         private readonly List _data = new List();         ///         /// 資料鎖         ///         private readonly object _dataLock = new object();         ///         /// 錯誤數量         ///         private int _errorCount = 0;         ///         /// 只讀 串列埠號         ///         public int ComNo          {              get             {                  return _comNo;              }          }         ///         /// 串列埠控制代碼         ///         public IntPtr ComHadle { set; get; }         ///         /// 只讀 時間間隔 毫秒級          ///         public int TimeTick          {             get             {                 return _timeTick;             }         }         ///         /// 是否多卡標誌         ///         public bool MultiFlag { set { _multiFlag = value; } get { return _multiFlag; } }         ///         /// 暫停讀取標誌         ///         public bool StopReadFlag { set; get; }         ///         /// 出入串列埠         ///         public PassCom PassCom { set; get; }         ///         /// 建構函式         ///         ///         ///         public RfidDevice(int comNo,int sleepTime)         {             _comNo = comNo;             _timeTick = sleepTime;             _mManualReset = new ManualResetEvent(true);             ComHadle = EPCSDKHelper.OpenComm(_comNo);             if (ComHadle == new IntPtr())             {                 //輸出系統日誌                 //throw new Exception("開啟串列埠失敗!");                 LogInfo.Error("開啟串列埠:" + comNo + "失敗!" );             }         }         ///         /// 建構函式         ///         ///         ///         ///         public RfidDevice(int comNo, int sleepTime,bool multiFlag)         {             _comNo = comNo;             _timeTick = sleepTime;             MultiFlag = multiFlag;             _mManualReset = new ManualResetEvent(true);             ComHadle = EPCSDKHelper.OpenComm(_comNo);             if (ComHadle == new IntPtr())             {                 //輸出系統日誌                 //throw new Exception("開啟串列埠失敗!");                 LogInfo.Error("開啟串列埠:" + comNo + "失敗!");             }         }         ///         /// 建構函式         ///         ///         ///         ///         ///         public RfidDevice(int comNo, int sleepTime, bool multiFlag,PassCom passCom)         {             _comNo = comNo;             _timeTick = sleepTime;             _multiFlag = multiFlag;             MultiFlag = multiFlag;             _mManualReset = new ManualResetEvent(true);             this.PassCom = passCom;             ComHadle = EPCSDKHelper.OpenComm(_comNo); #if DEBUG             Console.WriteLine("串列埠號:" + this.ComNo.ToString() + " - " + ComHadle.ToString()); #endif             if (ComHadle == new IntPtr())             {                 //輸出系統日誌                 //throw new Exception("開啟串列埠失敗!");                 LogInfo.Error("開啟串列埠:" + comNo + "失敗!");             }         }         ///         /// 關閉串列埠         ///         public void CloseComm()         {             EPCSDKHelper.CloseComm(this.ComHadle);             LogInfo.Info("關閉串列埠:" + this.ComNo );         }         ///         /// 開始讀取         ///         public void Start()         {             if (_mThread != null) return;             _mThread = new Thread(GetRfidTag) {IsBackground = true};             _mThread.Start();         }         ///         /// 暫停         ///         public void ReStart()         {             _mManualReset.Set();         }         ///         /// 繼續         ///         public void Stop()         {             _mManualReset.Reset();         }         ///         /// 獲取RFID標籤現成         ///         private void GetRfidTag()         {             while(true)             {                 GcCollect();                 try                 {                     Monitor.Enter(this._dataLock);                     _mManualReset.WaitOne();                     byte[] ids;                     byte[] devNos;                     byte[] antennaNos;                     if (this._multiFlag)                     {                         ids = new byte[12 * 200];                         devNos = new byte[200];                         antennaNos = new byte[200];                         //處理多卡讀取模式                         byte idNum = 0;                         if (EPCSDKHelper.IdentifyUploadedMultiTags(this.ComHadle, out idNum, ids, devNos, antennaNos))                         {                             _errorCount = 0;                             var tmpids = new byte[idNum * 12];                             Array.Copy(ids, 0, tmpids, 0, tmpids.Length);                             this._data.Add(tmpids); #if DEBUG                             Console.WriteLine("串列埠號:"+this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 02 - " + TextEncoder.ByteArrayToHexString(ids));                             LogInfo.Info("串列埠號:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 02 - " + TextEncoder.ByteArrayToHexString(ids)); #endif                         }                     }                     else                     {                         ids = new byte[12];                         devNos = new byte[1];                         antennaNos = new byte[1];                         //處理單卡讀取模式                         if (EPCSDKHelper.IdentifyUploadedSingleTag(this.ComHadle, ids, devNos, antennaNos))                         {                             _errorCount = 0;                             this._data.Add(ids); #if DEBUG                             Console.WriteLine("串列埠號:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 01 - " + TextEncoder.ByteArrayToHexString(ids));                             LogInfo.Info("串列埠號:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " - 01 - " + TextEncoder.ByteArrayToHexString(ids)); #endif                         }                     }                 }                 catch (Exception er)                 { #if DEBUG                     Console.WriteLine("串列埠號:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " Error: " + er.Message);                     LogInfo.Error("串列埠號:" + this.ComNo.ToString() + " - " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.yyy") + " Error: " + er.Message); #endif                     _errorCount++;                     if (_errorCount > 10)                     {                         //裝置復位                     }                 }                 finally                 {                     Monitor.Exit(this._dataLock);                 }                 Thread.Sleep(this._timeTick);             }         }         ///         /// 獲取RFID資料標籤         ///         ///         public IList GetData()         {             try             {                 Monitor.Enter(this._dataLock);                 GC.WaitForPendingFinalizers();                 GC.Collect();                 GC.WaitForPendingFinalizers();                 var tmpData = new List();                 tmpData.AddRange(_data);                 _data.Clear(); #if DEBUG                 Console.WriteLine("串列埠號:" + this.ComNo.ToString() + " - " + "_tmpData:" + tmpData.Count + "  _data:" + _data.Count);                 LogInfo.Info("串列埠號:" + this.ComNo.ToString() + " - " + "_tmpData:" + tmpData.Count + "  _data:" + _data.Count); #endif                 return tmpData;             }             finally             {                 Monitor.Exit(this._dataLock);             }         }         ///         /// 資料回收         ///         private static void GcCollect()         {             GC.WaitForFullGCComplete();             GC.Collect();             GC.WaitForFullGCComplete();         }     } }   當然我們還需要一個裝置管理類作為裝置的監管。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using RfidService; using System.Diagnostics; using System.Threading; using RfidService.Common; namespace Rfid {     public class RfidDevices : IDisposable     {         ///         /// RFID裝置集合         ///         private IList _lstRfidDevice = new List();         private readonly RfidDataContext _oRfidDataContext = new RfidDataContext();         ///         /// 新增RFID裝置         ///         ///         public void Add(RfidDevice rfidDevice)         {             this._lstRfidDevice.Add(rfidDevice);         }         ///         /// 移除RFID裝置         ///         ///         public void Remove(RfidDevice rfidDevice)         {             foreach (var o in _lstRfidDevice.Where(o => o.ComHadle == rfidDevice.ComHadle &&                                                         o.ComNo == rfidDevice.ComNo))             {                 _lstRfidDevice.Remove(o);                 break;             }         }         public void DeviceClose()         {             foreach (var o in _lstRfidDevice)             {                 try                 {                     o.CloseComm();                 }

相關推薦

話說RFID以前所以整理一下年前自己處理RFID程式原始碼

一開始覺得他是個很神奇的東西。 包含串列埠通訊和網路通訊。 由於網路通訊裝置太貴,所以國內的裝置基本上都是在外接一個比較便宜的模組在裡面。   本案例應該適用於大多數的RFID模組。 首先我們先放上RFID API:如下  using System; us

javahtml5+css3以及javascript面試題------自己面試的時候遇到的面試題所以整理一下

(1).java部分 1.執行緒與程序的區別     一個程式至少有一個程序,一個程序至少有一個執行緒. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。 執行緒在執

整理一下N年前寫的java web考勤管理系統

主要在這裡寫一下驗證碼的實現過程:function createCode(){   code = "";  var codeLength = 6;//驗證碼的長度  var checkCode = document.getElementById("checkCode");va

最近的MySQL:拋開復雜的架構設計MySQL優化思想基本都在這

like 貴的 https 信息 bec roc 數據庫 子查詢 使用 優化一覽圖 優化 筆者將優化分為了兩大類:軟優化和硬優化。軟優化一般是操作數據庫即可;而硬優化則是操作服務器硬件及參數設置。 1、軟優化 1)查詢語句優化 首先我們可以用EXPLAIN或DESCRIB

為什麼程式設計師少錢多死得早?-位人生悲慘的程式設計師與你講述其中原因

引子: 有一個段子:女人愛找程式設計師當男朋友,因為程式設計師話少錢多死得早。 哇咔咔,哈哈哈。 其實最開始聽到這個詞的時候我是拒絕的。因為我覺得我話挺多的,無論和誰,只要嘮開了,就能滔滔不絕的嘮下去: “哎呀老鐵,你說的太對了,還有個事跟你說說……&a

深度學習/機器學習入門基礎數學知識整理):線性代數基礎矩陣範數等

前面大概有2年時間,利用業餘時間斷斷續續寫了一個機器學習方法系列,和深度學習方法系列,還有一個三十分鐘理解系列(一些趣味知識);新的一年開始了,今年給自己定的學習目標——以補齊基礎理論為重點,研究一些基礎課題;同時逐步繼續寫上述三個系列的文章。 最近越來越多的

單元測試整理)——單元測試是什麼有什麼好處

單元測試是什麼 單元測試是開發者編寫的一小段程式碼,用於檢驗被測程式碼的一個很小的、很明確的功能是否正確,通常而言,一個單元測試是用於判斷某個特定條件(或者場景)下某個特定函式的行為1。 單元測試的好處 1,單元測試不但會使你的工作完成得更輕鬆。而且會

分析一下前段的玩客雲(區塊鏈相關產品)

玩客雲是迅雷公司在2017年年尾推出並風行的一款產品,我並沒有玩過這類產品,但我一直對此類產品的原理以及運營模式十分好奇。 通過搜尋一些資料,我瞭解到,玩客雲的原理是主要是:當你使用玩客雲時,會共享

自媒體百家號遍地黃金百萬爆發怎麽寫

什麽 col -c 自媒體 bsp clas abc ack 吸引 寫一篇文章最重要的是有人看,而別人之所以看你的文章的前提是你的標題、配圖夠吸引眼球。 第一:留懸念,令人遐想 第二:引起讀者共鳴,調動讀者情緒,如自豪感、正義感 第三:引發讀者不滿,誘導吐槽 套用標題

poj 3468 整理一下線段樹的寫法

ring 寫法 int nod ret sca using scanf tdi // 對於延遲更新,我們在updata 和query的時候 pushdown和pushup兩個東西都要存在 #include <iostream> #include <cst

最近的微信牛牛棋牌房卡搭建的源碼的一個BUG修復

std ray 下載 .com amd 其它 ceil ans 源碼 最新版修復所有bug出租微信牛牛棋牌房卡搭建(h5.fanshubbs.com)扣扣1687054422 BUG說明:當後臺設定某個玩家的控制贏率後。10局20局的就沒有問題。當是大於20,就會出現玩到最

小豬佩奇最近啊!那麽怎麽用代碼寫呢?Python源碼送給你!

size load original IE 也有 package 說明 shell str 齊天大聖保佑服務器 字體什麽的,都可以通過代碼進行微調。此次僅僅是作為樂趣分享。下面就把代碼分享出來,有興趣的朋友可以自己做來玩下。 程序代碼 至於

整理一下odoo10在windows系統下部署的流程

install 復制 douban rem amp con users 默認 ring odoo10環境搭建 所需依賴: Python3.5 odoo10.0 Node.js PostgreSQL 9.5 PyCharm 專業版 1.首先先安裝好Pyt

整理一下幾個webui庫使用下來遇到的一些問題(持續更新

AR play one 設置 持續更新 row size height IV semantic ui 柵格問題 在column裏設置h1 line-height會出現超出設置值的情況 column之間沒有間隙,但column內會有固定paddin b

整理一下最近Android面試的提問

VC 順序 大小 機制 速度慢 efault 結構 基本類 取代 java相關:   1. public protect private default關鍵字有什麽區別?     public:表示可以在任何一個類中被訪問;     protect:表示可以在自身、子類以及

最近的7大短視頻分紅平臺 每日分紅0成本必賺項目匯總

手機淘寶 搜索 都是 團隊 註冊 增長 可用 貢獻 授權 打開支付寶首頁在頂部搜索“9713978”,即可領紅包 [8月1日-9月30日]每天可以領到大額額外紅包 天貓聚劃算99大促 預售定金膨脹 滿300-30 萬券齊發:復制€m9C3bdzhkeg€打開手機淘寶領券 搶

聽說scratch少兒編程這個課程可以在線學嗎【已解決】

shadow log 圖片 少兒編程 全球 歷史 學習英語 51cto mar Scratch是入門編程,國外也用得很多。它的模塊比較適合少兒,又是中文的,普通編程太枯燥,這個主要是能適用於做一些小遊戲,小朋友最感興趣。蘋果CEO庫克曾說:“學習編程要比學習英語更重要。因為

現在的 vue 學習篇 (

記錄一下自己的學習過程,以及學習中遇到的問題。 學習什麼東西首先要知道為什麼去學習?學習它主要可以做什麼? 那什麼是vue.js? vue是一個輕量級框架,與其他重量級的框架不同的是,vue採用自底向上增量開發的設計。使用vue只需要關注檢視層,不過使用起來讓我感覺最不錯的是vue的響應

整理一下大二所做的手抄筆記1(反射機制及為什麼要使用反射)

本來想就“大三筆記”這個專欄一直寫下去的,後來想想,很多現在接觸到的知識都是需要了解一下底層原理才能更好地掌握的,於是乎,鞭策鞭策自己,將自己大二期間作的手抄筆記慢慢都更新到csdn中,方便閱覽,當然了,“大三筆記”也是會一直更的,期間也會更這個專欄。   什麼是反射 &nbs

之前的物聯網去哪了

前言:前兩年的物聯網真是無處不在,堪比當前火爆的區塊鏈,但是最近卻很少聽到物聯網,可能是區塊鏈佔得位置比較大,物聯網只能退下了,但是退哪裡去了呢? 其實物聯網技術仍然無處不在,它應用於我們生活中的每個場景,衣、食、住、行。例如我們遠端控制和監測車輛、門禁系統、公交系統、智慧家居等。 下面