iOS-使用SoftAP完成与智能硬件的交互

首先要说一声抱歉,昨天在写完bonjour的时候应该加把劲把这篇也写好的,但是……渣渣向你丢来了一个dota2,你感到时光飞逝,dota2效果拔群。


呃,总而言之,先说一下SoftAP的概念吧。
根据百度知道的说法,SoftAP模式是一种通过无线网卡,使用专用软件在PC上实现AP功能的技术,它可以取代无线网络中的AP(Access Point,无线接入点),从而会降低无线组网的成本。也就是可以把载体作为无线接入点,让电脑、手机或者其他上网设备的无线网连接到载体上,然后通过载体的网络(GPRS或者3G)上网。
浅显地来说,一个设备可以发出Wi-Fi信号,从而让其他手机啊电脑啊什么的连到它的Wi-Fi上去,达到局域网的效果,然后,利用局域网就可以联机……啊不,开发功能了。
我需要实现的功能也是跟上一篇一样,在将wifi账号密码交付给智能硬件的同时获取它的mac地址。
没错,同样的功能,两种实现方式。
在很多以交互为概念的领域中,这是非常重要的,毕竟,当你只有一种方法达成目的时总会有用户因为各种原因而没办法如你想象的一样走在你设计的路上,那么,在这个时候,多一条路就是不错的解决办法。
那么,在DEMO之前你需要了解两样东西,一是,让智能硬件如下图这样:

wifi列表.png

让它的wifi信号显示在手机的wifi列表中并不属于我们的范畴中,这是硬件工程师的工作,所以,如果你们的智能硬件没有这样的功能就不用往下看了。
二是,我们需要一个socket,是的,不管是ios自带的socket还是第三方的asyncsocket(大部分情况下最好使用asyncsocket,它的代码观赏性总是比原生的更佳,更何况,谁不喜欢异步呢?)

如果是第一次接触socket的同学也不必担心,前人插下的大树早已形成一片绿荫,无论是fuck baidu还是fuck google你都能在第一页找到你需要的完备代码,细细研读半个小时就能心领神会。

总而言之,你对asyncsocket的封装代码后露出头的需要有以下几个部分

@interface BSSocketServe : NSObject
//一个连接成功后的block回调,当然,代理或者其他什么随便啦,你要用通知我都没意见。
@property(copy,nonatomic)void (^CallBackBlock)(BOOL Success);
//一个信息回调,这个需要与你们的硬件工程师协定,当硬件得到它想要的数据后返回给你什么,这里我得到的是mac地址。
@property(copy,nonatomic)void (^MessageBlock)(NSString *message);

//单例或者其他你认为更好的选择
+(instancetype)shareSocketServe;
//开始连接吧,切记在正确的环境下连接,不然你很可能得不到想要的结果。
-(void)startSocket;
//通常,我们需要切断连接的方法。
-(void)cutOffSocket;
//whatever
- (void)sendMessage:(id)message;
-(void)sendSSID:(NSString *)ssid AndPWD:(NSString *)pwd;
@end

然后它们的实现是这样的

#import "BSSocketServe.h"
#import "AsyncSocket.h"

//你想要与之对话对象的ip地址以及它的端口号,在与硬件交流中通常是固定的,但你也可以从外界去取它。
#define HOST @"20.16.1.1"
#define PORT 21601
#define TIME_OUT 20

typedef enum {
    SocketOffLineByServe ,
    SocketOffLineByUser ,
    SocketOffLineByWiFiCut
}SocketOffLineBy;



@interface BSSocketServe ()<AsyncSocketDelegate>
@property(strong,nonatomic)AsyncSocket *socket;
@end
@implementation BSSocketServe


+(instancetype)shareSocketServe{
    static BSSocketServe * socket = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        socket = [[[self class] alloc]init];
    });
    return socket;
}
//开始连接
-(void)startSocket{
    self.socket = [[AsyncSocket alloc]initWithDelegate:self];
    [self.socket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
    if (![self SocketOpen:HOST port:PORT]) {
    }
}
//切断连接
-(void)cutOffSocket{
    [self.socket disconnect];
}
-(NSInteger)SocketOpen:(NSString *)addr port:(NSInteger)port{
    if (![self.socket isConnected]) {
        NSError *error = nil;
        [self.socket connectToHost:addr onPort:port withTimeout:TIME_OUT error:&error];
    }
    return 0;
}
//asyncsocket的代理方法,当你成功连接时它会调用这个方法
-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
 //    NSLog(@"成功连接");
    self.CallBackBlock(YES);
}
-(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err{
    NSLog(@" willDisconnectWithError %ld   err = %@",sock.userData,[err description]);
    if (err.code == 57) {
        self.socket.userData = SocketOffLineByWiFiCut;
    }
}
-(void)onSocketDidDisconnect:(AsyncSocket *)sock{
    NSLog(@"7878 sorry the connect is failure %ld",sock.userData);
    if (sock.userData == SocketOffLineByUser) {
        // 服务器掉线,重连
        [self startSocket];
    }
    else if (sock.userData == SocketOffLineByUser) {
        
        // 如果由用户断开,不进行重连
        return;
    }else if (sock.userData == SocketOffLineByWiFiCut) {
        
        // wifi断开,不进行重连
        return;
    }   
}
   //向服务器发送数据
-(void)sendMessage:(id)message
{
    if ([message isKindOfClass:[NSString class]]) {
        NSData *cmdData = [message dataUsingEncoding:NSASCIIStringEncoding];
        [self.socket writeData:cmdData withTimeout:-1 tag:1];
    }else{
        [self.socket writeData:message withTimeout:-1 tag:1];
    }
}
//对ssid以及pwd再包装后发送信息
-(void)sendSSID:(NSString *)ssid AndPWD:(NSString *)pwd{
    //对数据的再处理自行决定,请不要忘记调用上方的sendMessage
}

//发送消息成功之后回调
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
{
    //读取消息
    [self.socket readDataWithTimeout:-1 buffer:nil bufferOffset:0 maxLength:1024 tag:0];
}

//接受消息成功之后回调
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    self.MessageBlock(str);
}

@end

好了,准备工作结束了,我的工作也就几近完成了,接下来只需要

//你总是可以将它简化成三目运算符
         if "你处于硬件为你提供的wifi网络中时"{
                BSSocketServe.shareSocketServe().startSocket()
            }else{
                "提示用户选择硬件的wifi网络"
            }

//如果连接成功,向硬件发送它想知道的东西
            BSSocketServe.shareSocketServe().CallBackBlock = { (Success:Bool) ->() in
                if Success{
                    BSSocketServe.shareSocketServe().sendSSID(ssid, andPWD: pwd)
                }else{
                    print("连接失败")
                }
            }

//在信息回调里处理你得到的信息
            BSSocketServe.shareSocketServe().MessageBlock = {[weak self] (message) in
               self?.MAC = self?.getMacAdress(message)
                BSSocketServe.shareSocketServe().cutOffSocket()
            }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容

  • 作者:梅增杨 班级:1402019 学号:14020199039 【嵌牛导读】:802.11ax又称为「高效率无...
    mi_1581阅读 5,209评论 0 3
  • CocoaAsyncSocket支持tcp和udp。其中: AsyncSocket类是支持TCP的 AsyncUd...
    郑军红阅读 1,534评论 0 2
  • 云满弥天月桂香,金风抚槛润离肠。 几簇海棠娇艳艳,篱黯,叶黄秋菊落繁霜。 嘉庆中秋人闹闹,堪笑,月明今夜我独伤。 ...
    懦愚阅读 318评论 5 10
  • 曾经,我们是那样的知识青年,上知天文下知地理…… 经典古诗词分分钟溜溜的背诵出来; 函数虐我千百遍,我待函数...
    雨文青争阅读 421评论 11 2
  • 夜色已经完全降临,但现在整个杭州——或者说整个地球——仍然是一片拥挤和沸腾。到处都是人,焦躁的人群中不时爆发出一阵...
    oldj阅读 209评论 0 0