embedded - Arduino आरएफआईडी चेकसम गणना और महत्वपूर्ण विज़ुअलाइज़ेशन




(2)

चेकसम की गणना करने के तरीके के बारे में यहां बताया गया है।

अपना कार्ड नंबर लें (यह सीधे आपके टेक्स्ट से उद्धृत किया गया है)

I received: 2
I received: 51
I received: 67
I received: 48
I received: 48
I received: 67
I received: 69
I received: 55
I received: 53
I received: 52
I received: 67
I received: 67
I received: 66
I received: 3

यह आपको एक संख्या देगा जो निम्न के बराबर है:

2 51 67 48 48 67 69 55 53 52 67 67 66 3

पहला अंक (2) इंगित करता है कि यह एक अनुरोध की शुरुआत है।

अंतिम संख्या (3) इंगित करता है कि यह अनुरोध का अंत है।

2 51 67 48 48 67 69 55 53 52 67 67 66 3

चेकसम की गणना के प्रयोजनों के लिए, हम इन दो नंबरों को हटाने जा रहे हैं। तो आपका नया नंबर अब है:

51 67 48 48 67 69 55 53 52 67 67 66

आपके पास पिछले दो नंबर हैं जो आपके चेकसम हैं शेष संख्याएं आपके कार्ड नंबर हैं इसलिए:

आपका कार्ड नंबर है:

51 67 48 48 67 69 55 53 52 67

और आपका चेकसम है:

67 66

इसके बाद आपको अपना कार्ड नंबर और आपके चेकसम को एएससीआईआई मानों में बदलने की जरूरत है:

आपका कार्ड नंबर है:

3 सी 0 सीई 7 5 4 सी

और आपका चेकसम है:

सीबी

इसके बाद, प्रत्येक नंबर को जोड़े में दबाएं:

आपका कार्ड नंबर है:

3 सी 00 सीई 75 4 सी

और आपका चेकसम है:

सीबी

फिर आपको प्रत्येक जोड़ी को हेक्साइडचलम मान के रूप में व्यवहार करने और उनके खिलाफ एक्सओर करने की आवश्यकता है। तो मूल रूप से आपको निम्नलिखित को साबित करने की आवश्यकता है:

3 सी ^ 00 ^ सीई ^ 75 ^ 4 सी == सीबी

(3 सी ^ 00) = 3 सी

3 सी ^ सीई ^ 75 ^ 4 सी == सीबी

(3 सी ^ सीई) = एफ 2

F2 ^ 75 ^ 4 सी == सीबी

(3 सी ^ सीई) = 87

87 ^ 4 सी == सीबी

(87 ^ 4 सी) = सीबी

सीबी == सीबी

सीबी == सीबी क्योंकि, यह एक वैध लेनदेन है

इसमें कोई संदेह नहीं है कि कोई अन्य इस से बेहतर दृष्टिकोण के साथ आ सकता है, लेकिन यहां पर्याप्त छद्म कोड होना चाहिए ताकि आप खुद को लिख सकें।

मैं इस आरएफआईडी मॉड्यूल को Arduino Ethernet R3 का उपयोग कर रहा हूं और मुझे सॉफ्टवेयर सीरियल कार्ड ( TAG ) आईडी से पुनः प्राप्त करने की आवश्यकता है जो टैग के बाहर लिखा गया है। मॉड्यूल की डेटाशीट का कहना है कि 14 बाइट्स Arduino को भेजे जाते हैं। पहला शीर्षलेख है, अंतिम पादलेख, पादलेख से पहले 2 बाइट चेकसम हैं, और अन्य 10 बाइट्स एएससीआईआई डेटा हैं जिसमें टैग आईडी है।

मैं कार्ड की आईडी कैसे बना सकता हूं और चेकसम को कैसे नियंत्रित कर सकता हूं? उदाहरण के लिए टैग के साथ यह आईडी है: 0013530444, Arduino प्रतिक्रिया है:

I received: 2
I received: 51
I received: 67
I received: 48
I received: 48
I received: 67
I received: 69
I received: 55
I received: 53
I received: 52
I received: 67
I received: 67
I received: 66
I received: 3

लेकिन मुझे पता नहीं है कि स्क्रीन पर कैसे प्रिंट किया जाए, यह आरडुइनो द्वारा पढ़ा जाता है। चेकसम की गणना कैसे करें?

http://www.seeedstudio.com/wiki/index.php?title=125Khz_RFID_module_-_UART

क्या कोई मेरी मदद कर सकता है?


मुझे इस ब्लॉग को मिला जो अरडूनो में एक कार्यान्वयन है, मैंने इसे Java में काम करने के लिए अनुकूलित किया है और परिणाम अच्छे हैं I चूंकि बहुत सारे बिटवायर ऑपरेशन हैं - मैं समझता हूं कि क्या हो रहा है यह जानने के लिए http://www.miniwebtool.com/bitwise-calculator/ का इस्तेमाल किया गया है। मैं (val | (tempbyte << 4)) को छोड़कर इसके सभी को समझता हूं, मेरा मतलब है कि मैं समझता हूँ कि कथन क्या है, मुझे यह देखने के लिए अभी संघर्ष करना है कि मैं किस प्रकार परिणाम चाहता हूं।

void loop () {
  byte i = 0;
  byte val = 0;
  byte code[6];
  byte checksum = 0;
  byte bytesread = 0;
  byte tempbyte = 0;

  if(Serial.available() > 0) {
    if((val = Serial.read()) == 2) {
      // check for header 
      bytesread = 0; 
      while (bytesread < 12) {
        // read 10 digit code + 2 digit checksum
        if( Serial.available() > 0) {
          val = Serial.read();
          if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) {
            // if header or stop bytes before the 10 digit reading
            break;
            // stop reading
          }
          // Do Ascii/Hex conversion:
          if ((val >= '0') && (val <= '9')) {
            val = val - '0';
          } else if ((val >= 'A') && (val <= 'F')) {
            val = 10 + val - 'A';
          }
          // Every two hex-digits, add byte to code:
          if (bytesread & 1 == 1) {
            // make some space for this hex-digit by
            // shifting the previous hex-digit with 4 bits to the left:
            code[bytesread >> 1] = (val | (tempbyte << 4));
            if (bytesread >> 1 != 5) {
              // If we're at the checksum byte,
              checksum ^= code[bytesread >> 1];
              // Calculate the checksum... (XOR)
            };
          } else {
            tempbyte = val;
            // Store the first hex digit first...
          };
          bytesread++;
          // ready to read next digit
        }
      }
      // Output to Serial:
      if (bytesread == 12) {
        // removed code for clarity
        LCD.print("Check:");
        LCD.print(code[5], HEX);
        LCD.print(code[5] == checksum ? "-passed" : "-error");
      }
      bytesread = 0;
    }
  }
}

मेरा जावा / एंड्रॉइड पोर्ट एक ब्लूटूथसॉकेट को सुन रहा है मैं BlueTerm से बेस के आधार पर कोड का उपयोग कर रहा हूं, यह कोड ConnectedThread में चला जाता है सभी मूर्खतापूर्ण टिप्पणियों के लिए माफी, लेकिन मैं अब भी जावा सीख रहा हूं)।

//assume you have checksum as int and code as int array. it will overflow if bytes are used like above example
public void run() {
  Log.d(TAG, "BEGIN mConnectedThread");
  byte[] buffer = new byte[1024];
  int bytes;
  // Keep listening to the InputStream while connected
  while (true) {
    Log.d(TAG, "Running");
    try {
      // Read from the InputStream
      bytes = mmInStream.read(buffer);
      for (int i = 0; i < bytes; i++) {
        Log.d(TAG, "Reading: " + i + " of " + bytes + " from input stream");
        byte b = buffer[i];
        try {
          if(bytesread >= 0) {
            //just printing ASCII
            char printableB = (char) b;
            if (b < 32 || b > 126) printableB = ' ';
            Log.d(TAG, "'" + Character.toString(printableB) + "' (" + Integer.toString(b) + ")");
            if((b == 0x0D)||(b == 0x0A)||(b == 0x03)||(b == 0x02)) {
              // if header or stop bytes before the 10 digit reading
              Log.e(TAG, i + " Unexpected header while processing character " + Integer.toString(b));
            } else {
              // Do ASCII/Hex conversion
              if ((b >= '0') && (b <= '9')) {
                b = (byte) (b - '0');
              } else if ((b >= 'A') && (b <= 'F')) {
                b = (byte) (10 + b - 'A');
              }
              if ((bytesread & 1) == 1) {
                //if isOdd(bytesread)
              // make some space for this hex-digit by shifting the previous hex-digit with 4 bits to the left:
              code[bytesread >> 1] = (b | (tempbyte << 4));
              if (bytesread >> 1 != 5) {
                // If we're not at the checksum byte,
                checksum ^= code[bytesread >> 1];
                // Calculate the checksum... (XOR)
              }
            } else {
              // Store the first hex digit first
              tempbyte = b; 
            }
          }
          bytesread++;
        } else if(b == 2) {
          bytesread = 0;
          Log.d(TAG, "Header found!");
        }
        if(bytesread == 12) {
          String check = (code[5] == checksum ? "-passed" : "-error");
          String r = "";
          for(int j = 0; j < 5; j++){
            r += Integer.toString(code[i]);
          }
          Log.d(TAG, "Check:" + Integer.toString(code[5]) + check);
          init();
        } else if(bytesread > 12){
          Log.e(TAG, "Too many bytes!");
        }
      } catch (Exception e) {
        Log.e(TAG, i + " Exception while processing character " + Integer.toString(b), e);
      }
    }
    String a = buffer.toString();
    a = "";
  } catch (IOException e) {
    Log.e(TAG, "disconnected", e);
    connectionLost();
    break;
  }
}
Log.i(TAG, "END mConnectedThread");
}