Arduino Uno烟雾检测系统AES加密集成及蓝牙/Web连接咨询
烟雾检测系统加密与设备连接方案
一、传感器数值加密代码与集成
你的Receiver代码使用128位AES加密,且密钥全为0(set_bits(bits, key, 0)),发送端(烟雾检测设备)必须保持完全一致的AES配置才能正常解密。以下是修改后的完整烟雾检测代码,集成加密与HC-05蓝牙发送功能:
#include <AES.h> #include <SoftwareSerial.h> // HC-05蓝牙模块软串口引脚(根据实际接线调整) SoftwareSerial btSerial(2, 3); // RX, TX #define VCC2 5 int smokeA0 = A0; int buzzer = 11; float sensorValue; AES aes; byte key[N_BLOCK]; // AES密钥,与Receiver保持一致 byte plaintext[N_BLOCK]; // AES-128固定16字节明文块 byte ciphertext[N_BLOCK]; // 加密后密文块 void setup() { pinMode(buzzer, OUTPUT); pinMode(smokeA0, INPUT); pinMode(VCC2, OUTPUT); digitalWrite(VCC2, HIGH); Serial.begin(9600); btSerial.begin(9600); // 初始化HC-05串口,波特率匹配Receiver Serial.println("Gas sensor warming up!"); delay(2000); noTone(buzzer); // 初始化AES密钥:与Receiver保持全0的128位密钥 int bits = 128; set_bits(bits, key, 0); byte succ = aes.set_key(key, bits); if (succ != SUCCESS) Serial.println("AES key setup failed"); } void loop() { sensorValue = analogRead(smokeA0); Serial.print("Sensor value: "); Serial.print(sensorValue); if(sensorValue > 300){ Serial.print(" | Smoke detected!"); tone(buzzer,1000,2000); } else { noTone(buzzer); } Serial.println(""); // 加密并发送传感器数值 encryptAndSendSensorValue(sensorValue); delay(2000); // 调整间隔与Receiver的delay匹配 } // 加密并发送传感器值的工具函数 void encryptAndSendSensorValue(float value) { // 将传感器数值转为字符串,填充到16字节明文块(不足补空格) String valueStr = String(value, 2); // 保留2位小数 memset(plaintext, ' ', sizeof(plaintext)); // 初始化块为空格 valueStr.getBytes(plaintext, min(valueStr.length(), sizeof(plaintext))); // AES加密 byte succ = aes.encrypt(plaintext, ciphertext); if (succ != SUCCESS) { Serial.println("Encryption failed"); return; } // 通过HC-05发送16字节密文 btSerial.write(ciphertext, sizeof(ciphertext)); Serial.println("Encrypted data sent"); } // 复用Receiver的set_bits函数,保证密钥生成逻辑一致 void set_bits(int bits, byte *a, int count) { bits >>= 3; byte bcount = count >> 3; for (byte i = 0; i < bcount; i++) a[i] = 0xFF; if ((count & 7) != 0) a[bcount++] = 0xFF & (0xFF00 >> (count & 7)); for (byte i = bcount; i < bits; i++) a[i] = 0x00; }
集成关键点:
- 新增
SoftwareSerial库实现HC-05串口通信,需根据实际接线调整引脚 - 复用Receiver的
set_bits函数,确保密钥和加密逻辑完全匹配 - 将传感器数值转为字符串后填充到16字节固定块(AES-128要求)
- 加密后直接发送16字节密文,Receiver端可直接用现有解密逻辑处理
二、是否需要Web服务器?
不需要。你的现有Receiver代码是通过HC-05蓝牙模块实现两台Arduino的短距离直连通信,蓝牙本身就是点对点无线协议,两台设备配对后即可直接传输数据,无需Web服务器或互联网介入。
仅当你需要实现远程跨互联网通信(比如设备超出蓝牙覆盖范围)时,才需要搭建Web服务器或MQTT broker作为数据中转。
三、如需远程连接的Web服务器代码(Node.js示例)
如果后续需要扩展远程功能,以下是一个简单的Node.js Web服务器示例,用WebSocket实现实时加密数据接收:
const express = require('express'); const WebSocket = require('ws'); const app = express(); const port = 3000; // 启动HTTP服务器 app.get('/', (req, res) => { res.send('Smoke Sensor Data Server'); }); const server = app.listen(port, () => { console.log(`Server running on http://localhost:${port}`); }); // 启动WebSocket服务,处理设备连接 const wss = new WebSocket.Server({ server }); wss.on('connection', (ws) => { console.log('New device connected'); ws.on('message', (data) => { // 接收Arduino发送的16字节加密数据 console.log('Received encrypted data:', data.toString('hex')); // 可在此添加解密逻辑(与Arduino用相同密钥)或存储到数据库 }); ws.on('close', () => { console.log('Device disconnected'); }); });
配套Arduino端修改说明:
- 需给Uno外接WiFi模块(如ESP8266),通过AT指令或ESP8266库连接WiFi
- 将原蓝牙发送逻辑改为WebSocket发送加密后的传感器数据
- 保持AES加密逻辑与之前一致,服务器端用相同密钥解密
内容的提问来源于stack exchange,提问作者Giannie Joe
相关产品推荐
相关产品推荐

