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]; // 每次接发数据都需要加上
}