完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、本章需要基础知识
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端收到发送的信息,效果如下: |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9049 浏览 16 评论
4083 浏览 18 评论
1167浏览 3评论
601浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
592浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2329浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1892浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 16:10 , Processed in 1.554172 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号