当前位置:   article > 正文

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

esp32 micropython 加密

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"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

三、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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

运行后效果如下:
在这里插入图片描述
在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加密数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/704586
推荐阅读
相关标签
  

闽ICP备14008679号