单片机学习小组
直播中

而无返还

8年用户 1203经验值
擅长:光电显示
私信 关注

socket通信该怎样去实现呢

socket通信该怎样去实现呢?

怎样去实现socket AES-CBC加密呢?

回帖(1)

董薇

2022-1-20 10:57:17
一、本章需要基础知识
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端收到发送的信息,效果如下:
举报

更多回帖

发帖
×
20
完善资料,
赚取积分