手机连接设备的蓝牙向其发送服务器局域网IP信息,从而esp8266与该服务器建立tcp连接

连线图(这个esp8266图不对凑合着看)

        

手机连接设备的蓝牙向其发送服务器局域网IP信息,从而esp8266与该服务器建立tcp连接

实际的esp8266引脚图:

手机连接设备的蓝牙向其发送服务器局域网IP信息,从而esp8266与该服务器建立tcp连接

接线:UTXD ----11号引脚

           URXD------10号引脚

           CH_PD 和 VCC -------- 3.3v(太高电压会烧)

           GND-------GND

 

可以通过arduino做一些的应用,重点在代码部分

 

需要做的设置就是,用AT指令把hc-05设置为从模式,并且把波特率调成与esp8266相同(我的esp8266默认是115200)

一下是hc05相关指令:

AT+NAME=Bluetooth-Slave 蓝牙名称为Bluetooth-Slave

AT+ROLE=0 蓝牙模式为从模式          AT+ROLE=1 蓝牙模式为主模式

AT+CMODE=0 蓝牙连接模式为任意地址连接模式

AT+PSWD=1234 蓝牙配对密码为1234

AT+UART=9600,0,0 蓝牙通信串口波特率为9600,停止位1位,无校验位

AT+RMAAD 清空配对列表

 

 

 

————————————————————————————————————————————————————————————————

————————————————————————————————————————————————————————————————

 

直接上代码

 

代码有一小部分是参照网上的大神们的代码,写了这几天的代码,最让我头痛的是如何让来自手机的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(115200);//硬串口波特率(arduino上的rx和tx)
while (!Serial) {
; //看端口是否准备好
}
Serial.println("BT is ready!");


mySerial.begin(115200);// 软串口的波特率
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连接,从这一点切入,很快整个框架就展开了。

最后,我得出的结论是对于软硬件的结合一定要有耐心,期间我好几次都不想做了,不过坚持下来就不觉得难了。

 

                                                           

作者:

        油鹿

------------------------------------------

后来又做了一遍这个小功能发现自己竟然不能很快的复制出来,所以又重新完善了这个博客,希望对大家有所帮助!