AT设备Socket移植问题

发表在 AT2019-8-29 13:41 [复制链接] 21 291

在AT Device 里面有很多网路模块,里面已经做好了网卡设备和SAL的移植接口。但是关于这方面的介绍请问在哪可以找到呢?因为在实际应用中,我发现了AT DEVICE一些问题,已经找到了问题的根源,但是看不到SAL接口更深层次的调用关系,所以不知道该如何更改。
7 u  C9 F5 V" ?7 W! K, N比如:以下接口体,对应着SAL的网络连接接口,但是我找到不到调用的入口,不知道应该如何去追踪
' P9 a0 H0 ^3 L! _6 h. V0 c% A1 O( {6 j. g) \* D" x0 |
static const struct at_socket_ops sim76xx_socket_ops =! J& {0 u' l$ ~% Y. o: w* f% A: S7 n' G
{
( v: e: c/ a) F9 C8 V    sim76xx_socket_connect,8 ~; W! g) U, k5 t4 ?  b3 F
    sim76xx_socket_close,8 I+ V. K2 i* ~9 d& S. S5 ~
    sim76xx_socket_send,
6 Z: ^* _8 a' J" P1 d5 T; T    sim76xx_domain_resolve,
( \1 O. X; |0 K7 B" f7 P    sim76xx_socket_set_event_cb,9 j/ k2 i1 {% e: A6 R9 |) W$ x
};2 i4 K, O8 U8 k4 r" R* B4 E

6 F2 T) i, m3 |* c3 t# y
3 B) T: H2 |' J" `8 R
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-8-29 13:52:47 | 显示全部楼层
感觉这块后续集成到stduio中会更好,例如弄个gd32vf + wifi或2G模块的硬件,形成一个简单的参考设计
使用道具 举报 回复
发表于 2019-8-29 14:06:00 | 显示全部楼层
本帖最后由 bevis 于 2019-8-29 14:14 编辑
, f, Y. I% b' ^) q: C1 B& Z+ |- V/ `; E
以下是最新版AT DEVICE调试发现的问题,因为加入了网卡设备管理的特性,(SIM7600)第一次开机初始化完成后总会去执行CDNSGIP,然后创建UDP连接(此处占用0号链路),而且这个UDP连接的IP还是空的,i并且还CIPSEND了一些东西出去,完成后就关闭0号链路,这些操作看起来好像也没什么问题。问题1:% \3 S" R" e3 \& r
但是当用户再次创建TCP时,分配的链路不再是0号,尽管此时检查到链路全是空的,链路序列号依然会递增到1号链路。
/ z9 ^2 w% @2 V+ W! t问题2:
% _" E$ c# W* j  ^( X在问题1的基础上,因为第一次开机先CDNSGIP,再创建UDP连接。而此时用户在网卡驱动初始化完成后需要打开webclient, POS一个URL,并等待HTTP Read FIFO的过程中。及其容易与正在创建的UDP+发送某些东西 ,这个步骤冲突而导致用户的网络应用错乱。而最后定位在了第一次开机后总会调用这个 “sim76xx_domain_resolve”,才会触发UDP。
: z; ?& q4 Q0 P. x# h尝试过规避这个现象
1 e: P. x2 v* B) W' q, ~2 p1. 初始化完成后,加3秒延时,让sim76xx_domain_resolve跑完,再执行我用户网络应用。但是会出现链路一直递增的问题(问题1).
/ m% h' F' h$ A8 w/ E2. 把 “sim76xx_domain_resolve”函数里面实现屏蔽,相当于网卡设备执行了个空函数,也依然会触发UDP+发送一些东西上去,到头来程序触发的异常更诡异。. \/ j: z# X: u9 C: E' r! \8 ]4 v* q
! @! C7 N/ C4 J4 u/ o0 [, ]* f  D

异常2

异常2

异常1

异常1

这个正确是碰巧不与用户网络冲突的情况

这个正确是碰巧不与用户网络冲突的情况
222.png

链路自增问题

链路自增问题
使用道具 举报 回复
发表于 2019-8-29 14:23:18 | 显示全部楼层
不知道楼主是否是使用的 laster 版本的 at_deivce,最近 at_device 修复了 sim76xx 设备驱动存在的一些网络连接问题,包括 sim76xx 设备 socket 创建和关闭时存在的失败问题以及多线程处理问题。你先试着使用 laster 最新版本测试一下。& o* K5 D. b+ P0 E9 u

( @: y5 x. o5 w. N3 K" |7 X& B% z具体改动可参考如下 PR 内容 https://github.com/RT-Thread-pac ... 8647c06483aba9a22e20 R; i; j% U/ l* E! H" D& M

' q$ J+ d; {8 E8 U' G% u
使用道具 举报 回复
发表于 2019-8-29 14:34:59 | 显示全部楼层
bevis 发表于 2019-8-29 14:06! h7 f7 N) b- U5 X$ F' i4 b
以下是最新版AT DEVICE调试发现的问题,因为加入了网卡设备管理的特性,(SIM7600)第一次开机初始化完成后总 ...

1 p& D( I0 J& m  h我整理一下楼主的问题,  B+ D1 H' F2 k( _2 o; `7 ^# {

/ H) _8 t8 g5 \3 m6 q/ n: `! o第一个问题,就是每次开机都会创建一个 UDP 连接,并且发送数据后关闭,这个 UDP 连接的主要作用是同步网卡 INTERNET_UP 状态,每个能连接外网的设备都需要执行。
. p4 D2 U3 q/ a; ]# X
% u) N. q6 L8 \: b8 Z+ S; H. V第二个问题, UDP 关闭之后,很快再次建立一个 TCP 连接,这时候 socket 值从 1 开始创建,而不是从 0。这个问题,我最新在修复 sim76xx 驱动时有注意到,主要是因为 socket 0 关闭过程需要一定时间,这段时间里 socket 0 值还是被占用,如果立刻再创建 scoket ,就会从第二个 socket 开始创建。这个问题我应该在上述 PR 中已经修复。
! w7 i1 P8 h( k/ e5 i5 k/ a
3 d4 D; V; _7 v6 o2 s4 [第三个问题,关于 AT Socket 移植介绍,有时间最近会出一个《RT-Thread AT 设备移植指南》中会详细介绍 AT Device 软件包中实现原理和移植方式。
使用道具 举报 回复
发表于 2019-8-29 14:41:39 | 显示全部楼层
Cheney_Chen 发表于 2019-8-29 14:23
8 g; N; }' K, K% L不知道楼主是否是使用的 laster 版本的 at_deivce,最近 at_device 修复了 sim76xx 设备驱动存在的一些网络 ...

$ x0 l* K1 R, \. Q& H  I) H因为我一直在关注的AT DEVICE的更新状况,昨天我就已经更新最新了,所以我才觉得这次版本结构做的比之前好太多太多。今天测试才发现这些小问题。你说的上述PR中已经修复是指,最近还会发版吗?
使用道具 举报 回复
发表于 2019-8-29 14:45:52 | 显示全部楼层
Cheney_Chen 发表于 2019-8-29 14:346 ]8 h9 z  f' t. x# J5 T8 g* N
我整理一下楼主的问题,8 C+ d1 u' i4 V. d2 N, B1 M

& @  X) q: a0 t1 I9 @- k第一个问题,就是每次开机都会创建一个 UDP 连接,并且发送数据后关闭,这个 UDP ...

3 f8 S* S8 X9 ~8 P. ?! z我有个担心是,如果当用户socket因为网络原因,一直快速反复开启与关闭,链路号会不会一直递增下去,链路总数只有9个哟
使用道具 举报 回复
发表于 2019-8-29 14:48:16 | 显示全部楼层
本帖最后由 Cheney_Chen 于 2019-8-29 14:50 编辑
: m1 t, t5 q+ q
bevis 发表于 2019-8-29 14:41
& w% ^5 L' I* f& B/ D/ P因为我一直在关注的AT DEVICE的更新状况,昨天我就已经更新最新了,所以我才觉得这次版本结构做的比之前 ...

1 V$ t6 _, R, _9 S; k: X你指的现在的问题是什么,是 socket 值一直会增加吗?我从上面日志上没看出什么错误,能把现在错误定位截图给我看一下吗?4 a8 _# j' R& U/ B- l2 v2 K. P# y

, n% L/ d4 H6 _你试一下再创建再执行以下 webclient 例程,看分配的 socket 是从链路 3 开始吗,确定一下是否真有这个问题?  g: r# J2 N% U; `6 c2 Y5 f

& w, e, W/ ^& U9 _
使用道具 举报 回复
发表于 2019-8-29 15:58:05 | 显示全部楼层
Cheney_Chen 发表于 2019-8-29 14:483 C5 P% ?: J2 @# y9 {% P
你指的现在的问题是什么,是 socket 值一直会增加吗?我从上面日志上没看出什么错误,能把现在错误定位截 ...

- x1 K! T+ g$ o5 z2 I# G按照你说的方法我测了。! W% m9 L! b$ m8 \" ~7 w
初始化成功后,我必须延时3秒,让DNS+UDP先跑完,然后再跑我的网络应用,连接TCP,然后再断开,反复进行。我的TCP永远会占用在1号链路。 测试通过OK。
5 m" [' C3 t# P6 u( P, d3 \7 W有个小疑问,UDP既然用完就关,上述测试现象来看,0号链路却是一直被占用着。是驱动的特性吗??  ?0 S& Y5 ]$ s/ s! l" d& I
( p. c/ A! |) R1 O
以下是我给驱动改善的建议,我已经改好部分:, D! j! V% X! e$ ^# ^
1. 开机时序上对比上一个版本,不知道是不是多了网卡管理,AT执行的时间好像比开机时序调用的时间更快,每次reboot经常会误判已经开机了,然后发送AT,串口却没响应的报错。我改了一下后效果稍微好一点点,但是偶尔还是会发生。
1 w5 j6 Q0 d' Q# l; L- X2. 网络RTC的原生同步,免除NTP的同步,这样更快捷方便。/ ~: L. ^( c6 f! Y8 _* Z! Q
3. NETOPEN 和 CIPCLOSE (不带问号的)执行的返回值其实是第四行显示,resp不应该写0参数,以下是我改好的NETOPEN, CIPCLOSE因为你是使用带?的轮训,所以没有发生意外。9 O  ]2 P9 o: t

( e2 h+ l$ `0 v) a9 ?( U9 q3 ]7 H* V  F% ]. x& q
开机时序.png
网络同步时间.png
NETOPEN.png
使用道具 举报 回复
发表于 2019-8-29 16:23:02 | 显示全部楼层
本帖最后由 Cheney_Chen 于 2019-8-29 16:24 编辑 ' N0 @& F+ B# B3 P
bevis 发表于 2019-8-29 15:58
. @% z# s8 ~+ ]2 K按照你说的方法我测了。# M: i$ l- [( x$ L1 p/ [" w' d
初始化成功后,我必须延时3秒,让DNS+UDP先跑完,然后再跑我的网络应用,连接TCP ...

5 n# b9 z. C7 x# Y  \感谢你的问题反馈和改动建议,我逐一回答一下:
8 @1 t8 L% B, z4 q, k' j: P% p+ E" ]6 v9 R3 o. j; {2 I
1. UDP 关闭之后链路一直被占用问题,我这边没有测试复现过,这边 UDP 关闭之后,0 端口都可以一直使用,我想问一下 端口一直被占用时 AT+IPCLOSE? 命令是不是一直显示 0 端口状态为1,能否保存一份完整的错误复现日志我帮你分析一下问题。0 b, b: K& v  [( b; Z1 E- D
+ ~4 G4 y& Q& c: a% g% L; f
2. 开机时序调用过快不知道是不是我删除了 开机函数之后的 1秒延时导致的,你可以改回去测试一下,如下图所示:
. ]' `8 H7 b! m2 \- l: b- r9 }/ I( C5 C/ Q, O0 S
QQ截图20190829162219.jpg ; Q( r# @) A8 b  g& N
% E- X  V: C) a1 r9 [" h
3. RTC 你这样改动没问题,欢迎你提交 PR
3 |+ H( ~* i9 s6 e3 S! d1 N; n* {- O' u5 Q
4. NETOPEN 和 CIPCLOSE 确实可以改动,也欢迎提交 PR。" _- e3 m! V" ]3 e

: q; ?0 A5 S0 R5 D: b, yPS:上述端口被占用问题我还是觉得是模块内部判断问题或者可能是上述 AT+CIPCLOSE 命令接收响应问题,我需要详细确定一下。
使用道具 举报 回复
发表于 2019-8-29 16:50:52 | 显示全部楼层
本帖最后由 bevis 于 2019-8-29 17:00 编辑 2 H5 e* K! P6 ~$ H6 N
Cheney_Chen 发表于 2019-8-29 16:23
" h. f; b, S$ ~" R5 Z1 }感谢你的问题反馈和改动建议,我逐一回答一下:
! I! W) @% D$ z/ \
! q4 k! v) G* n1. UDP 关闭之后链路一直被占用问题,我这边没有测试复现 ...
1 N& @! A2 q8 S

1 G9 T  X/ X& l* T附件是链路占用日志, 连接成功后3秒断开再重连,0号链路一直存在4 Z% e$ ~1 K0 j: J. ^
8 ~$ V) z, ]4 F1 L* g. B' P% w

链路占用日志.txt

37.8 KB, 下载次数: 67

使用道具 举报 回复
发表于 2019-8-29 17:09:51 | 显示全部楼层
bevis 发表于 2019-8-29 16:50' _- q$ f! \& @# w$ e
附件是链路占用日志, 连接成功后3秒断开再重连,0号链路一直存在
) n: W+ S8 U" i2 W9 y& ~- T
日志中好像没有 “AT+CIPCLOSE=0” 的操作,自然端口 0 被一直占用,这里创建的 UDP 连接有点奇怪,不是我上面提到的同步 INTERNET_UP 的连接,你确定一下这里 UDP  Socket 为什么没关闭
使用道具 举报 回复
发表于 2019-8-29 17:57:14 | 显示全部楼层
Cheney_Chen 发表于 2019-8-29 17:09% d" f" i/ Z7 N3 o  k
日志中好像没有 “AT+CIPCLOSE=0” 的操作,自然端口 0 被一直占用,这里创建的 UDP 连接有点奇怪,不是 ...

4 w. X6 i# r2 }1 |& a) g解决了,归根结底还是要延时等待。一定要等 “sim76xx_domain_resolve” 执行完了(包括把UDP彻底关闭完成)才能执行用户网络应用。
. g  w; e. W  C) f9 Z0 l; g, J原先我等3秒,3秒刚好在UDP关闭链路的过程中,我就开始执行我的网络应用,所以产生了1号链路。
/ N4 a1 M: l0 ?/ {- N现在我等6秒,我的链路就是0号了。% `1 e* L: p- M4 L% H/ |$ y! j
后续能不能让这个“sim76xx_domain_resolve” 流程执行完才 到这个初始化成功  ???  LOG_I("sim76xx devuce(%s) network initialize success!", device->name);& W9 K3 [9 n8 k& N8 W0 [
这个坑有点深那
. p8 G/ |3 P  k$ k6 _  R+ U6 [& a, z1 ]/ b* E' x
2222.png
使用道具 举报 回复
发表于 2019-8-29 17:58:26 | 显示全部楼层
sim76xx_domain_resolve 这个地方我不知道怎么改成同步。找不到调用关系,等你更新了
使用道具 举报 回复
发表于 2019-8-29 18:09:49 | 显示全部楼层
sim76xx_domain_resolve 函数执行就是发送域名解析命令,命令的发送都是同步的,所以这里肯定会域名解析完成之后才会执行应用代码,这块你是不是通过日志分析出来的,能贴出错误日志看一下吗?
使用道具 举报 回复
发表于 2019-8-29 18:18:02 | 显示全部楼层
bevis 发表于 2019-8-29 17:58( j& i' Y* M8 s  @# a( V, \
sim76xx_domain_resolve 这个地方我不知道怎么改成同步。找不到调用关系,等你更新了 ...

- y0 {9 J1 g9 t' L感觉你是不是把每次连接外网之后发送 UDP 数据的地址和端口号改掉了,现在你提供的日志中都没有这块数据的发送和域名解析的相关流程
使用道具 举报 回复
发表于 2019-8-29 18:19:36 | 显示全部楼层
Cheney_Chen 发表于 2019-8-29 18:09" A% F; }. E8 Y
sim76xx_domain_resolve 函数执行就是发送域名解析命令,命令的发送都是同步的,所以这里肯定会域名解析完 ...

# M1 W& C) K0 ^. S) w( x6 esim76xx_domain_resolve 函数是异步的没错,如果不加延时,这个异步的动作会和用户的网络应用几乎同时执行。你执行UDP,我执行TCP,就像1楼最先的问题,TCP在发HTTP包头等HTTP应答过程,正好UDP在执行开启或关闭,就产生一些怪异的现象。下图是我加了6秒等待后的日志, C2 I5 T7 K0 B+ Y, B3 v9 _
! I) y2 T5 n0 h+ @- g

1 F- r* [* ^  ^; |- q1 h( k
111.png
使用道具 举报 回复
发表于 2019-8-29 18:26:06 | 显示全部楼层
本帖最后由 Cheney_Chen 于 2019-8-29 18:31 编辑 % k% b' T/ o& F* I3 q0 R
bevis 发表于 2019-8-29 18:196 f* x$ ^4 t0 g% G3 J+ G
sim76xx_domain_resolve 函数是异步的没错,如果不加延时,这个异步的动作会和用户的网络应用几乎同时执 ...

9 Q5 V4 m" j3 W- s  B好的,我大概知道了,去掉延时的错误日志能给出一份吗,我看一下这个问题
使用道具 举报 回复
发表于 2019-8-29 18:28:52 | 显示全部楼层
Cheney_Chen 发表于 2019-8-29 18:18
6 Y: Y* M( }4 ^& }/ Z+ r感觉你是不是把每次连接外网之后发送 UDP 数据的地址和端口号改掉了,现在你提供的日志中都没有这块数据的 ...
+ x" ]5 D$ ?, l( a
那个txt的日志是我疏忽把sim76xx_domain_resolve里面注释掉了,所以才没有看到UDP关闭的流程。小失误哈。后面我打开了,但是sim76xx_domain_resolve的确是在初始化完成后就立即执行,的确会和用户的网络应用同时运行的现象。
使用道具 举报 回复
发表于 2019-9-13 19:03:02 | 显示全部楼层
你好,我在使用AT组件的时候,也遇到你这样的问题,但是我是在发送数据到UDP之后,在接收数据时出现错误,导致释放内存出错,你有遇到吗?
使用道具 举报 回复
发表于 2019-9-14 17:34:50 | 显示全部楼层
瑞尧 发表于 2019-9-13 19:03( E, J) k3 |" x  j
你好,我在使用AT组件的时候,也遇到你这样的问题,但是我是在发送数据到UDP之后,在接收数据时出现错误, ...
. b, y3 K' j8 ~6 t- v7 i$ j0 v" v
我这个问题已经解决了,截止到我最后一次回帖新版的AT DEVICE基本已经很完善,功能细节上看个人风格可以轻微改动。总的来说,新版我并没有发现问题
使用道具 举报 回复
发表于 2019-9-15 22:44:47 | 显示全部楼层
bevis 发表于 2019-9-14 17:34  S0 H: d$ i% l/ y  f. J6 O
我这个问题已经解决了,截止到我最后一次回帖新版的AT DEVICE基本已经很完善,功能细节上看个人风格可以 ...

. v3 T  q9 L5 R0 ~( K我也已经解决了问题,应该是我释放内存过快,AT指令的响应还未接收完成,导致内存释放失败,感谢
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表