文档章节

点对点蓝牙通讯服务类

 泊竹
发布于 2014/04/29 20:07
字数 616
阅读 398
收藏 8
//
//  LocalChatCenter.h
//  TestLocalChat
//
//  Created by 孙俊 on 14-4-6.
//  Copyright (c) 2014年 yipinapp. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol LocalChatCenterDelegate <NSObject>

@optional
//连接相关
- (void)isConnection;
- (void)isUnConnection;

//数据传输相关
- (void)receiveData:(NSData *)data UserName:(NSString *)userName;

@end

@interface LocalChatCenter : NSObject

@property (nonatomic, weak) id<LocalChatCenterDelegate>     delegate;
@property (nonatomic, assign, readonly) BOOL                isConnected;

+ (LocalChatCenter *)shareInstance;

- (void)startConnection;
- (void)stopConnection;

- (void)sendData:(NSData *)data;

@end

//
//  LocalChatCenter.m
//  TestLocalChat
//
//  Created by 孙俊 on 14-4-6.
//  Copyright (c) 2014年 yipinapp. All rights reserved.
//

#define D_SessionID_My      @"TestChat"

#import "LocalChatCenter.h"
#import <GameKit/GameKit.h>

static LocalChatCenter *localChatCenter = nil;

@interface LocalChatCenter()<GKPeerPickerControllerDelegate, GKSessionDelegate>

@property (nonatomic, strong) GKPeerPickerController    *peerPicker;
@property (nonatomic, strong) GKSession                 *session;
@property (nonatomic, strong) NSString                  *myPeerId;
@property (nonatomic, assign) BOOL                       isConnected;

@end

@implementation LocalChatCenter

+ (LocalChatCenter *)shareInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        localChatCenter = [[LocalChatCenter alloc] init];
    });
    
    return localChatCenter;
}

#pragma mark 通讯连接相关方法
//启动联机
- (void)startConnection
{
    if (self.isConnected == NO) {
        
        self.peerPicker = [[GKPeerPickerController alloc] init];
        self.peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby | GKPeerPickerConnectionTypeOnline;
        self.peerPicker.delegate = self;
        [self.peerPicker show];
    }
}

//设置会话属性回调
- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type
{
    if (self.session != nil) {
        return self.session;
    }
    
    self.session = [[GKSession alloc] initWithSessionID:D_SessionID_My
                                            displayName:nil
                                            sessionMode:GKSessionModePeer];
    self.session.delegate = self;
    return self.session;
}

//联机成功回调
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
{
    self.session = session;
    [self.session setDataReceiveHandler:self withContext:nil];
    self.myPeerId = peerID;
    self.isConnected = YES;
    [picker dismiss];
}

//取消联机
- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{
    //此处可以进行取消联机后的处理,可以什么都不做。
}

//停止联机
- (void)stopConnection
{
    if (self.isConnected == YES) {
        
        [self.session disconnectFromAllPeers];
        self.session = nil;
        self.myPeerId = nil;
        self.isConnected = NO;
    }
}

//设备的联机状态改变回调
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
    NSString *peerName = [session displayNameForPeer:peerID];
    if (peerName == nil) {
        peerName = peerID;
    }
    switch (state) {
        case GKPeerStateConnected:
        {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil
                                                                message:[NSString stringWithFormat:@"%@进入会话",peerName]
                                                               delegate:nil
                                                      cancelButtonTitle:@"知道了"
                                                      otherButtonTitles: nil];
            [alertView show];
            
            if ([self.delegate respondsToSelector:@selector(isConnection)]) {
                
                [self.delegate isConnection];
            }
        }
            break;
        case GKPeerStateDisconnected:
        {
            self.isConnected = NO;
            [self stopConnection];
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil
                                                                message:[NSString stringWithFormat:@"会话结束"]
                                                               delegate:nil
                                                      cancelButtonTitle:@"知道了"
                                                      otherButtonTitles: nil];
            [alertView show];
            
            if ([self.delegate respondsToSelector:@selector(isUnConnection)]) {
                
                [self.delegate isUnConnection];
            }
        }
            break;
            
        default:
            break;
    }
}

- (void)hidePicker
{
    if (self.peerPicker.isVisible) {
        
        [self.peerPicker dismiss];
    }
}

//收到其它设备的连接请求回调
- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID
{
    [session acceptConnectionFromPeer:peerID error:nil];
}

//和其他设备连接发生错误回调
- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error
{
    
}

//GKSession内部发生错误回调
- (void)session:(GKSession *)session didFailWithError:(NSError *)error
{
    
}

#pragma mark 收发信息相关方法
//发送消息
- (void)sendData:(NSData *)data
{
    [self startConnection];
    NSError *error;
    BOOL sendOk = [self.session sendDataToAllPeers:data
                                      withDataMode:GKSendDataReliable
                                             error:&error];
    if (sendOk == NO) {
        NSLog(@"传送信息失败,原因如下/n%@", error);
    }
}

//接收消息
- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context
{
    if ([self.delegate respondsToSelector:@selector(receiveData: UserName:)]) {
        
        NSString *userName = [session displayNameForPeer:peer];
        if (userName == nil || userName.length == 0) {
            
            userName = peer;
        }
        
        [self.delegate receiveData:data UserName:userName];
    }
}

@end


© 著作权归作者所有

共有 人打赏支持
粉丝 90
博文 67
码字总数 13285
作品 0
徐汇
NFC Shield For pcDuino

NFC shield是基于NXP PN532芯片、兼容arduino接口的一个NFC模块,可以很简的在arduino和pcDuino上实现NFC功能的扩展。 NFC简介 NFC是Near Field Communication缩写,即近距离无线通讯技术。由...

pc朵拉
2013/11/30
578
0
iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计

iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计 一、引言 本系列博客将系统的介绍一款蓝牙对战五子棋的开发思路与过程,其中的核心部分有两个,一部分是蓝牙通讯中对战双方...

珲少
2016/03/21
586
0
介绍常用的WiFi,蓝牙,3G/4G等物联网通讯架构

现在所有的云端的物联网平台和设备之间的通讯,本质上都是建构在TCP/IP协议之上的,只是对数据包的再封装而已,基于此我们可以是用WiFi,4G来实现设备和云平台的通讯,不过设备与设备之间的通...

昇润科技
06/25
0
0
J2me蓝牙打印开发

Java代码 String url = servRecord.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false); StreamConnection conn = (StreamConnection)Connector.open(url); DataOutputStream ......

长平狐
2012/08/29
122
0
iOS开发之蓝牙通讯

iOS开发之蓝牙通讯 一、引言 蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的CoreBluetooth.framework进行统一管理。通过...

珲少
2015/12/20
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部