打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
智能家居简单实现

前段时间,公司利用 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项目,项目结构:

添加一个异步处理类:

  1. /**
  2. * Created by Layne_Yao on 2017/5/12.
  3. * CSDN:http://blog.csdn.net/Jsagacity
  4. */
  5. public class SendAsyncTask extends AsyncTask<String, Void, Void> {
  6. //这里是连接ESP8266的IP和端口号,IP是通过指令在单片机开发板查询到,而端口号可以自行设置,也可以使用默认的,333就是默认的
  7. private static final String IP = "192.168.4.1";
  8. private static final int PORT = 333;
  9. private Socket client = null;
  10. private PrintStream out = null;
  11. @Override
  12. protected Void doInBackground(String... params) {
  13. String str = params[0];
  14. try {
  15. client = new Socket(IP, PORT);
  16. client.setSoTimeout(5000);
  17. // 获取Socket的输出流,用来发送数据到服务端
  18. out = new PrintStream(client.getOutputStream());
  19. out.print(str);
  20. out.flush();
  21. if (client == null) {
  22. return null;
  23. } else {
  24. out.close();
  25. client.close();
  26. }
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. return null;
  31. }
  32. }


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

  1. public class MobileServer implements Runnable {
  2. private ServerSocket server;
  3. private DataInputStream in;
  4. private byte[] receice;
  5. private Handler handler = new Handler();
  6. public MobileServer() {
  7. }
  8. public void setHandler(Handler handler) {
  9. this.handler = handler;
  10. }
  11. @Override
  12. public void run() {
  13. try {
  14. //5000是手机端开启的服务器的端口号,ESP8266进行TCP连接时使用的端口,而IP也是通过指令查询的联入设备的IP
  15. server = new ServerSocket(5000);
  16. while (true) {
  17. Socket client = server.accept();
  18. in = new DataInputStream(client.getInputStream());
  19. receice = new byte[50];
  20. in.read(receice);
  21. in.close();
  22. Message message = new Message();
  23. message.what = 1;
  24. message.obj = new String(receice);
  25. handler.sendMessage(message);
  26. }
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. try {
  31. server.close();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }


布局文件:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.itman.connectesp8266.MainActivity" >
  6. <TextView
  7. android:id="@+id/tv_content"
  8. android:layout_width="match_parent"
  9. android:layout_height="25dp"
  10. android:layout_centerHorizontal="true"
  11. android:layout_marginTop="10dp"
  12. android:background="#fe9920"
  13. android:gravity="center"
  14. android:text="接收的内容" />
  15. <Button
  16. android:id="@+id/bt_send"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_below="@id/tv_content"
  20. android:layout_centerHorizontal="true"
  21. android:layout_marginTop="40dp"
  22. android:text="发送" />
  23. <TextView
  24. android:id="@+id/tv_send_text"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:layout_below="@id/bt_send"
  28. android:layout_centerHorizontal="true"
  29. android:layout_marginTop="33dp"
  30. android:text="发送的内容" />
  31. </RelativeLayout>


最后是MainActivity:

  1. public class MainActivity extends ActionBarActivity implements OnClickListener {
  2. private TextView tv_content, tv_send_text;
  3. private Button bt_send;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. InitView();
  9. //开启服务器
  10. MobileServer mobileServer = new MobileServer();
  11. mobileServer.setHandler(handler);
  12. new Thread(mobileServer).start();
  13. }
  14. private void InitView() {
  15. tv_content = (TextView) findViewById(R.id.tv_content);
  16. tv_send_text = (TextView) findViewById(R.id.tv_send_text);
  17. bt_send = (Button) findViewById(R.id.bt_send);
  18. bt_send.setOnClickListener(this);
  19. }
  20. @Override
  21. public void onClick(View v) {
  22. switch (v.getId()) {
  23. case R.id.bt_send:
  24. String str = "Sent to the ESP8266";
  25. new SendAsyncTask().execute(str);
  26. tv_send_text.setText(str);
  27. break;
  28. }
  29. }
  30. Handler handler = new Handler() {
  31. @Override
  32. public void handleMessage(Message msg) {
  33. switch (msg.what) {
  34. case 1:
  35. tv_content.setText("WiFi模块发送的:" + msg.obj);
  36. Toast.makeText(MainActivity.this, "接收到信息", Toast.LENGTH_LONG)
  37. .show();
  38. }
  39. }
  40. };
  41. }


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

<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。

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

如果想直接学习并实现的,可以参与这场Chat:智能家居远程控制,实现APP与ESP8266远程通信

如果是想学习Android开发基础的,可以看一下这篇文章:简单的入门Android开发基础

关注个人公众号「技术人的日常」,关注后回复:安卓基础,即可获取Android基础入门学习资料。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android线程间通信机制
Looper和Handler
(总结)Android 开发中一些很有用但你不知道的方法(三)
Android 基础教程之---动态更改屏幕方向的简单例子(LANDSCAPE与PORTR...
手把手带你制作WIFI智能开关.走进物联网-ESP8266学习日记(四)
UC头条:51单片机通过WIFI模块ESP8266控制四路继电器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服