Многопользовательское подключение с персональным Hotspot Swift - PullRequest
0 голосов
/ 14 января 2019

Я работаю с подключением Multipeer. Он отлично работает, когда все устройства подключены к одному и тому же Wi-Fi.

У меня есть 1 ведущее и 5 ведомых устройств. Я хочу установить соединение с личной точкой доступа, но каждый раз соединение будет отклоняться. Я хочу подключить все подчиненные устройства к главному устройству, используя личную точку доступа для обмена данными между ними.

Это мой код:

class SessionManager: NSObject, MCSessionDelegate, MCBrowserViewControllerDelegate, MCNearbyServiceAdvertiserDelegate, MCNearbyServiceBrowserDelegate {

    func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String: String] ? ) {
        browser.invitePeer(peerID, to: mcSession, withContext: nil, timeout: 10)
    }

    func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
        print("Lost Peer")
    }


    static
    let shared = SessionManager()

    var peerID = MCPeerID(displayName: UIDevice.current.name)
    var mcSession: MCSession!
        var mcAdvertiserAssistant: MCAdvertiserAssistant!
            var delegate: SessionDelegate!
                var serviceBrowser: MCNearbyServiceBrowser
    var serviceAdvertiser: MCNearbyServiceAdvertiser

    override init() {
        serviceBrowser = MCNearbyServiceBrowser(peer: peerID, serviceType: "demo")
        serviceAdvertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: "demo")

        super.init()

        peerID = MCPeerID(displayName: UIDevice.current.name)
        mcSession = MCSession(peer: peerID, securityIdentity: nil, encryptionPreference: .required)
        mcSession.delegate = self

        serviceBrowser.delegate = self
        serviceBrowser.startBrowsingForPeers()
        serviceAdvertiser.delegate = self
        serviceAdvertiser.startAdvertisingPeer()

    }


    //MARK: Start Hosting
    func startHosting() {
        mcAdvertiserAssistant = MCAdvertiserAssistant(serviceType: "demo", discoveryInfo: nil, session: mcSession)
        mcAdvertiserAssistant.start()
    }

    //MARK: Join Session
    func joinSession() {
        let mcBrowser = MCBrowserViewController(serviceType: "demo", session: mcSession)
        mcBrowser.delegate = self
        mcBrowser.navigationController ? .navigationBar.backgroundColor = .black
        UINavigationBar.appearance().tintColor = .black
        UIApplication.visibleViewController.present(mcBrowser, animated: true)
    }

    //MARK: Delegate Methods
    func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {}

    func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {}

    func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL ? , withError error : Error ? ) {}

    func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
        UIApplication.visibleViewController.dismiss(animated: true, completion: nil)
    }

    func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
        UIApplication.visibleViewController.dismiss(animated: true, completion: nil)

    }

    func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
        switch state {
            case MCSessionState.connected:
                print("Connected:SessionManager \(peerID.displayName)")

            case MCSessionState.connecting:
                print("Connecting:SessionManager \(peerID.displayName)")

            case MCSessionState.notConnected:
                print("Not Connected:SessionManager \(peerID.displayName)")
        }
    }

    func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
        let sessionData = SessionModel.init(session, peerID, data)
        delegate.didRecieveSessionData(sessionData)
    }

    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data ? , invitationHandler : @escaping(Bool, MCSession ? ) - > Void) {
        print("Receive Invitation")
        invitationHandler(true, self.mcSession)
    }
    func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) {
        print("Ddn't Start")
    }


}

Есть ли способ сделать это.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 января 2019

Ранее уже спрашивали (безрезультатно): Не работает многопользовательское соединение с персональной точкой доступа

Насколько я знаю, MPC - это просто уровень абстракции поверх различных способов создания сетей. Apple использует M-DNS (Bonjour) и другие методы, включая Bluetooth, чтобы максимально упростить взаимодействие между устройствами MacOS / iOS.

Многопользовательское соединение - это одноранговое решение, и то, что вы описываете, является гораздо больше клиент-серверным решением. Это не значит, что вы не можете справиться с этим, но хорошо иметь это в виду! Это означает, что вы хотите MPC в качестве базового уровня сети и реализовать клиент-серверную структуру поверх этого. Я не вижу причин, почему это было бы невозможно при использовании одного из устройств в качестве точки доступа, но я не думаю, что это даже необходимо: Airdrop также использует MCP, и это работает также, когда устройства не находятся в той же сети.

На этом есть несколько ценных ресурсов:

...