【问题标题】:Transfer NSString between two devices via bluetooth in iOS在 iOS 中通过蓝牙在两台设备之间传输 NSString
【发布时间】:2023-03-15 16:50:01
【问题描述】:

我想通过蓝牙在两台 iOS 设备之间传输NSString。谁能帮助如何通过蓝牙传输NSString?我搜索了具体的答案和示例代码,但找不到。请指导我。

提前致谢。!!

【问题讨论】:

标签: ios iphone bluetooth nsstring file-transfer


【解决方案1】:

查看苹果开发者论坛源代码BTLE Transfer

我希望这将有助于您使用蓝牙将字符串或任何数据从一台设备传输到另一台设备。

【讨论】:

    【解决方案2】:

    我将更广泛地评论如何将MCSession 用于这种简单的案例,因为当我第一次熟悉MCSession 时,我很惊讶关于如何使用的信息很少一个简单的MCSession 没有添加MCBrowserViewController 的额外层。

    在您的 .h 中,添加以下委托:MCSessionDelegate、MCNearbyServiceAdvertiserDelegate 和 MCNearbyServiceBrowserDelegate。还要为MCPeerID *devicePeerID、MCSession *session、MCNearbyServiceAdvertiser *serviceAdvertiser 和MCNearbyServiceBrowser *nearbyServiceBrowser 声明类实例变量。

    在您的 .m 中,在 viewDidLoad 期间或您希望启动 MCSession 之前的任何其他时间,初始化您的 MCPeerID:

    devicePeerId = [[MCPeerID alloc] initWithDisplayName:DISPLAY_NAME];
    

    然后使用MCPeerID 来初始化MCSession:

    session = [[MCSession alloc] initWithPeer:devicePeerId securityIdentity:nil encryptionPreference:MCEncryptionNone];
    session.delegate = self;
    

    现在,为了避免使用MCBrowserViewController,您必须初始化自己的MCNearbyServiceAdvertiser 以允许您的设备宣传会话,MCNearbyServiceBrowser 以允许您的设备找到会话,或者您甚至可以初始化两者都在同一设备上,以允许同时进行广告和浏览:

    serviceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:myDevicePeerId discoveryInfo:nil serviceType:SERVICE_TYPE];
    serviceAdvertiser.delegate = self;
    // (I've set discoveryInfo to nil here, but it can also contain an NSDictionary of data to pass along to browsers who find this advertiser via the browser:foundPeer:withDiscoveryInfo method)
    
    nearbyServiceBrowser = [[MCNearbyServiceBrowser alloc] initWithPeer:myDevicePeerId serviceType:SERVICE_TYPE];
    nearbyServiceBrowser.delegate = self;
    

    接下来,如果您已将设备设置为广告客户,则需要实现MCNearbyServiceAdvertiserDelegate 方法。

    从浏览同行发出邀请:

    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didReceiveInvitationFromPeer:(MCPeerID *)peerID withContext:(NSData *)context invitationHandler:(void (^)(BOOL, MCSession *))invitationHandler {
    
        NSLog(@"invitation received");
    
        if (want_to_accept_invitation)
            invitationHandler(YES, session);
        else
            invitationHandler(NO, session);
    
    }
    

    如果设备由于某种原因尚未开始广告,则收到错误消息:

    - (void)advertiser:(MCNearbyServiceAdvertiser *)advertiser didNotStartAdvertisingPeer:(NSError *)error {
        NSLog(@"Did not start advertising error: %@", error);
    }
    

    同样,如果你已经将设备设置为浏览器,你需要实现MCNearbyServiceBrowserDelegate方法:

    // Peer found
    - (void)browser:(MCNearbyServiceBrowser *)browser foundPeer:(MCPeerID *)peerID withDiscoveryInfo:(NSDictionary *)info {
    
        NSLog(@"Session Manager found peer: %@", peerID);
    
        if (want_to_connect)
            [serviceBrowser invitePeer:peerID toSession:session withContext:nil timeout:CONNECTION_TIMEOUT];
    
    } 
    
    // Peer lost, ex. out of range
    - (void)browser:(MCNearbyServiceBrowser *)browser lostPeer:(MCPeerID *)peerID {
        NSLog(@"Session Manager lost peer: %@", peerID);
    
    }
    
    - (void)browser:(MCNearbyServiceBrowser *)browser didNotStartBrowsingForPeers:(NSError *)error {
        NSLog(@"Did not start browsing for peers: %@", error);
    }
    

    那么你需要MCSessionDelegate 方法来帮助通知用户连接状态的变化并促进数据的发送和接收:

    - (void)session:(MCSession *)session didReceiveCertificate:(NSArray *)certificate fromPeer:(MCPeerID *)peerID certificateHandler:(void (^)(BOOL accept))certificateHandler {
        NSLog(@"Did receive certificate");
        certificateHandler(true);
    }
    
    // To detect changes in the state of your connections with your peers….
    - (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state {
    
        switch (state) {
            case MCSessionStateConnected: {
    
                NSLog(@"Connected to %@", peerID);
    
                //  If you'd like to send your text string as soon as you're connected...
                NSError *error;
                [session sendData:[@"text" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[NSArray arrayWithObject:peerID] withMode:MCSessionSendDataReliable error:&error];
    
                break;
            } case MCSessionStateConnecting: {
                NSLog(@"Connecting to %@", peerID);
    
                break;
            } case MCSessionStateNotConnected: {
                break;
            }
        }
    }
    
    
    - (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {
        NSLog(@"Did receive data.");
    
        /// Receive the string here.
        NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
    }
    

    请注意,为了发送数据,我使用了:

    [session sendData:[@"text" dataUsingEncoding:NSUTF8StringEncoding] toPeers:[NSArray arrayWithObject:peerID] withMode:MCSessionSendDataReliable error:&error];
    

    在用户与他的同伴连接后立即传输数据。但是这一行可以用来在代码的其他地方发送数据,例如:

    - (void)sendMessageToAllPeers:(NSString *)message {
        [session sendData:[message dataUsingEncoding:NSUTF8StringEncoding] toPeers:session.connectedPeers withMode:MCSessionSendDataReliable error:&error];
    }
    
    - (void)sendMessage:(NSString *)message toPeerIDs:(NSArray *)peerIDs {
        [session sendData:[message dataUsingEncoding:NSUTF8StringEncoding] toPeers:peerIDs withMode:MCSessionSendDataReliable error:&error];
    }
    

    最后,要开始/停止为您的广告商和/或浏览器做广告,您可以致电[_serviceAdvertiser start/stopAdvertisingPeer]、[_nearbyServiceBrowser start/stopBrowsingForPeers]:

    - (void)start {
        [serviceAdvertiser startAdvertisingPeer];
        [nearbyServiceBrowser startBrowsingForPeers];
    }
    
    - (void)stop {
        [serviceAdvertiser stopAdvertisingPeer];
        [nearbyServiceBrowser stopBrowsingForPeers];
    }
    

    还有其他方法,但这些是基础。虽然写得很快,所以任何人都应该随时修改!

    【讨论】:

    • 哇没有意识到这篇文章有多长......抱歉占用了这么多屏幕:P
    • 非常感谢@Lydsey Scott ...您的彻底了解和见解为我节省了大量时间。不胜感激!
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2012-07-18
    相关资源
    最近更新 更多