superce
主要
esp8266怎么配置
esp8266和USB转TTL连接
esp8266简单介绍
esp8266连接路由器
esp8266通过路由器连接在同一局域网中的电脑,建立TCP连接
esp8266使用串口发送数据到电脑上的网络调试助手
esp8266使用串口通过局域网发送到电脑上自己写的Java程序
esp8266的透传模式
esp8266使用透传模式连接到电脑的网络调试助手
esp8266使用透传模式连接到电脑上的java程序
1
2
3
4
5
6
7
8
9
10
USB转TTL如何和esp8266连接?
USB转TTL
5V
VCC
3V3
TXD
RXD
GND
esp8266
3V3 RX
IO16 IO0
EN IC2
TX GND
连接
USB转TTL esp8266
TXD RX
RXD TX
GND GND
VCC和3V3用短路帽连接后再同时连到esp8266的3V3和EN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
esp8266测试
打开串口调试助手,选择发送新行
AT
OK
-----------
AT+GMR
AT version:1.3.0.0(Jul 14 2016 18:54:01)
SDK version:2.0.0(656edbf)
compile time:Jul 19 2016 18:44:44
OK
-----------
AT+CWSAP_CUR?
+CWSAP_CUR:"ESP_A5A06F","",1,0,4,0
OK
-----------
AT+CWSAP_DEF?
+CWSAP_DEF:"ESP_A5A06F","",1,0,4,0
OK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Esp8266三种模式
STA 连接其他设备来上网,作为client
STA 站点,每一个连接到无线网络中的终端(如笔记本电脑、 PDA及其它可以联网的用户设备)都可称为一个站点
AP 可以当作路由器来给其他esp8266或其他设备连接
是无线接入点,是一个无线网络的创建者,是网络的中心节点
STA+AP
Wifi模块包括两种类型的拓扑形式:基础网(Infra)和自组网(Adhoc)
基于AP组建的基础无线网络(Infra):Infra也称为基础网,是由AP创建,众多 STA加入所组成的无线网络,这种类型的网络的特点是AP是整个网络的中心,网络中所有的通信都通过 AP 来转发完成。
基于自组网的无线网络(Adhoc):Adhoc也称为自组网,是仅由两个及以上STA自己组成,网络中不存在 AP,这种类型的网络是一种松散的结构, 网络中所有的 STA 都可以直接通信
1
2
3
4
5
6
7
8
单连接,多连接和透传模式的关系
多连接情况下(”AT+CIPMUX=1“),才能开启 TCP 服务器
服务器仅⽀持多连接
创建 TCP 服务器后,⾃动建⽴ TCP server 监听
当有 TCP client 接⼊,会⾃动按顺序占⽤⼀个连接 id
⾮透传模式 ( “AT+CIPMODE=0”) ,才能设置为多连接
透传模式,仅⽀持 TCP 单连接和 UDP 固定通信对端的情况
1
2
3
4
5
6
esp8266连接路由器
esp8266已经设置为STA/AP模式
指令:
AT+CWJAP_CUR="Cise_132_Middle",""
AT+CWJAP_CUR="Cise_128_01","213213213"
WIFI CONNECTED
WIFI GOT IP
OK
这样esp8266就有一个IP地址了
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"5e:cf:7f:a5:a0:6f"
+CIFSR:STAIP,"192.168.1.110"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
那么查询一下现在的网络连接状态
AT+CIPSTATUS
STATUS:2
OK
参数说明:
<stat>
2:获得 IP
3:已连接
4:断开连接
5:未连接到 WiFi
测试一下域名解析功能
AT+CIPDOMAIN="www.baidu.com"
+CIPDOMAIN:61.135.169.125
OK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
现在试一下和电脑建立TCP连接
先建立单连接
查询电脑IP
192.168.1.108
255.255.255.0
192.168.1.1
AT+CIPSTART="TCP","192.168.1.108",8000
不能先用esp8266建立一个tcp连接,连不上的,因为TCP server 还没有建立,esp8266也连不上
先用网络调试助手创建一个TCP server,打开指定端口,再连接
AT+CIPSTART="TCP","192.168.31.171",6699
CONNECT
OK
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"5e:cf:7f:a5:a0:6f"
+CIFSR:STAIP,"192.168.31.103"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
在网络调试助手上显示已经和192.168.31.103建立连接
通过路由器在一个局域网中向电脑发送数据
esp8266和电脑连接同一个路由器
AT+CIPSEND=9
OK
> 123asdfgh
busy s...
Recv 9 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
上面是用网络调试助手创建TCP Server,那么可不可以使用java创建一个serversocket来接收数据呢?
esp发送命令
AT+CIPSENDBUF=16
一直按回车就可以了,因为这个命令本身的长度就是16,可以发送自己
java程序
package espSever;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
public class Esp {
JButton Sendtoesp;
JTextArea textArea;
JButton opensocket;
ServerSocket serverSocket;
PrintWriter writer;
Socket socket;
BufferedReader reader;
InputStreamReader streamReader;
public static void main(String[] args) {
// TODO Auto-generated method stub
Esp esp =new Esp();
esp.go();
}
public void go() {
JFrame frame = new JFrame("EspServer");
JPanel panel01 = new JPanel();
JPanel panel02 = new JPanel();
opensocket = new JButton("OpenSocket");
Sendtoesp = new JButton("Send To Esp");
textArea = new JTextArea(20,20);
textArea.setLineWrap(true); //可以使用滚动条
//设置滚动条
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
opensocket.addActionListener(new Socketopen());
panel01.setBackground(Color.PINK);
panel02.setBackground(Color.BLUE);
panel02.setLayout(new BoxLayout(panel02, BoxLayout.Y_AXIS));
panel01.add(scrollPane);//不能忘了加滚动条
panel02.add(opensocket);
panel02.add(Sendtoesp);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.CENTER, panel01);
frame.getContentPane().add(BorderLayout.EAST, panel02);
frame.setSize(600, 600);
frame.setVisible(true);
}
class Espget implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
String message;
try {
while((message =reader.readLine())!=null)
{
textArea.append("IP : "+message+"\n");
}
} catch (Exception e2) {
// TODO: handle exception
System.out.println("发生异常.\n");
}
}
}
class Socketopen implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
textArea.append("server socket open ing!\n");
try {
//@SuppressWarnings("resource")
serverSocket = new ServerSocket(6699);
Socket socket = serverSocket.accept();
streamReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(streamReader);
writer = new PrintWriter(socket.getOutputStream());
Thread tserver = new Thread(new Espget());
tserver.start();
textArea.append("服务器已启动!\n");
} catch (Exception e2) {
// TODO: handle exception
System.out.println("发生异常.\n");
}
}
}
}
主要的问题是使用内部类和线程
测试结果:
使用Java的serversocket是可以接收到esp发送的数据的,不过由于使用的是buffer,要发送足够的数据,因为AT+CIPSENDBUF=16太短了,Java程序才会显示出来,而且有乱码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
怎么解决有什么接收什么和防止乱码的问题?
涉及到编码问题,稍后再研究
1
esp8266接收数据
直接使用TCP server发送数据,WiFi模块就能在串口上显示,不需要特殊的配置
不过如果需要显示发送消息来的TCP server的IP和端口需要使用AT指令AT+CIPDINFO=1就可以显示相关信息了,
1
2
先了解一种工作模式叫透传,这个很有用处
透传的意思是将WiFi模块设置为透传模式(前提是设置为单连接,而且已经和TCP server建立连接)后,发给WiFi模块的信息(AT指令)WiFi模块就不处理了,直接将输入的发给TCP server
这样如果使用WiFi模块和STM32连接,STM32发给ESP8266后,其实就是发给了网络上的TCP server,就不用使用AT+CIPSEND命令设置长度再发送数据了。
设置透传模式
第一次设置不对
AT+CIPMUX=0
OK
AT+CIPSTART="TCP","192.168.31.171",6699
CONNECT
OK
AT+CIPSMODE=1
ERROR
AT+CIPMODE=1
OK
AT+CIPMODE=1
OK
AT+CIPMODE=1
OK
BHBUUHY
ERROR
hhhhhhhhhhBHBUUHY
ERROR
BHBUUHY
ERROR
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"5e:cf:7f:a5:a0:6f"
+CIFSR:STAIP,"192.168.31.103"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
AT+CIPSTATUS
STATUS:3
+CIPSTATUS:0,"TCP","192.168.31.171",6699,46789,0
OK
AT+CIPSENDBUF=16
IPMODE=1
ERROR
AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16AT+CIPSENDBUF=16
IPMODE=1
ERROR
CLOSED
好像应该设置为客户端模式,再设置单连接,再连接TCP再设置透传,
设置为客户端模式(其实设置为STA/AP模式也可以)
重启
AT查看
查看IP
连接AP
查看IP
设置单连接
连接TCP server
查看IP
设置透传
输入AT+CIPSEND
之后输入的任何信息都会直接传输到TCP server
输入连续的+++结束透传
输入AT+CIPCLOSE断开TCP连接
AT+CWMODE_DEF=1
OK
AT+RST
OK
ets Jan 8 2013,rst cause:1, boot mode:(3,7)
load 0x40100000, len 2408, room 16
tail 8
chksum 0xe5
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0x84
load 0x3ffe8310, len 632, room 0
tail 8
chksum 0xd8
csum 0xd8
2nd boot version : 1.6
SPI Speed : 40MHz
SPI Mode : DOUT
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
屻?僶鞗;凔g|?宒噋;l勩;沝宒?
d`屻s踠?
AT+CIFSR
+CIFSR:STAIP,"0.0.0.0"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
AT+CWJAP_CUR="Cise_128_01","213213213"
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIFSR
+CIFSR:STAIP,"192.168.31.103"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
AT+CIPMUX=0
OK
AT+CIFSR
+CIFSR:STAIP,"192.168.31.103"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
AT+CIPSTART="TCP","192.168.31.171",6699
CONNECT
OK
AT+CIFSR
+CIFSR:STAIP,"192.168.31.103"
+CIFSR:STAMAC,"5c:cf:7f:a5:a0:6f"
OK
AT+CIPSTATUS
STATUS:3
+CIPSTATUS:0,"TCP","192.168.31.171",6699,29851,0
OK
AT+CIPMODE=1
OK
AT+CIPMODE=1
OK
AT
OK
AT
OK
VVREV
ERROR
VVREV
ERROR
hhhVVREV
ERROR
VVREV
ERROR
AT+CIPSENDBUF=16
IPMODE=1
ERROR
AT+CIPSENDBUF=16
IPMODE=1
ERROR
AT+CIPSENDBUF
ERROR
AT+CIPSENDBUF
ERROR
AT+CIPSEND
OK
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
那么不用网络调试助手建立TCP server,使用上面那个自己的Java程序会怎样?
还是按上面的步骤建立透传
不过每个发送的字符串在Java的textArea上面都显示出来了,而不是像之前一样得发够一定的字节数,在Java程序上一下显示出来
---------------------
作者:流氓兔来啦
来源:CSDN
原文:https://blog.csdn.net/superce/article/details/78219707
版权声明:本文为博主原创文章,转载请附上博文链接!