server implementation

master
esterTion 2020-02-29 22:17:26 +08:00
parent adef11266d
commit 59a0d9bd92
5 changed files with 136 additions and 9 deletions

View File

@ -12,6 +12,7 @@
1968E72C24086C2200784829 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1968E72A24086C2200784829 /* Main.storyboard */; };
1968E72E24086C2B00784829 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1968E72D24086C2B00784829 /* Assets.xcassets */; };
1968E73424086C2B00784829 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1968E73324086C2B00784829 /* main.m */; };
19F13E2A240A6F2200809B83 /* SocketDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 19F13E29240A6F2200809B83 /* SocketDelegate.m */; };
D023549DD3B09C46EBA2E321 /* libPods-Brokenithm-iOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A7EE02147010843456A2152 /* libPods-Brokenithm-iOS.a */; };
/* End PBXBuildFile section */
@ -25,6 +26,8 @@
1968E72D24086C2B00784829 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
1968E73224086C2B00784829 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
1968E73324086C2B00784829 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
19F13E22240A683200809B83 /* SocketDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SocketDelegate.h; sourceTree = "<group>"; };
19F13E29240A6F2200809B83 /* SocketDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SocketDelegate.m; sourceTree = "<group>"; };
259804D4CC006A58255BC938 /* Pods-Brokenithm-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Brokenithm-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Brokenithm-iOS/Pods-Brokenithm-iOS.release.xcconfig"; sourceTree = "<group>"; };
5A7EE02147010843456A2152 /* libPods-Brokenithm-iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Brokenithm-iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B78B36B35C6A90E4F71F84B4 /* Pods-Brokenithm-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Brokenithm-iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Brokenithm-iOS/Pods-Brokenithm-iOS.debug.xcconfig"; sourceTree = "<group>"; };
@ -71,6 +74,8 @@
1968E72D24086C2B00784829 /* Assets.xcassets */,
1968E73224086C2B00784829 /* Info.plist */,
1968E73324086C2B00784829 /* main.m */,
19F13E22240A683200809B83 /* SocketDelegate.h */,
19F13E29240A6F2200809B83 /* SocketDelegate.m */,
);
path = "Brokenithm-iOS";
sourceTree = "<group>";
@ -186,6 +191,7 @@
1968E72924086C2200784829 /* ViewController.m in Sources */,
1968E73424086C2B00784829 /* main.m in Sources */,
1968E72624086C2200784829 /* AppDelegate.m in Sources */,
19F13E2A240A6F2200809B83 /* SocketDelegate.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -0,0 +1,26 @@
//
// SocketDelegate.h
// Brokenithm-iOS
//
// Created by ester on 2020/2/29.
// Copyright © 2020 esterTion. All rights reserved.
//
#ifndef SocketDelegate_h
#define SocketDelegate_h
@class ViewController;
#import <UIKit/UIKit.h>
#import <CocoaAsyncSocket/GCDAsyncSocket.h>
#import "ViewController.h"
@interface SocketDelegate : NSObject {
GCDAsyncSocket *server;
NSMutableArray *connectedSockets;
}
@property ViewController *parentVc;
@end
#endif /* SocketDelegate_h */

View File

@ -0,0 +1,78 @@
//
// SocketDelegate.m
// Brokenithm-iOS
//
// Created by ester on 2020/2/29.
// Copyright © 2020 esterTion. All rights reserved.
//
#import "SocketDelegate.h"
@interface SocketDelegate ()
@end
@implementation SocketDelegate
- (id)init {
server = [[GCDAsyncSocket alloc] initWithDelegate:(id)self delegateQueue:dispatch_get_main_queue()];
{
NSError *error = nil;
if (![server acceptOnPort:24864 error:&error]) {
NSLog(@"error creating server: %@", error);
return nil;
}
}
connectedSockets = [[NSMutableArray alloc] initWithCapacity:1];
return [super init];
}
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket {
@synchronized(connectedSockets)
{
[connectedSockets addObject:newSocket];
}
NSLog(@"got connection");
NSString *initResponse = @"\x03WEL";
NSData *initResp = [initResponse dataUsingEncoding:NSASCIIStringEncoding];
[newSocket writeData:initResp withTimeout:-1 tag:0];
[newSocket readDataToLength:1 withTimeout:5 tag:0];
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag {}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
switch (tag) {
case 0: {
// length
[sock readDataToLength:((uint8_t*)data.bytes)[0] withTimeout:1 tag:1];
break;
}
case 1: {
// data
if (data.length < 3) {
[sock disconnect];
return;
}
NSData *msgData = [data subdataWithRange:NSMakeRange(0, 3)];
NSString *message = [[NSString alloc] initWithData:msgData encoding:NSASCIIStringEncoding];
if ([message isEqualToString:@"LED"] && data.length >= 99) {
NSLog(@"received led update");
NSData *led = [data subdataWithRange:NSMakeRange(3, 96)];
[self.parentVc updateLed:led];
}
[sock readDataToLength:1 withTimeout:5 tag:0];
}
}
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {
if (sock != server)
{
NSLog(@"connection ended");
@synchronized(connectedSockets)
{
[connectedSockets removeObject:sock];
}
}
}
@end

View File

@ -6,10 +6,21 @@
// Copyright © 2020 esterTion. All rights reserved.
//
#pragma once
@class SocketDelegate;
#import <UIKit/UIKit.h>
#import <CocoaAsyncSocket/GCDAsyncSocket.h>
#import "SocketDelegate.h"
@interface ViewController : UIViewController
@interface ViewController : UIViewController {
SocketDelegate *server;
}
@property UIView *airIOView;
@property UIView *sliderIOView;
@property CAGradientLayer *ledBackground;
-(void)updateLed:(NSData*)rgbData;
@end

View File

@ -10,17 +10,21 @@
@interface ViewController ()
@property UIView *airIOView;
@property UIView *sliderIOView;
@property CAGradientLayer *ledBackground;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// network permission
{
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://captive.apple.com/"]];
[NSURLConnection sendAsynchronousRequest:req
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *resp, NSData *data, NSError *error) {}];
}
CGRect screenSize = [UIScreen mainScreen].bounds;
float screenWidth = screenSize.size.width;
float screenHeight = screenSize.size.height;
@ -30,8 +34,6 @@
self.sliderIOView = [[UIView alloc] initWithFrame:CGRectMake(0, offsetY, screenWidth, sliderHeight)];
[self.view addSubview:self.airIOView];
[self.view addSubview:self.sliderIOView];
//self.airIOView.backgroundColor = [UIColor blueColor];
//self.sliderIOView.backgroundColor = [UIColor redColor];
self.ledBackground = [CAGradientLayer layer];
self.ledBackground.frame = CGRectMake(0, 0, screenWidth, sliderHeight);
[self.sliderIOView.layer addSublayer:self.ledBackground];
@ -67,11 +69,15 @@
[self.sliderIOView addSubview:sliderInput];
}
server = [[SocketDelegate alloc] init];
server.parentVc = self;
NSLog(@"server created");
dispatch_async(dispatch_get_main_queue(), ^(){
char ledDataChar[32*3] = {0,254,254,0,254,254,0,254,254,0,0,0,254,254,254,254,254,254,254,254,254,0,0,0,10,10,10,10,10,10,10,10,10,0,0,0,0,254,128,0,254,128,0,254,128,0,254,128,0,254,128,0,254,128,0,254,128,0,0,0,0,0,254,0,0,254,0,0,254,0,0,254,0,0,254,0,0,0,0,0,254,0,0,254,0,0,254,0,0,254,0,0,254,0,0,0};
NSData *ledData = [NSData dataWithBytes:ledDataChar length:32*3];
[self updateLed:ledData];
NSLog(@"displayed demo led");
});
}