sohotcall

Fingerprint Server

Apr 23rd, 2019
194
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Net;
  3. using System.Threading;
  4. using System.Linq;
  5. using System.Collections.Generic;
  6. //using System.Linq;
  7. using System.Text;
  8. using System.Web;
  9. using System.IO.Ports;
  10.  
  11. namespace FingerprintServer {
  12.     class Program : DPFP.Capture.EventHandler {
  13.         private HttpListener httpListener;
  14.         private DPFP.Capture.Capture capturer;
  15.         private int stopFlag = 0;
  16.         static int PORT = 8083;
  17.  
  18.         static Program program;
  19.         static void Main(string[] args){
  20.             program = new Program();
  21.             program.MainProgram(args);
  22.         }
  23.         private void MainProgram(string[] args) {
  24.             // Fingerprint
  25.             capturer = new DPFP.Capture.Capture(DPFP.Capture.Priority.Low);
  26.             if (capturer != null){
  27.                 capturer.EventHandler = program; // Apa coba ini
  28.                 LogMessage("Capture terpasang");
  29.             } else {
  30.                 LogMessage("Capturer tidak terpasang");
  31.             }
  32.  
  33.             // Arduino
  34.             comPort = new SerialPort();
  35.             comPort.BaudRate = 115200;
  36.             comPort.Parity = Parity.None;
  37.             comPort.StopBits = StopBits.One;
  38.             comPort.DataBits = 8;
  39.             comPort.Handshake = Handshake.None;
  40.             comPort.RtsEnable = true;
  41.             comPort.DtrEnable = true;
  42.             comPort.ReadTimeout = 500;
  43.             comPort.WriteTimeout = 500;
  44.             comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  45.  
  46.             // Webserver
  47.             if (! HttpListener.IsSupported) throw new NotSupportedException("OS harus WinXP SP2 ke atas.");
  48.             program.httpListener = new HttpListener();      
  49.             program.httpListener.Prefixes.Add("http://*:" + PORT + "/");
  50.             program.httpListener.Start();
  51.  
  52.             ThreadPool.QueueUserWorkItem((o) => {
  53.                 LogMessage(String.Format("Webserver running on port {0}..", PORT));
  54.                 try {
  55.                     while (program.httpListener.IsListening) {
  56.                         ThreadPool.QueueUserWorkItem((c) => {
  57.                             LogMessage("New connection..");
  58.                             HttpListenerContext context = c as HttpListenerContext;
  59.                             HttpListenerRequest request = context.Request;
  60.                             try {
  61.                                 Dictionary<string, string> posts = new Dictionary<string,string>();
  62.                                 string postQueryString;
  63.                                 using (var reader = new System.IO.StreamReader(request.InputStream, request.ContentEncoding)){
  64.                                     postQueryString = reader.ReadToEnd();
  65.                                 }
  66.                                 string[] rawPosts = postQueryString.Split('&');
  67.                                 for (int i=0; i<rawPosts.Length; i++) { //string keyvalue in rawPosts){
  68.                                     string[] key_value = rawPosts[i].Split('=');
  69.                                     posts.Add(key_value[0], HttpUtility.UrlDecode(key_value[1]));
  70.                                 }
  71.                                 string response;
  72.                                 if (posts.ContainsKey("action")){
  73.                                     LogMessage("action = " + posts["action"]);
  74.                                     response = program.ProcessRequest(posts);
  75.                                 } else {
  76.                                     response = "{\"result\":\"Error\", \"message\":\"Unknown request.\"}";
  77.                                 }
  78.                                 byte[] buf = Encoding.UTF8.GetBytes(response);
  79.                                 context.Response.AddHeader("Access-Control-Allow-Origin", "*");
  80.                                 context.Response.ContentLength64 = buf.Length;
  81.                                 context.Response.OutputStream.Write(buf, 0, buf.Length);
  82.                             } catch { } finally { context.Response.OutputStream.Close(); }
  83.                         }, program.httpListener.GetContext());
  84.                     }
  85.                 } catch { }
  86.             });
  87.  
  88.             // Close Webserver
  89.             while (program.stopFlag == 0) {
  90.                 Console.ReadKey();
  91.             }
  92.             program.httpListener.Stop();
  93.             program.httpListener.Close();
  94.  
  95.             // Close Fingerprint
  96.             if (program.capturer != null) {
  97.                 program.capturer.EventHandler = null;
  98.                 program.capturer.StopCapture();
  99.             }
  100.         }
  101.  
  102.         private string message = "{}";
  103.         private int mode = 0;
  104.         const int MODE_NONE = 0;
  105.         const int MODE_TO_ENROLL = 1;
  106.         const int MODE_ENROLLED = 2;
  107.         const int MODE_ENROLL_FAILED = 3;
  108.         const int MODE_TO_VERIFY = 4;
  109.         const int MODE_VERIFY_READY = 5;
  110.         const int MODE_VERIFY_FAILED = 6;
  111.         const int MODE_VERIFIED = 7;
  112.         const int MODE_NOT_VERIFIED = 8;
  113.         const int MODE_MFRC522_READ = 9;
  114.         private DPFP.Processing.Enrollment Enroller = null;
  115.         private DPFP.Verification.Verification Verificator = null;
  116.         private string feature64 = null; // Base64 encoded
  117.         private string template64 = null; // Base64 encoded
  118.  
  119.         private String lastCom = null;
  120.         private SerialPort comPort = null;
  121.         private bool changePort(String port){
  122.             if (port != lastCom) {
  123.                 lastCom = port;
  124.                 if (comPort != null) comPort.Close();
  125.                 comPort.PortName = lastCom;
  126.                 comPort.Open();
  127.                
  128.                 return true;
  129.             }
  130.             return false;
  131.         }
  132.         private void comWrite(String command){
  133.             if (comPort != null && comPort.IsOpen)
  134.                 comPort.Write(command + "\r\n");
  135.         }
  136.         private String comResult = "";
  137.         private bool inComment = false;
  138.         private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
  139.             SerialPort sp = (SerialPort) sender;
  140.             String data = sp.ReadExisting();
  141.             if (data.TrimStart().StartsWith("//"))
  142.                 inComment = true;
  143.             else if (inComment && data.Contains('\n'))
  144.                 inComment = false;
  145.             else if (! inComment)
  146.                 comResult += data;
  147.         }
  148.         private String comRead(){
  149.             String result = "";
  150.             if (comPort != null && comPort.IsOpen){
  151.                 int i = 0;
  152.                 while (i<100){
  153.                     if (comResult != ""){
  154.                         result = comResult;
  155.                         comResult = "";
  156.                         return result;
  157.                     }
  158.                     System.Threading.Thread.Sleep(50);
  159.                     i++;
  160.                 }
  161.             }
  162.             return result;
  163.         }
  164.         private string ProcessRequest(Dictionary<string, string> posts){
  165.             if (posts["action"] == "led-on"){
  166.                 if (posts.ContainsKey("com")) changePort(posts["com"]);
  167.                 comWrite("{\"led\":\"1\"}");
  168.                 message = comRead();
  169.             } else if (posts["action"] == "led-off"){
  170.                 if (posts.ContainsKey("com")) changePort(posts["com"]);
  171.                 comWrite("{\"led\":\"0\"}");
  172.                 message = comRead();
  173.             } else if (posts["action"] == "mfrc522-begin") {
  174.                 if (posts.ContainsKey("com")) changePort(posts["com"]);
  175.                 comWrite("{\"mfrc522\":\"begin\"}");
  176.                 message = comRead();
  177.             } else if (posts["action"] == "mfrc522-read") {
  178.                 if (posts.ContainsKey("com")) changePort(posts["com"]);
  179.                 if (mode == MODE_MFRC522_READ){
  180.                     message = comRead();
  181.                     mode = MODE_NONE;
  182.                 } else {
  183.                     comWrite("{\"mfrc522\":\"read\"}");
  184.                     message = comRead();
  185.                     mode = MODE_MFRC522_READ;
  186.                 }
  187.             } else if (posts["action"] == "terminate") {
  188.                 LogMessage("Action = Stop Webserver." + message);
  189.                 message = "{\"result\":\"OK\", \"message\":\"Webserver will be terminated.\"}";
  190.                 program.stopFlag = 1;
  191.             } else if (program.stopFlag == 1) {
  192.                 message = "{\"result\":\"Error\", \"message\":\"Webserver will be terminated.\"}";
  193.             } else if (posts["action"] == "abort") {
  194.                 mode = MODE_NONE;
  195.                 if (Enroller != null){
  196.                     Enroller.Clear();
  197.                     Enroller = null;
  198.                 }
  199.                 if (Verificator != null){
  200.                     Verificator = null;
  201.                 }
  202.                 capturer.StopCapture();
  203.                 message = "{\"result\":\"OK\", \"message\":\"Pembatalan berhasil.\"}";
  204.             } else if (posts["action"] == "start_enroll"){
  205.                 // ubah mode, start capture
  206.                 LogMessage("Action = Start Enroll " + mode);
  207.                 if (mode == MODE_NONE || mode == MODE_VERIFY_READY){
  208.                     // mulai enroll
  209.                     LogMessage("OK");
  210.                     mode = MODE_TO_ENROLL;
  211.                     Enroller = new DPFP.Processing.Enrollment();
  212.                     message = "{\"result\":\"OK\", \"message\":\"Scan fingerprint dibutuhkan: " + Enroller.FeaturesNeeded + " buah.\", " +
  213.                         "\"params\":{\"need_fingerprint\":\"" + Enroller.FeaturesNeeded + "\"}}";
  214.                     capturer.StartCapture();
  215.                 } else {
  216.                     LogMessage("Error");
  217.                     return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":"+message+"}";
  218.                 }
  219.             } else if (posts["action"] == "check_enroll") {
  220.                 // get hasil, ubah mode
  221.                 LogMessage("Action = Check Enroll " + mode);
  222.                 if (mode == MODE_ENROLLED) {
  223.                     // enroll berhasil
  224.                     LogMessage("OK");
  225.                     mode = MODE_NONE;
  226.                     message = "{\"result\":\"OK\", \"message\":\"Scan fingerprint berhasil.\", " +
  227.                                 "\"params\":{\"template\":\"" + template64 + "\"}}";
  228.                 } else if (mode == MODE_ENROLL_FAILED){
  229.                     // enroll gagal
  230.                     LogMessage("Error");
  231.                     mode = MODE_NONE;
  232.                     message = "{\"result\":\"Error\", \"message\":\"Scan fingerprint gagal.\"}";
  233.                 } else if (mode == MODE_TO_ENROLL) {
  234.                     // sedang enroll
  235.                     LogMessage("Info");
  236.                     message = "{\"result\":\"Info\", \"message\":\"Scan fingerprint dibutuhkan: " + Enroller.FeaturesNeeded + " buah.\", " +
  237.                             "\"params\":{\"need_fingerprint\":\"" + Enroller.FeaturesNeeded + "\"}}";
  238.                 } else {
  239.                     LogMessage("Error");
  240.                     return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":" + message + "}";
  241.                 }
  242.             } else if (posts["action"] == "start_verify") {
  243.                 // ubah mode, start capture
  244.                 LogMessage("Action = Start Verify " + mode);
  245.                 if (mode == MODE_NONE){
  246.                     // mulai verifikasi (ambil sidik jari)
  247.                     LogMessage("OK");
  248.                     mode = MODE_TO_VERIFY;
  249.                     Verificator = new DPFP.Verification.Verification();
  250.                     message = "{\"result\":\"OK\", \"message\":\"Lakukan scan fingerprint.\"}";
  251.                     capturer.StartCapture();
  252.                 } else {
  253.                     LogMessage("Error");
  254.                     return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":" + message + "}";
  255.                 }
  256.             } else if (posts["action"] == "check_verify") {
  257.                 // get hasil, ...
  258.                 LogMessage("Action = Check Verify " + mode);
  259.                 if (mode == MODE_VERIFY_READY){
  260.                     // verifikasi siap
  261.                     LogMessage("OK");
  262.                     message = "{\"result\":\"OK\", \"message\":\"Verifikasi siap.\", " +
  263.                                 "\"params\":{\"feature\":\"" + feature64 + "\"}}";
  264.                 } else if (mode == MODE_VERIFY_FAILED) {
  265.                     // verifikasi tidak siap
  266.                     LogMessage("Error");
  267.                     mode = MODE_NONE;
  268.                     message = "{\"result\":\"Error\", \"message\":\"Scan fingerprint gagal.\"}";
  269.                 } else if (mode == MODE_TO_VERIFY) {
  270.                     // verifikasi belum siap
  271.                     LogMessage("Info");
  272.                     message = "{\"result\":\"Info\", \"message\":\"Lakukan scan fingerprint.\"}";
  273.                 } else {
  274.                     LogMessage("Error");
  275.                     return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":" + message + "}";
  276.                 }
  277.             } else if (posts["action"] == "verify") {
  278.                 LogMessage("Action = Verify " + mode);
  279.                 if (mode == MODE_VERIFY_READY || (posts.ContainsKey("templates") && posts.ContainsKey("feature"))) {
  280.                     LogMessage("OK/Info?");
  281.                     if (posts.ContainsKey("feature"))
  282.                         feature64 = posts["feature"];
  283.                     byte[] featureBytes = Convert.FromBase64String(feature64);
  284.                     DPFP.FeatureSet features = new DPFP.FeatureSet();
  285.                     features.DeSerialize(featureBytes);
  286.                     LogMessage("1");
  287.                    
  288.                     if (posts.ContainsKey("templates"))
  289.                         template64 = posts["templates"];
  290.                     char[] splitters = {',', ' '};
  291.                     string[] templates = template64.Split(splitters);
  292.                     int minFAR = -1;
  293.                     LogMessage("2");
  294.                    
  295.                     for (int i=0; i<templates.Length; i++){
  296.                         LogMessage(templates[i]);
  297.                         byte[] templateBytes = Convert.FromBase64String(templates[i]);
  298.                         DPFP.Template template = new DPFP.Template();
  299.                         template.DeSerialize(templateBytes);
  300.                         LogMessage("4");
  301.                         if (Verificator == null)
  302.                             Verificator = new DPFP.Verification.Verification();
  303.                         DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
  304.                         Verificator.Verify(features, template, ref result);
  305.                         LogMessage("5");
  306.                         if (result.Verified) {
  307.                             LogMessage("OK");
  308.                             message = "{\"result\":\"OK\", \"message\":\"Verifikasi berhasil.\", \"params\":{\"FAR\":\"" + result.FARAchieved + "\", \"index\":\"" + i + "\"}}";
  309.                             i = templates.Length; // Excuse me, can I just type "break"?
  310.                         } else if (i==0 || result.FARAchieved < minFAR) {
  311.                             LogMessage("Info");
  312.                             message = "{\"result\":\"Info\", \"message\":\"Verifikasi gagal.\", \"params\":{\"FAR\":\"{" + result.FARAchieved + "\", \"index\":\"" + i + "\"}}";
  313.                             minFAR = result.FARAchieved;
  314.                         }
  315.                     }
  316.                 } else {
  317.                     LogMessage("Error");
  318.                     return "{\"result\":\"Error\", \"message\":\"Verification service tidak siap.\", \"last_message\":"+message+"}";
  319.                 }
  320.             } else
  321.                 return "{\"result\":\"Error\", \"message\":\"Unknown request.\"}";
  322.             LogMessage(message);
  323.             return message;
  324.         }
  325.    
  326.         static public void LogMessage(string message) {
  327.             Console.WriteLine(message);
  328.         }
  329.  
  330.         #region EventHandler Members
  331.  
  332.         public void OnComplete(object capture, string readerSerialNumber, DPFP.Sample sample) {
  333.             LogMessage("onComplete");
  334.            
  335.             if (mode == MODE_TO_ENROLL){
  336.                 if (Enroller == null)
  337.                     Enroller = new DPFP.Processing.Enrollment();
  338.                 DPFP.FeatureSet features = new DPFP.FeatureSet();
  339.                 DPFP.Processing.FeatureExtraction featureExtraction = new DPFP.Processing.FeatureExtraction();
  340.                 DPFP.Capture.CaptureFeedback captureFeedback = new DPFP.Capture.CaptureFeedback();
  341.                 featureExtraction.CreateFeatureSet(sample, DPFP.Processing.DataPurpose.Enrollment, ref captureFeedback, ref features);
  342.  
  343.                 if (captureFeedback == DPFP.Capture.CaptureFeedback.Good && features != null) { // captureFeedback == DPFP.Capture.CaptureFeedback.Good
  344.                     try {
  345.                         //MakeReport("The fingerprint feature set was created.");
  346.                         Enroller.AddFeatures(features); // Add feature set to template.
  347.                     } finally {
  348.                         if (Enroller.TemplateStatus == DPFP.Processing.Enrollment.Status.Ready) {
  349.                             // Success
  350.                             mode = MODE_ENROLLED;
  351.                             byte[] templateBytes = null;
  352.                             Enroller.Template.Serialize(ref templateBytes);
  353.                             template64 = Convert.ToBase64String(templateBytes);
  354.                             templateBytes = null;
  355.                             Enroller.Clear();
  356.                             Enroller = null;
  357.                             capturer.StopCapture();
  358.                         } else if (Enroller.TemplateStatus == DPFP.Processing.Enrollment.Status.Failed) {
  359.                             // Failed
  360.                             mode = MODE_ENROLL_FAILED;
  361.                             Enroller.Clear();
  362.                             Enroller = null;
  363.                             capturer.StopCapture();
  364.                         }
  365.                     }
  366.                 }
  367.             } else if (mode == MODE_TO_VERIFY) {
  368.                 DPFP.FeatureSet features = new DPFP.FeatureSet();
  369.  
  370.                 DPFP.Processing.FeatureExtraction featureExtraction = new DPFP.Processing.FeatureExtraction();
  371.                 DPFP.Capture.CaptureFeedback captureFeedback = DPFP.Capture.CaptureFeedback.None;
  372.                 featureExtraction.CreateFeatureSet(sample, DPFP.Processing.DataPurpose.Verification, ref captureFeedback, ref features);
  373.                 if (captureFeedback == DPFP.Capture.CaptureFeedback.Good) {
  374.                     mode = MODE_VERIFY_READY;
  375.                     byte[] featureBytes = null;
  376.                     features.Serialize(ref featureBytes);
  377.                     feature64 = Convert.ToBase64String(featureBytes);
  378.                     featureBytes = null;
  379.                     capturer.StopCapture();
  380.                 } else {
  381.                     mode = MODE_VERIFY_FAILED;
  382.                     capturer.StopCapture();
  383.                 }
  384.             }
  385.         }
  386.         public void OnFingerGone(object capture, string readerSerialNumber) { LogMessage("OnFingerGone"); }
  387.         public void OnFingerTouch(object capture, string readerSerialNumber) { LogMessage("OnFingerTouch"); }
  388.         public void OnReaderConnect(object capture, string readerSerialNuber) { LogMessage("OnReaderConnect"); }
  389.         public void OnSampleQuality(object capture, string readerSerialNumber, DPFP.Capture.CaptureFeedback captureFeedback) { }
  390.         public void OnReaderDisconnect(object capture, string readerSerialNumber) { LogMessage("OnReaderDisconnect"); }
  391.  
  392.         #endregion
  393.     }
  394. }
RAW Paste Data