重點(diǎn) (三十一) : 藍(lán)牙/傳感器

iOS中藍(lán)牙的實(shí)現(xiàn)方案

iOS中提供了4個(gè)框架用于實(shí)現(xiàn)藍(lán)牙連接

GameKit.framework(用法簡單)

只能用于iOS設(shè)備之間的連接眯牧,多用于游戲(比如五子棋對戰(zhàn))舔清,從iOS7開始過期

MultipeerConnectivity.framework

只能用于iOS設(shè)備之間的連接锤灿,從iOS7開始引入,主要用于文件共享(僅限于沙盒的文件)

ExternalAccessory.framework

可用于第三方藍(lán)牙設(shè)備交互瘪吏,但是藍(lán)牙設(shè)備必須經(jīng)過蘋果MFi認(rèn)證(國內(nèi)較少)

CoreBluetooth.framework(時(shí)下熱門)

可用于第三方藍(lán)牙設(shè)備交互铃彰,必須要支持藍(lán)牙4.0

硬件至少是4s,系統(tǒng)至少是iOS6

藍(lán)牙4.0以低功耗著稱歇式,一般也叫BLE(Bluetooth Low Energy)

目前應(yīng)用比較多的案例:運(yùn)動手壞驶悟、嵌入式設(shè)備、智能家居

GameKit的藍(lán)牙開發(fā)步驟

顯示可以連接的藍(lán)牙設(shè)備列表

GKPeerPickerController*ppc = [[GKPeerPickerController
alloc] init];

ppc.delegate =self;

[ppc show];

在代理方法中監(jiān)控藍(lán)牙的連接

  • (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {

    NSLog(@"連接到設(shè)備:%@", peerID);

    關(guān)閉藍(lán)牙設(shè)備顯示界面

    [picker dismiss];

    設(shè)置接收到藍(lán)牙數(shù)據(jù)后的監(jiān)聽器

    [session setDataReceiveHandler:self withContext:nil];

    保存session

    self.session = session;

}

GameKit的藍(lán)牙開發(fā)步驟

處理接收到的藍(lán)牙數(shù)據(jù)

  • (void) receiveData:(NSData *)data fromPeer:(NSString
    *)peer inSession: (GKSession *)session
    context:(void *)context {

}

利用GKSession給其他設(shè)備發(fā)送數(shù)據(jù)

給指定的連接設(shè)備發(fā)送數(shù)據(jù)

  • (BOOL)sendData:(NSData *) data toPeers:(NSArray
    *)peers withDataMode:(GKSendDataMode)mode
    error:(NSError **)error;

給所有連接的設(shè)備發(fā)送數(shù)據(jù)

  • (BOOL)sendDataToAllPeers:(NSData
    *) data withDataMode:(GKSendDataMode)mode
    error:(NSError **)error;

GameKit的藍(lán)牙開發(fā)注意

只能用于iOS設(shè)備之間的連接

只能用于同一個(gè)應(yīng)用程序之間的連接

最好別利用藍(lán)牙發(fā)送比較大的數(shù)據(jù)

Core Bluetooth

Core Bluetooth測試比較麻煩材失,正常情況下痕鳍,得至少有2臺真實(shí)的藍(lán)牙4.0設(shè)備

如何讓iOS模擬器也能測試藍(lán)牙4.0程序?

買一個(gè)CSR藍(lán)牙4.0 USB適配器,插在Mac上

在終端輸入sudo nvram
bluetoothHostControllerSwitchBehavior="never"

重啟Mac

用Xcode 4.6調(diào)試代碼笼呆,將程序跑在iOS 6.1的模擬器上

(蘋果把iOS 7.0模擬器對BLE的支持移除掉了)

Core Bluetooth的使用場景

運(yùn)動手環(huán)熊响、智能家居、嵌入式設(shè)備等等(金融刷卡器诗赌、心電測量器)

1.png

Core Bluetooth的基本常識

每個(gè)藍(lán)牙4.0設(shè)備都是通過服務(wù)(Service)和特征(Characteristic)來展示自己的

一個(gè)設(shè)備必然包含一個(gè)或多個(gè)服務(wù)汗茄,每個(gè)服務(wù)下面又包含若干個(gè)特征

特征是與外界交互的最小單位

比如說,一臺藍(lán)牙4.0設(shè)備铭若,用特征A來描述自己的出廠信息洪碳,用特征B來收發(fā)數(shù)據(jù)

服務(wù)和特征都是用UUID來唯一標(biāo)識的,通過UUID就能區(qū)別不同的服務(wù)和特征

設(shè)備里面各個(gè)服務(wù)(service)和特征(characteristic)的功能叼屠,均由藍(lán)牙設(shè)備硬件廠商提供瞳腌,比如哪些是用來交互(讀寫),哪些可獲取模塊信息(只讀)等

Core Bluetooth的開發(fā)步驟

建立中心設(shè)備

掃描外設(shè)(Discover Peripheral)

連接外設(shè)(Connect Peripheral)

掃描外設(shè)中的服務(wù)和特征(Discover Services And Characteristics)

利用特征與外設(shè)做數(shù)據(jù)交互(Explore And Interact)

斷開連接(Disconnect)

藍(lán)牙的現(xiàn)狀

絕大多數(shù)智能手機(jī)支持藍(lán)牙 4.0(BLE)

藍(lán)牙芯片發(fā)展迅速镜雨,在性能和效率方面都有很大提高嫂侍,且不斷變得更小更便宜

iBeacon + 藍(lán)牙,前景一片光明

應(yīng)用之一:室內(nèi)導(dǎo)航

Estimote公司為iBeacon提供基站

3個(gè)iBeacon基站的預(yù)購價(jià)格為99美元(約合人民幣610元)

Estimote公司推出的iBeacon基站的最遠(yuǎn)傳輸距離為50m冷离,但是他們推薦在10m范圍內(nèi)的使用效果最好

一塊紐扣電池就能為一個(gè)iBeacon基站提供長達(dá) 2 年的使用壽命吵冒,而且是在設(shè)備不斷對外發(fā)射信號的情況下

藍(lán)牙通訊:

GameKit框架簡介

使用GameKit框架,可以在游戲中增加對等連接西剥,又稱對端連接或點(diǎn)對點(diǎn)連接痹栖,Peer To Peer。

使用GameKit框架中的對等網(wǎng)絡(luò)連接API瞭空,可以在游戲玩家之間建立一個(gè)對等網(wǎng)絡(luò)揪阿,并在游戲/應(yīng)用實(shí)例之間交換數(shù)據(jù)。

GameKit框架可以使用藍(lán)牙在玩家之間創(chuàng)建網(wǎng)絡(luò)咆畏,玩家甚至不需要連接到互聯(lián)網(wǎng)南捂,就可以彼此對戰(zhàn)。

通過藍(lán)牙實(shí)現(xiàn)對等網(wǎng)絡(luò)連接

為玩家雙方呈現(xiàn)一個(gè)GKPeerPickerController旧找,提供了一個(gè)標(biāo)準(zhǔn)的用戶界面連接兩臺設(shè)備

ViewControoler遵循GKPeerPickerControllerDelegate協(xié)議溺健,處理來自GKPeerPickerController(對端選擇器)的信息

建立連接后,使用GKSession類可以向?qū)Χ嗽O(shè)備發(fā)送數(shù)據(jù)

在receiveData:fromPeer:inSession:context代理方法中編寫代碼來處理接收到的數(shù)據(jù)

藍(lán)牙對等網(wǎng)絡(luò)演練——發(fā)送照片(1)

演練目標(biāo):通過藍(lán)牙彼此發(fā)送照片

演練步驟:

  1. 基于照片選擇項(xiàng)目進(jìn)行擴(kuò)展钮蛛,僅從照片庫選擇照片

  2. 添加GameKit框架

  3. 創(chuàng)建對等連接

3.1 實(shí)例化對端選擇器

3.2 設(shè)置代理鞭缭,并遵循協(xié)議

3.3 顯示對端選擇器

  1. 連接建立代理方法

peerPickerController:didConnectPeer:toSession:

4.1記錄對端連接會話

4.2
設(shè)置數(shù)據(jù)接收處理

4.3
關(guān)閉對端選擇器

藍(lán)牙對等網(wǎng)絡(luò)演練——發(fā)送照片(2)

發(fā)送數(shù)據(jù)方法

[_peerSession
sendDataToAllPeers:data withDataMode:GKSendDataReliable
error:&error];

接收數(shù)據(jù)方法

  • (void)receiveData:(NSData
    *)data fromPeer:(NSString *)peer inSession:
    (GKSession *)session context:(void *)context;

藍(lán)牙對等網(wǎng)絡(luò)——發(fā)送自定義對象

如果要通過網(wǎng)絡(luò)發(fā)送自定義對象,需要使用NSKeyedArchiver方法歸檔自定義對象魏颓,然后再發(fā)送歸檔后的NSData

自定義對象需要遵從NSCoding協(xié)議岭辣,并實(shí)現(xiàn)相應(yīng)的歸檔和恢復(fù)方法

接收端接收到數(shù)據(jù)之后,使用NSKeyedUnarchiver方法恢復(fù)數(shù)據(jù)

傳感器

什么是傳感器

傳感器是一種感應(yīng)\檢測周圍環(huán)境的一種裝置, 目前已經(jīng)廣泛應(yīng)用于智能手機(jī)上

傳感器的作用

用于感應(yīng)\檢測設(shè)備周邊的信息

不同類型的傳感器, 檢測的信息也不一樣

iPhone中的下面現(xiàn)象都是由傳感器完成的

在地圖應(yīng)用中, 能判斷出手機(jī)頭面向的方向

一關(guān)燈, iPhone會自動調(diào)整屏幕的亮度

打電話時(shí), 人臉貼近iPhone屏幕時(shí), 屏幕會自動鎖屏

... ...

傳感器的類型

iPhone內(nèi)置的傳感器有

運(yùn)動傳感器\加速度傳感器\加速計(jì)(Motion/Accelerometer
Sensor)

環(huán)境光傳感器(Ambient Light Sensor)

距離傳感器(Proximity Sensor)

磁力計(jì)傳感器(Magnetometer Sensor)

內(nèi)部溫度傳感器(Internal Temperature Sensor)

濕度傳感器(Moisture Sensor)

陀螺儀(Gyroscope)

2.png

3.png

4.png

5.png

濕度傳感器(Moisture Sensor)

濕度傳感器跟其他基于微電子的傳感器不同甸饱,是一個(gè)簡單的物理傳感器

簡單來說沦童,濕度傳感器就是一張遇水變紅的試紙

Apple的維修人員就是通過檢測試紙是否變紅仑濒,來判斷設(shè)備是否進(jìn)水

(設(shè)備進(jìn)水不在保修范圍之內(nèi))


6.png

7.png

8.png

距離傳感器的使用

開啟距離感應(yīng)功能

[UIDevice
currentDevice].proximityMonitoringEnabled
= YES;

監(jiān)聽距離感應(yīng)的通知

[[NSNotificationCenter
defaultCenter]
addObserver:self

selector:@selector(proximityChange:)

name:UIDeviceProximityStateDidChangeNotification

object:nil];

  • (void)proximityChange:(NSNotification *)notification {

    if ([UIDevice currentDevice].proximityState== YES) {

NSLog(@"某個(gè)物體靠近了設(shè)備屏幕"); 屏幕會自動鎖住

} else {

NSLog(@"某個(gè)物體遠(yuǎn)離了設(shè)備屏幕"); 屏幕會自動解鎖

}

}

加速計(jì)

加速計(jì)的作用

用于檢測設(shè)備的運(yùn)動(比如搖晃)

加速計(jì)的經(jīng)典應(yīng)用場景

搖一搖

計(jì)步器

1.png

加速計(jì)程序的開發(fā)

加速計(jì)程序的開發(fā)

在iOS4以前:使用UIAccelerometer,用法非常簡單(到了iOS5就已經(jīng)過期)

從iOS4開始:CoreMotion.framework

雖然UIAccelerometer已經(jīng)過期偷遗,但由于其用法極其簡單墩瞳,很多程序里面都還有殘留

UIAccelerometer的使用步驟

獲得單例對象

UIAccelerometer*accelerometer = [UIAccelerometer
sharedAccelerometer];

設(shè)置代理

accelerometer.delegate =self;

設(shè)置采樣間隔

accelerometer.updateInterval = 1.0/30.0; 1秒鐘采樣30次

實(shí)現(xiàn)代理方法

  • (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration

acceleration中的x、y鹦肿、z三個(gè)屬性分別代表每個(gè)軸上的加速度

2.png

Core Motion

在iOS4之前矗烛,加速度計(jì)由UIAccelerometer類來負(fù)責(zé)采集數(shù)據(jù)

隨著iPhone4的推出

加速度計(jì)全面升級,并引入了陀螺儀

與Motion(運(yùn)動)相關(guān)的編程成為重頭戲

蘋果特地在iOS4中增加了專門處理Motion的框架-CoreMotion.framework

Core Motion不僅能夠提供實(shí)時(shí)的加速度值和旋轉(zhuǎn)速度值箩溃,更重要的是,蘋果在其中集成了很多牛逼的算法

3.png

Core Motion的使用步驟(push)

創(chuàng)建運(yùn)動管理者對象

CMMotionManager*mgr = [[CMMotionManager
alloc] init];

判斷加速計(jì)是否可用(最好判斷)

if
(mgr.isAccelerometerAvailable) {

 加速計(jì)可用

}

設(shè)置采樣間隔

mgr.accelerometerUpdateInterval = 1.0/30.0; 1秒鐘采樣30次

開始采樣(采樣到數(shù)據(jù)就會調(diào)用handler碌嘀,handler會在queue中執(zhí)行)

  • (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler;

Core Motion的使用步驟(pull)

創(chuàng)建運(yùn)動管理者對象

CMMotionManager*mgr = [[CMMotionManager
alloc] init];

判斷加速計(jì)是否可用(最好判斷)

if (mgr.isAccelerometerAvailable) {
加速計(jì)可用 }

開始采樣

  • (void)startAccelerometerUpdates;

在需要的時(shí)候采集加速度數(shù)據(jù)

CMAccelerationacc = mgr.accelerometerData.acceleration;

NSLog(@"%f, %f,%f", acc.x, acc.y, acc.z);

4.png

搖一搖

監(jiān)控?fù)u一搖的方法

方法1:通過分析加速計(jì)數(shù)據(jù)來判斷是否進(jìn)行了搖一搖操作(比較復(fù)雜)

方法2:iOS自帶的Shake監(jiān)控API(非常簡單)

判斷搖一搖的步驟:實(shí)現(xiàn)3個(gè)搖一搖監(jiān)聽方法

檢測到搖動

  • (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent*)event

搖動取消(被中斷)

  • (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent*)event

搖動結(jié)束

  • (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent*)event
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涣旨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子股冗,更是在濱河造成了極大的恐慌霹陡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件止状,死亡現(xiàn)場離奇詭異烹棉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怯疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門浆洗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人集峦,你說我怎么就攤上這事伏社。” “怎么了塔淤?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵摘昌,是天一觀的道長。 經(jīng)常有香客問我高蜂,道長聪黎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任备恤,我火速辦了婚禮稿饰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烘跺。我一直安慰自己湘纵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布滤淳。 她就那樣靜靜地躺著梧喷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铺敌,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天泪酱,我揣著相機(jī)與錄音,去河邊找鬼插佛。 笑死两疚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弯囊。 我是一名探鬼主播痰哨,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匾嘱!你這毒婦竟也來了斤斧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤霎烙,失蹤者是張志新(化名)和其女友劉穎撬讽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悬垃,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡游昼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尝蠕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烘豌。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖趟佃,靈堂內(nèi)的尸體忽然破棺而出扇谣,到底是詐尸還是另有隱情,我是刑警寧澤闲昭,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布罐寨,位于F島的核電站,受9級特大地震影響序矩,放射性物質(zhì)發(fā)生泄漏鸯绿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一簸淀、第九天 我趴在偏房一處隱蔽的房頂上張望瓶蝴。 院中可真熱鬧,春花似錦租幕、人聲如沸舷手。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽男窟。三九已至盆赤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歉眷,已是汗流浹背牺六。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汗捡,地道東北人淑际。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像扇住,于是被迫代替她去往敵國和親春缕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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