(区别说明:iOS使用的GCDAsyncUdpSocket获取的UDP消息一次是一条,安卓的UDP消息是以列表的形式返回)
一,UDP 初始化
RCT_EXPORT_METHOD(initUDPWithPort:(NSString *)port callback:(RCTResponseSenderBlock)callback)
{
Socket *socket = [Socket sharedInsance];
socket.delegate = self;
socket.delegateQueue = _methodQueue;
NSError *error;
[socket bindToPort:(uint16_t)port.intValue?(uint16_t)port.intValue:CLIENTPORT error:&error];
if (error) {
NSLog(@"客户端绑定失败");
callback(@[@"UDP客户端绑定失败"]);
} else {
NSLog(@"客户端绑定成功");
callback(@[@"UDP客户端绑定成功"]);
}
[socket beginReceiving:nil];
}
二,UDP 发送
#pragma mark - UDP 发送
- (void)sendUDPMessage:(NSString *)port wifiName:(NSString *)name wifiPassword:(NSString *)password
{
NSDate *confromTimesp = [NSDate date];
NSDateFormatter *dateFormat=[[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@"yyyyMMddHHmmss"];
NSString* date=[dateFormat stringFromDate:confromTimesp];
NSString* wifiName = [@""m3"" stringByReplacingCharactersInRange:NSMakeRange(1, 2) withString:name];
//同个局域网内,发送Wi-Fi信息
NSDictionary *wifi = @{
@"SSID": wifiName,//@""m3""
@"PWD": password,//@"chen9107jq"
@"KeyType":@ "AES",
@"AuthMode": @"WPA2PSK"
};
NSDictionary *data = @{
@"type":@"SetDevWifiArg",
@"data":wifi.mj_JSONString,
@"result":@"req",
@"date":date,
};
NSData *sendData = data.mj_JSONData;
Socket *socket = [Socket sharedInsance];
socket.delegate = self;
socket.delegateQueue = _methodQueue;
// 发送广播设置
NSError *error;
[socket enableBroadcast:YES error:&error];
[socket sendData:sendData
toHost:IPAddress
port:(uint16_t)port.intValue?(uint16_t)port.intValue:SERVERPORT
withTimeout:1000
tag:200];
}
三,UDP收到消息发送消息给RN(这里涉及原生发送通知给RN,参考《原生和RN之间的通知》)
-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext {
[[EventEmitterManager manger]udpSocket:sock didReceiveData:data fromAddress:address withFilterContext:filterContext];
}