ESP32 MicroPython Sokcet 通信与AES-CBC加密通信

本文介绍如何使用ESP32与MicroPython实现socket通信,并通过AES-CBC加密方式保障数据安全。涵盖客户端和服务端的实现代码,及esp32向电脑安全发送温湿度数据的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MicroPython ESP32 开发
1.ESP32刷入MicroPython以及连接WiFi
2.ESP32 GPIO
3.ESP32 GPIO 的高低电平与PWM
4.ESP32 控制继电器与读取DHT22温湿度数据
5.sokcet 通信与AES-CBC加密通信 (本文)

更新中……



前言

esp32 通过socket 与电脑通信


提示:以下是本篇文章正文内容,下面案例可供参考

一、本章需要基础知识

  • 1.socket原理(将会在学习完成后,复盘时完成此部分)
  • 2.python基础

二、socket通信

1.客户端

代码如下(示例):

import socket 
import _thread 
import json
import array
# socket的连接实例化  AF_INET = IPV4  SOCK_STREAM = TCP
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#服务端ipv4地址
sock_tcp.connect(("192.168.0.5",60000))
#向服务端发送json打包后的字典数据
# 字典内容 = {
#     "type":"exec":
#     "cmd":"g5.value(1)"
# }
execDictDump = json.dumps({"type":"exec","cmd":"g5.value(1)"})
sock_tcp.sendall(bytes(execDictDump, "utf-8"))

2.服务端

代码如下(示例):

import socket 
import _thread
import json
import array

def tcplink(conn, addr):
    global g5
    print("addr:",addr)
    print("conn",conn)
    while 1:
    	# MTU最大为1024byte
        data = conn.recv(1024)
        # 防止对面掉线,连接无法正常关闭
        if not data:
            break
        recvDict = json.loads(data)
        #判断字典内容为执行命令后执行cmd的内容
        if recvDict["type"] == "exec":
            exec(recvDict["cmd"])
        print(g5.value())
    conn.close()
# socket实例化
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 允许所有设备连接
sock_tcp.bind(("0.0.0.0", 60000))
# 最大连接数
sock_tcp.listen(100)
while 1:
    print("Start Listening")
    # 如果设备连接过来之后,将连接的实例复制给conn 将ip与端口赋值给addr
    conn, addr = sock_tcp.accept()
    # 启动新线程连接,如果不用新线程将会一直停留在阻塞状态
    _thread.start_new_thread(tcplink, (conn,addr))

三、socket AES-CBC加密

以下仅展示esp32向window发送温度数据
windows下的python代码:

import socket
import _thread
import json
import array
from Crypto import AES
import os
import binascii
import hashlib
def tcplink(conn, addr):
    print("addr:", addr)
    print("conn", conn)
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        keystr = "lihz"
        key = hashlib.sha256(keystr.encode("utf-8")).digest()[0:16]
        data = aes_decrypt(bytes(data), key)
        print(str(data, "utf-8"))
    conn.close()
def aes_decrypt(data: bytes, eKey: bytes):
    iv_ = data[0:16]
    aes = AES.new(eKey, 2, iv_)
    plain = aes.decrypt(data[16:]).rstrip()
    return plain
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_tcp.bind(("0.0.0.0", 60000))
sock_tcp.listen(5)
while 1:
    print("Start Listening...")
    conn, addr = sock_tcp.accept()
    _thread.start_new_thread(tcplink, (conn, addr))

运行后效果如下:
在这里插入图片描述
在micropython中运行如下代码:

from dht import DHT22
from machine import Pin
import socket
import _thread
import json
import array
import ucryptolib
import os
import ubinascii  # base64
import uhashlib

def aes_encrypt(data: bytes, eKey: bytes):
    padding_len = 16 - len(data) % 16
    data = data + b" "*padding_len
    iv_ = os.urandom(16)
    aes = ucryptolib.aes(eKey, 2, iv_)
    encrypt_data = aes.encrypt(data)
    final = iv_ + encrypt_data
    return final

key = uhashlib.sha256("lihz").digest()[0:16]
g5 = DHT22(Pin(5))
g5.measure()

sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_tcp.connect(("192.168.0.6", 60000)) #连接windows

send1='temp:'+str(g5.temperature())+'  humi:'+str(g5.humidity())
sends=aes_encrypt(bytes(send1, "utf-8"), key)
sock_tcp.sendall(sends) #发送sends加密数据

运行后Windows端收到发送的信息,效果如下:
在这里插入图片描述

总结

然后就可以通过WiFi在客户端发送消息给服务端了,可以从esp32向服务端发送各种传感器数据,还能在服务端发送控制命令来控制esp32

### 实现ESP32上的AES加密 对于希望在ESP32上实施AES加密的应用场景,可以利用MicroPython的强大功能来简化这一过程。通过安装特定的库文件并编写相应的脚本,能够有效地执行AES加密操作。 #### 安装必要的库和支持包 为了支持AES加密,在ESP32运行MicroPython环境中需先加载`ucryptolib`模块。此模块内含多种加密算法的支持,其中包括AES加密方式[^2]。 #### 编写AES加密代码实例 下面展示了一段简单的Python代码片段用于说明如何使用上述提到的功能来进行字符串形式的数据加密: ```python from ucryptolib import aes def encrypt_data(key, data): cipher = aes(key, 2) # 使用CBC模式初始化cipher对象 encrypted_bytes = b"" while True: chunk = data.read(16) if not chunk: break # 对不足块大小的部分进行填充处理 padding_length = 16 - (len(chunk) % 16) padded_chunk = chunk + bytes([padding_length]) * padding_length encrypted_bytes += cipher.encrypt(padded_chunk) return encrypted_bytes # 测试函数 key = b'your_very_secure_key' data_to_encrypt = open('plaintext.txt', 'rb') encrypted_result = encrypt_data(key, data_to_encrypt) print("Encrypted:", encrypted_result.hex()) ``` 这段程序定义了一个名为`encrypt_data()`的方法接收两个参数——密钥(`key`)和待加密的信息源(`data`)。这里采用的是CBC工作模式下的AES加密方法;同时注意到了输入流可能不是完整的区块长度的情况,因此加入了适当数量字节作为填充以满足AES的要求。 #### 配置注意事项 当实际部署时还需要考虑更多细节问题比如密钥管理策略、IV向量的选择等。另外值得注意的一点是在发送端完成加密之后应该妥善保存所使用的初始向量以便于接收方正确解码消息内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不想35岁失业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值