我正在制作一个应用程序来发送UDP
数据包,以便打开一个LED bulb
.当我连接到由Ad-hoc
创建的创建时,我已经能够执行所有操作Wifi bridge
.
现在,我想配置Wifi bridge
它,以便它可以连接到我的主路由器.我有AT命令设置来执行此过程,但不知何故,我无法收到Wifi bridge
我发送给它的命令的响应.
程序如下: -
步骤1:将UDP消息发送到LAN广播IP地址"10.10.100.255"和端口48899 =>"Link_Wi-Fi"
LAN上的所有Wifi网桥都将响应其详细信息.回复是"10.10.100.254,ACCF232483E8"
步骤2 :(可选择更改wifi网桥上的设置):然后将"+ ok"发送到LimitlessLED Wifi Bridge.将UDP消息发送到从步骤1"10.10.100.254"=>"+ ok"返回的响应IP地址
发送UDP包的代码如下
-(void)configureWifi{
counter++;
NSString *host = @"10.10.100.255";
if ([host length] == 0)
{
[self logError:@"Address required"];
return;
}
int port = 48899; //[portField.text intValue];
if (port <= 0 || port > 65535)
{
[self logError:@"Valid port required"];
return;
}
NSString *msg = @"Link_Wi-Fi";
NSData …
Run Code Online (Sandbox Code Playgroud) 我在网络上有一个设备通过UDP组播一个非常小的文件.我正在开发的iOS应用程序负责读取这些数据包,我选择使用GCDAsyncUdpSocket来执行此操作.该文件每半秒发送一次,但我几乎没有经常收到它(大约每3-10秒接收一次).
认为这可能是设备的问题,我开始使用Wireshark监控流量.这似乎反映了我在我的应用程序中看到的内容,直到我在Wireshark中启用"监控模式",此时每个UDP数据包都被捕获.此外,iOS模拟器开始接收所有丢失的数据包,因为它与我正在开发的Mac共享NIC.
有没有办法在iOS设备上启用"监控模式"或者我缺少哪些可以让丢失的数据包进入?我还看到GCDAsyncUdpSocket中有一个readStream方法.也许我需要使用它而不是beginReceiving?虽然如果是这样的话,我不知道如何在Objective-C中设置流.
这是我现在的测试代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"View Loaded");
[self setupSocket];
}
- (void)setupSocket
{
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![udpSocket bindToPort:5555 error:&error])
{
NSLog(@"Error binding to port: %@", error);
return;
}
if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){
NSLog(@"Error connecting to multicast group: %@", error);
return;
}
if (![udpSocket beginReceiving:&error])
{
NSLog(@"Error receiving: %@", error);
return;
}
NSLog(@"Socket Ready");
} …
Run Code Online (Sandbox Code Playgroud) 我想从OBD2 Wifi启用的适配器读取和写入数据,该适配器用于读取汽车数据和故障代码.为此,我使用GGCDAsyncSocket库进行套接字连接.
您可以下载CocoaAsyncSocket Library源代码
但它几乎保持连接10秒,有时40-50秒,然后终止.
日志显示:
套接字断开连接:错误域= NSPOSIXErrorDomain代码= 57"操作无法完成.套接字未连接"UserInfo = 0x14cd50 {}
任何帮助或想法将不胜感激!
提前致谢 !
请看下面的代码:
- (void)connectObdKeyHost:(NSString*)strHost port:(NSString *)strPort {
[gcdAsyncSocket connectToHost:strHost onPort:portNo withTimeout:30 error:&error];
}
// GCDAsyncSocket Delegate Methods
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
NSLog(@"Socket connected : ");
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"Socket disconnected : %@",err);
}
Run Code Online (Sandbox Code Playgroud) 我试图简单地使用GCDAsyncSocket发送和接收消息,但无法使其工作.
我正在成功建立连接并写入消息,但是当涉及到阅读时,我的委托从未被调用过.
我正在使用ios5和这个设置:
客户:
-(void) connectToHost:(HostAddress*)host{
NSLog(@"Trying to connect to host %@", host.hostname);
if (asyncSocket == nil)
{
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err = nil;
if ([asyncSocket connectToHost:host.hostname onPort:host.port error:&err])
{
NSLog(@"Connected to %@", host.hostname);
NSString *welcomMessage = @"Hello from the client\r\n";
[asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];
[asyncSocket readDataWithTimeout:-1 tag:0];
}else
NSLog(@"%@", err);
}
}
Run Code Online (Sandbox Code Playgroud)
不调用Delegate didReadData方法
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSLog(@"MESSAGE: %@", [NSString stringWithUTF8String:[data bytes]]);
}
Run Code Online (Sandbox Code Playgroud)
服务器
-(void)viewDidLoad{
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
connectedSockets …
Run Code Online (Sandbox Code Playgroud) 我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.
当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.
是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).
我正在开发一个应用程序,我需要使用OBD连接器一次更新多个值,如Engine RPM,Speed等参数.我需要实现异步命令/响应.为此,我使用[gcdAsyncSocket writeData:data withTimeout:-1 tag:uniqueTag];
异步标签异步发送命令.
但是当调用gcdAsync的委托方法"socketDidReadDatawithTag"时,它会返回数据,但它不正确.如果我已发送一个命令"010C\r"(读取RPM)和"010D\r"(速度),则使用Tag分别为263和264,如果我用socketDidReadDatawithTag中的标签264解析响应,有时它会返回RPM的数据.(我的响应混乱或OBD设备无法处理异步响应)
NSLog(@"Command Sent for Async : %@",commandString);
NSData *data = [commandString dataUsingEncoding:NSASCIIStringEncoding];
long obdObjectTag = [obdObject getPIDTag];//Unique Tag
[gcdAsyncSocket writeData:data withTimeout:-1 tag:obdObjectTag];
NSData *readData = [@">" dataUsingEncoding:NSASCIIStringEncoding];
[gcdAsyncSocket readDataToData:readData withTimeout:-1 tag:obdObjectTag];
Run Code Online (Sandbox Code Playgroud)
并且socketdidReadDatawithTag
数据和标签不匹配.
每次按下发送按钮但客户端第一次收到消息时,客户端都会发送消息.服务器有什么问题
服务器:
- (void)viewDidLoad
{
[super viewDidLoad];
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err = nil;
if (![asyncSocket acceptOnPort:10000 error:&err]){
NSLog(@"Error in acceptOnPort:error: -> %@", err);
}
}
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
NSLog(@"Accepted new socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);
self.asyncSocket = newSocket;
NSString *welcomMessage = @"Hello from the server\r\n";
[self.asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];
[self.asyncSocket readDataWithTimeout:-1 tag:0];
}
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"MSG: %@",msg);
}
Run Code Online (Sandbox Code Playgroud)
客户:
- …
Run Code Online (Sandbox Code Playgroud) 首先,我必须说我在日期和时间设置中设置了自动设置,并且每个设备的时区是相同的.所以我用它[NSDate date]
来获取时间戳,以毫秒为单位,然后编码NSData
并发送到另一台设备.接收器数据正在被解码并用新的减去[NSDate date]
.这样我就可以获得发送和接收消息所需的总时间.我被认为是因为当发送者是iPhone 4 iOS6而接收者是iPhone 5 iOS7时接收者比发送者有更早的时间戳.我不知道为什么?[NSData date]
对于那种操作,也许不是最可靠的类?我GCDAsyncUdpSocket
用于发送/接收UDP.
代码发送者
NSData *data2 = [self createRandomNSData:8192];
NSMutableData *dataToSend =[NSMutableData data];
[dataToSend appendBytes:&tag length:sizeof(int)];
long long currentTimeStamp = (long long)([[NSDate date] timeIntervalSince1970]*1000.0);
[dataToSend appendBytes:¤tTimeStamp length:sizeof(long long)];
[dataToSend appendData:data2];
NSLog(@"%i || %lld || %lu",tag, currentTimeStamp,(unsigned long)[dataToSend length]);
[_udpSocket sendData:dataToSend toHost:@"230.0.0.1" port:_port withTimeout:-1 tag:tag];
tag++;
Run Code Online (Sandbox Code Playgroud)
代码接收器
char* dataBytes = [data bytes];
int inTag;
long long inCurrentTimeStamp;
[data getBytes:&inTag length:sizeof(int)];
[data getBytes:&inCurrentTimeStamp range:NSMakeRange(sizeof(int), sizeof(long long))];
long …
Run Code Online (Sandbox Code Playgroud) 我想打开一个基于ELM327芯片的OBD加密狗的TCP连接.所以我决定使用GCDAsyncSocket库.我写了这段代码,
import UIKit
import CocoaAsyncSocket
class ViewController: UIViewController, GCDAsyncSocketDelegate {
let addr = "192.168.0.10"
let port:UInt16 = 35000
var socket:GCDAsyncSocket!
override func viewDidLoad() {
super.viewDidLoad()
socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
do {
try socket.connectToHost(addr, onPort: port)
} catch let e {
print(e)
}
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func connect(sender: AnyObject) {
print("Clicked")
} …
Run Code Online (Sandbox Code Playgroud) 我正在使用CocoaAsyncSocket尝试创建TCP隧道/ mux/demux,通过端口对(A < - > B)转发所有连接.写入端口A的所有内容都应该从端口B"出来",反之亦然.我只能使用端口A和B,无法打开其他端口.
我正在创建2监听AsyncSockets
A和B,并有2个连接客户端阵列,并在
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
if (sock.localPort == B.localPort)
{
for (AsyncSocket * cl in clientsOfA)
{
[cl writeData:data withTimeout:-1 tag:0];
[cl readDataWithTimeout:-1 tag:0];
}
[sock readDataWithTimeout:-1 tag:0];
}
我在端口AI上读到的所有内容都将发送给端口B的所有客户端,反之亦然.在A的一侧有一个Safari,向A提出请求.
我的问题是:当数据从B端口返回时,在A端我有5个客户端(谢谢Safari ...),我不知道哪一个最初请求当前数据包,所以我发送数据到他们所有人......好吧......一切都搞砸了.
这种多路复用器/多路复用器能否以这种方式实现?或者实现这一目标的正确方法是什么?我怎样才能区分发起客户?
gcdasyncsocket ×10
ios ×8
objective-c ×4
sockets ×4
iphone ×3
tcp ×2
udp ×2
asynchronous ×1
cocoa ×1
eventmachine ×1
ios5 ×1
multicast ×1
nsdate ×1
obd-ii ×1
swift ×1
wireshark ×1