user_ourdev 发表于 2012-7-9 17:07:09

如何加快GPRS通信速率?

用GPRS模块发送数据,发送的速度115200bps很快,但每个数据包发送后需要等服务器回执,这个时间一般几秒,太长了。有什么好的办法吗?

网上查一般都是1KB一个包,如果这样发送1MB文件,按3秒一包,需要50分钟!为什么不把包做大些呢?是不是GPRS模块长时间发数据会使丢数据的几率变大呢?

自己打算在发送所有文件包后统一由服务器给一个回执,标出缺失的文件包。例如先发送1000个包,然后服务器回执或者查询服务器知道缺失几号包,之后再重发,是否可行?

jathenal 发表于 2012-7-10 13:57:37

"每个数据包发送后需要等服务器回执"是应用层的回执否,如果应用层完全自主设计,应该好办,充分利用GPRS信道的并发性,像文件传输这类数据相关性较弱的应用,完全可以将数据拆成很多子块,全双工多线程方式并行传输,比单线程每个数据包一应一答效率要高很多。

Appcat 发表于 2012-7-10 14:06:49

采用内部有多个发送缓冲区的模块,可以进行并行发送,速度就快多了。因为网络本身是并发的,要充分利用带宽。
为什么包不能做大,这里涉及到网络层以下协议管理开销以及风险代价的问题,所以你现在能接触到的网络类型,都是很小的数据包,不会出现大数据包的。
一般网络上最大TCP封包也就1K多一点点,所以GPRS模块设为1K没有什么不合适。

eliachen 发表于 2012-7-10 18:00:36

你用内部的协议栈,就是这个速度,大概2~3k,如果你用外部的协议栈,大概模式就是拨号上网(把gprs模块当做一个modem),速度上能快点,如果你玩linux,还可以自己改协议,如果是嵌入式设备还可以用lwip,自己可以控制tcp的窗口数,来优化协议!

wozaijintian 发表于 2012-7-12 17:30:59

有可以每次发10K的GPRS模块,可以试试!

gaoshou5432 发表于 2012-7-12 21:58:56

哈哈.用EDGE的模块上EDGE的网快些.{:smile:}

user_ourdev 发表于 2012-7-13 09:03:35

Appcat 发表于 2012-7-10 14:06 static/image/common/back.gif
采用内部有多个发送缓冲区的模块,可以进行并行发送,速度就快多了。因为网络本身是并发的,要充分利用带宽 ...

谢谢大神苹果猫!我是自己用ARM做的DTU,裸奔,我理解你的意思是不是,例如我可以开10个1K的缓冲空间,不用等待当前1K缓存数据发送出去后的服务器回复,就可以发送下一个1K缓存,可能是我在发第10个1K缓存的时候才收到第1个1K缓存从服务器上发来的回复?这样跟之前的发1条等1条的方式比,就将速率调高了10倍,对吗?

user_ourdev 发表于 2012-7-13 09:28:03

jathenal 发表于 2012-7-10 13:57 static/image/common/back.gif
"每个数据包发送后需要等服务器回执"是应用层的回执否,如果应用层完全自主设计,应该好办,充分利用GPRS信 ...

我是裸奔,并行操作是不是可以理解为一次性发送多条信息后,再等待多条信息对应的服务器回复?

Appcat 发表于 2012-7-13 09:40:25

你的理解是对的
但是这里开多少个缓冲区并行,不是你说了算,而是看你手里的模块是不是可以支持。能支持的模块,内部有多个发送缓冲区,每条发送指令占用一个,这些缓冲区是可以并行的,不必等待每条发送都成功。

leehuabo 发表于 2012-7-13 09:47:35

这依赖于你使用的GPRS模块的buffer大小,比如华为的GTM900C,内置有16个包缓冲,之前也是发一个包,等回应通常需要1~3秒,状况不好的时候可能需要几十秒,很慢,实际上你可以一次发16个包给模块,你发的过程可能前面包的回应已经过来了;这种方式速度提高10倍多,当然这依赖于模块的buffer大小,当然越大越好了。。。。

你自己MCU的内存也得够大,发送的buffer应该同模块的buffer一样,不过也要看应用需求了,这种方式是让模块带宽利用趋于极致,这样当你发现应该超时的时候,可以再次重发;TCP包是基于流的,因此超时后,应答少了几个就重发后面那几包数据就可以了,实际上我自己处理时偷了下懒,是如果应答超时,那16个包是全部重发的,处理上并不会有多大的简化,只是感觉上更保险了,但服务器那也要做检查重复数据的处理;

dadongleilei 发表于 2012-7-13 10:13:44

一次发送1M大小的文件 可以考虑用3G模块了,或者干脆采用带ftp协议的模块

user_ourdev 发表于 2012-7-13 11:52:46

Appcat 发表于 2012-7-13 09:40 static/image/common/back.gif
你的理解是对的
但是这里开多少个缓冲区并行,不是你说了算,而是看你手里的模块是不是可以支持。能支持的 ...

我现在用的是华为的MG323,查了资料,没看到里面BUFFER是多大。
是不是像MG323这样的模块,也和DTU的原理一样,有一个大的BUFFER,不能持续的向里面发数据?这样的话如果知道BUFFER是否满呢?
还是说每个通道有一个BUFFER,这样的话是不是就不能用透传模式了(因为要区别通道)?

user_ourdev 发表于 2012-7-13 11:58:04

leehuabo 发表于 2012-7-13 09:47 static/image/common/back.gif
这依赖于你使用的GPRS模块的buffer大小,比如华为的GTM900C,内置有16个包缓冲,之前也是发一个包,等回应 ...

现在我打算像你那样做。我用的是华为MG323,目前查不到它内部buffer的资料。像你说的GTM900C有16个包缓冲,那一个包最大到多少字节也是有限制的吧?

Appcat 发表于 2012-7-13 12:03:32

GTM900C内部是16个缓冲区,每个1024字节
MG323内部是9个缓冲区,每个1024字节

使用缓冲区在GTM900C上没有任何问题,MG323上采用和GTM900C兼容的指令集也没有问题。但是如果采用和西门子兼容的指令集,目前不太清楚对缓冲区是如何操作的。

GTM900C每次AT%IPSEND后会出现%IPSEND 1,15这样的回复,其中15就表示他还有15个空闲缓冲区,AT%IPSEND?就可以查询目前模块还有多少个空闲缓冲区可以使用,当发送完成,缓冲区自动被释放。在MG323上上述指令也一样可以工作。

user_ourdev 发表于 2012-7-13 17:06:34

Appcat 发表于 2012-7-13 12:03 static/image/common/back.gif
GTM900C内部是16个缓冲区,每个1024字节
MG323内部是9个缓冲区,每个1024字节



MG323的透传模式能这么做吗(它不会返回哪个buffer是空的)
另外我查了很多地方,也查不到关于MG323buffer的资料,请问是从哪里知道的是9K?
十分感谢

Appcat 发表于 2012-7-13 17:23:12

为什么非得要用华为自己的透传呢,他那个透传做的像垃圾一样。什么复杂情况都处理不了。其实他的单独发送指令很不错的,自己做控制了,当然是要搞的细一些,完备一些,不能光图省事了。
至于那个9K的缓冲区,华为没有公开MG323的一部分指令,所以你自然不清楚了。尝试着用GTM900C的指令去操作一个MG323你就明白了。

leehuabo 发表于 2012-7-13 19:33:45

资源够的话,最好还是整个TCPIP再加PPP拨号;
AT指令操作TCPIP数据看起来方便,其实麻烦多多,我花了大把的时间除错,几乎穷尽所有能遇到的错误,手册上很多细节都没有说明;

被动接收的数据,以及主动发送的AT指令的返回串,都是从同一个串口接收,很难分开,要做互斥处理,发送命令前要检查是否在接收数据,
还有正在发送数据时也不知道是否会出现接收数据的情况,加上掉线检测处理,麻烦多多,搞不懂为什么都要使用字符串。。。。

Appcat 发表于 2012-7-13 20:01:35

leehuabo 发表于 2012-7-13 19:33 static/image/common/back.gif
资源够的话,最好还是整个TCPIP再加PPP拨号;
AT指令操作TCPIP数据看起来方便,其实麻烦多多,我花了大把的 ...

看来这也是自己走过来的人啊。{:handshake:}
当初这个东西是在一颗8位单片机上实现了,根本无法去奢望跑自己的协议栈。现在经历几年的升级,优化,移植,回头再看看,真有“古今多少事,都付笑谈中”的感觉

leehuabo 发表于 2012-7-14 14:59:54

是啊,当时就是图省事啊,感觉扩展的TCPIP的AT指令用起来挺简单的,以为一个月连写带测肯定够了,后来第三个月还在找错……

leehuabo 发表于 2012-7-14 15:05:40

其实那个AT指令就是给人工操作方便的,程序操作太不方便了,一点也不严谨;到最后发现,没省时间反倒是费了大把时间,
唯一就作用就是证明了这条路不是正道。
页: [1]
查看完整版本: 如何加快GPRS通信速率?