最近做项目,采用公司自研WIFI芯片配置为网络接入点(access point,AP),用户进入指定网页,通过POST接口,传输指令,具体过程ESP32肯定比我讲的更详细,就不再多言了。主要难点在OTA(over the air)文件传输部分,需要读取文件,并采用TCP/IP通信机制,将文件传输给作为http server的WIFI芯片。
HTTP 服务器 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com)
XMLHttpRequest.send() - Web API 接口参考 | MDN (mozilla.org)
OTA文件的传输我采用xmlhttprequest.send()与readAsArrayBuffer()方法结合,我没有采用formdata方法,是因为formdata发送时,会自动添加边界标识符(boundary),不利于http server还原OTA文件。http server接收时,原定是256字节读取一次,并对读到的数据组帧,再通过串口发给开发板上的另一块具有私有协议通信功能的芯片。但除最后一包数据外,均采用定长发送,即有效字节为256。但在实际通信过程中,发现私有协议芯片存在校验失败的现象,OTA更新自然也就受到了影响。通过不断的调试,最终发现TCP/IP传输过程与设想的不一致。发现http server读取socket缓冲区数据时,长度可能小于256字节。WIFI芯片直接将小于256字节的数据发出,私有协议芯片仍按照256字节进行校验,导致校验失败,OTA文件传输过程直接终止。
实际的开发过程,需要首先确定取数据小于256字节时,OTA文件传输过程是否可以正常进行。作为无知小白的我,在这个过程甚至怀疑TCP/IP传输过程是否会丢包。通过实际测试,发现发现,可靠传输并不会丢包,只是会把数据放到下一包里发送,也不会因为这一包数据长度异常而停止传输(我之前OTA终止,是因为采用私有协议通信的芯片检测到传输的这一包数据存在问题)。为了证明不存在数据丢包现象,我将WIFI芯片收到的每包数据都打印出来,通过文本对比工具与正常传输的数据进行对比。下图仅仅是证明OTA文件传输不会因一包长度异常的数据而终止,WIFI芯片可以将接收到的数据进行重组,确定每包数据有效数据长度都是256字节。