Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Net;
- using System.Threading;
- using System.Linq;
- using System.Collections.Generic;
- //using System.Linq;
- using System.Text;
- using System.Web;
- using System.IO.Ports;
- namespace FingerprintServer {
- class Program : DPFP.Capture.EventHandler {
- private HttpListener httpListener;
- private DPFP.Capture.Capture capturer;
- private int stopFlag = 0;
- static int PORT = 8083;
- static Program program;
- static void Main(string[] args){
- program = new Program();
- program.MainProgram(args);
- }
- private void MainProgram(string[] args) {
- // Fingerprint
- capturer = new DPFP.Capture.Capture(DPFP.Capture.Priority.Low);
- if (capturer != null){
- capturer.EventHandler = program; // Apa coba ini
- LogMessage("Capture terpasang");
- } else {
- LogMessage("Capturer tidak terpasang");
- }
- // Arduino
- comPort = new SerialPort();
- comPort.BaudRate = 115200;
- comPort.Parity = Parity.None;
- comPort.StopBits = StopBits.One;
- comPort.DataBits = 8;
- comPort.Handshake = Handshake.None;
- comPort.RtsEnable = true;
- comPort.DtrEnable = true;
- comPort.ReadTimeout = 500;
- comPort.WriteTimeout = 500;
- comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
- // Webserver
- if (! HttpListener.IsSupported) throw new NotSupportedException("OS harus WinXP SP2 ke atas.");
- program.httpListener = new HttpListener();
- program.httpListener.Prefixes.Add("http://*:" + PORT + "/");
- program.httpListener.Start();
- ThreadPool.QueueUserWorkItem((o) => {
- LogMessage(String.Format("Webserver running on port {0}..", PORT));
- try {
- while (program.httpListener.IsListening) {
- ThreadPool.QueueUserWorkItem((c) => {
- LogMessage("New connection..");
- HttpListenerContext context = c as HttpListenerContext;
- HttpListenerRequest request = context.Request;
- try {
- Dictionary<string, string> posts = new Dictionary<string,string>();
- string postQueryString;
- using (var reader = new System.IO.StreamReader(request.InputStream, request.ContentEncoding)){
- postQueryString = reader.ReadToEnd();
- }
- string[] rawPosts = postQueryString.Split('&');
- for (int i=0; i<rawPosts.Length; i++) { //string keyvalue in rawPosts){
- string[] key_value = rawPosts[i].Split('=');
- posts.Add(key_value[0], HttpUtility.UrlDecode(key_value[1]));
- }
- string response;
- if (posts.ContainsKey("action")){
- LogMessage("action = " + posts["action"]);
- response = program.ProcessRequest(posts);
- } else {
- response = "{\"result\":\"Error\", \"message\":\"Unknown request.\"}";
- }
- byte[] buf = Encoding.UTF8.GetBytes(response);
- context.Response.AddHeader("Access-Control-Allow-Origin", "*");
- context.Response.ContentLength64 = buf.Length;
- context.Response.OutputStream.Write(buf, 0, buf.Length);
- } catch { } finally { context.Response.OutputStream.Close(); }
- }, program.httpListener.GetContext());
- }
- } catch { }
- });
- // Close Webserver
- while (program.stopFlag == 0) {
- Console.ReadKey();
- }
- program.httpListener.Stop();
- program.httpListener.Close();
- // Close Fingerprint
- if (program.capturer != null) {
- program.capturer.EventHandler = null;
- program.capturer.StopCapture();
- }
- }
- private string message = "{}";
- private int mode = 0;
- const int MODE_NONE = 0;
- const int MODE_TO_ENROLL = 1;
- const int MODE_ENROLLED = 2;
- const int MODE_ENROLL_FAILED = 3;
- const int MODE_TO_VERIFY = 4;
- const int MODE_VERIFY_READY = 5;
- const int MODE_VERIFY_FAILED = 6;
- const int MODE_VERIFIED = 7;
- const int MODE_NOT_VERIFIED = 8;
- const int MODE_MFRC522_READ = 9;
- private DPFP.Processing.Enrollment Enroller = null;
- private DPFP.Verification.Verification Verificator = null;
- private string feature64 = null; // Base64 encoded
- private string template64 = null; // Base64 encoded
- private String lastCom = null;
- private SerialPort comPort = null;
- private bool changePort(String port){
- if (port != lastCom) {
- lastCom = port;
- if (comPort != null) comPort.Close();
- comPort.PortName = lastCom;
- comPort.Open();
- return true;
- }
- return false;
- }
- private void comWrite(String command){
- if (comPort != null && comPort.IsOpen)
- comPort.Write(command + "\r\n");
- }
- private String comResult = "";
- private bool inComment = false;
- private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
- SerialPort sp = (SerialPort) sender;
- String data = sp.ReadExisting();
- if (data.TrimStart().StartsWith("//"))
- inComment = true;
- else if (inComment && data.Contains('\n'))
- inComment = false;
- else if (! inComment)
- comResult += data;
- }
- private String comRead(){
- String result = "";
- if (comPort != null && comPort.IsOpen){
- int i = 0;
- while (i<100){
- if (comResult != ""){
- result = comResult;
- comResult = "";
- return result;
- }
- System.Threading.Thread.Sleep(50);
- i++;
- }
- }
- return result;
- }
- private string ProcessRequest(Dictionary<string, string> posts){
- if (posts["action"] == "led-on"){
- if (posts.ContainsKey("com")) changePort(posts["com"]);
- comWrite("{\"led\":\"1\"}");
- message = comRead();
- } else if (posts["action"] == "led-off"){
- if (posts.ContainsKey("com")) changePort(posts["com"]);
- comWrite("{\"led\":\"0\"}");
- message = comRead();
- } else if (posts["action"] == "mfrc522-begin") {
- if (posts.ContainsKey("com")) changePort(posts["com"]);
- comWrite("{\"mfrc522\":\"begin\"}");
- message = comRead();
- } else if (posts["action"] == "mfrc522-read") {
- if (posts.ContainsKey("com")) changePort(posts["com"]);
- if (mode == MODE_MFRC522_READ){
- message = comRead();
- mode = MODE_NONE;
- } else {
- comWrite("{\"mfrc522\":\"read\"}");
- message = comRead();
- mode = MODE_MFRC522_READ;
- }
- } else if (posts["action"] == "terminate") {
- LogMessage("Action = Stop Webserver." + message);
- message = "{\"result\":\"OK\", \"message\":\"Webserver will be terminated.\"}";
- program.stopFlag = 1;
- } else if (program.stopFlag == 1) {
- message = "{\"result\":\"Error\", \"message\":\"Webserver will be terminated.\"}";
- } else if (posts["action"] == "abort") {
- mode = MODE_NONE;
- if (Enroller != null){
- Enroller.Clear();
- Enroller = null;
- }
- if (Verificator != null){
- Verificator = null;
- }
- capturer.StopCapture();
- message = "{\"result\":\"OK\", \"message\":\"Pembatalan berhasil.\"}";
- } else if (posts["action"] == "start_enroll"){
- // ubah mode, start capture
- LogMessage("Action = Start Enroll " + mode);
- if (mode == MODE_NONE || mode == MODE_VERIFY_READY){
- // mulai enroll
- LogMessage("OK");
- mode = MODE_TO_ENROLL;
- Enroller = new DPFP.Processing.Enrollment();
- message = "{\"result\":\"OK\", \"message\":\"Scan fingerprint dibutuhkan: " + Enroller.FeaturesNeeded + " buah.\", " +
- "\"params\":{\"need_fingerprint\":\"" + Enroller.FeaturesNeeded + "\"}}";
- capturer.StartCapture();
- } else {
- LogMessage("Error");
- return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":"+message+"}";
- }
- } else if (posts["action"] == "check_enroll") {
- // get hasil, ubah mode
- LogMessage("Action = Check Enroll " + mode);
- if (mode == MODE_ENROLLED) {
- // enroll berhasil
- LogMessage("OK");
- mode = MODE_NONE;
- message = "{\"result\":\"OK\", \"message\":\"Scan fingerprint berhasil.\", " +
- "\"params\":{\"template\":\"" + template64 + "\"}}";
- } else if (mode == MODE_ENROLL_FAILED){
- // enroll gagal
- LogMessage("Error");
- mode = MODE_NONE;
- message = "{\"result\":\"Error\", \"message\":\"Scan fingerprint gagal.\"}";
- } else if (mode == MODE_TO_ENROLL) {
- // sedang enroll
- LogMessage("Info");
- message = "{\"result\":\"Info\", \"message\":\"Scan fingerprint dibutuhkan: " + Enroller.FeaturesNeeded + " buah.\", " +
- "\"params\":{\"need_fingerprint\":\"" + Enroller.FeaturesNeeded + "\"}}";
- } else {
- LogMessage("Error");
- return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":" + message + "}";
- }
- } else if (posts["action"] == "start_verify") {
- // ubah mode, start capture
- LogMessage("Action = Start Verify " + mode);
- if (mode == MODE_NONE){
- // mulai verifikasi (ambil sidik jari)
- LogMessage("OK");
- mode = MODE_TO_VERIFY;
- Verificator = new DPFP.Verification.Verification();
- message = "{\"result\":\"OK\", \"message\":\"Lakukan scan fingerprint.\"}";
- capturer.StartCapture();
- } else {
- LogMessage("Error");
- return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":" + message + "}";
- }
- } else if (posts["action"] == "check_verify") {
- // get hasil, ...
- LogMessage("Action = Check Verify " + mode);
- if (mode == MODE_VERIFY_READY){
- // verifikasi siap
- LogMessage("OK");
- message = "{\"result\":\"OK\", \"message\":\"Verifikasi siap.\", " +
- "\"params\":{\"feature\":\"" + feature64 + "\"}}";
- } else if (mode == MODE_VERIFY_FAILED) {
- // verifikasi tidak siap
- LogMessage("Error");
- mode = MODE_NONE;
- message = "{\"result\":\"Error\", \"message\":\"Scan fingerprint gagal.\"}";
- } else if (mode == MODE_TO_VERIFY) {
- // verifikasi belum siap
- LogMessage("Info");
- message = "{\"result\":\"Info\", \"message\":\"Lakukan scan fingerprint.\"}";
- } else {
- LogMessage("Error");
- return "{\"result\":\"Error\", \"message\":\"Scan service tidak siap.\", \"last_message\":" + message + "}";
- }
- } else if (posts["action"] == "verify") {
- LogMessage("Action = Verify " + mode);
- if (mode == MODE_VERIFY_READY || (posts.ContainsKey("templates") && posts.ContainsKey("feature"))) {
- LogMessage("OK/Info?");
- if (posts.ContainsKey("feature"))
- feature64 = posts["feature"];
- byte[] featureBytes = Convert.FromBase64String(feature64);
- DPFP.FeatureSet features = new DPFP.FeatureSet();
- features.DeSerialize(featureBytes);
- LogMessage("1");
- if (posts.ContainsKey("templates"))
- template64 = posts["templates"];
- char[] splitters = {',', ' '};
- string[] templates = template64.Split(splitters);
- int minFAR = -1;
- LogMessage("2");
- for (int i=0; i<templates.Length; i++){
- LogMessage(templates[i]);
- byte[] templateBytes = Convert.FromBase64String(templates[i]);
- DPFP.Template template = new DPFP.Template();
- template.DeSerialize(templateBytes);
- LogMessage("4");
- if (Verificator == null)
- Verificator = new DPFP.Verification.Verification();
- DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
- Verificator.Verify(features, template, ref result);
- LogMessage("5");
- if (result.Verified) {
- LogMessage("OK");
- message = "{\"result\":\"OK\", \"message\":\"Verifikasi berhasil.\", \"params\":{\"FAR\":\"" + result.FARAchieved + "\", \"index\":\"" + i + "\"}}";
- i = templates.Length; // Excuse me, can I just type "break"?
- } else if (i==0 || result.FARAchieved < minFAR) {
- LogMessage("Info");
- message = "{\"result\":\"Info\", \"message\":\"Verifikasi gagal.\", \"params\":{\"FAR\":\"{" + result.FARAchieved + "\", \"index\":\"" + i + "\"}}";
- minFAR = result.FARAchieved;
- }
- }
- } else {
- LogMessage("Error");
- return "{\"result\":\"Error\", \"message\":\"Verification service tidak siap.\", \"last_message\":"+message+"}";
- }
- } else
- return "{\"result\":\"Error\", \"message\":\"Unknown request.\"}";
- LogMessage(message);
- return message;
- }
- static public void LogMessage(string message) {
- Console.WriteLine(message);
- }
- #region EventHandler Members
- public void OnComplete(object capture, string readerSerialNumber, DPFP.Sample sample) {
- LogMessage("onComplete");
- if (mode == MODE_TO_ENROLL){
- if (Enroller == null)
- Enroller = new DPFP.Processing.Enrollment();
- DPFP.FeatureSet features = new DPFP.FeatureSet();
- DPFP.Processing.FeatureExtraction featureExtraction = new DPFP.Processing.FeatureExtraction();
- DPFP.Capture.CaptureFeedback captureFeedback = new DPFP.Capture.CaptureFeedback();
- featureExtraction.CreateFeatureSet(sample, DPFP.Processing.DataPurpose.Enrollment, ref captureFeedback, ref features);
- if (captureFeedback == DPFP.Capture.CaptureFeedback.Good && features != null) { // captureFeedback == DPFP.Capture.CaptureFeedback.Good
- try {
- //MakeReport("The fingerprint feature set was created.");
- Enroller.AddFeatures(features); // Add feature set to template.
- } finally {
- if (Enroller.TemplateStatus == DPFP.Processing.Enrollment.Status.Ready) {
- // Success
- mode = MODE_ENROLLED;
- byte[] templateBytes = null;
- Enroller.Template.Serialize(ref templateBytes);
- template64 = Convert.ToBase64String(templateBytes);
- templateBytes = null;
- Enroller.Clear();
- Enroller = null;
- capturer.StopCapture();
- } else if (Enroller.TemplateStatus == DPFP.Processing.Enrollment.Status.Failed) {
- // Failed
- mode = MODE_ENROLL_FAILED;
- Enroller.Clear();
- Enroller = null;
- capturer.StopCapture();
- }
- }
- }
- } else if (mode == MODE_TO_VERIFY) {
- DPFP.FeatureSet features = new DPFP.FeatureSet();
- DPFP.Processing.FeatureExtraction featureExtraction = new DPFP.Processing.FeatureExtraction();
- DPFP.Capture.CaptureFeedback captureFeedback = DPFP.Capture.CaptureFeedback.None;
- featureExtraction.CreateFeatureSet(sample, DPFP.Processing.DataPurpose.Verification, ref captureFeedback, ref features);
- if (captureFeedback == DPFP.Capture.CaptureFeedback.Good) {
- mode = MODE_VERIFY_READY;
- byte[] featureBytes = null;
- features.Serialize(ref featureBytes);
- feature64 = Convert.ToBase64String(featureBytes);
- featureBytes = null;
- capturer.StopCapture();
- } else {
- mode = MODE_VERIFY_FAILED;
- capturer.StopCapture();
- }
- }
- }
- public void OnFingerGone(object capture, string readerSerialNumber) { LogMessage("OnFingerGone"); }
- public void OnFingerTouch(object capture, string readerSerialNumber) { LogMessage("OnFingerTouch"); }
- public void OnReaderConnect(object capture, string readerSerialNuber) { LogMessage("OnReaderConnect"); }
- public void OnSampleQuality(object capture, string readerSerialNumber, DPFP.Capture.CaptureFeedback captureFeedback) { }
- public void OnReaderDisconnect(object capture, string readerSerialNumber) { LogMessage("OnReaderDisconnect"); }
- #endregion
- }
- }
Add Comment
Please, Sign In to add comment