我目前正在尝试通过UDP
接收设备信息。
我将使用<broadcast
,因为我不知道该单位的IP。
之前从未进行任何UDP
通信,我创建了一个基本的listener.py
:
import socket
if __name == "__main__":
UDP_IP = ""
UDP_PORT = 6137
inbound = socket(AF_INET, SOCK_DGRAM)
inbound.bind((UDP_IP, UDP_PORT))
while True:
data, wherefrom = inbound.recvfrom(1024, 0)
data = struct.unpack("!L3i", data)
data = str(data)
sys.stderr.write(repr(wherefrom) + "\n")
sys.stderr.flush()
sys.stdout.write(data + "\n")
sys.stdout.flush()
和broadcast.py
:
from socket import *
import struct
def broadcast():
if __name__ == "__main__":
UDP_IP = '<broadcast>'
UDP_PORT = 6137
HEX = 0x2F03F4B2
I = 0
V = 0
C = 0
PAYLOAD = struct.pack("!L3i", HEX, I, V, C)
comsocket = socket(AF_INET, SOCK_DGRAM)
comsocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
comsocket.sendto(PAYLOAD, (UDP_IP, UDP_PORT))
comsocket.close()
如果我运行listener.py
然后运行broadcast.py
,我会看到邮件已发送,并且已在另一端正确解压缩。
我遇到的问题是,当我发送此广播时(上面是我实际发送的内容的修改版本),设备意味着将响应发送回同一port
所在地广播来自。
所以这就是我被困住的地方,我知道我可以socket.bind()
强制我的广播从固定端口发送,因此设备将响应同一个端口但是如果我{{{ 1}}它显然不能在同一个端口上运行我的bind
。
如何使用“绑定广播”接收发送到我选择的端口的响应?
答案 0 :(得分:2)
套接字可以发送和接收。如果它是udp并绑定到端口。您可以将消息发送回广播套接字。
# broadcast.py
from socket import *
import struct
if __name__ == "__main__":
UDP_IP = '<broadcast>'
UDP_PORT = 6139
HEX = 0x2F03F4B2
I = 0
V = 0
C = 0
PAYLOAD = struct.pack("!L3i", HEX, I, V, C)
comsocket = socket(AF_INET, SOCK_DGRAM)
comsocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
comsocket.sendto(PAYLOAD, (UDP_IP, UDP_PORT))
data, wherefrom = comsocket.recvfrom(1024, 0)
print data, wherefrom
comsocket.close()
这是发送回广播套接字的监听器:
import socket
from socket import *
import struct
import sys
if __name__ == "__main__":
UDP_IP = ""
UDP_PORT = 6139
inbound = socket(AF_INET, SOCK_DGRAM)
inbound.bind((UDP_IP, UDP_PORT))
while True:
data, wherefrom = inbound.recvfrom(1024, 0)
data = struct.unpack("!L3i", data)
data = str(data)
sys.stderr.write(repr(wherefrom) + "\n")
sys.stderr.flush()
sys.stdout.write(data + "\n")
sys.stdout.flush()
inbound.sendto('lala', wherefrom)
print wherefrom