iOS中的WiFi與硬件通信

WiFi通信是指手機通過WiFi與外部設備建立連接,并與外部設備進行交互、通信。手機與外部設備的WiFi通信通常是使用Socket來實現的,在這里先介紹一個第三方Socket庫(CocoaAsyncSocket)來實現WiFi通信。

CocoaAsyncSocket支持TCP和UDP,其中:

AsyncSocket類是支持TCP的;

AsyncUdpSocket類是支持UDP的。

本文是建立在硬件通過UDP廣播包廣播自身信息,手機與硬件之間通過TCP連接傳輸數據。

WiFi連接的建立

首先,通過手動連接手機WiFi至外部設備,此時可以獲取到外部WiFi的一些信息:

#import <UIKit/UIKit.h>@interface ViewController : UIViewControllertypedef void (^udpSocketBlock)(NSDictionary* dic,NSError* err);// block用于硬件返回信息的回調
@property (nonatomic,copy) udpSocketBlock udpSocketBlock;
- (void)sendUdpBoardcast:(udpSocketBlock)block;
@end
#import "ViewController.h"
#import <AsyncSocket.h>
#import <AsyncUdpSocket.h>
@interface ViewController ()<AsyncSocketDelegate,AsyncUdpSocketDelegate>
@property (nonatomic,strong) AsyncUdpSocket *udpSocket;
@property (nonatomic,strong) AsyncSocket *socket;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];
}- (void)sendUdpBoardcast:(udpSocketBlock)block{self.udpSocketBlock = block;if(!_udpSocket)_udpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];NSData *data = [NSData data];// 此處data是根據硬件要求傳參數UInt16 port = 34343;// 此處具體指需詢問硬件工程師[self.udpSocket enableBroadcast:YES error:NULL];[_udpSocket sendData:data toHost:@"255.255.255.255" port:port withTimeout:-1 tag:0];// 因為不知道具體的ip地址,所以host采用受限廣播地址
}
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{
// data 接收到的外部設備返回的數據id result = [self unpackageMessage:data]; // 對數據進行處理,此處調用的 - (id)unpackageMessage:(NSData *)data ;是根據與硬件方面協商的數據格式進行的數據處理if ([[result valueForJSONKey:@"typeid"] isEqualToString:@"xxxx"]) {self.udpSocketBlock([result valueForJSONKey:@"data"],nil);} // 判斷的到的數據是否為我們需要的數據return YES; // 發現設備后,則關閉發現通道return NO; // 不關閉發現通道,一直處于發現狀態
}
#pragma mark - udpSocket
-(void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag{}

通過調用該方法,可以得到外部設備返還的WiFi信息:

[self sendUdpBoardcast:^(NSDictionary *dic, NSError *err) {// dic為硬件返回的參數
}];

獲取硬件參數之后,需要確認手機是否已于硬件連接,直接調用方法

- (BOOL)isConnected;

若未連接,則需建立手機和硬件之間的socket連接:

- (BOOL)connectToHost:(NSString*)hostname onPort:(UInt16)port error:(NSError **)errPtr;
// hostname、port均為硬件返回的

數據的寫入和讀取

CocoaAsyncSocket提供了寫入數據和讀取數據的方法:

// 數據的寫入
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
// 數據的讀取
- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag;

數據寫入具體格式需要根據硬件要求來決定,這里提供幾種常用的數據類型轉換方法以供參考:

  • 十六進制字符串轉NSData
    -(NSData *)converHexStrToData:(NSString *)hexString {NSMutableData *data = [[NSMutableData alloc] init];unsigned char whole_byte;char byte_chars[3] = {'\0','\0','\0'};if (hexString.length%2) {//防止丟失半個bytehexString = [@"0" stringByAppendingString:hexString];}int i;for (i = 0; i < [hexString length]/2; i++) {byte_chars[0] = [hexString characterAtIndex:i * 2];byte_chars[1] = [hexString characterAtIndex:i * 2 + 1];whole_byte = strtol(byte_chars, NULL, 16);[data appendBytes:&whole_byte length:1];}return data;
    }
  • NSData轉十六進制字符串
    -(NSString *) converDataToHexString:(NSData *)data
    {if (data == nil) {return nil;}NSMutableString* hexString = [NSMutableString string];const unsigned char *p = [data bytes];for (int i=0; i < [data length]; i++) {[hexString appendFormat:@"%02x", *p++];}return hexString;
    }
  • 十六進制字符串轉普通字符串
    -(NSString *)stringFromHexString:(NSString *)hexString {char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);bzero(myBuffer, [hexString length] / 2 + 1);for (int i = 0; i < [hexString length] - 1; i += 2) {unsigned int anInt;NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];[scanner scanHexInt:&anInt];myBuffer[i / 2] = (char)anInt;}NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:4];return unicodeString;
    }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB查詢報錯:class com.mongodb.MongoSecurityException: Exception authenticating MongoCredential...

異常日志&#xff1a; 2019-05-30 10:10:24,252 [http-nio-8080-exec-1] DEBUG [java.sql.Connection] - ooo Connection Opened 2019-05-30 10:10:24,258 [http-nio-8080-exec-1] DEBUG [java.sql.PreparedStatement] - > Executing: insert into client_config ( appid, …

動態添加后的數據轉換 — 后臺接收數據

let data this.projectPersonnel.map(item > {let obj {}obj.member item.people.map(info > {return info.id})obj.member JSON.stringify(obj.member)obj.projectId idobj.teamId item.name.idreturn obj})

iOS開發--地圖與定位

iOS開發--地圖與定位 概覽 現在很多社交、電商、團購應用都引入了地圖和定位功能&#xff0c;似乎地圖功能不再是地圖應用和導航應用所特有的。的確&#xff0c;有了地圖和定位功能確實讓我們的生活更加豐富多彩&#xff0c;極大的改變了我們的生活方式。例如你到了一個陌生的地…

CTO、技術總監、首席架構師的區別

項目經理是項目的直接負責人&#xff0c;這個角色相當于一個中間接口&#xff0c;不管是團隊成員還是需求方&#xff08;客戶&#xff09;&#xff0c;或者是上級領導&#xff0c;有事都直接找他&#xff0c;所以這個職位著重 于管理與溝通。一般來說&#xff0c;項目經理的工作…

iview組件庫 - 穿梭欄設置

<Modalv-model"modal1"title"項目藥品上下架維護"width"1020":mask-closable"false"on-ok"addOk()"><Col span"36"><Selectfilterableon-change"onChangeProject"placeholder"請先…

如何優雅地使用Sublime Text3

Sublime Text&#xff1a;一款具有代碼高亮、語法提示、自動完成且反應快速的編輯器軟件&#xff0c;不僅具有華麗的界面&#xff0c;還支持插件擴展機制&#xff0c;用她來寫代碼&#xff0c;絕對是一種享受。相比于難于上手的Vim&#xff0c;浮腫沉重的Eclipse&#xff0c;VS…

題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13... 求出這個數列的前20項之和。...

題目&#xff1a;有一分數序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13... 求出這個數列的前20項之和。 程序分析&#xff1a;請抓住分子與分母的變化規律。 public class 第二十題求數列之和 {public static void mai…

iview 組件 設置頭像更換

基于iview 組件 設置頭像更換 <!-- 頭像更換 --><div style"width: 100%;height:100%;"><div style"height: 100%;"><Upload :on-success"uploadSuccess" :show-upload-list"false" accept"image/png, i…

HTML的target屬性中_blank、_self、_parent、_top含義

_blank 瀏覽器會另開一個新窗口顯示鏈接_self&#xff0c;在同一框架或窗口中打開所鏈接的文檔。 此參數為默認值&#xff0c;通常不用指定。 _parent&#xff0c;將鏈接的文件載入含有該鏈接框架的父框架集或父窗口中。 如果含有該鏈接的框架不是嵌套的&#xff0c;則在瀏覽…

Windows 聚焦的鎖屏壁紙設置為桌面壁紙

需求&#xff1a; Windows的鎖屏壁紙偶爾遇到非常喜歡的壁紙&#xff0c;想設置為桌面壁紙。 步驟如下&#xff1a; 1. “Windows 聚焦”的鎖屏壁紙都保存在隱藏文件夾 --- Assets里。 a. 打開“資源管理器 b. 在地址欄復制粘貼下方路徑后按回車鍵&#xff0c;即可快速跳轉至這…

VUE藥監碼掃描

<!-- 藥監碼 --><div class"divContent"><div class"headDiv"><div class"spanA">請掃描相關藥監碼</div></div><button class"scanBtn" clickscan_img()>掃描藥監碼</button><bu…

Chrome 控制臺的console用法收集

Chrome 控制臺console的用法 大家都有用過各種類型的瀏覽器&#xff0c;每種瀏覽器都有自己的特色&#xff0c;本人拙見&#xff0c;在我用過的瀏覽器當中&#xff0c;我是最喜歡Chrome的&#xff0c;因為它對于調試腳本及前端設計調試都有它比其它瀏覽器有過之而無不及的地方。…

面向對象思想封裝狙擊手狙擊敵人

需求&#xff1a;狙擊手xxx使用xx槍&#xff0c;射擊敵人xxx,敵人生命值歸0&#xff0c;應聲倒下分析設計類&#xff1a; 封裝狙擊手類 屬性&#xff1a; 名字 行為&#xff1a;撿槍   裝彈   射擊封裝槍類 屬性&#xff1a; 型號 行為&#xff1a;射擊封裝彈夾類 屬性&…

JavaScript 字符串處理方法總結

變量從字符串轉換成int和float型 var weightincrease "2.5kg";undefinedparseInt(weightincrease);2parseFloat(weightincrease);2.5 字符串處理方法var words "魚神是個帥哥";undefinedwords.length6words.charAt(0);"魚"words.charAt(words.…

【js】vue 2.5.1 源碼學習(二) 策略合并

一、 整體思路1 首先是代碼的大體構造&#xff0c;先判斷引入代碼的環境&#xff0c;即對應amd 和cmd的處理2 vue_init 需要借助 initMinxin >>> // 初始化選項1: 規范 2: 合并策略。3 mergeOptions 選項合并 一個或者多個對象合并&#xff0c;并且生成一個…

解決公眾號的加載問題

相關組件內設置的方法&#xff08;方法可以多處組件運用&#xff09; <x-input on-change"changeinp" on-blur"temporaryRepair();" on-enter"temporaryRepair();" name"mobile" :show-clear"false" placeholder"…

JavaScript 數組處理方法總結

數組處理方法//定義數組var array [];undefined//查看類型typeof(array);"object"//往數組里添加數據array [first,second,third]["first", "second", "third"]//數組長度array.length3//索引array[0]"first"//添加數組新…

今天第一次開通blog

紀念第一次開通轉載于:https://www.cnblogs.com/struggle-star/p/10960491.html

前端設置,驗證碼登錄

<group class"shadow" gutter"0"><x-input v-model"mobileCaptcha" placeholder"請輸入手機驗證碼" class"weui-vcode" keyboard"number" :max"6"></x-input><button click"…

JQuery實現頁面跳轉

$(function(){ var pn $("#gotopagenum").val();//#gotopagenum是文本框的id屬性 location.href "NewList.aspx?pagenum"pn;//location.href實現客戶端頁面的跳轉 }); 今天我們就來說一說如何在jQuery中跳轉到另外一個網頁HTML。其實下面我列舉的幾…