iOS socket 发送16进制
项目中用到了socket 所以和大家分享一下。
首先我们需要在项目导入GCDAsyncSocket,这个网上的下载地址很多。
创建tcp socket 实现代理GCDAsyncSocketDelegate
- (void) createClientTcpSocket {
dispatch_queue_t dQueue = dispatch_queue_create("client tdp socket", NULL);
// 1. 创建一个 socket用来和服务端进行通讯
sendTcpSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dQueue socketQueue:nil];
// 2. 连接服务器端. 只有连接成功后才能相互通讯 如果60s连接不上就出错 超时时间自己设置
[self connectSevers];
}
-(void)connectSevers{
NSString *host = @"your host";
uint16_t port = @"your port";
[sendTcpSocket connectToHost:host onPort:port withTimeout:60 error:nil];
}
#pragma mark - 代理方法表示连接成功/失败 回调函数
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
NSLog(@"连接成功");
[sock readDataWithTimeout:-1 tag:200];
//成功后的操作
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
NSLog(@"连接失败 %@", err);
dispatch_sync(dispatch_get_main_queue(), ^{
[MBProgressHUD showError:@"连接失败" toView:nil];
});
// 断线重连
//[self connectSevers];
}
#pragma mark - 消息发送成功 代理函数
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag {
NSLog(@"消息发送成功");
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
//接收到服务器返回
}
//向服务器发送指令
//传入16进制字符即ke
//处理数据 根据服务器要求 进行转换即可
- (void)sendMessageForservers:(NSString *)message {
NSString *hexString = message; //16进制字符串
int j=0;
Byte bytes[8];//根据自己的要求 设置 位数
for(int i=0;i<[hexString length];i++)
{
int int_ch; /// 两位16进制数转化后的10进制数
unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)
int int_ch1;
if(hex_char1 >= '0' && hex_char1 <='9')
int_ch1 = (hex_char1-48)*16; //// 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
else
int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97
i++;
unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)
int int_ch2;
if(hex_char2 >= '0' && hex_char2 <='9')
int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch2 = hex_char2-55; //// A 的Ascll - 65
else
int_ch2 = hex_char2-87; //// a 的Ascll - 97
int_ch = int_ch1+int_ch2;
NSLog(@"int_ch=%d",int_ch);
bytes[j] = int_ch; ///将转化后的数放入Byte数组里
j++;
}
NSData *newData = [[NSData alloc] initWithBytes:bytes length:8];//length 根据自己要求设置
[sendTcpSocket writeData:newData withTimeout:-1 tag:0];
}