开发环境:Ubuntu16.04
ESP32:Arduino
PC图传:Python3.6.9

首先上python代码

import socket
import cv2
import numpy as npimg = cv2.imread('./picture.jpg')  #读取图像
# 检测图片的象素大小
sp = img.shape
print(sp[0], sp[1], sp[2]) # sp[0] height sp[1] width
height = img.shape[0]
width = img.shape[1]
if (sp[0] != 128)&(sp[1] != 128):img = cv2.resize(img, (int(128), int(128)))  # 修改象素大小为128*128# cv2.imshow("pic", img)
print(img.shape)
image_arr = [0 for i in range(128*128)]
image_R = [0 for i in range(128*128)]
image_G = [0 for i in range(128*128)]
image_B = [0 for i in range(128*128)]
# print(img[0][0]) # 顺序是BGR ,img[y][x]
# 取模,RGB888 变为 RGB565  RGB都取高位
for i in range(128):for j in range(128):image_R[i * 128 + j] = img[i][j][2] >> 3image_G[i * 128 + j] = img[i][j][1] >> 2image_B[i * 128 + j] = img[i][j][0] >> 3
for i in range(128*128):image_arr[i] = (image_R[i] << 11) | (image_G[i] << 5) | (image_B[i])# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # AF_INET ipv4协议 SOCK_DGRAM  udp模式
host = socket.gethostname()  # 获取本地计算机名
ip = '192.168.2.109'
port = 9000  # 设置端口号
s.bind((ip, port))  # 绑定本地ip和端口
print("udp配置完成")
print("udp ip ", ip, " port", port)value = 1
for i in range(128*128):s.sendto(int(image_arr[i]).to_bytes(2, 'big'), ('192.168.2.105', 9000))print(int(image_arr[i]).to_bytes(2, 'big'))while True:data = s.recv(1024)if data == value.to_bytes(1,'big'):break
s.close()

该Python代码的主要功能就是把图片改为128*128大小的565象素格式的图片,能进行UDP通讯,本人是Python小白,有些地方我感觉可以在改进的,尤其是通过udp,每一次只能传送两个字节。下面的代码由于PC发送的太快导致ESP32接收不过来,所以我采用应答的方式保证每个象素点的值能被ESP32接收。如果能改善的话,我感觉可以实现视频传输了。
注:
在888象素格式转化565格式的时候,一定要注意,是用RGB高5位和高6位
在python opencv中读出的图像数组顺序是BGR!!

下面是esp32代码

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <WiFi.h>
#include <WiFiUdp.h>#define TFT_CS     5
#define TFT_RST    16
#define TFT_DC     17
#define TFT_SCLK  18
#define TFT_MOSI  23
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
float p = 3.1415926;// WiFi network name and password:
const char * networkName = "xxxxx";
const char * networkPswd = "xxxxx";const char * udpAddress = "192.168.2.109";
const int udpPort = 9000;//Are we currently connected?
boolean connected = false;//The udp library class
WiFiUDP udp;uint8_t frame[128];
uint8_t udp_frame[32768];
uint16_t image_frame[16384];
int framesize = 0;
int size = 0;
uint8_t response[2] = {1,2};void draw_picture(uint16_t* buff)
{int i =0;int j = 0;for(i=0;i<128;i++)for(j=0;j<128;j++)tft.drawPixel(j,i,buff[j+128*i]);
}void connectToWiFi(const char * ssid, const char * pwd){Serial.println("Connecting to WiFi network: " + String(ssid));// delete old configWiFi.disconnect(true);//register event handlerWiFi.onEvent(WiFiEvent);//Initiate connectionWiFi.begin(ssid, pwd);Serial.println("Waiting for WIFI connection...");
}//wifi event handler
void WiFiEvent(WiFiEvent_t event){switch(event) {case SYSTEM_EVENT_STA_GOT_IP://When connected setSerial.print("WiFi connected! IP address: ");Serial.println(WiFi.localIP());//initializes the UDP state//This initializes the transfer bufferudp.begin(WiFi.localIP(),udpPort);connected = true;break;case SYSTEM_EVENT_STA_DISCONNECTED:Serial.println("WiFi lost connection");connected = false;break;default: break;}
}void setup(){Serial.begin(115200);tft.initR(INITR_144GREENTAB);   // initialize a ST7735S chip, black tab//Connect to the WiFi networkconnectToWiFi(networkName, networkPswd);
}void loop(){int i = 0;if(connected){int num = udp.parsePacket();if(udp.read(frame,128)){for(i=0;i<num;i++){udp_frame[i+framesize] = frame[i];}framesize += 2;udp.beginPacket(udpAddress,udpPort);udp.write(response,1);udp.endPacket();}else if(framesize == 32768){for(i=0;i<32768;i++){image_frame[size] = (udp_frame[i]<<8) | (udp_frame[i+1]);Serial.println(image_frame[size]);size++;i++;}draw_picture(image_frame);framesize = 0;size = 0;}}
}

最后展示一下结果:

使用的话代码直接用,把任意一个大于128×128的图片放在Python工程,设置好端口和ip就可以实现了。

PC基于wifi采用UDP协议实现ESP32无线图传显示在1.44寸屏幕相关推荐

  1. 从入门到入土:基于C语言采用UDP协议实现远程控制|详细说明|利用流套接字实现一个简单的远程控制系统|代码展示

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  2. 从入门到入土:基于C语言采用UDP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. 基于C#的UDP协议的同步实现

    一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visual Studio 2010 三.实验原理 UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述. 四.实例  4.1 ...

  4. QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?

    登陆采用TCP协议和HTTP协议,你和好友之间发送消息,主要采用UDP协议,内网传文件采用了P2P技术. QQ对于普通用户是采用UDP协议,对于会员用TCP协议 总来的说: 1.登陆过程,客户端cli ...

  5. 采用UDP协议实现PIC18F97J60 ethernet bootloader

    采用UDP协议实现PIC18F97J60 ethernet bootloader 了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloade ...

  6. ESP32 直接使用WIFI进行UDP通信, 将光敏电阻传感器数值, 显示在OLED上 - 米思齐/Arduino

    ESP32 使用WIFI UDP协议通信 ESP32主: 读取光敏传感器数值, 并通过UDP发送 ESP32从: 读取主机发送的数值, 并显示在OLED显示屏上 实际效果 左边为ESP32, 连接OL ...

  7. QQ为何采用UDP协议?

    https://blog.csdn.net/liusandian/article/details/52238939 登陆采用TCP协议和HTTP协议, 你和好友之间发送消息,主要采用UDP协议, 内网 ...

  8. 从入门到入土:基于Python采用TCP协议实现通信功能的程序

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. 为什么聊天软件一般采用UDP协议

    TCP是美国国防部设计的两种传输协议之一,另一种是UDP.UDP是一种不可靠的网络服务,负载比 较小,而TCP则是一种可靠的通信服务,负载相对而言比较大.TCP采用套接字(socket)或者端口 (p ...

最新文章

  1. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统
  2. Spring Cloud Alibaba 生产实践:Sentinel 进阶应用场景
  3. ubuntu下修改文件权限
  4. 知乎快捷取消我关注的问题chrome插件
  5. cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” 和 cl: 命令行 error D8021 :无效的数值参数“/Wno-unused-function”
  6. C++ 11 深度学习(四)结构、权限修饰符
  7. qq ip探测仪 php,巧用Win7资源监视器,查看QQ好友IP
  8. DSP5509的GPIO学习-第5篇
  9. 数字人民币这一年,互联网企业做了什么?
  10. 【博客项目】—登录验证功能实现( 五)
  11. php图片遍历,php – 如何遍历图像的所有像素?
  12. h5 监听浏览器被切换到后台或者手机锁屏再次唤起事件
  13. ARM汇编指令调试方法
  14. SpringMVC文件上传(二)指定文件
  15. 网络安全设备Bypass功能
  16. Android开发之日期、时间选择器(DatePicker和TimePicker)的功能和用法
  17. PPT模板、电子书、论文、壁纸、视频、各类数据...走出信息茧房——资源网站全推荐
  18. 可视化展示炫酷3D图表
  19. c语言设计由数组,C语言程序设计_07数组.ppt
  20. 概率统计Python计算:离散型随机变量分布(bernoulli geom)

热门文章

  1. zabbix agent安装步骤
  2. 如何和用户一起写汇报材料
  3. 【Nodejs】外研社一年级起各年级英语音频下载(缺456年级上)
  4. 李开复博士在MVP颁奖大会演讲:中国的IT行业发展
  5. 最常见的六种跨域解决方案
  6. Python爬虫-教抓取动漫妹子图
  7. 如何发现自己的兴趣?
  8. 百度究竟是哪国的公司
  9. Java容器来一发 --- 目录
  10. mc服务器状态查询php,GitHub - GamerNoTitle/Minecraft-Server-Status: 一个用于显示服务器在线信息及其他内容的网站...