: w# M2 L# d0 z( W' T
目的: ESP8266 实现 wifi 下运行telnet 进行finish 操作,
7 _6 m" w. q# \9 e4 L7 m
0 t5 B n5 T$ A2 u& T
, F2 ]5 U- i6 ~ N5 _6 X) G操作:/ {3 o1 `1 L2 Z/ x; ?8 L4 Q
1,开启telnet 模块
& e6 L7 u2 B+ Y7 h
6 c- W) Y- x! v- P 5 f( |8 b( ~4 q
2 开启 AT ESP8266驱动
* `7 h( m4 i4 Z& M& S q - X4 s0 j; n5 {' }! {6 x7 S
& {( C% |, k8 t/ _1 k/ a3 开启AT 组件
9 O& U+ [+ D! I, l! x8 u5 u( z) k # W( [4 t" t; [1 ^. X! a b
4 开启SAL
5 |6 x- p: H! C/ O h) _2 ?6 Z7 |
9 f( p+ b2 m9 ]* L& ^1 _& k+ t5 修改telnet.c 里的 AF_INET 替换 AF_AT
, t: I' T: O- g4 [$ o8 |. z/ A0 }#define AF_INET_temp AF_AT (这句是我加的 )
( {/ Z! \: H* Z+ c! Vstatic void telnet_thread(void* parameter)
7 y$ e6 w [- K3 ]( z$ Q{+ Y9 O3 L5 w& X7 x3 z: Q
#define RECV_BUF_LEN 64
6 d( b" e1 G5 i9 O5 ^9 M
& y$ L5 C0 p5 B1 B: {3 ~' { struct sockaddr_in addr;- l( i- }( ?3 P E: E2 i) G
socklen_t addr_size;
6 }: U+ V( C' |( B4 v' \$ t rt_uint8_t recv_buf[RECV_BUF_LEN];5 Q) H3 M: Z+ ~9 @: n u7 S
rt_int32_t recv_len = 0;
- P' I7 n5 \" O) \* {3 v4 W7 B8 i& {- e; {/ u( O4 `
if ((telnet->server_fd = socket(AF_INET_temp, SOCK_STREAM, 0)) == -1)6 o8 T R! X1 I& o4 y% g5 {
{
H) a$ U1 `! C$ k# |: n+ a rt_kprintf("telnet: create socket failed\n");
" J+ u* I% n' c( ^+ p return;) ]4 J0 A9 k5 x' F" b
}
* f+ N; K' Y2 b8 W" Z* @1 f
6 E8 R0 h" \9 l addr.sin_family = AF_INET_temp;
! m2 ?( A1 ?- H) @" m/ Q7 t+ _( Y3 S addr.sin_port = htons(TELNET_PORT);
( Q, y1 ^6 u5 L# M addr.sin_addr.s_addr = INADDR_ANY;
0 J8 {* |# c1 ^; c" U4 P rt_memset(&(addr.sin_zero), 0, sizeof(addr.sin_zero));# Y0 z4 o8 ~' T0 L3 E' A/ m
if (bind(telnet->server_fd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) == -1)+ t, ^" k5 N' ?' E; `. Y
{0 E. H3 I% f+ K" N9 M* |
rt_kprintf("telnet: bind socket failed\n");
# P3 _4 C1 j. ^" O) ~6 ] return;
. C( p, F. `2 W3 Q5 V4 q }8 ^1 W+ `" a c
% t7 g+ K" b3 x: o# k
3 E. R0 d. [) A
6 ,测试后 出现问题" H- \( B* D4 W& P9 h! q% D0 X3 d
0 n. j0 a8 M. p% X6 Q( \- O
发现 AT+CIPCLOSE 失败" e$ u/ k+ U6 t- w# D
# e) Y6 y5 K2 k1 C3 h b
CLI 模式下直接发AT 命令1 V1 B+ N! y7 q7 Y3 ?2 _ r
AT+CIPSTATUS
# i* x% Q. x2 D2 E! F- ?; v) BSTATUS:4 , @$ Q7 L) m* Z
) C' n- O q( e# N
OK2 x: t K! [& J" O% ?
) W! ^9 g5 M9 K* X; @1 P; n
4代表失去 连接6 }1 B9 i* I6 ~# V1 s, J
发现以问题 , telnet 流程下先关闭 TCP 但是
6 I0 r+ c( t; G1 H6 u# T) L, j! h# z5 f& ]8 S. f$ L1 g: X0 m8 |
AT+CIPCLOSE=0 e* V9 ~4 l% D. }
UNLINK
3 T5 z- d! ]% [ E2 y3 N, g% M7 w% } f( E7 Y4 Y
ERROR3 n" w4 w i# M" ]
: x4 ?, y; L9 o8 F$ S U6 V( t, P. |& x1 a& h* Z
这里有个ERROR 导致 at_client 文件下的函数 at_obj_exec_cmd* L7 L& ~2 F z1 z
if (client->resp_status != AT_RESP_OK)' ?' V8 |' x3 D
{
" h o6 [/ v1 ~6 o cmd = at_get_last_cmd(&cmd_size);+ k& V" U3 q. v
LOG_E("execute command (%.*s) failed!", cmd_size, cmd);
' K8 H% w# i% O# ~; _ result = -RT_ERROR;, F. P/ R3 N& h& p+ e
goto __exit;( l, q' l; N# P" R5 U% W9 r! ]
}
. _) m$ z. g$ z/ r# x }; i/ {" c( W) o4 }. z
+ F, O$ i; Q- B7 }
0 ~2 f M0 M7 H/ x% _0 Y
然后报了错误 导致 bind 失败
; b! _" I* q- ]$ R! t4 C if (bind(telnet->server_fd, (struct sockaddr *) &addr, sizeof(struct sockaddr)) == -1)1 u2 T& j9 D. H! e
{& l5 A# Z# p/ b5 Y" k
rt_kprintf("telnet: bind socket failed\n");
& G6 ?8 ? Z9 j+ S$ U" E return;$ p4 C: _+ Y# E" Q
}
7 @) Z* \+ H6 a( c1 P
5 F+ Y' b) Z' Z5 F \& j- `* \& x- j" u
请问:
+ o$ A/ l; M8 utelnet.c 里的bind 干啥了,为啥回去关TCP?
, S5 l9 F( K# w: g8 x6 I' N ESP8266 下telnet 怎么实现 有例子 吗?
5 {# V' k7 [# Q4 C" z! `官网的代码怎么实现telnet呢?" P$ p$ P% x$ S; ]0 e# p
3 ^! w1 n. \. H; C) Z
" g& N" A! o: C# ~/ J* M# N: Y
* j8 m1 i f- q/ X/ N3 r/ r- _9 t$ Q: F
# r/ Q8 E. n' R& x
6 a+ p1 A! P. u1 K, E" w t |
|