Arduino Esp8266 UDP通信

**

使用2个WeMos D1mini通过UDP通信实现传输字符串类

**

WeMos D1 Mini

基于Esp8266的开发板,用Arduino Ide+安卓线即可实现程序编译烧录,非常适合于物联网,通信等方面

UDP通信

UDP通信很近似于广播,AP发了就是发了,不会去管sta会不会收到,相比于TCP通信而言,UDP通信虽然有丢包的可能,但是由于UDP的简单粗暴使得UDP通信比TCP通信的实现要轻松的多得多.
UDP通信有个特性,举个例子来说,有那种人,你不跟他说话,他也永远不会跟你说话,这个主动跟他交流的过程实际上是互相告诉ip的地址的过程;如果让两片8266跑UDP通信,就好比让两个这种人互相交流,结果显而易见,但有解决方法

Udp.beginPacket("255.255.255.255", localPort);

255.255.255.255就相当一个广播频道,对于所有连接到这个热点的sta,都会收到AP发的信息,因为AP端执行的一定是读取什么数据然后发送给sta的过程(例程是读取AP附近的指定ssid的rssi值并传给sta,用pc串口读),因此就让AP充当广播的角色去和sta通信

第一次写csdn有点紧张,直接上代码吧

AP端

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include<stdlib.h>
#include<stdio.h>
const char *ssid = "Esp8266";
const char *password = "12345678";
unsigned int localPort = 4210; 
WiFiUDP Udp;
void setup() 
{
    delay(1000);
    Serial.begin(115200);
    WiFi.softAP(ssid, password);
    Udp.begin(localPort);
}
void Send(char ch[])
{
   Udp.beginPacket("255.255.255.255", localPort);
   Udp.write(ch);
   Udp.endPacket();
}
void loop() 
{
  int n = WiFi.scanNetworks();
  for (int i = 0; i < n; ++i)
  {
    if(WiFi.SSID(i)=="OPPO Reno4")
    {
      int rssi=WiFi.RSSI(i);
      char chh[5];
      itoa(rssi,chh,10);
      Send(chh);
    }
  }
  delay(3000);
}

AP端扫描附近指定ssid的AP(怪怪的),获取rssi值,通过itoa实现int和char[]的互换,这里插一嘴,UDP发送的数据类型几乎都是字符串,所以要转一下
别问我为什么对rssi如此在意,我们队长挑了个用WiFi定位的题
在此得出血与泪的教训,rssi值和距离在一米半以内勉勉强强有线性关系,不要妄想用WiFi测距了

STA端

遍地都能找到的udp接收教程

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "Esp8266";
const char* password = "12345678";

WiFiUDP Udp;
unsigned int localUdpPort = 4210; 
char incomingPacket[255];  
char  replyPacket[] = "Hi there! Got the message :-)"; 


void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");

  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}
void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)//解析包不为空
  {
    Serial.printf("收到来自远程IP:%s(远程端口:%d)的数据包字节数:%d\n", Udp.remoteIP().toString().c_str(), Udp.remotePort(), packetSize);
    String udpStringVal = Udp.readString(); 
    Serial.print("开发板接收到UDP数据中的字符串 "); Serial.println(udpStringVal);
  }
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值