ios 藍芽
搞下藍芽,集合下:
gamekit ios裝置間使用
和藍芽裝置外設 External Accessory
低電 ble 使用CoreBluetooth
EA:
和配件進行通訊
在iPhone OS 3.0及之後的系統上,External Accessory框架(ExternalAccessory.framework
)提供了一種管道機制,使應用程式可以和iPhone或iPod
touch裝置的配件進行通訊。通過這種管道,應用程式開發者可以將配件級別的功能整合到自己的程式中。
ExternalAccessory.framework
加入到Xcode工程,並連線到相應的目標中。此外,還需要在相應的原始碼檔案的頂部包含一個#import
<ExternalAccessory/ExternalAccessory.h>
語句,才能訪問該框架的類和標頭檔案。有關如何為工程新增框架的更多資訊,請參見Xcode工程管理指南中的工程中的檔案部分;有關External
Accessory框架中類的一般資訊,請參見External
Accessory框架參考。配件的基礎
在和配件進行通訊之前,需要與配件的製造商緊密合作,理解配件提供的服務。製造商必須在配件的硬體中加入顯式的支援,才能和iPhone OS進行通訊。作為這種支援的一部分,配件必須支援至少一種命令協議,也就是支援一種定製的通訊模式,使配件和應用程式之間可以進行資料傳輸。蘋果並不維護一個協議的登錄檔,支援何種協議及是否使用其他製造商支援的定製或標準協議是由製造商自行決定的。
作為和配件製造商通訊的一部分,您必須找出給定的配件支援什麼協議。為了避免名字空間發生衝突,協議的名稱由反向的DNS字串來指定,形式是com.apple.myProtocol
。這使得每個配件製造商都可以根據自己的需要定義協議,以支援不同的配件產品線。
應用程式通過開啟一個使用指定協議的會話來和配件進行通訊。開啟會話的方法是建立一個EASession
類的例項,該類中包含NSInputStream
和NSOutputStream
物件,可以和配件進行通訊。通過這些流物件,應用程式可以向配件傳送未經加工的資料包,以及接收來自配件的類似資料包。因此,您必須按照期望的協議來理解每個資料包的格式。
宣告應用程式支援的協議
能夠和配件通訊的應用程式應該在其Info.plist
檔案中宣告支援的協議,使系統知道在相應的配件接入時,該應用程式可以被啟動。如果當前沒有應用程式可以支援接入的配件,系統可以選擇啟動App Store並指向支援該裝置的應用程式。
為了宣告支援的協議,您必須在應用程式的Info.plist
檔案中包含UISupportedExternalAccessoryProtocols
鍵。該鍵包含一個字串陣列,用於標識應用程式支援的通訊協議。您的應用程式可以在這個列表中以任意順序包含任意數量的協議。系統並不使用這個列表來確定應用程式應該選擇哪個協議,而只是用它來確定應用程式是否能夠和相應的配件進行通訊。您的程式碼需要在開始和配件進行對話時選擇適當的通訊協議。
在執行時連線配件
在配件接入系統並做好通訊準備之前,通過External Accessory框架無法看到配件。當配件變為可見時,您的應用程式就可以獲取相應的配件物件,然後用其支援的一或多個協議開啟會話。
共享的EAAccessoryManager
物件為應用程式尋找與之通訊的配件提供主入口點。該類包含一個已經接入的配件物件的陣列,您可以對其進行列舉,看看是否存在應用程式支援的配件。EAAccessory
物件中的絕大多數資訊(比如名稱、製造商、和型號資訊)都只是用於顯示。如果您要確定應用程式是否可以連線一個配件,必須看配件的協議,確認應用程式是否支援其中的某個協議。
對於給定的配件物件,每次只能有一個指定協議的會話。EAAccessory
物件的protocolStrings
屬性包含一個字典,字典的鍵是配件支援的協議。如果您試圖用一個已經在使用的協議建立會話,External
Accessory框架就會產生錯誤。
程式清單8-1展示瞭如何檢查接入配件的列表並從中取得應用程式支援的第一個配件。它為指定的協議建立一個會話,並對會話的輸入和輸出流進行配置。在這個方法返回會話物件時,已經完成和配件的連線,並可以開始傳送和接收資料了。
程式清單8-1 建立和配件的通訊會話
- (EASession *)openSessionForProtocol:(NSString *)protocolString
|
{
|
NSArray *accessories = [[EAAccessoryManager sharedAccessoryManager]
|
connectedAccessories];
|
EAAccessory *accessory = nil;
|
EASession *session = nil;
|
|
for (EAAccessory *obj in accessories)
|
{
|
if ([[obj protocolStrings] containsObject:protocolString])
|
{
|
accessory = obj;
|
break;
|
}
|
}
|
|
if (accessory)
|
{
|
session = [[EASession alloc] initWithAccessory:accessory
|
forProtocol:protocolString];
|
if (session)
|
{
|
[[session inputStream] setDelegate:self];
|
[[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
|
forMode:NSDefaultRunLoopMode];
|
[[session inputStream] open];
|
[[session outputStream] setDelegate:self];
|
[[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]
|
forMode:NSDefaultRunLoopMode];
|
[[session outputStream] open];
|
[session autorelease];
|
}
|
}
|
|
return session;
|
}
|
在配置好輸入輸出流之後,最好一步就是處理和流相關的資料了。程式清單8-2展示了在委託方法中處理流事件的基本程式碼結構。清單中的方法可以響應來自配件輸入輸出流的事件。當配件嚮應用程式傳送資料時,事件發生表示有資料可供讀取;類似地,當配件準備好接收應用程式資料時,也通過事件來表示(當然,您並不一定要等到這個事件發生才向流寫出資料,應用程式也可以呼叫流的hasBytesAvailable
方法來確認配件是否還能夠接收資料)。有關流及如何處理流事件的更多資訊,請參見Cocoa流程式設計指南。
程式清單8-2 處理流事件
// Handle communications from the streams.
|
- (void)stream:(NSStream*)theStream handleEvent:(NSStreamEvent)streamEvent
|
{
|
switch (streamEvent)
|
{
|
case NSStreamHasBytesAvailable:
|
// Process the incoming stream data.
|
break;
|
|
case NSStreamEventHasSpaceAvailable:
|
// Send the next queued command.
|
break;
|
|
default:
|
break;
|
}
|
|
}
|
監控與配件有關的事件
當配件接入或斷開時,External Accessory框架都可以傳送通告。但是這些通告並不自動傳送,如果您的應用程式感興趣,必須呼叫EAAccessoryManager類的registerForLocalNotifications方法來顯式請求。當配件接入、認證、並準備好和應用程式進行互動時,框架可以發出一個EAAccessoryDidConnectNotification
通告;而當配件斷開時,框架則可以傳送一個EAAccessoryDidDisconnectNotification
通告。您可以通過預設的NSNotificationCenter
來註冊接收這些通告。兩種通告都包含受影響的配件的資訊。
除了通過預設的通告中心接收通告之外,當前正在和配件進行互動的應用程式可以為相應的EAAccessory
物件分配一個委託,使它在發生變化的時候得到通知。委託物件必須遵循EAAccessoryDelegate
協議,該協議目前包含名為accessoryDidDisconnect:
的可選方法,您可以通過這個方法來接收配件斷開通告,而不需要事先配置通告觀察者。
相關文章
- iOS 藍芽iOS藍芽
- iOSBluetooth(藍芽)iOS藍芽
- iOS藍芽開發iOS藍芽
- MASA MAUI Plugin IOS藍芽低功耗(三)藍芽掃描UIPluginiOS藍芽
- iOS藍芽開發 Bluetooth藍芽CoreBluetooth 藍芽中心裝置的實現 藍芽外設的實現 有DemoiOS藍芽
- iOS 藍芽開發 - swift版iOS藍芽Swift
- iOS 藍芽開發·基礎篇iOS藍芽
- iOS藍芽4.0(BLE)開發(一)iOS藍芽
- [轉載]ios藍芽開發學習筆記(四)ios藍芽應用的後臺處理iOS藍芽筆記
- iOS藍芽Mesh開發總結一iOS藍芽
- iOS藍芽Mesh開發總結二iOS藍芽
- iOS藍芽4.0開發基礎教程iOS藍芽
- 藍芽藍芽
- iOS 藍芽4.0開發使用(內附Demo)iOS藍芽
- iOS-BLE藍芽開發持續更新iOS藍芽
- Android藍芽使用詳解(普通藍芽)Android藍芽
- 藍芽模組藍芽模組
- Android藍芽那點事——深入瞭解藍芽BlE藍芽 《總結篇》Android藍芽
- Android藍芽協議-藍芽掃描 startDiscoveryAndroid藍芽協議
- 藍芽HFP 藍芽電話剖析(二) --- AT command集合藍芽
- ESP32藍芽學習--藍芽概念學習藍芽
- java+藍芽Java藍芽
- 藍芽4.0 BLE藍芽
- 白色藍芽耳機藍芽
- iOS藍芽開發CoreBlueTooth庫核心方法使用介紹iOS藍芽
- MASA MAUI Plugin 安卓藍芽低功耗(一)藍芽掃描UIPlugin安卓藍芽
- 熊晨灃藍芽實戰--小程式藍芽連線2.0藍芽
- 藍芽工作流程藍芽
- 藍芽之九-AT命令藍芽
- 低功耗藍芽(5)藍芽
- 低功耗藍芽(2)藍芽
- 低功耗藍芽(3)藍芽
- 藍芽學習1藍芽
- BLE低功耗藍芽藍芽
- 藍芽耳機怎麼恢復中文模式 藍芽耳機調不了中文藍芽模式
- GJLightBlueTooth——一個輕量級的iOS藍芽開發庫iOS藍芽
- iOS之BLE藍芽SDK開發個人總結(進階篇)iOS藍芽
- iOS之BLE藍芽SDK開發個人總結(基礎篇)iOS藍芽