当前位置:   article > 正文

WiFi-ESP8266入门开发(十九)--手机APP控制和透传_#include 透传

#include 透传

 

注:对于ESP8266开源技术感兴趣的可以加群,我们一起探索交流学习,群号:579932824。群名:ESP8266开源技术交流群。

1.手机控制

        通过上一篇我们使用了电脑tcp调试软件来控制继电器,今天我们使用手机来控制继电器,这里同样是使用手机调试软件和ESP8266接入同一个wifi网络即接同一个路由器,手机开热点也可以。这里我们使用的是手机和ESP8266连接同一个路由器。

打开手机上的网络调试助手

 

点击配置输入端口号8266,点击激活。ps:端口号可以任意取一个,两边对应即可

 

 

打开arduino ide修改下代码,如下

 

 

  1. /*这篇把8266作为TCPcleint,加入手机创建的tcpServer中来控制一个继电器*/
  2. #include <ESP8266WiFi.h>
  3. #define relayPin 2 //继电器连接在8266的GPIO2上
  4. const char *ssid = "TP_LINK_6960";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
  5. const char *password = "123456789";//你要连接的wifi密码
  6. const char *host = "192.168.191.4";//修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
  7. WiFiClient client;
  8. const int tcpPort = 8266;//修改为你建立的Server服务端的端口号
  9. void setup()
  10. {
  11. pinMode(relayPin,OUTPUT);
  12. Serial.begin(115200);
  13. delay(10);
  14. Serial.println();
  15. Serial.println();
  16. Serial.print("Connecting to ");//写几句提示
  17. Serial.println(ssid);
  18. WiFi.begin(ssid, password);
  19. while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
  20. //这里就不一一赘述它返回的数据了,有兴趣的到ESP8266WiFi.cpp中查看
  21. {
  22. delay(500);
  23. Serial.print(".");
  24. }//如果没有连通向串口发送.....
  25. Serial.println("");
  26. Serial.println("WiFi connected");
  27. Serial.println("IP address: ");
  28. Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
  29. }
  30. void loop()
  31. {
  32. while (!client.connected())//几个非连接的异常处理
  33. {
  34. if (!client.connect(host, tcpPort))
  35. {
  36. Serial.println("connection....");
  37. //client.stop();
  38. delay(500);
  39. }
  40. }
  41. while (client.available())//available()同ARDUINO,不解释了
  42. {
  43. char val = client.read();//read()同arduino
  44. if(val=='a'){//pc端发送a和b来控制
  45. digitalWrite(relayPin, LOW);
  46. }
  47. if(val=='b')
  48. {
  49. digitalWrite(relayPin, HIGH);
  50. }
  51. }
  52. }

编译烧写固件

 

给ESP8266上电,打开手机调试软件可以看到已经有一个设备加入网络了
 

发送我们设定的0和1开关继电器
 

哈哈,就可以开关继电器啦。
我也发一个有按钮的调试软件,用法一样
 

手机设置为服务端,这里我们使用一个指令控制,改下代码就可以了
先申明一个变量来存状态
boolean ONorOFF=LOW;
在改成
if(val == 1) {
            digitalWrite(2,ONorOFF);
            Serial.print("ON");
            ONorOFF = (!ONorOFF);

这样就可以一个指令控制了。

2.透传

 

 

 

       ESP8266叫串口wifi模块,那么透传肯定不能少,把8266作为透传同理就是把8266串口获取到的数据无线发送出去。

改下上面的代码即可:

  1.     while (client.available())//改动的就这里啦,无线读取到的数据转发到到串口
  2.     {
  3.         uint8_t c = client.read();
  4.         Serial.write(c);
  5.     }
  6.  
  7.  
  8.     if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
  9.     {
  10.         size_t counti = Serial.available();
  11.         uint8_t sbuf[counti];
  12.         Serial.readBytes(sbuf, counti);
  13.         client.write(sbuf, counti);
  14.  
  15.     }

这样透传就OK啦,把8266的rx,tx接在其他单片机的tx,rx上。

3.全局广播,无视IP

直接上源码:(有的ESP8266模块只能定向发送)

  1. #include <ESP8266WiFi.h>
  2. #include <WiFiUdp.h>
  3. const char *ssid = "MyWIFI";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
  4. const char *password = "123123123";//你要连接的wifi密码
  5. const char *UDPhost = "255.255.255.255";//局域网全网UDP广播地址,也可以使用你本地网段后缀为255也行,不过适应能力就弱了
  6. WiFiClient client;
  7. const int udpPort = 4321;//修改为你建立的Server服务端的端口号
  8. unsigned int localPort = 3888;//UDP端口侦听
  9. char packetBuffer[255]; //存放接收到的UDP数据
  10. char whoamiBuffer[128]="Udp Test01";
  11. char ReplyBuffer[255] = "I Received packet!"; // 回复广播发送者
  12. WiFiUDP Udp;
  13. void setup()
  14. {
  15. Serial.begin(115200);
  16. delay(10);
  17. Serial.println();
  18. Serial.println();
  19. Serial.print("Connecting to ");//写几句提示,哈哈
  20. Serial.println(ssid);
  21. WiFi.begin(ssid, password);//连接WIFI热点
  22. while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
  23. {
  24. delay(500);
  25. Serial.print(".");//如果没有连通向串口发送.....
  26. }
  27. Serial.println("");
  28. Serial.println("WiFi connected");
  29. Serial.println("IP address: ");
  30. Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的本机ip地址
  31. long rssi = WiFi.RSSI();
  32. Serial.print("signal strength (RSSI):");
  33. Serial.print(rssi);
  34. Serial.println(" dBm");//整几个高大上的数字,比如信号强度啥米的,呵呵
  35. // 开始UDP端口侦听
  36. Udp.begin(localPort);
  37. //先把自己是谁广播出去
  38. Udp.beginPacket(UDPhost, udpPort);
  39. Udp.write(whoamiBuffer);
  40. Udp.endPacket();
  41. Serial.println(UDPhost);
  42. }
  43. void loop()
  44. {
  45. //UDP广播数据到达处理
  46. int packetSize = Udp.parsePacket();
  47. if (packetSize) {
  48. Serial.print("Received packet of size ");
  49. Serial.println(packetSize);
  50. Serial.print("From ");
  51. IPAddress remoteIp = Udp.remoteIP();//获取远程广播包发送IP
  52. Serial.print(remoteIp);
  53. Serial.print(", port ");
  54. Serial.println(Udp.remotePort());
  55. // 将到达的数据包读入packetBufffer
  56. int len = Udp.read(packetBuffer, 255);
  57. if (len > 0) {
  58. packetBuffer[len] = 0;
  59. }
  60. Serial.println("Contents:");
  61. Serial.println(packetBuffer);
  62. // 回复信息给广播发送IP
  63. Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
  64. // strcat(ReplyBuffer,Udp.remoteIP());
  65. Udp.write(Udp.remoteIP());
  66. Udp.write(ReplyBuffer);
  67. Udp.endPacket();
  68. }
  69. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/531611
推荐阅读
相关标签
  

闽ICP备14008679号