手机连接设备的蓝牙向其发送子服务器局域网IP信息,从而esp8266与该服务器建立tcp连接
2017-12-21 12:37
483 查看
连线图
可以通过arduino做一些的应用,重点在代码部分
装逼分割线
————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————
直接上代码
代码有一小部分是参照网上的大神们的代码,写了这几天的代码,最让我头痛的是如何让来自手机的WiFi名字和WiFi密码生效,其实很简单,只需在AT指令最后加上\r\n,这是esp8266对AT指令的识别标志,注意必须按照标准格式,不然指令无效。还有一点就是代码的AT指令发送必须要有时间间隔,让esp8266去处理AT指令,不然会显示设备忙。
我做这个实验时用到了sscom和NetAsist这两个软件,一个是串口监视软件,一个用来建立模拟服务器让esp8266去连接详细的介绍,给个大神的说法(网址):
https://www.cnblogs.com/zzb-Dream-90Time/p/6674286.html
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX,Esp8266为软串口
String copy="";
String WiFiName="";bool status1=true;//未赋值时是true
String WiFiPasswd="";bool status2=true;
String Ip="";bool status3=true;
String Port="";bool status4=true;
void setup()
{
Serial.begin(38400);//硬串口波特率(arduino上的rx和tx)
while (!Serial) {
; //看端口是否准备好
}
Serial.println("BT is ready!");
mySerial.begin(38400);// 软串口的波特率
mySerial.println("Esp8266 is ready!");
mySerial.print("AT+CWMODE=1\r\n");//Esp8266进入STA模式,可连接热点和服务器
delay(10);//从手机蓝牙依次输入WiFiName,WiFiPasswd,服务器Ip,服务器Port
}
void ConnectWiFi();
void SingleConnect();
void CreateTCP();
void SerialNet();
void loop()
{
if (mySerial.available()){//返回模块(esp8266)状态信息
Serial.write(mySerial.read());
}
while (Serial.available()>0){//if(avaiable()) 只要有到达一个数据就会发送,一个串不行,会形成多次循环
copy+=char(Serial.read());
delay(2);//为了更好的接收数据,避免错误
}
if(copy.length()>0){
if(status1){ //给所需的数据赋值完成后调用CreateTCP()函数建立TCP连接
WiFiName=copy;
status1=false;
copy="";
}
else {
if(status2){
WiFiPasswd=copy;
status2=false;
copy="";
ConnectWiFi();
}
else{
if(status3){
Ip=copy;
status3=false;
copy="";
SingleConnect();
}
else{
if(status4){
Port=copy;
status4=false;
copy="";
CreateTCP();
delay(1000);
SerialNet();
}
}//end else3
}//end else2
}//end else1
}//end copy.length()
delay(10);//延迟一下从而缓解一下模块压力
}
void ConnectWiFi(){
//连接到WiFi
mySerial.print("AT+CWJAP=\"");
mySerial.print(WiFiName);
mySerial.print("\",\"");
mySerial.print(WiFiPasswd);
mySerial.print("\"\r\n");
delay(10);
}
void SingleConnect(){
//设置单链接模式及透传模式
mySerial.print("AT+CIPMUX=0\r\n");
delay(10);
mySerial.print("AT+CIPMODE=1\r\n");
delay(10);
}
void CreateTCP(){
//连接服务器
mySerial.print("AT+CIPSTART=\"TCP\",\"");
mySerial.print(Ip);
mySerial.print("\",");
mySerial.print(Port);
mySerial.print("\r\n");
delay(10);
}
void SerialNet(){
//进入透传模式
mySerial.print("AT+CIPSEND\r\n");
delay(10);
}
开始的时候,毫无头绪,但是我抓住了一点,就是建立tcp连接,从这一点切入,很快整个框架就展开了。
最后,我得出的结论是对于软硬件的结合一定要有耐心,期间我好几次都不想做了,不过坚持下来就不觉得难了。
作者:
油鹿
可以通过arduino做一些的应用,重点在代码部分
装逼分割线
————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————
直接上代码
代码有一小部分是参照网上的大神们的代码,写了这几天的代码,最让我头痛的是如何让来自手机的WiFi名字和WiFi密码生效,其实很简单,只需在AT指令最后加上\r\n,这是esp8266对AT指令的识别标志,注意必须按照标准格式,不然指令无效。还有一点就是代码的AT指令发送必须要有时间间隔,让esp8266去处理AT指令,不然会显示设备忙。
我做这个实验时用到了sscom和NetAsist这两个软件,一个是串口监视软件,一个用来建立模拟服务器让esp8266去连接详细的介绍,给个大神的说法(网址):
https://www.cnblogs.com/zzb-Dream-90Time/p/6674286.html
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX,Esp8266为软串口
String copy="";
String WiFiName="";bool status1=true;//未赋值时是true
String WiFiPasswd="";bool status2=true;
String Ip="";bool status3=true;
String Port="";bool status4=true;
void setup()
{
Serial.begin(38400);//硬串口波特率(arduino上的rx和tx)
while (!Serial) {
; //看端口是否准备好
}
Serial.println("BT is ready!");
mySerial.begin(38400);// 软串口的波特率
mySerial.println("Esp8266 is ready!");
mySerial.print("AT+CWMODE=1\r\n");//Esp8266进入STA模式,可连接热点和服务器
delay(10);//从手机蓝牙依次输入WiFiName,WiFiPasswd,服务器Ip,服务器Port
}
void ConnectWiFi();
void SingleConnect();
void CreateTCP();
void SerialNet();
void loop()
{
if (mySerial.available()){//返回模块(esp8266)状态信息
Serial.write(mySerial.read());
}
while (Serial.available()>0){//if(avaiable()) 只要有到达一个数据就会发送,一个串不行,会形成多次循环
copy+=char(Serial.read());
delay(2);//为了更好的接收数据,避免错误
}
if(copy.length()>0){
if(status1){ //给所需的数据赋值完成后调用CreateTCP()函数建立TCP连接
WiFiName=copy;
status1=false;
copy="";
}
else {
if(status2){
WiFiPasswd=copy;
status2=false;
copy="";
ConnectWiFi();
}
else{
if(status3){
Ip=copy;
status3=false;
copy="";
SingleConnect();
}
else{
if(status4){
Port=copy;
status4=false;
copy="";
CreateTCP();
delay(1000);
SerialNet();
}
}//end else3
}//end else2
}//end else1
}//end copy.length()
delay(10);//延迟一下从而缓解一下模块压力
}
void ConnectWiFi(){
//连接到WiFi
mySerial.print("AT+CWJAP=\"");
mySerial.print(WiFiName);
mySerial.print("\",\"");
mySerial.print(WiFiPasswd);
mySerial.print("\"\r\n");
delay(10);
}
void SingleConnect(){
//设置单链接模式及透传模式
mySerial.print("AT+CIPMUX=0\r\n");
delay(10);
mySerial.print("AT+CIPMODE=1\r\n");
delay(10);
}
void CreateTCP(){
//连接服务器
mySerial.print("AT+CIPSTART=\"TCP\",\"");
mySerial.print(Ip);
mySerial.print("\",");
mySerial.print(Port);
mySerial.print("\r\n");
delay(10);
}
void SerialNet(){
//进入透传模式
mySerial.print("AT+CIPSEND\r\n");
delay(10);
}
开始的时候,毫无头绪,但是我抓住了一点,就是建立tcp连接,从这一点切入,很快整个框架就展开了。
最后,我得出的结论是对于软硬件的结合一定要有耐心,期间我好几次都不想做了,不过坚持下来就不觉得难了。
作者:
油鹿
相关文章推荐
- 建立tcp/ip连接,vc6实现客户端(发送数据)
- 服务器和客户机通过TCP/IP三次握手建立一个连接
- 【有用】 基于WIFI模块(ESP8266)与非同一个局域网内服务器建立连接
- 客户端C和服务器S之间建立一个TCP连接,该连接总是以1KB的最大段长发送TCP段,客户端C有足够的数据要发送。当拥塞窗口为16KB的时候发生超时,如果接下来的4个RTT往返时间内的TCP段的传输是成
- 客户端C和服务器S之间建立了一个TCP连接,TCP最大段长度为1KB,客户端C当前的拥塞窗口是16KB,向服务器S连续发送2个最大段之后,成功收到服务器S发送的第一段的确认段,确认段中通告的接受窗口大
- 基于WIFI模块(ESP8266)与非同一个局域网内服务器建立连接
- [置顶] 基于WIFI模块(ESP8266)与非同一个局域网内服务器建立连接
- WINCE蓝牙服务器获得被其他设备连接信息
- (2) linux 3.x - server - TCP连接建立系列 — 服务端发送SYNACK段
- TCP/IP建立连接与终止连接
- 伪基站收集方圆500至1000米范围内的手机卡信息,并且通过伪基站设备伪装成银行、中国移动、中国联通等任意号码向手机用户发送短信或拨打电话
- linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口
- TCP/IP连接的建立
- 关于socket应用:一个不断监听一个进程的服务器以及发送信息的客户端 TCP的三次握手和四次挥手
- 通过TCP/IP方式连接 “不能上到 mysqL 服务器连接 ”解决方法
- 怎么搜索局域网内IPCamera设备的IP、Port等信息,用C#\UDP怎么实现?
- 在linux下,扫描连接到服务器指定端口的客户端ip信息,以及每个ip有几个链接。
- 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用