玩點好玩的:智能鎖 - 虛位密碼的實現

虛位密碼 是一個頗有意思的功能,不知道何時開始變成了智能鎖的標配功能之一。ios

虛位密碼的意思是你輸入的密碼位數不固定,可是隻要你輸入的密碼有你當初設定的密碼,那麼就認爲是正確的;反之就是錯誤的。算法

虛位密碼功能在C++ 或者 Java中最相似的應該是String類裏面查找+比較功能。oop

這裏僅僅用最簡單的算法來進行實現,不求特別複雜的實現。測試

不少的時候工程裏面要取捨 實現的質量(從效率和佔用來衡量) 和 實現的速度(編碼的時間。Java之因此流行就是由於他的編碼速度比較快【一次編譯,到處運行】,雖然Java面向對象實現的不是那麼完美)。ui

這裏扯遠了。本次只實現兩個版本的代碼:標準C++(運行平臺:PC) 和 嵌入式C++(Arduino用的C++)編碼


 思路

對於給定的字符串 s,咱們首先獲取其的首字符 c,以後再用戶輸入的字符串 p中,去尋找 c所在的位置,再從c所在的位置切取長度與 給定的字符串s 同樣的字符串,進行比較(C語言裏面加起來減的比較),若比較結果爲0,則認爲找到該串,返回成功的結果;反之,若是爲能在給定的區域找到給定的字符串,即搜索的位置已達末尾,以及分割出來的子串長度已經小於給定的字符串長度,則認爲失敗,返回失敗的結果。spa

結果

成功:true,找到類似的字符串code

失敗:false,未找到類似的字符串對象


 下面是一個標準C++的實現,C++版本爲11blog

 1 #include<string>
 2 #include <iostream>
 3 
 4 int main()
 5 {
 6     int findlength = 0; //尋找的長度
 7     bool isOK = false; //找到了就是true
 8     std::string passwd = "218519"; //原始密碼
 9     std::string userinputpasswd;
10     std::cout << "請輸入密碼:";
11     std::cin >> userinputpasswd;
12     while (findlength < userinputpasswd.size())
13     {
14         if (findlength != 0)//非首次搜索跳過已搜索的位置,不然會陷入死循環。
15         {
16             findlength++;
17         }
18         findlength = userinputpasswd.find(passwd.front(), findlength);//從頭開始找到第一個元素和密碼匹配的位置
19         if (findlength != std::string::npos)//找不到就要break了。
20         {
21             std::string substr = userinputpasswd.substr(findlength, passwd.size());
22             if (substr.size() < passwd.size())
23             {
24                 break;
25             }
26             int comp =substr.compare(passwd);
27             if (comp == 0)
28             {
29                 isOK = true;
30                 break;
31             }
32         }
33         else {
34             break;
35         }
36     }
37     std::cout << (isOK ? "密碼正確" : "密碼錯誤")<<std::endl;
38     return 0;
39 }

運行結果:

給定的字符串:218519

測試字符串:218519

結果正確。

輸入字符串:6262626564542621851965656

輸入的字符串含有字串:」218519「,結果應爲正確。

輸出結果:密碼正確

結果正確

輸入的字符串:123456

輸出結果:密碼錯誤。

結果正確

輸入密碼:5161816+1856165185615316

輸出結果:密碼錯誤。

結果正確。

這就是一個簡單的實現,在個人Workstation(工做站)上面好像不須要一秒就能完成。可是咱們知道虛位密碼功能是用於嵌入式設備上面的,嵌入式設備一般是很是的week。因此還要在Arduino Uno上驗證。(ATMEGA328P 已經很week了);


Arduino uno是一塊基於Atemel 愛特梅爾(現已被Microchip 微芯 收購)Atmega 328p的8位嵌入式開發板,因爲其支持C++的特性已經簡單易用受到全世界範圍內嵌入式愛好者(包括藝術家)的喜好。

atmega328p在Arduino Uno上運行於16MHz的主頻狀態,正常應該運行在20Mhz的狀態。這是爲了兼容前代設備。

Arduino代碼:

 1 int findlength = 0;//尋找的位置
 2 String passwd = "218519";
 3 bool isOK = false;
 4 // The setup() function runs once each time the micro-controller starts
 5 void setup()
 6 {
 7     Serial.begin(9600);
 8     Serial.println("Please enter you passwd:");
 9 }
10 
11 // Add the main program code into the continuous loop() function
12 void loop()
13 {
14     findlength = 0;
15     isOK = false;
16     if (Serial.available())
17     {
18         String pass = Serial.readString();
19         Serial.println(pass);
20         Serial.flush();
21         while (findlength < pass.length())
22         {
23             if (findlength != 0)
24             {
25                 findlength++;
26             }
27             findlength = pass.indexOf(passwd.charAt(0), findlength);
28             if (findlength == -1)
29             {
30                 break;
31             }
32             else {
33                 String substr = pass.substring(findlength, findlength + passwd.length());
34                 int comp = passwd.compareTo(substr);
35                 if (comp == 0)
36                 {
37                     isOK = true;
38                     break;
39                 }
40             }
41         }
42         Serial.println(isOK ? "OK" : "NO");
43         Serial.println("Please enter you passwd:");
44     }
45     
46     delay(500);
47 }

這是標準的Arduino代碼能夠適用於任何兼容Arduino的設備(好比ESP8266),這裏在Arduino Uno上驗證是由於他足夠表明嵌入式設備的實力。(單片機實力不好是公認的事實)

運行結果:

與上面相似於,因爲嵌入式代碼是一種沒有終止的,只要給電就一直跑的代碼,因此能夠看簡單這些代碼一直在循環(如今的計算機也是這樣)。

輸入給定的元素都很快。並且速度均在一秒內給出。因此證實虛位密碼功能在上面仍是很簡單就能實現的。

相關文章
相關標籤/搜索