マイナーすぎるのでほぼ自分用忘備録
仕様:EchonetLiteのINF_REQ(0x63)をUDP Multicastで送信して、同一プログラム内で受信もするPythonサンプルコード(受信側はUDP Unicast/Multicastの両方のパケットが受信可能)
お礼とお詫び:いろんな人のソースを参考に作ったので引用元がもうわからず。サンプルソースを公開してくださった皆様ありがとうございます。ミキシングされてしまい、どれをどう引用したか、もうわかりません。すみません
課題:送信用、受信用2つのUDPソケットを開いていますが、このような実装が正しいのかどうか自信ありません。エラーにはならずに動いてはいる。何をもって正しい実装と言えるのか、判断の根拠が分からない。2つのソケットで同じローカルIPをbindしているけど、、ポートが違うからそれは問題ないのだろうと推測。ポートを共用してはいないので許されるのだろう。。多分。。はぁ。。自信ない。。
#!/usr/bin/python3
import time
import threading
import socket
import config
import parse
def receive_packet(dummy):
print("------starting receive thread-----")
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((config.LOCAL_ADDR, config.ECHONET_PORT))
sock.setsockopt(socket.IPPROTO_IP,
socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(config.MULTICAST_GROUP) + socket.inet_aton(config.LOCAL_ADDR))
msg = None
msg, address = sock.recvfrom(128)
print(f"from: {address}")
parse.dump(msg.hex())
sock.close()
print("------end of receive thread-----")
def ELP_infreq():
# create socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# bind
print(f"listen at:{config.LOCAL_ADDR} port:{config.ECHONET_PORT}")
sock.setsockopt(socket.IPPROTO_IP,
socket.IP_MULTICAST_IF,
socket.inet_aton(config.LOCAL_ADDR))
p = threading.Thread(target = receive_packet, args = (None, ))
print(f"multicast:{config.MULTICAST_GROUP} port:{config.ECHONET_PORT}")
msg = "1081000205FF010EF0016301D600" # infreq D6(ins list) ask to node prop
parse.dump(msg)
msg = bytes.fromhex(msg)
p.start()
sock.sendto(msg, (config.MULTICAST_GROUP, config.ECHONET_PORT))
sock.close()
#receive(sock)
p.join()
print("bye")
ELP_infreq()以下実行例
$ ./sendrec_infreq_mul.py
listen at:192.168.10.152 port:3610
multicast:224.0.23.0 port:3610
|10|81|0002|05FF01|0EF001|63(INF_REQ)|01|D6()_00_|
------starting receive thread-----
from: ('192.168.10.150', 49154)
|10|81|0002|0ef001|05ff01|73(INF)|01|d6()_07_0205ff01013009|
------end of receive thread-----
byeメディアコンバータ*1からINF(0x73)+自ノードインスタンスリスト(0xd6)の返信が得られています。メディアコンバータには、0x5ff01(コントローラ)と、0x013009(エアコン)がぶら下がっている。。と。。