Esp8266与android app的UDP通讯

Esp8266

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

const char *ssid = "dsx_zj";     //网络名称
const char *password = "dsxbs725"; //网络密码

WiFiUDP Udp;
unsigned int udpPort = 8081; // 本地端口号
const int rec_data_len = 128;
char incomingPacket[rec_data_len];         // 接收缓冲区
const int client_udpPort = 8081;  //客户端端口号
const int pin1 = 2;const int pin2 = 0;const int pin3 = 4;
void setup()
{
  Serial.begin(115200);
  pinMode(pin1, OUTPUT);pinMode(pin2, OUTPUT);pinMode(pin3, OUTPUT);
  digitalWrite(pin1, HIGH); digitalWrite(pin2, HIGH);digitalWrite(pin3, HIGH);
  Serial.println();
  Serial.printf("Connecting to %s ", ssid);
  WiFi.mode(WIFI_STA);
  WiFi.setAutoConnect(false);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected!");
  //以下开启UDP监听并打印输出信息
  Udp.begin(udpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), udpPort);
}

void loop()
{
  int packetSize = Udp.parsePacket(); //获取当前队首数据包长度
  if (packetSize)                     // 有数据可用
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, rec_data_len); // 读取数据到incomingPacket
    if (len > 0)                             // 如果正确读取
    {
      incomingPacket[len] = 0; //末尾补0结束字符串
      Serial.printf("UDP packet contents: %s\n", incomingPacket);

      if (strcmp(incomingPacket, "red") == 0) // 如果收到Turn off
      {
        digitalWrite(pin1, LOW); digitalWrite(pin2, HIGH);digitalWrite(pin3, HIGH);
        Udp.beginPacket(Udp.remoteIP(), client_udpPort);
        Udp.write("LED Red!"); // 回复LED has been turn off
        Udp.endPacket();
      }
      else if (strcmp(incomingPacket, "green") == 0) // 如果收到Turn on
      {
        digitalWrite(pin1, HIGH); digitalWrite(pin2, LOW);digitalWrite(pin3, HIGH);
        Udp.beginPacket(Udp.remoteIP(), client_udpPort);
        Udp.write("LED Green!"); // 回复LED has been turn off
        Udp.endPacket();
      }
      else if (strcmp(incomingPacket, "blue") == 0) // 如果收到Turn on
      {
        digitalWrite(pin1, HIGH); digitalWrite(pin2, HIGH);digitalWrite(pin3, LOW);
        Udp.beginPacket(Udp.remoteIP(), client_udpPort);
        Udp.write("LED Blue!"); // 回复LED has been turn off
        Udp.endPacket();
      }
      else // 如果非指定消息
      {
        digitalWrite(pin1, HIGH); digitalWrite(pin2, HIGH);digitalWrite(pin3, HIGH);
        Udp.beginPacket(Udp.remoteIP(), client_udpPort);
        Udp.write("Data Error!"); // 回复Data Error!
        Udp.endPacket();
      }
    }
  }
}

app

package com.example.esp8266app;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {
    private Button send;   //发送按钮
    private EditText content;
    private TextView rec_content;
    public static final String local_ip = "192.168.2.201"; //本机ip
    public static final int local_recv_port = 8081; //本机接收udp绑定的端口
    public static final String client_ip = "192.168.2.203"; //客户端IP
    public static final int client_port = 8081;//客户端port
    private DatagramSocket socket;  //接收数据用的socket

    int data_len = 127;//与esp32cam约定的数据传输的长度
    byte[] RevBuff = new byte[data_len];//定义接收数据流的包的大小
    MyHandler myHandler; //处理信息
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myHandler = new MyHandler();
        content = findViewById(R.id.content);
        rec_content = findViewById(R.id.rec_content);
        //生成接受数据使用的socket
        try {
            InetAddress local_serverAdder = InetAddress.getByName(local_ip); //本手机的ip地址
            socket = new DatagramSocket(local_recv_port,local_serverAdder);
        } catch (SocketException | UnknownHostException e) {
            e.printStackTrace();
        }
//        启动接收数据的线程
        new Thread(new Recv()).start();
//        发送数据
        send = findViewById(R.id.send);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread((new Send())).start();  //启动发送数据线程 发送一次数据
            }
        });
    }

    //    接收数据的线程
    public class Recv implements Runnable {
        public void run() {
            // 接收UDP广播,有的手机不支持
            while (true) {
                byte[] recbuf = new byte[data_len];
                DatagramPacket recpacket = new DatagramPacket(recbuf,
                        recbuf.length);
                try {
                    socket.receive(recpacket);
                    RevBuff = recpacket.getData();
                    Message msg = myHandler.obtainMessage();
                    msg.what = 3;
                    msg.obj = RevBuff;
                    msg.arg1 = RevBuff.length;
                    myHandler.sendMessage(msg);
                    //Log.v("Tag:",new String(RevBuff));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //  发送数据线程
    public class Send implements Runnable {
        @Override
        public void run() {
            try {
                InetAddress client_serverAdder = InetAddress.getByName(client_ip);
                DatagramSocket send_socket = new DatagramSocket();
                String tmp = content.getText().toString();
                byte[] buf = tmp.getBytes();
                DatagramPacket send_packet = new DatagramPacket(buf, buf.length, client_serverAdder, client_port);
                send_socket.send(send_packet);
                send_socket.close();
                Thread.sleep(100);
            } catch (SocketException | UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //处理一些不能在线程里面执行的信息
    class MyHandler extends Handler {
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
//                    连接服务器成功信息
                    break;
                case 1:
//                    连接服务器失败信息
                    break;
                case 2:
//                    处理接收到的非图像数据
                    break;
                case 3:
                    byte[] tmp = new byte[msg.arg1];
                    System.arraycopy((byte[])msg.obj,0,tmp,0,msg.arg1);
                    SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
                    Date date = new Date(System.currentTimeMillis());
                    String content = (new String(tmp)) + "----"  + formatter.format(date) + "\n";
                    rec_content.append(content);
                    break;
                default: break;
            }
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        socket.close(); //关闭接收使用的socket
        System.out.println("UDP Client程序退出,关掉socket,停止广播");
    }
}

<uses-permission android:name="android.permission.INTERNET"/>



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/rec_content"
        android:layout_width="match_parent"
        android:layout_height="500dp" />
    <EditText
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="60dp" />
    <Button
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:text="发送" />

</LinearLayout>

猜你喜欢

转载自blog.csdn.net/weixin_42854045/article/details/128022151