智能升降桌-UDP廣播和TCP鏈接

? ? ? ?其實(shí)整個(gè)項(xiàng)目最不好理解的就是app端和硬件的交互怖竭,因?yàn)榭蛻舳撕苌倩厝ソ佑|底層的東西毙替,所以開始會(huì)覺得不知所措可岂,接下跟大家分享一下具體流程错敢。

? ? ? ?首先,我們接入了一個(gè)第三方缕粹,叫ESPTouch,把客戶端所連接的WIFI信息發(fā)送給硬件稚茅,需要把WIFI的SSID和SECURT發(fā)送給硬件,用到的朋友可以去官網(wǎng)下個(gè)demo平斩。

// 獲取WIFI信息

#import <SystemConfiguration/CaptiveNetwork.h>

- (NSDictionary *)WIFIDic{

NSArray *ifs = (id)CFBridgingRelease(CNCopySupportedInterfaces());

NSLog(@"%s: Supported interfaces: %@", __func__, ifs);

for (NSString *ifnam in ifs) {

_WIFIDic = (id)CFBridgingRelease(CNCopyCurrentNetworkInfo((CFStringRef)ifnam));

//? ? ? ? NSLog(@"%s: %@ => %@", __func__, ifnam, _WIFIDic);

if (_WIFIDic && [_WIFIDic count]) {

break;

} ??}

NSLog(@"wifi信息? %@? ",_WIFIDic);

return _WIFIDic ; ? }

然后峰锁,在鏈接成功的方法中發(fā)送UDP廣播,給大家推薦一個(gè)很好用的第三方pod "CocoaAsyncSocket";

.h文件中:

<GCDAsyncUdpSocketDelegate>

self.updSuccess = NO;

self.udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

NSError * error = nil;

//? ? [_udpSocket bindToPort:46000 error:&error];? //? 綁定端口 若客戶端只向服務(wù)端發(fā)送消息而不用接收到其他的udp消息就可以不用綁定端口

[self.udpSocket enableBroadcast:YES error:&error]; //? 啟用廣播

if (error) {//監(jiān)聽錯(cuò)誤打印錯(cuò)誤信息

NSLog(@"error:%@",error);

}else {//監(jiān)聽成功則開始接收信息

[_udpSocket receiveOnce:&error];

}

NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];

if (!self.updTimers) {

self.updTimers = [NSTimer scheduledTimerWithTimeInterval:2 repeats:YES block:^(NSTimer * _Nonnull timer) {

if (self.updSuccess == YES) {

[self.updTimers invalidate];

self.updTimers = nil;

}else{

//data 需要發(fā)送的信息 ?host IP地址 ?port 端口號(hào)

[_udpSocket sendData:data toHost:host port:port withTimeout:10 tag:0];

} ? ?}]; ? ?}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag{

NSLog(@"發(fā)送信息成功");

}

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error{

NSLog(@"發(fā)送信息失敗 %@",error);

}

#pragma mark? --------------------UDP廣播的回調(diào)----------------------------

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext{

self.updSuccess = YES;

NSString * ip = [GCDAsyncUdpSocket hostFromAddress:address];

uint16_t port = [GCDAsyncUdpSocket portFromAddress:address];

//? ? NSString * message = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

if (!data || [data length] == 0) {

return;

}

// 十六進(jìn)制轉(zhuǎn)字符串

NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];

[data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {

unsigned char *dataBytes = (unsigned char*)bytes;

for (NSInteger i = 0; i < byteRange.length; i++) {

NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];

if ([hexStr length] == 2) {

[string appendString:hexStr];

} else {

[string appendFormat:@"0%@", hexStr]; } ?}

}];

NSLog(@"接收到服務(wù)端的消息:ip:%@? port:%d? message:%@",ip,port,string);

if ([self.delegate respondsToSelector:@selector(clientSocketDidReceiveMessage:andPort:withHost:)]) {

[self.delegate clientSocketDidReceiveMessage:string andPort:port withHost:ip];

}

[self.udpSocket receiveOnce:nil];

}

這就好了双戳,UPD完成虹蒋,,然后在回調(diào)方法中發(fā)送TC:

.h文件中:<GCDAsyncSocketDelegate>

//將GCDAsynSocket設(shè)置為全局變量

self.tcpSocket = [[GCDAsyncSocket alloc] initWithDelegate:self? delegateQueue:dispatch_get_main_queue()];

NSError *error = nil;

[self.tcpSocket connectToHost:servesIP onPort:port error:&error];

[self.tcpSocket writeData:[message dataUsingEncoding:NSUTF8StringEncoding] withTimeout:5 tag:101];

[self.tcpSocket readDataWithTimeout:5 tag:0];

//withTimeout: 超時(shí)時(shí)間 -1? 表示不超時(shí)

//tag: 一個(gè)標(biāo)識(shí)

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{

NSLog(@"鏈接成功");

}

// 服務(wù)器返回?cái)?shù)據(jù)

- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData *)data withTag:(long)tag {

self.tcpIsSuccess = YES;

// 十六進(jìn)制轉(zhuǎn)字符串

NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];

[data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {

unsigned char *dataBytes = (unsigned char*)bytes;

for (NSInteger i = 0; i < byteRange.length; i++) {

NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];

if ([hexStr length] == 2) {

[string appendString:hexStr];

} else {

[string appendFormat:@"0%@", hexStr]; ? } ? } ? ?}];

[self.delegate tcpSocketDicReceiveMessage:string];

[self.tcpSocket readDataWithTimeout:5 tag:0];

}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err {

NSLog(@"已經(jīng)斷開連接!");

if (self.tcpIsSuccess == NO) {

[self.delegate tcpConnectError]; ? }

[self.tcpSocket readDataWithTimeout:5 tag:0]; ? }

如果飒货,回調(diào)成功魄衅,恭喜你,app與硬件交互完成了塘辅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晃虫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扣墩,更是在濱河造成了極大的恐慌哲银,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻惕,死亡現(xiàn)場(chǎng)離奇詭異荆责,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)亚脆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門做院,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人濒持,你說(shuō)我怎么就攤上這事键耕。” “怎么了柑营?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屈雄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我官套,道長(zhǎng)酒奶,這世上最難降的妖魔是什么蓖议? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮讥蟆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺阔。我一直安慰自己瘸彤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布笛钝。 她就那樣靜靜地躺著质况,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玻靡。 梳的紋絲不亂的頭發(fā)上结榄,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音囤捻,去河邊找鬼臼朗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝎土,可吹牛的內(nèi)容都是我干的视哑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼誊涯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挡毅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起暴构,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跪呈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后取逾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耗绿,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年砾隅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缭乘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琉用,死狀恐怖堕绩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邑时,我是刑警寧澤奴紧,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站晶丘,受9級(jí)特大地震影響黍氮,放射性物質(zhì)發(fā)生泄漏唐含。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一沫浆、第九天 我趴在偏房一處隱蔽的房頂上張望捷枯。 院中可真熱鬧,春花似錦专执、人聲如沸淮捆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)攀痊。三九已至,卻和暖如春拄显,著一層夾襖步出監(jiān)牢的瞬間苟径,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工躬审, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棘街,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓承边,卻偏偏與公主長(zhǎng)得像蹬碧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炒刁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容