从ESP826601接收多播消息

2024-05-19 00:41:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python3.7项目中工作,依靠从ESP8266-01接收临时数据,从ESP8266-01发送数据的代码似乎工作正常,当我使用wireshark时数据是可见的

enter image description here

但我不能在python程序下得到按摩, 使用代码:

import socket
import struct
import sys

multicast_group = '224.0.1.3'
server_address = ('', 8266)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(server_address)

group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
    print(sys.stderr, '\nwaiting to receive message')
    data, address = sock.recvfrom(1024)

    print(sys.stderr, 'received %s bytes from %s' % (len(data), address))
    print(sys.stderr, data)
    print(sys.stderr, 'sending acknowledgement to', address)
    sock.sendto('ack', address)

我在读一些关于stackoverflow中类似UDP通信问题的文章和回复,但是其中任何一个在我这边都不起作用(我不会提供链接,它们太多了),可能是某种操作系统错误(Windows 10版)

我也可以分享ESP8266-01的简单程序(感谢Marc Quinton)

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

// simple POC : send hello world string over UDP-multicast address every   2 seconds.
// a very simple way to connect IOT to local network without need of any server.
// author : Marc Quinton / feb 2019
// keywords : esp8266, arduino, multicast, IOT, example, POC

WiFiUDP udp;
const int port = 8266;

// IPAddress broadcast;
IPAddress broadcast=IPAddress(224, 0, 1, 3);

const char* ssid = "myssid";
const char* password = "mypassword";

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

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print("broadcast address : ");
  Serial.print(broadcast);
  Serial.print(":");
  Serial.println(port);

}

void sendUDP(String string) {

  Serial.print("sendUDP : ");
  Serial.println(string);

  // convert string to char array
  char msg[255];
  string.toCharArray(msg,255);

  udp.beginPacketMulticast(broadcast, port, WiFi.localIP());
  udp.write(msg);
  udp.endPacket();
}

void loop(void)
{
  sendUDP((String)"hello world");
  delay(2000);
}

致以最诚挚的问候, 埃尔迪安


Tags: tostringaddressstderrsysserialgroupsocket

热门问题