You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:05:23