MulticastでEchonetLite (GET / 自ノードインスタンスリスト) 投げて機器からUnicast(自ノードインスタンスリスト)で戻ってくるパケットを受け取るサンプル。このソースでは受信できない、(Multicastで受け取る実装になっているから)
import Foundation import Network var EL_HEADER:[UInt8] = [0x10, 0x81] var EL_TID:[UInt8] = [0x00, 0x00] var EOJ_CONTROLLER:[UInt8] = [0x05, 0xff, 0x01] var EOJ_NODEPROFILE:[UInt8] = [0x0e, 0xf0, 0x01] let ESV_GETI:UInt8 = 0x60 let ESV_GETC:UInt8 = 0x61 let ESV_GET:UInt8 = 0x62 let ESV_INFREQ:UInt8 = 0x63 let ESV_SETGET:UInt8 = 0x6E let EPC_INSLSTNTFPROP:UInt8 = 0xD5 let EPC_INSLIST:UInt8 = 0xD6 let EPC_STATE:UInt8 = 0x80 func device_scan(){ guard let multicast = try? NWMulticastGroup(for: [ .hostPort(host: "224.0.23.0", port: 3610)], disableUnicast: false) else { fatalError("error in Muticast") } let group = NWConnectionGroup(with: multicast, using: .udp) group.setReceiveHandler(maximumMessageSize: 1024, rejectOversizedMessages: true) { (message, content, isComplete) in print("Received message from \(String(describing: message.remoteEndpoint))") //let message = String(data: content, encoding: .utf8) //let message = Data(content, encoding: .utf8) print(content) //let sendContent = Data("ack".utf8) //message.reply(content: sendContent) } group.stateUpdateHandler = { (newState) in print("Group entered state \(String(describing: newState))") switch newState { case .ready: print("ready") var msg:[UInt8] = EL_HEADER + EL_TID + EOJ_CONTROLLER + EOJ_NODEPROFILE //msg.append(contentsOf:[ESV_INFREQ, 0x01, EPC_INSLSTNTFPROP, 0x00]) msg.append(contentsOf:[ESV_GET, 0x01, EPC_INSLIST, 0x00]) let groupSendContent = Data(msg) // .data(using: .utf8) print("send...UDP") group.send(content: groupSendContent) { (error) in print("Send complete with error \(String(describing: error))") } case .waiting(let error): print("waiting") print(error) case .setup: print("setup") case .cancelled: print("cancelled") case .failed: print("failed") //case .preparing: // print("preparing") default: print("default") } } let queue = DispatchQueue(label: "ExampleNetwork") //print(group.isUnicastDisabled) group.start(queue: queue) //group.start(queue: .main) sleep(10) group.cancel() sleep(5) print("bye") } device_scan()