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è)備等等(金融刷卡器诗赌、心電測量器)
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ā)送照片
演練步驟:
基于照片選擇項(xiàng)目進(jìn)行擴(kuò)展钮蛛,僅從照片庫選擇照片
添加GameKit框架
創(chuàng)建對等連接
3.1 實(shí)例化對端選擇器
3.2 設(shè)置代理鞭缭,并遵循協(xié)議
3.3 顯示對端選擇器
- 連接建立代理方法
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)
濕度傳感器(Moisture Sensor)
濕度傳感器跟其他基于微電子的傳感器不同甸饱,是一個(gè)簡單的物理傳感器
簡單來說沦童,濕度傳感器就是一張遇水變紅的試紙
Apple的維修人員就是通過檢測試紙是否變紅仑濒,來判斷設(shè)備是否進(jìn)水
(設(shè)備進(jìn)水不在保修范圍之內(nèi))
距離傳感器的使用
開啟距離感應(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ì)步器
加速計(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è)軸上的加速度
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)速度值箩溃,更重要的是,蘋果在其中集成了很多牛逼的算法
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);
搖一搖
監(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