现状: 有个网关设备,自身带一个 wifi,名为 XXXX ;
APP ( IOS 端)添加这个网关设备配网时,会通过 UDP 广播方式发出去一个数据包,端口固定。
使用 Window 的 UDP 工具测试时,发现收到包的概率特别大。但是使用 APP 程序( CocoaAsyncSocket 实现),但是收到包的概率太小了,好多包都丢了。
可能是什么情况?请大家帮忙分析一下,小弟感谢万分!
相关代码如下:
import SystemConfiguration.CaptiveNetwork import NetworkExtension
import UIKit
class UDPSocketManager: NSObject, GCDAsyncUdpSocketDelegate {
static var shared = UDPSocketManager()
var udpSocket: GCDAsyncUdpSocket?
var udpError: String?
var port = 26600
var isStarting: Bool = false
override init() {
super.init()
}
func start() {
if isStarting {
return
}
self.udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)
do {
try udpSocket?.bind(toPort: UInt16(port), interface: udpError)
try udpSocket?.enableBroadcast(true)
try udpSocket?.beginReceiving()
self.isStarting = true
} catch {
print("catch:\(String(describing: error))")
self.isStarting = false
}
}
func close() {
self.isStarting = false
udpSocket?.close()
}
func sendUdp(aaa: String, ssid: String, pw: String, address: Data) {
let str = "ssid:\(ssid)pw:\(pw)"
let asciiArr = str.asciiHexValues
let instructStr = BasicProtocol.gatewayInstructionGeneration(frameNumStrArr: BasicProtocol.gatewayFrameNumStrArr, respFlagStrArr: ["80"], cmdIdStrArr: ["08", "01"], dataStrArr: asciiArr)
HUD.showSuccess("收到数据:\(aaa)\n 发送数据:\(instructStr)", delay: 5)
// self.udpSocket.send(Data(instructStr.components(separatedBy: " ").joined().changeToBytes()), toHost: "192.168.4.1", port: UInt16(self.port), withTimeout: -1, tag: 0)
self.udpSocket?.send(Data(instructStr.components(separatedBy: " ").joined().changeToBytes()), toAddress: address, withTimeout: -1, tag: 0)
}
func sendUdp(str: String, address: Data) {
let asciiArr = str.asciiValues
let instructStr = BasicProtocol.gatewayInstructionGeneration(frameNumStrArr: BasicProtocol.gatewayFrameNumStrArr, respFlagStrArr: ["80"], cmdIdStrArr: ["08", "01"], dataStrArr: asciiArr)
HUD.showSuccess("发送数据:\(instructStr)", delay: 5)
self.udpSocket?.send(Data(instructStr.components(separatedBy: " ").joined().changeToBytes()), toAddress: address, withTimeout: -1, tag: 0)
}
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
// 接受数据
let strData = data.map({ String(format: "%02x", $0) }).joined(separator: " ")
HUD.showSuccess("收到数据:\(strData)", delay: 5)
NotificationCenter.default.post(name: NSNotification.Name("UDPSocketNewMessage"), object: ["strData": strData, "address": address])
}
func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) {
// 发送数据成功
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.