Быстрый пример для GCDAsyncSocketDelegate

Обратитесь к этому сообщению У меня есть некоторые проблемы при получении данных из GCDAsyncSocket и я не могу найти работающий пример Swift.

import UIKit
import CocoaAsyncSocket


class DiscoveryViewControllerTest: UIViewController, GCDAsyncSocketDelegate{
    let host = "192.168.55.1"
    let port:UInt16 = 4000

    let cmdDeviceInformation = "?0600\r";
    let cmdDeviceIStandByeExit = "?060B\r";
    let cmdDeviceIStandByeEnter = "?060A\r";
    var mSocket: GCDAsyncSocket!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("Started wifi scanning!\n")

        mSocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
        do {
            try mSocket.connect(toHost: host, onPort: port)
        } catch let error {
            print(error)
        }
        print("Connecting to instrument...!\n")
    }

    public func socket(_ socket: GCDAsyncSocket, didConnectToHost host: String, port p:UInt16){
        print("didConnectToHost!\n");

        let data = cmdDeviceIStandByeEnter.data(using: .utf8)
        print("TX: ", terminator: " ")
        print(data! as NSData)
        mSocket.write(data!, withTimeout:10, tag: 0)

        mSocket.readData(withTimeout: -1, tag: 0) //This line was missing!

    }

    public func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
        print("didWriteData");
    }

    public func socket(_ sock: GCDAsyncSocket, didReceive trust: SecTrust, completionHandler: @escaping (Bool) -> Void) {
        print("didReceiveData")

        let rxData:Data = Data()
        mSocket.readData(to: rxData, withTimeout: 5, buffer: nil, bufferOffset: 0, tag: 0)
        print("RX: ", terminator: " ")
        print(rxData as NSData)
    }

    public func socket(_ sock: GCDAsyncSocket, didRead: Data, withTag tag:CLong){
        print("didRead!");
    }

    public func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
        print("didDisconnect!")
    }
}

Метод подключения и записи запущен, но метод didReceive никогда не вызывается.

Консольный вывод:

Началось сканирование wifi!

Подключение к инструменту...!

didConnectToHost!

TX: <3f303630 410d> didWriteData

РЕДАКТИРОВАТЬ Я решил свою проблему и изменил код вопроса на готовый пример.

1 ответ

Решение

Я нашел свою ошибку. Подсказка - включить чтение прямо за mSocket.write() вызов функции в socket didConnectToHost(), Полная функция выглядит следующим образом:

public func socket(_ socket: GCDAsyncSocket, didConnectToHost host: String, port p:UInt16){
    print("didConnectToHost!\n");

    let data = cmdDeviceInformation.data(using: .utf8)
    print("TX: ", terminator: " ")
    print(data! as NSData)
    mSocket.write(data!, withTimeout:10, tag: 0)

    mSocket.readData(withTimeout: -1, tag: 0) // Add this line
}

Кстати, я отредактировал свой вопрос, чтобы создать готовый пример для всех.

Другие вопросы по тегам