本质来说相差不大。

esp32中Udp连续发送数据 esp32 udp广播_网络

 假设需要执行的函数为:

void function_A(void)
{
    //函数功能
}

void function_B(void)
{
    //函数功能
}

函数处理

通过注册函数列表来调用函数。

typedef void (* CommandCallback)(char*);     //回调函数指针

CommandCallback call_list[20];               //回调函数指针列表
char* call_ids[20];                          //回调函数代名列表
int call_count;                              //用于计算有多少函数写入序列

注册函数到函数列表

void Command_add(char* id, CommandCallback onCommand)
{
  call_list[call_count] = onCommand; 
  call_ids[call_count] = id; 
  call_count++;
}

调用函数

void Command_run(char* str)
{
    for(int i=0; i < call_count; i++)
    {
        if(isSentinel(call_ids[i],str))
        {  
          call_list[i];         //回调函数
          break;
        }
    }
}

bool Command_isSentinel(char* ch,char* str)
{
    char s[strlen(ch)+1];    
    strncpy(s,str,strlen(ch));
    s[strlen(ch)] = '\0';     
    if(strcmp(ch, s) == 0)
       return true;
    else 
       return false;
}

和wifi&UDP相关

AsyncUDP udp;                     //创建UDP实例
unsigned int localUdpPort = 2333; //本地端口号 
IPAddress apIP(192, 168, 4, 4);   //设置AP的IP地址

const char *ssid = "esp32";             //账号
const char *password = "12345678";      //密码

WiFi.mode(WIFI_AP);   //设置为接入点模式AP
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); 
while(!WiFi.softAP(ssid, password)){}; //启动AP,函数获取并打印软AP的IP
Serial.println("AP启动成功");
while (!udp.listen(localUdpPort)){}; //等待udp监听设置成
udp.onPacket(onPacketCallBack); //注册收到数据包事件

代码例程(已验证)

(我自己写的,可能有部分不足之处。比如没验证开启AP,端口设置什么的都没有验证)

#include <WiFi.h>
#include <AsyncUDP.h> //引用以使用异步UDP

typedef void (* CommandCallback)(void);     //回调函数指针
CommandCallback call_list[20];               //回调函数指针列表
char* call_ids[20];                          //回调函数代名列表
int call_count;                              //用于计算有多少函数写入序列

AsyncUDP udp;                     //创建UDP实例
unsigned int localUdpPort = 2333; //本地端口号 

const char *ssid = "esp32";             //账号
const char *password = "12345678";      //密码
IPAddress apIP(192, 168, 4, 4);         //设置AP的IP地址

void Command_add(char* id, CommandCallback onCommand)
{
  call_list[call_count] = onCommand; 
  call_ids[call_count] = id; 
  call_count++;
}

bool Command_isSentinel(char* ch,char* str)
{
    char s[strlen(ch)+1];    
    strncpy(s,str,strlen(ch));
    s[strlen(ch)] = '\0';     
    if(strcmp(ch, s) == 0)
       return true;
    else 
       return false;
}

void Command_run(char* str)
{
    for(int i=0; i < call_count; i++)
    {
        if(Command_isSentinel(call_ids[i],str))
        {  
          call_list[i]();         //回调函数
          break;
        }
    }
}

void function_A(void)
{
  Serial.println("功能A执行");
}
void function_B(void)
{
  Serial.println("功能B执行");
}

void onPacketCallBack(AsyncUDPPacket packet)
{
  char* da;
  da= (char*)(packet.data());
  Serial.print("读到信息:");
  Serial.println(da);   
  Command_run(da);     
}

void setup() 
{
  Serial.begin(115200);
  
  WiFi.mode(WIFI_AP);   //设置为接入点模式AP
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); 
  while(!WiFi.softAP(ssid, password)){}; //启动AP,函数获取并打印软AP的IP
  Serial.println("AP启动成功");
  while (!udp.listen(localUdpPort)){}; //等待udp监听设置成
  udp.onPacket(onPacketCallBack); //注册收到数据包事件

  Command_add("FUNA",function_A);
  Command_add("FUNB",function_B);
  Serial.println("IP:192.168.4.4");
  Serial.println("输入FUNA或者FUNB");
  
}

void loop() 
{
  while(1);

}

说明:运行结果

通过UDP发送FUNA,串口打印 功能A执行 。通过UDP发送FUNB,串口打印 功能B执行 。

串口打印:(是在UDP写入FUNA和FUNB之后的结果

esp32中Udp连续发送数据 esp32 udp广播_网络协议_02

手机UDP助手:连接IP 192.168.4.4 ,端口号:2333。

esp32中Udp连续发送数据 esp32 udp广播_网络协议_03

 OK,这样基本功能就实现了。并且也间接验证了无线调参功能。

UDP_Sender文件下载:(0积分)