前段时间,公司利用 ESP8266 这个WiFi模块,做了好多小产品。从手机 APP 直连这个 ESP8266 进行通讯,再到实现远程控制。中间实现过程磕磕碰碰,虽然这方面已经做得非常成熟,但是网上的资料少之又少。现在把实现方式展示出来,同时也算是做一个笔记。

首先这里要实现的是Android端的APP直连ESP8266进行双向通讯。

如果想了解Android端的APP远程连接与ESP8266进行双向通信的,实现真正的智能家居,可以参与这场Chat: 智能家居远程控制,实现APP与ESP8266远程通信

首先我们来说一下这个ESP8266,这个在淘宝上非常便宜,10块左右,安信可的产品。这个WiFi模块已经做得非常的成熟,下面介绍一下它的基本使用,首先这个模块有三种模式:

1:STA 模式: ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。

2:AP 模式: ESP8266模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。

3:STA+AP 模式: 两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。

今天的实现用AP模式就够了,指令有下面这几个就够了:

  1. 设置wifi模式:AT+CWMODE=2
  2. 重启生效:AT+RST
  3. 启动多连接:AT+CIPMUX=1
  4. 建立server:AT+CIPSERVER=1

另外还有非常多的指令可以修改这个模块的参数,甚至还可以修改里面的程序重新烧录,更多的详情就参考安信可的官网。这个就需要电子比较厉害的人才会适合了,我是Android开发的,所以这方面不太了解,还望海涵。

这是设备:

接下来通过串口发送指令开启ESP8266的WiFi:

发送完这四个指令之后,打开手机就可以看到相应的WiFi开启了(这个WiFi名给我改过):

好了,硬件准备完毕,接下来我们准备APP软件,针对Android端的。新建一个Android项目,项目结构:

添加一个异步处理类:

/** * Created by Layne_Yao on 2017/5/12. * CSDN:http://blog.csdn.net/Jsagacity */  public class SendAsyncTask extends AsyncTask<String, Void, Void> {  //这里是连接ESP8266的IP和端口号,IP是通过指令在单片机开发板查询到,而端口号可以自行设置,也可以使用默认的,333就是默认的  private static final String IP = "192.168.4.1";  private static final int PORT = 333;  private Socket client = null;  private PrintStream out = null;  @Override  protected Void doInBackground(String... params) {  String str = params[0];  try {  client = new Socket(IP, PORT);  client.setSoTimeout(5000);  // 获取Socket的输出流,用来发送数据到服务端  out = new PrintStream(client.getOutputStream());  out.print(str);  out.flush();  if (client == null) {  return null;  } else {  out.close();  client.close();  }  } catch (IOException e) {  e.printStackTrace();  }  return null;  }  }
复制代码

在手机端建立一个作为接受ESP8266发送的消息的服务器:

public class MobileServer implements Runnable {  private ServerSocket server;  private DataInputStream in;  private byte[] receice;  private Handler handler = new Handler();  public MobileServer() {  }  public void setHandler(Handler handler) {  this.handler = handler;  }  @Override  public void run() {  try {  //5000是手机端开启的服务器的端口号,ESP8266进行TCP连接时使用的端口,而IP也是通过指令查询的联入设备的IP  server = new ServerSocket(5000);  while (true) {  Socket client = server.accept();  in = new DataInputStream(client.getInputStream());  receice = new byte[50];  in.read(receice);  in.close();  Message message = new Message();  message.what = 1;  message.obj = new String(receice);  handler.sendMessage(message);  }  } catch (IOException e) {  e.printStackTrace();  }  try {  server.close();  } catch (IOException e) {  e.printStackTrace();  }  }
}
复制代码

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context="com.itman.connectesp8266.MainActivity" >  <TextView  android:id="@+id/tv_content"  android:layout_width="match_parent"  android:layout_height="25dp"  android:layout_centerHorizontal="true"  android:layout_marginTop="10dp"  android:background="#fe9920"  android:gravity="center"  android:text="接收的内容" />  <Button  android:id="@+id/bt_send"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_below="@id/tv_content"  android:layout_centerHorizontal="true"  android:layout_marginTop="40dp"  android:text="发送" />  <TextView  android:id="@+id/tv_send_text"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_below="@id/bt_send"  android:layout_centerHorizontal="true"  android:layout_marginTop="33dp"  android:text="发送的内容" />  </RelativeLayout>
复制代码

最后是MainActivity:

public class MainActivity extends ActionBarActivity implements OnClickListener {  private TextView tv_content, tv_send_text;  private Button bt_send;  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  InitView();  //开启服务器  MobileServer mobileServer = new MobileServer();  mobileServer.setHandler(handler);  new Thread(mobileServer).start();  }  private void InitView() {  tv_content = (TextView) findViewById(R.id.tv_content);  tv_send_text = (TextView) findViewById(R.id.tv_send_text);  bt_send = (Button) findViewById(R.id.bt_send);  bt_send.setOnClickListener(this);  }  @Override  public void onClick(View v) {  switch (v.getId()) {  case R.id.bt_send:  String str = "Sent to the ESP8266";  new SendAsyncTask().execute(str);  tv_send_text.setText(str);  break;  }  }  Handler handler = new Handler() {  @Override  public void handleMessage(Message msg) {  switch (msg.what) {  case 1:  tv_content.setText("WiFi模块发送的:" + msg.obj);  Toast.makeText(MainActivity.this, "接收到信息", Toast.LENGTH_LONG)  .show();  }  }  };  }
复制代码

最后不要忘了添加网路权限:

<uses-permission android:name="android.permission.INTERNET"/>
复制代码

运行到真机,确保手机连接上ESP8266的WiFi,就可以进行手机发送信息到ESP8266了。手机APP发送过去的:

ESP8266接收到的:

接下来是ESP8266发送数据到APP。首先ESP要使用到的指令有:

  1. 建立TCP连接:AT+CIPSTART=0,"TCP","192.168.4.2",5000
  2. 确定发送数据的长度:AT+CIPSEND=0,19
  3. 发送信息:Sent to the Android

操作指令:

APP端接受到的信息:

以上是简单的实现APP和ESP8266直连通讯的实现。

如果想要实现远程控制,过程是比较繁杂的,但是并不复杂。

这里只简单的说明一下大致的实现方式:

1、要实现远程控制就必须得租用一个服务器,当然自己电脑也可以作为服务器,就是需要配置。最简单的方式是租用云服务器,比如阿里云的ECS,如果是学生,还有学生价。

2、接下来是最麻烦的步骤:

1)手机发数据到云服务器,这个不用多说了,使用json数据的网络通信;

2)接着就是云服务器继续把手机发送过来的转发的ESP8266,而云服务器和ESP8266之间的通讯是需要使用TCP长连接的。因为ESP8266这边的IP是会变化的所以只能使用长连接;

3)ESP8266发数据到云服务器就不用再多说了,就第2点中的长连接。但是云服务器怎么推送数据到APP呢?答案也是长连接的,这里可以使用别人集成好的框架mina。

以上就是远程控制的大致过程要点,想要实现就各自去完成了。当初我还是在别的平台问人问到的实现方案,网上根本没有相应的资料,或者是方案。以上的实现方案虽然有点繁杂,但是并不复杂,慢慢实现是没有很大难度的。

原文链接:blog.csdn.net/Jsagacity/a…

智能家居简单实现---使用ESP8266简单实现和APP通讯相关推荐

  1. 智能家居代码构建编写、简单工厂模式、树莓派摄像头视频监控功能实现

    根据上一节内容的代码框架开始编写代码: 首先编写controlDevices.h这个头文件里面的代码,这个是设备工厂每一个结点的结构体类型,而且还要在这个头文件里面进行函数的声明,也就是创建的那些设备 ...

  2. android版 智能家居 kit,Android/IOS版全能家电手机APP(智能家居APP)

    主要功能说明 1.照明控制 配合KOTI各系列的遥控开关(单火或零火开关),用户可以在手机APP上实现智能灯光控制,包括灯的开关.调光控制. 2.电动窗帘控制 配合KOTI各系列的窗帘开关,用户可以在 ...

  3. 智能家居平台乱战,京东欲借“超级APP”争夺控制中心

    近两年,智能硬件一路走红,衍生出一系列诸如智能手环.智能路由器等设备,BAT巨头的加入更是让整个市场异常火爆,各家都在尝试以智能硬件产品为切入,在万物互联时代找到自己的新位置. 根据今年美国的CES情 ...

  4. 【智能家居远程控制系统】ESP8266连接阿里云(六)

    系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 第五章 阿里云平台云 ...

  5. 【智能家居远程控制系统】ESP8266连接阿里云(一)

    系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 第五章 阿里云平台云 ...

  6. 【智能家居远程控制系统】ESP8266连接阿里云(三)

    系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 目录 系列文章目录 ...

  7. 【智能家居远程控制系统】ESP8266连接阿里云(二)

    系列文章目录 第一章 阿里云平台的构建​​​​​​​ 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 目录 系列文章目录 文章目录 前言 一.订阅 ...

  8. Google智能家居控制ESP8266

    Google home 智能家居控制ESP8266 第一步 下载程序到esp8266 第二步 google智能家居 第三步 (附)开源app控制 第一步 下载程序到esp8266 下载地址: 点击下载 ...

  9. 个人入行做智能家居,应该从哪几方面入手?

    理想总是与现实相悖,在经济持续不景气的今天,豪情壮志之后便是对生活及职业的不满,大伙儿都在感叹如今钱越来越难挣,生意越来越不好做,大家都在戾气中虎视眈眈地瞄着任何一个可能会爆发的机会. 智能家居便是被 ...

最新文章

  1. 如何在windows7和windows8双系统中卸载windows8
  2. 安卓实现记住密码登陆功能
  3. 【安装】Linux系统(X64)安装Oracle 11g
  4. 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
  5. 微信小程序-智能机器人
  6. 列举ospf的5种报文类型_OSPF的5种报文类型
  7. 系统架构设计师 - 软件架构设计 - 架构评估
  8. ScaleGestureDetector使用注意事项
  9. 使用 iTextSharp 生成 PDF 表格
  10. Greenplum创建存储过程
  11. 小清新风高清壁纸,让你一天心情轻松!
  12. paip.快速查找定位文件VS2010
  13. 面向对象的数据库db4o: 安装并使用db4o
  14. 关于SO、SOP、SOIC封装(宽体、中体、窄体)的详解
  15. Android 修改wifi阀值,6种简单方法使WiFi网络提速
  16. 图像原点矩、二阶中心矩物理意义推导
  17. FlinkSql系列6之 Interval Join
  18. Flutter时间轴
  19. 你若运行,便是晴天!
  20. 修复iPhone系统故障导致的黑屏

热门文章

  1. Tips--Solidworks 2016绘制工程图时显示gtol.sym文件缺失的解决方法
  2. 带你了解FPGA(2)--逻辑设计基础
  3. windows环境下注册安装GitHub Desktop使用方法详解
  4. 从github上下载单个文件
  5. java多态的简单例子_要JAVA的简单例子,继承\多态的,详细讲解运行的每一步
  6. 7-1 一元多项式求导 (10 分)
  7. nacos dataid修改配置文件_nacos 配置中心自动化运维之namespace坑
  8. oracle 时间按季度,Oracle按日期季度查询
  9. vue路由,解决同一路由页面多次触发不刷新页面【vue开发】
  10. 汇编语言(王爽 第三版)检测点