文档章节

点对点蓝牙通讯服务类

 泊竹
发布于 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
介绍常用的WiFi,蓝牙,3G/4G等物联网通讯架构

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

昇润科技
06/25
0
0
iOS简易蓝牙对战五子棋游戏设计思路之一——核心蓝牙通讯类的设计

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

珲少
2016/03/21
586
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RobotFramework之Process

Process Library version: 3.0.4 Library scope: global Named arguments: supported Introduction Robot Framework test library for running processes. This library utilizes Python's s......

海盐宝宝
3分钟前
0
0
easyui的textbox赋值问题,不能用$('#text').val('text');赋值

下面来看看easyui的各种验证框赋值的方式: <input name="text" id="text" class="easyui-numberbox" > <input name="text" id="text" class="easyui-textbox" > <input name="text" id="tex......

无小农
6分钟前
0
0
弹性工作制的魔咒

简评:你找到了一份完美的工作 —— 可以提前离开公司,还可以在晚上从家里回复邮件。既然如此,你为什么还会有那么强的负罪感呢? 或许是弹性工作制魔咒在作祟。 很多享受弹性工作制的人会始...

极光推送
13分钟前
0
0
KAFKA介绍(分布式架构)

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以...

明理萝
19分钟前
0
1
os::NodeHandle::subscribe回调函数绑定对象

void Foo::callback(const std_msgs::Empty::ConstPtr& message){}Foo foo_object;ros::Subscriber sub = handle.subscribe("my_topic", 1, &Foo::callback, &foo_object); 参考: ht......

itfanr
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部