智能家居简单实现---使用ESP8266简单实现和APP通讯
前段时间,公司利用 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模式就够了,指令有下面这几个就够了:
- 设置wifi模式:AT+CWMODE=2
- 重启生效:AT+RST
- 启动多连接:AT+CIPMUX=1
- 建立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要使用到的指令有:
- 建立TCP连接:AT+CIPSTART=0,"TCP","192.168.4.2",5000
- 确定发送数据的长度:AT+CIPSEND=0,19
- 发送信息: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通讯相关推荐
- 智能家居代码构建编写、简单工厂模式、树莓派摄像头视频监控功能实现
根据上一节内容的代码框架开始编写代码: 首先编写controlDevices.h这个头文件里面的代码,这个是设备工厂每一个结点的结构体类型,而且还要在这个头文件里面进行函数的声明,也就是创建的那些设备 ...
- android版 智能家居 kit,Android/IOS版全能家电手机APP(智能家居APP)
主要功能说明 1.照明控制 配合KOTI各系列的遥控开关(单火或零火开关),用户可以在手机APP上实现智能灯光控制,包括灯的开关.调光控制. 2.电动窗帘控制 配合KOTI各系列的窗帘开关,用户可以在 ...
- 智能家居平台乱战,京东欲借“超级APP”争夺控制中心
近两年,智能硬件一路走红,衍生出一系列诸如智能手环.智能路由器等设备,BAT巨头的加入更是让整个市场异常火爆,各家都在尝试以智能硬件产品为切入,在万物互联时代找到自己的新位置. 根据今年美国的CES情 ...
- 【智能家居远程控制系统】ESP8266连接阿里云(六)
系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 第五章 阿里云平台云 ...
- 【智能家居远程控制系统】ESP8266连接阿里云(一)
系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 第五章 阿里云平台云 ...
- 【智能家居远程控制系统】ESP8266连接阿里云(三)
系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 目录 系列文章目录 ...
- 【智能家居远程控制系统】ESP8266连接阿里云(二)
系列文章目录 第一章 阿里云平台的构建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 目录 系列文章目录 文章目录 前言 一.订阅 ...
- Google智能家居控制ESP8266
Google home 智能家居控制ESP8266 第一步 下载程序到esp8266 第二步 google智能家居 第三步 (附)开源app控制 第一步 下载程序到esp8266 下载地址: 点击下载 ...
- 个人入行做智能家居,应该从哪几方面入手?
理想总是与现实相悖,在经济持续不景气的今天,豪情壮志之后便是对生活及职业的不满,大伙儿都在感叹如今钱越来越难挣,生意越来越不好做,大家都在戾气中虎视眈眈地瞄着任何一个可能会爆发的机会. 智能家居便是被 ...
最新文章
- 如何在windows7和windows8双系统中卸载windows8
- 安卓实现记住密码登陆功能
- 【安装】Linux系统(X64)安装Oracle 11g
- 华为swot分析2020_2020华为音频产品汇总分析,完善产品质量,丰富产品线
- 微信小程序-智能机器人
- 列举ospf的5种报文类型_OSPF的5种报文类型
- 系统架构设计师 - 软件架构设计 - 架构评估
- ScaleGestureDetector使用注意事项
- 使用 iTextSharp 生成 PDF 表格
- Greenplum创建存储过程
- 小清新风高清壁纸,让你一天心情轻松!
- paip.快速查找定位文件VS2010
- 面向对象的数据库db4o: 安装并使用db4o
- 关于SO、SOP、SOIC封装(宽体、中体、窄体)的详解
- Android 修改wifi阀值,6种简单方法使WiFi网络提速
- 图像原点矩、二阶中心矩物理意义推导
- FlinkSql系列6之 Interval Join
- Flutter时间轴
- 你若运行,便是晴天!
- 修复iPhone系统故障导致的黑屏
热门文章
- Tips--Solidworks 2016绘制工程图时显示gtol.sym文件缺失的解决方法
- 带你了解FPGA(2)--逻辑设计基础
- windows环境下注册安装GitHub Desktop使用方法详解
- 从github上下载单个文件
- java多态的简单例子_要JAVA的简单例子,继承\多态的,详细讲解运行的每一步
- 7-1 一元多项式求导 (10 分)
- nacos dataid修改配置文件_nacos 配置中心自动化运维之namespace坑
- oracle 时间按季度,Oracle按日期季度查询
- vue路由,解决同一路由页面多次触发不刷新页面【vue开发】
- 汇编语言(王爽 第三版)检测点