iOS智能家居

iOS 智能家居 TCP连接网关

2017-04-15  本文已影响98人  诠释残缺

需求
本地化:在内网的情况下,客户也可以控制设备,并且在App上显示。

需要在外网情况下登陆过App,将账号下的网关和网关下在线的设备保存在本地。

使用CocoaAsyncSocket进行开发

github下载地址CocoaAsyncSocket
可以通过CocoaPods进行导入配置也可以通过手动导入

通过UDP接收到的信息进行TCP连接网关

使用GCDAsyncSocket

1>准备工作
#import "GCDAsyncSocket.h"
<GCDAsyncSocketDelegate>
{
//    TCP连接
    NSString *tcpIPSTR;
    UInt16 tcpPort;
}
2>建立TCP连接
#pragma mark -建立TCP连接
- (void)tcpReconnect{
    
    [_tcpSocket disconnect];
    _tcpSocket = nil;
    _tcpSocket.delegate = nil;
    
    _tcpSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    NSError *error;
   //  根据IP地址和端口号进行TCP连接
    if (![_tcpSocket connectToHost:tcpIPSTR onPort:tcpPort error:&error]) {
        NSLog(@"错误:%@",error.description);
    }else {
        NSLog(@"TCP打开端口%@,%hu",tcpIPSTR,tcpPort);
    }
}
3>GCDAsyncSocketDelegate 代理方法
#pragma mark -GCDAsyncSocketDelegate
  //  连接成功
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)ports{

    NSLog(@"TCP连接成功IP:%@ ,端口号:%hu", host, ports);
  //  接受信息
    [_tcpSocket readDataWithTimeout:-1 tag:0];  //  每次接发数据都需要加上
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err{
    
#判断是因为什么原因关闭,如果是退出App关闭或者切换外网关闭无需处理,如果是其他情况关闭,就进行重连
    NSLog(@"TCP连接关闭:%@",err);
}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    
  //  接收到信息,解析信息,处理
    NSLog(@"TCP接收到的信息:%@",data);
    [_tcpSocket readDataWithTimeout:-1 tag:0];  //  每次接发数据都需要加上
}
4>发送信息
- (void)tcpSendMessageWithData:(NSData *)data{

        [_tcpSocket writeData:data withTimeout:-1 tag:0];  //  发送信息
        [_tcpSocket readDataWithTimeout:-1 tag:0];  //  每次接发数据都需要加上
}
上一篇下一篇

猜你喜欢

热点阅读