嵌入式技术论坛
直播中

ss

8年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[问答]

怎样去解决利用webclient通过4G AT socket下载较大文件的问题

STM32F环境下,利用webclient 通过4G AT socket下载较大(几十上百k)文件问题!

测试结果如下:
1、webclient没问题,因为通过Lwip的socket下载是没问题的
2、WEBCLIENT_RESPONSE_BUFSZ=4096, 即4K分片下载,首先发现recvfrom函数总是能够“立即”返回4096,无论数据是否接收到
3、继续跟踪发现:是函数at_recvpkt_get总是能够不正常地“迅速”得到4096
4、截图:


图中,表明当调用webclient_read==>recvfrom==>at_recvpkt_get后,此时socket里只有258+1400字节数据,但我们却“成功”得到了4096,原因是 bfsz_totle=825110831, page_pos=16645903 导致的,想问下这是个什么问题
5、在函数at_recvpkt_get里for循环末尾无条件加入break语句,则文件成功下载完成。
总结:git clone 工程,menuconfig 配置好后,竟然不能功能,而且还是这么深入的一个问题,这太折磨人了吧!

回帖(3)

ss

2022-3-28 09:44:39
rlist 列表里的数据损坏了,可能是系统中其它地方的内存溢出,把列表数据污染了。
举报

ss

2022-3-28 09:45:40
rtt从设计上、框架上、各种模块支持性上都应该国内领先了,必须表扬下。但是,我感觉并不好用,更有莫名的不稳定,比如随便想一个:

1 文件写write SD卡,会有一个不大不打小的概率会失败,磁盘太重要了,这问题我往哪里找啊!

2 i2c 的读写动作,网上清一色的绕过rt_device_write,都是直接调用的i2c虚拟驱动层的函数,这么个重要且小的问题愣是不解决!搞的我自己扩展了内核,又在设备层之上做了个api读写接口,如下:

include "i2c_if.h"

int i2c_if_read( rt_device_t i2c_dev,

                uint16_t slave_addr,

                uint16_t addr,

                uint16_t addr_len,      // number of bytes, 1 or 2

                void *buf, int len)

{

int ret;

rt_off_t pos_flag, pos = slave_addr >> 1;

if (addr_len == 2) addr = (addr >> 8) | (addr << 8);

struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)i2c_dev->user_data;

RT_ASSERT(bus);

rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);

pos_flag = pos | (RT_I2C_NO_STOP << 16);

if ((ret=rt_device_write(i2c_dev, pos_flag, &addr, addr_len)) == addr_len) {

    pos_flag = pos | (RT_I2C_FORCE_RESTART << 16);

    ret = rt_device_read(i2c_dev, pos_flag, buf, len);

}

rt_mutex_release(&bus->lock);

return ret;

}

int i2c_if_write( rt_device_t i2c_dev,

                uint16_t slave_addr,

                uint16_t addr,

                uint16_t addr_len,      // number of bytes, 1 or 2

                const void *buf, int len)

{

int ret;

rt_off_t pos_flag, pos = slave_addr >> 1;

if (addr_len == 2) addr = (addr >> 8) | (addr << 8);

struct rt_i2c_bus_device *bus = (struct rt_i2c_bus_device *)i2c_dev->user_data;

RT_ASSERT(bus);

rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);

pos_flag = pos | (RT_I2C_NO_STOP << 16);

if ((ret=rt_device_write(i2c_dev, pos_flag, &addr, addr_len)) == addr_len) {

    pos_flag = pos | (RT_I2C_NO_START << 16);

    ret = rt_device_write(i2c_dev, pos_flag, buf, len);

}

rt_mutex_release(&bus->lock);

return ret;

}

基本的file I2c uart net socket io,一定要好用且稳定,必须是傻瓜式的。否则,带给用户的全是担心和不信任。
举报

ss

2022-3-28 09:46:12
基本的file I2c uart net socket io,一定要好用且稳定,必须是傻瓜式的。否则,带给用户的全是担心和不信任.

稳定好用, 需要时间。 需要大家贡献力量。

先阶段, 我都是把用到的代码自己过一遍。 然后下个项目就可以接着用了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分