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