思路:在设计的时候,考虑用tea算法实现加密过程,利用随机数的生成生成加密的字符串,加密的字符串发送给手机,手机解码之后发送,如果与单片机的数据一致,则可以通过,不一致,则以电机的转动来表示报警。
遇到的问题:loop循环在手机解密和发送的过程中会继续进行
解决办法:以电机的转动状态来表示循环的进行程度
代码如下:
#include <Servo.h>
Servo myservo;
String str;
boolean flag = true;
void setup() {
// put your setup code here, to run once:
myservo.attach(9);
Serial.begin(9600);
}
void loop() {
// v为要加解密的数据,两个32位无符号整数
uint32_t v[2] = { random(100),random(100) };
// k为加解密密钥,4个32位无符号整数,密钥长度为128位
uint32_t k[4] = { 1,2,3,4 };
int n = sizeof(v) / sizeof(uint32_t);
if(flag){
encrypt(v, k);
Serial.println(v[1]);
decrypt(v, k);
}
flag = false;
while(Serial.available())
{
//从软件串口读出一字节,写入硬件串口
flag = true;
str += (char)Serial.read();
delay(20);
}
if(str == v[1]){
myservo.write(90);
delay(500);
}else{
myservo.write(0);
delay(500);
}
str = "";
}
//加密函数
void encrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0, i;
uint32_t delta = 0x9e3779b9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i < 32; i++) {
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
}
v[0] = v0; v[1] = v1;
}
//解密函数
void decrypt(uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i;
uint32_t delta = 0x9e3779b9;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0; i<32; i++) {
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v[0] = v0; v[1] = v1;
}