需求
本地化:在內(nèi)網(wǎng)的情況下瓣铣,客戶也可以控制設(shè)備电谣,并且在App上顯示狮辽。
需要在外網(wǎng)情況下登陸過App淳衙,將賬號下的網(wǎng)關(guān)和網(wǎng)關(guān)下在線的設(shè)備保存在本地。
使用CocoaAsyncSocket進行開發(fā)
github下載地址CocoaAsyncSocket
可以通過CocoaPods進行導(dǎo)入配置也可以通過手動導(dǎo)入
通過UDP接收到的信息進行TCP連接網(wǎng)關(guān)
使用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;
// 根據(jù)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]; // 每次接發(fā)數(shù)據(jù)都需要加上
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err{
#判斷是因為什么原因關(guān)閉宠能,如果是退出App關(guān)閉或者切換外網(wǎng)關(guān)閉無需處理,如果是其他情況關(guān)閉磁餐,就進行重連
NSLog(@"TCP連接關(guān)閉:%@",err);
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
// 接收到信息违崇,解析信息阿弃,處理
NSLog(@"TCP接收到的信息:%@",data);
[_tcpSocket readDataWithTimeout:-1 tag:0]; // 每次接發(fā)數(shù)據(jù)都需要加上
}
4>發(fā)送信息
- (void)tcpSendMessageWithData:(NSData *)data{
[_tcpSocket writeData:data withTimeout:-1 tag:0]; // 發(fā)送信息
[_tcpSocket readDataWithTimeout:-1 tag:0]; // 每次接發(fā)數(shù)據(jù)都需要加上
}