| 
 
中级会员  
 
	积分217金钱217 注册时间2017-3-24在线时间20 小时 | 
 
 
 楼主|
发表于 2022-6-4 11:16:44
|
显示全部楼层 
| 本帖最后由 abcrazy 于 2022-6-5 11:22 编辑 
 第二部分:微雪 ESP8266 / ESP32 开发板 WIFI 数据传送分析
 对应的微雪源码在 1 楼附件 墨水屏资料.zip
 微雪可以适配多个版本型号的墨水屏 ESP32 开发板精髓:在网页中处理图片,再把处理后的数据发送到墨水屏。
 优点是 MCU 的内存可以很小,小到无法装下一帧内容,只负责接收一小部分数据,然后马上发送到墨水屏中。把需要消耗大量内存解码 png 、 mpeg、 bmp 图片的任务交给电脑浏览器或手机浏览器。
 
   
 以下是第一段接受到的数据内容:
 
 一、确定墨水屏型号:复制代码POST /EPDo_ HTTP/1.1
Host: 192.168.11.80
Connection: keep-alive
Content-Length: 0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Accept: */*
Origin: null
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
POST /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiodaLOAD_ HTTP/1.1
Host: 192.168.11.80
Connection: keep-alive
Content-Length: 0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Accept: */*
Origin: null
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
分析第1行:POST /EPDo_ HTTP/1.1
 1.EPD:墨水屏的特征码
 2.o:墨水屏的型号
 参考文件:E-Paper_ESP32_Driver_Board_Code\Loader_esp32wf\epd.h
 
 注意看后面注释,o 字母对应的是 "4.2 inch b" 型号墨水屏。复制代码/* The set of pointers on 'init', 'load' and 'show' functions, title and code */
struct EPD_dispInfo
{
    int(*init)(); // Initialization
    void(*chBk)();// Black channel loading
    int next;     // Change channel code
    void(*chRd)();// Red channel loading
    void(*show)();// Show and sleep
    char*title;   // Title of an e-Paper
};
/* Array of sets describing the usage of e-Papers ----------------------------*/
EPD_dispInfo EPD_dispMass[] =
{
    { EPD_Init_1in54,                EPD_loadA,                -1  ,        0,                                EPD_1IN54_Show,                        "1.54 inch"                },// a 0
    { EPD_Init_1in54b,                EPD_loadB,                0x13,        EPD_loadA,                EPD_showB,                        "1.54 inch b"        },// b 1
    { EPD_Init_1in54c,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "1.54 inch c"        },// c 2
    { EPD_Init_2in13,                EPD_loadC,                -1  ,        0,                                EPD_showA,                        "2.13 inch"                },// d 3
    { EPD_Init_2in13b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "2.13 inch b"        },// e 4
    { EPD_Init_2in13b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "2.13 inch c"        },// f 5
    { EPD_Init_2in13d,                EPD_loadA,                -1  ,        0,                                EPD_showD,                        "2.13 inch d"        },// g 6
    { EPD_Init_2in7,                EPD_loadA,                 1  ,        0,                                EPD_showB,                        "2.7 inch"                },// h 7
    { EPD_Init_2in7b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "2.7 inch b"        },// i 8
    { EPD_Init_2in9,                EPD_loadA,                -1  ,        0,                                EPD_showA,                        "2.9 inch"                },// j 9
    { EPD_Init_2in9b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "2.9 inch b"        },// k 10
    { EPD_Init_2in9b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "2.9 inch c"        },// l 11
    { EPD_Init_2in9d,                EPD_loadA,                -1  ,        0,                                EPD_2IN9D_Show,                "2.9 inch d"        },// M 12
    { EPD_Init_4in2,                EPD_loadA,                -1  ,        0,                                EPD_showB,                        "4.2 inch"                },// N 13
    { EPD_Init_4in2b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "4.2 inch b"        },// O 14
    { EPD_Init_4in2b,                EPD_loadA,                0x13,        EPD_loadA,                EPD_showB,                        "4.2 inch c"        },// P 15
    { EPD_5in83__init,                EPD_loadD,                -1  ,        0,                                EPD_showC,                        "5.83 inch"                },// Q 16
    { EPD_5in83b__init,                EPD_loadE,                -1  ,        0,                                EPD_showC,                        "5.83 inch b"        },// R 17
    { EPD_5in83b__init,                EPD_loadE,                -1  ,        0,                                EPD_showC,                        "5.83 inch c"        },// S 18
    { EPD_7in5__init,                EPD_loadD,                -1  ,        0,                                EPD_showC,                        "7.5 inch"                },// T 19    
    { EPD_7in5__init,                EPD_loadE,                -1  ,        0,                                EPD_showC,                        "7.5 inch b"        },// u 20
    { EPD_7in5__init,                EPD_loadE,                -1  ,        0,                                EPD_showC,                        "7.5 inch c"        },// v 21
    { EPD_7in5_V2_init,                EPD_loadAFilp,        -1  ,        0,                                EPD_7IN5_V2_Show,        "7.5 inch V2"        },// w 22
    { EPD_7in5B_V2_Init,        EPD_loadA,                0x13,        EPD_loadAFilp,        EPD_7IN5_V2_Show,        "7.5 inch B V2"        },// x 23
    { EPD_7IN5B_HD_init,        EPD_loadA,                0x26,        EPD_loadAFilp,        EPD_7IN5B_HD_Show,        "7.5 inch B HD"        },// y 24
        { EPD_5IN65F_init,                EPD_loadG,                -1  ,        0,                                EPD_5IN65F_Show,        "5.65 inch F "        },// z 25
        { EPD_7IN5_HD_init,                EPD_loadA,                -1        ,        0,                                EPD_7IN5_HD_Show,        "7.5 inch HD"        },// A 26
        { EPD_3IN7_1Gray_Init,        EPD_loadA,                -1        ,        0,                                EPD_3IN7_1Gray_Show,"3.7 inch"                },// 27
        { EPD_2IN66_Init,                EPD_loadA,                -1        ,        0,                                EPD_2IN66_Show,                "2.66 inch"                },// 28
        { EPD_5in83b_V2_init,        EPD_loadA,                0x13,        EPD_loadAFilp,        EPD_showC,                        "5.83 inch B V2"},// 29
        { EPD_Init_2in9b_V3,        EPD_loadA,                0x13,        EPD_loadA,                EPD_showC,                        "2.9 inch B V3"        },// 30
        { EPD_1IN54B_V2_Init,        EPD_loadA,                0x26,        EPD_loadAFilp,        EPD_1IN54B_V2_Show,        "1.54 inch B V2"},// 31
        { EPD_2IN13B_V3_Init,        EPD_loadA,                0x13,        EPD_loadA,                EPD_2IN13B_V3_Show,        "2.13 inch B V3"},// 32
        { EPD_Init_2in9_V2,         EPD_loadA,                -1,                0,                                EPD_2IN9_V2_Show,        "2.9 inch V2"        },// 33
        { EPD_Init_4in2b_V2,        EPD_loadA,                0x13,        EPD_loadA,                EPD_4IN2B_V2_Show,        "4.2 inch b V2"        },// 34
        { EPD_2IN66B_Init,                EPD_loadA,                0x26,        EPD_loadAFilp,        EPD_2IN66_Show,                "2.66 inch b"        },// 35
        { EPD_Init_5in83_V2,        EPD_loadAFilp,        -1,                0,                                EPD_showC,                        "5.83 inch V2"        },// 36
        { EPD_4IN01F_init,                EPD_loadG,                -1,                0,                                EPD_4IN01F_Show,        "4.01 inch f"        },// 37
        { EPD_Init_2in7b_V2,        EPD_loadA,                0x26,        EPD_loadAFilp,        EPD_Show_2in7b_V2,        "2.7 inch B V2"        },// 38
        { EPD_Init_2in13_V3,        EPD_loadC,                -1,         0,                                 EPD_2IN13_V3_Show,         "2.13 inch V3"        },// 39
        { EPD_2IN13B_V4_Init,        EPD_loadA,                0x26,        EPD_loadA,                EPD_2IN13B_V4_Show, "2.13 inch B V4"},// 40
};
里面的参数分别对应:初始化屏幕函数指针、发送黑白色到屏幕的函数指针、切换红白色命令码、发送红白色到屏幕的函数指针、显示内容的函数指针、字符串说明。
 
 
 二、接收数据--传送数据大小
 iodaLOAD
 当识别到“LOAD”字母时,那么前面四个字节,就是本次传送数据的大小。
 特别注意:微雪的十六进制数跟网络传送字符转换:以“a”或“A”为偏移数,两个字节的 hex 组成实际对应一个字节数。
 如:ioda 转为 ascii 码后分别减去 'a' 得到的 hex 为:'i'-'a'=105-97=8,'o'-'a'=111-97=14='e','d'-'a'=100-97=3,'a'-'a'=97-97=0
 最后为:8e 30
 我们可以数一下 POST 后面,正好有 1000 个 'a',转为 16 进制为 0x03e8
 那么可以看出,微雪的十六进制规则是:第一字节减去 'a' 后得到的数是实际数一个字节低四位,第二字节减去 'a' 后得到的数是实际数一个字节高四位。小端,低地址在前,高地址在后。
 
 三、接收数据--传送数据内容
 以三色条示例,400x300 分辨率,黑白红各占 400x100 个像素点,黑色和红色实际都为 bit 0,白色为 bit 1,只是黑白和红白分别记录在两个不同的内存中。
 把微雪的网页文件,放在 C:/http/ 内,安装 python 3 以上的版本,建立一个简单的服务器,输入命令行:
 python -m http.server 80 --directory c:/http/
 
 浏览器打开网页:127.0.0.1 可以得到微雪转换图片的网页,修改好网页内本机的 IP 、选择好墨水屏型号、选择图片、转换图片为想要的效果
 点击上载数据。
 
 看回命令行返回的数据,每种颜色正好发 10 次,每次 1000 字节:
 
  黑色是 400x100 = 40000 像素,而正常来说 1bit = 1 像素,那么黑色实际需要 40000/8 = 5000 字节。 而接收的数据有 1000x10= 10000 字节,这么算起来,两个字节对应实际的一个字节。
 这里又是以 'a' 为基础的 hex 数据流,变为正常的 hex,那么有 10000 个 0,对应实际 5000 个字节的 0x00,代表黑白屏的全屏 1/3 黑色。
 10次 1000 字节  'a' 后,接着是 20 次 1000 字节的 'p',转为 hex 是 20000 个 'f',对应实际 10000 个字节的 0xff,代表黑白屏的全屏 2/3 白色。
 
 
   发送完黑白屏数据后,接着发红白屏数据。
 检查到有 'NEXT'  标志后,就应该发送转屏码到墨水屏了,黑白屏命令码为 0x10,转为红白屏命令码为 0x13。
 转为红白屏后,对应的写入墨水屏的对应函数也许会一样,也许会不同,具体看屏型号了。
 再看看发送的数据,首先是 20 次 1000 字节的 'p',再接着 10 次 1000 字节的 'a'。
 跟前面差不多,红白屏前 2/3 数据是 0xFF 代表白色,后 1/3 是 0x00 代表红色。
 
 
   最后,检测到 ’SHOW' 则显示数据。
 
  微雪的js网页图片转换.zip
(7.1 KB, 下载次数: 5) | 
 |