esp8266通过udp控制电脑滚轮操作

8266端

通过监听8888端口所收到的消息,记录所收到消息包中的ip和端口,并在编码器动作的时候给该端口发送编码器的值

点击查看代码
#include <Arduino.h>

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

#define STASSID "HangLing"
#define STAPSK "1a2b3c4d"
//静态地址、网关、子网掩码
IPAddress local_IP(192, 168, 31, 220);
IPAddress gateway(192, 168, 31, 1);
IPAddress subnet(255, 255, 255, 0);
unsigned int localPort = 8888; // local port to listen on

// 定义远程IP和端口
IPAddress remote_IP(192, 168, 31, 171);
unsigned int remotePort = 8888;
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; // buffer to hold incoming packet,

WiFiUDP Udp;

#define ROTARY_ENCODER_A_PIN D5
#define ROTARY_ENCODER_B_PIN D6
#define ROTARY_ENCODER_BUTTON_PIN D7

#define ROTARY_ENCODER_STEPS 4
AiEsp32RotaryEncoder rotaryEncoder = AiEsp32RotaryEncoder(ROTARY_ENCODER_A_PIN, ROTARY_ENCODER_B_PIN, ROTARY_ENCODER_BUTTON_PIN, -1, ROTARY_ENCODER_STEPS);
volatile long change_encode = 0;
volatile int last_button = 0;

void IRAM_ATTR readEncoderISR()
{
  rotaryEncoder.readEncoder_ISR();
}

// 更新编码器数值
void updateRotaryEncoder()
{

  change_encode = rotaryEncoder.encoderChanged();
  last_button = rotaryEncoder.isEncoderButtonClicked();

  // 验证数据有效性
  if (change_encode != 0 || last_button != 0)
  {
    String send_data = "{\"encode\":" + String(change_encode) + ",\"button\":" + String(last_button) + "}";
    // Serial.println(send_data);
    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(remote_IP, remotePort);
    Udp.write(send_data.c_str());
    Udp.endPacket();
  }
}

void setup()
{
  Serial.begin(9600);

  //设置
  WiFi.mode(WIFI_STA);
  WiFi.config(local_IP, gateway, subnet); //设置静态IP
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print('.');
    delay(200);
  }

  rotaryEncoder.begin();
  rotaryEncoder.setup(readEncoderISR);
  rotaryEncoder.setAcceleration(1);

  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}

void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n",
    //               packetSize,
    //               Udp.remoteIP().toString().c_str(), Udp.remotePort(),
    //               Udp.destinationIP().toString().c_str(), Udp.localPort(),
    //               ESP.getFreeHeap());

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    // Serial.print(F("Contents:"));
    // Serial.println(packetBuffer);
    // 赋值远程IP和端口
    remote_IP = Udp.remoteIP();
    remotePort = Udp.remotePort();
  }

  updateRotaryEncoder();
}

电脑端

运行Python,功能是监听ESP8266的固定ip和端口
将收到的消息解析并通过pyautogui执行滚轮操作

点击查看代码
import socket
import time
import pyautogui as pg
import json


pg.FAILSAFE = False

print('开始')
# 创建 socket
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ('192.168.31.220', 8888)
i = 1
while True:
    msg = f"{i}"
    i += 1
    # 发送数据报
    # print(f'发送数据报:{msg}')
    sk.sendto(msg.encode('utf-8'), addr)
    # 接收数据报
    msg_recv, addr = sk.recvfrom(1024)
    # 打印
    print(msg_recv.decode('utf-8'))
    # {"encode":0,"button":0}
    json_data = json.loads(msg_recv.decode('utf-8'))
    encoder = json_data.get('encode')
    encoder = int(encoder)*100
    button = json_data.get('button')
    if not encoder == 0 :
        # print(encoder, button)
        pg.scroll(encoder)

# 关闭 socket
# sk.close()

posted @ 2022-05-17 10:28  Dapenson  阅读(183)  评论(0编辑  收藏  举报