iOS開發藍牙4.0初識

iOS開發藍牙4.0初識
轉載 2015-09-20 15:26:44
標簽:ios開發藍牙ios開發藍牙4.0ios開發藍牙連接ios開發藍牙掃描ios藍牙4.0

防丟自拍器

車載儀表盤

針灸儀設備

ANCS實現的監控來電,短信,郵箱

第一張圖片防丟自拍器已經上傳到APPSTORE,源碼已經上傳到QQ群共享460325065

要了解一項技術,最好先了解一下歷史。1994年,愛立信一位工程師,為了解除日益增多的連接線纜的煩惱,發明了一種名為藍牙的短距離無線通信技術。自2001年發布藍牙1.1版本技術規范,一群諾基亞的工程師就開始暢想,在若干年后,如何讓智能移動設備與周邊的嵌入式設備連接的時間更長,從而使得智能移動設備成為與周邊10m范圍內各種電子產品通信的中樞。經過10年的努力,藍牙技術聯盟終于在2011年發布了里程碑版本的藍牙4.0技術規范,其中最具吸引力的就是低功耗藍牙技術規范。

      在無線技術迅猛發展的今天 ,藍牙技術到底是一個什么位置,可以通過下圖做一個簡單的了解。

該圖片摘自《BLE權威教程》,我新建了一個QQ群460325065,群共享上傳了該文獻
?目前市場上影響力最大的三種無線技術,藍牙,WIFI和Zigbee。從上圖可以看出,藍牙的傳輸距離是最短的,功耗是高于Zigbee,低于WIFI。傳輸距離最短,只有2-10米,當然這是傳統藍牙,傳輸速度能達到3Mbps。如果用過諾基亞手機的人,應該知道,在那個沒有智能手機的時代,已經有了藍牙技術,而且還能用藍牙在兩個手機之間傳輸音樂和圖片。如果細心的人應該會發現,如今的智能手機,比如兩臺iPhone之間,在設置中,是無法搜索到對方。這是為什么呢?簡單的說,因為藍牙4.0技術。

     什么是藍牙 4.0 ?

該圖片摘自《BLE權威教程》,我新建了一個QQ群460325065,群共享上傳了該文獻
?從上圖我們可以發現,全新的藍牙4.0技術并不是一種技術,而是由傳統藍牙,高速藍牙和低功耗藍牙合而為一。并且這三種藍牙可以組合使用,也可以單獨使用。其中,低功耗藍牙即BLE是藍牙4.0的核心規范。毫不夸張的說,藍牙4.0為什么可以成為改變生活的原因,就是因為BLE,低功耗藍牙的產生。因為一切智能設備,都需要電,電量用完,設備就是一堆廢鐵。然而,低功耗是硬件上的事情,跟我們手機APP有什么關系,APP根本就不關心你耗電不耗電,我只寫我的客戶端就好了啊。實際上,與APP還是有關系的,正是因為有BLE和傳統藍牙,市場上是有三類藍牙產品的。如果你不知道你在為哪一類產品開發程序,你會遇到很多麻煩,比如說,老板要你用BLE傳輸音頻數據,如果你不知道傳音頻是傳統藍牙的功能,你可能會白辛苦很久而達不到效果。在舉個例子,如果老板要你監控來電短信或者郵件等其他信息,然后通過APP發送到藍牙設備。如果你不知道這是ANCS的工作,而自己傻傻的去找檢測來電短信的辦法,然后還要在程序退到后臺依然能起作用,并通過BLE發送到設備,那可能你的工作中會充滿煩惱。到最后還認為你的水平很low。

所以,作為iOS工程師,第一件事情,就是要區分你正在開發的APP是為單模藍牙,還是雙模藍牙;僅傳統藍牙是不需要APP的,譬如市面上大多數的藍牙音箱,只要連上電腦或者手機,在電腦或者手機設備上播放音樂,系統底層就可以通過傳統藍牙協議,將音頻數據傳到藍牙音箱上播放。換句話說,就是傳統藍牙部分在APP上不可控,在iOS上,更是連判斷在設置中是否連接了傳統藍牙都辦不到,iOS可控的部分只有BLE。那為什么還要區分單模,雙模呢,知道又如何,傳統藍牙部分都無法控制,原因在哪?答案在于這里說的不可控,是指在iOS上,但是在硬件上是可以知道的。我們可以通過BLE將傳統藍牙的連接狀態,以及一些其他信息指定一套協議進行溝通。當然,如果你想要實現像蘋果手表那樣的功能,在手機上有來電和短信,或者其他軟件信息提醒的時候,在你的藍牙設備上也能接收到。那這個功能的實現需要用到ANCS(Apple Notification Center Service)。ANCS在可以看成一個超級權限,但卻跟傳統藍牙工作在不同局域,一個是通知,一個是音頻。具體的實現,我們都不得而知,這部分屬于蘋果系統的功能了。從我上上個月開發過的那個ANCS產品來看,我個人的感覺ANCS目前存在一些BUG,ANCS的產品在BLE操作中,會出現斷開不了的情況,所以從這點上看,感覺ANCS是有一些BLE的成分。而從這個協議單純的理解,應該要像傳統藍牙一樣,一個單獨連接,與BLE無關才對;但是ANCS沒有像傳統藍牙一樣在設置中有一個專欄;所以,感覺從目前來說,貌似有BUG,也許目前已經解決,只是我不知道。

從上圖,我們還應該知道的是,并不是所有手機都支持藍牙4.0技術,iPhone需要4S以上的手機,安卓需要系統4.3及以上的版本。

到這里,大家應該對市面上的藍牙設備有一個大概的分類了,那如何區分,也說了 ,在iOS上區分一個設備是否包含傳統藍牙的?方法是通過查看設置中是否有傳統藍牙的連接。因為蘋果系統對用戶隱私的保護,傳統藍牙的連接,在第一次連接時,用戶必須自己手動點擊連接。后面可以通過設備在手機打開藍牙時自動連接。ANCS會在啟動時,在程序中有提示,而且這個提示框是無法去掉的。而在BLE中,有時候也會出現提示框,而這個提示框,可以在硬件上去掉。判斷BLE的方法,就是第三方APP與藍牙設備通信,就一定是BLE的功能了。據硬件工程師的說法,ANCS是涵蓋BLE和傳統藍牙功能的。而我在測試的過程中,ANCS會在手機上彈出連接的窗口,而一旦連上,BLE的連接會受到ANCS的影響。但是在BLE斷開的情況下,ANCS依然可用。由于沒辦法看到ANCS是否正常,所以也不好下結論,所以我說,也許存在BUG,所以這篇博客的名字叫藍牙4.0初識。

一般來說,從一個技術博客的角度出發,寫一篇博客的話,應該是大多數的代碼,而這篇我寫這么多不是代碼的東西,實際上,在真正的藍牙開發過程中,如果不了解這些,會產生很多疑惑,因為,從iOS藍牙開發角度說,蘋果已經幫我們把底層都封裝起來了,我們只是簡單的調用,毫不夸張的說,一個半年的新手都能在兩天之內上手,一個星期內使用。然而,并不是說你能用就能解釋清楚其中的很多狀況。從我個人來說,我是喜歡弄明白一個現象深處的東西。而弄清楚最好的辦法,就是深入了解藍牙4.0的方方面面。

在了解藍牙的歷史,什么是藍牙4.0,藍牙產品的分類,各類產品能實現什么功能,以及如何為你的需求做藍牙技術上的選擇之后,下面討論的是藍牙連接的問題。

藍牙4.0連接?中的一些小知識

說到連接,不得不重提之前兩臺iPhone手機在設置中無法發現發現對方的問題,兩臺設備,要相互知道對方,唯一的辦法,只能是至少有一個人告訴對方,我是誰。如果兩臺設備都不說話,那肯定不知道對方是藍牙設備的身份。所以,藍牙連接的過程,實際上就是一個溝通的過程,在藍牙設備中,說話是通過廣播一段無線信號實現,一臺藍牙設備是不能同時廣播和接收廣播,因為目前芯片還沒那么強大。在藍牙通信中,接收廣播的那個設備叫主機(Central),發送廣播的設備叫從機(Peripheral)。而通常手機都處在主機狀態,也就是只能接收廣播,而自己沒有向周圍發送廣播。所以兩臺手機之間一般是無法發現對方的。除非,你寫一段程序,讓手機向周圍發送廣播。目前,作為主機的設備,是可以與多個從機進行連接的,而作為從機的設備,通常只能與一個主機進行連接,通常在與一個主機相連后,設備就會關閉廣播。所以,在開發過程中,可能你的身邊有多個藍牙設備處于運行狀態,但是一個也搜索不到,那就是因為別人的手機已經連接了。然而,在藍牙設備上,并不是在連接之后就必須關閉廣播,是可以在芯片上實現讓他繼續廣播的。那是不是就能說明一臺從機就可以連接多臺主機呢?目前答案是不行。因為目前市場上,影響最大的是美國TI公司的CC2540/CC2541,以及新出來的CC2640/CC2650系列產品,目前沒有實現他作為從機時,多連的功能。從另一個角度說,主機能連接多個,從機也連接多臺設備,通信協議無疑會變得很復雜,從機發數據到底發給誰,怎么去控制他發送。單這兩個問題,就決定了藍牙設備作為從機時,只能連接一個主機。作為主機的設備,采用藍牙4.0協議的話,也不是連接任意臺設備的,經過測試,iPhone手機最多能連10臺從機,安卓手機得看手機性能,6到10臺不等。如果要連接更多的設備,在藍牙4.1;4.2中,藍牙聯盟已經在改進藍牙協議了。那實現這一點,就需要你的手機和你的藍牙設備里的芯片都支持到藍牙4.1,4.2,那無疑對手機的要求更高,用戶群更小,而市場上支持4.1和4.1藍牙協議的芯片并不多,即使有也在試驗階段,不一定穩定。而10個的連接數,已經能滿足大多數用戶的需求了,新的芯片成本肯定更高,所以在選擇支持4.1或4.2協議時,慎重。(小秘密:在做安卓測試的時候,在京東上買了多臺手機,然后7天無理由退貨,又退回去,自己只需要一些快遞費)

該圖片摘自《藍牙4.0 BLE開發完全手冊 物聯網開發技術實戰》,我新建了一個QQ群460325065,群共享上傳了該文獻
如果做過藍牙開發的人應該都知道,連接藍牙并不是百分百成功的,很可能你連上之后秒斷,仿佛沒有連接一樣。并不是程序寫的有問題,APP上確實會發生這樣的事情。根本原因在于底層藍牙協議。

?上圖就是藍牙4.0BLE協議棧,對于iOS開發人員來說,你也可以完全不用管它,但是做過安卓的同學肯定知道GATT服務器。它位于整個協議棧的最高層,與APP進行交互。在安卓開發過程中,代碼可以明確的知道APP上的BLE連接是委托GATT服務器完成的。而在iOS上,就是藍牙管理中心CBCentralManager。蘋果已經把底層都封裝起來了,這可以說是做iOS的幸福之處,也可以說是對開發者的不幸之處,因為完全不清楚為什么會這樣。

GATT服務器才是真正決定連接是否成功的關鍵。GATT在收到連接請求后,會像下繼續請求資源,而由于藍牙資源是有限的,所以并不是每一次請求都會成功,特別當你實現多連的時候,連接的越多,越容易出現連接斷開的情況。

還有一個原因,兩個設備之間是如何確定對方還處于連接狀態的呢,也是類似于一個心跳包的概念。上圖中的“有效連接間隔”。

☆短間隔的連接事件:兩設備都會以高能耗運行,高數據吞吐量,發送等到時間短

☆長間隔的連接事件:兩設備都會以低能耗運行,低數據吞吐量,發送等待時間長

如果連接過程經常斷開,可以嘗試將硬件的連接時間間隔?縮短。當然有利有弊。

?那對于這個問題,在軟件怎么解決?實際上沒法從根本上解決,只能多連幾次,可以在藍牙4.0斷開時自動重連。

藍牙的東西太多,一篇文章肯定講不清楚。篇幅過長會看的疲勞,下面講一下CODING。

?第二部分:XCODE中的操作
一.一個簡單的demo搭建?

1.用xcode建立一個project,建一個Single View Application?,給項目取個名字BleTest,我選的語言是OC。

2.?在ViewController.h頭文件中加入#import "CoreBluetooth/CoreBluetooth.h"這個頭文件,兩個委托方法<</span>CBCentralManagerDelegate,CBPeripheralDelegate>,聲明一個變量@property (strong,nonatomic) CBCentralManager * MyCentralManager;

3.?在ViewController.m的viewDidLoad方法中加入self.MyCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];?

4.在ViewController.m方法體中加入如下兩個方法

pragma mark - Navigation

  • (void)centralManagerDidUpdateState:(CBCentralManager *)central

{

switch (central.state) {

    case CBCentralManagerStateUnknown:

        break;

    case CBCentralManagerStateUnsupported:

        NSLog(@"模擬器不支持藍牙調試");

        break;

    case CBCentralManagerStateUnauthorized:

        break;

    case CBCentralManagerStatePoweredOff:

        NSLog(@"藍牙處于關閉狀態");

        break;

    case CBCentralManagerStateResetting:

        break;

    case CBCentralManagerStatePoweredOn:

? NSLog(@"藍牙已開啟");

      [self.MyCentralManager  scanForPeripheralsWithServices:nil  options:nil];?

        break;

}

}

  • (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

{

NSLog(@"能發現設備:%@",peripheral.name);

}

?5.運行程序,一個最簡單的藍牙程序就完成了

如何手機設備的藍牙已打開,在LOG消息中可以看到附近的藍牙設備。藍牙不支持模擬器調試,必須使用iPhone4S以上的真機調試。

二.實現更多功能?

1.?CBCentralManager主設管理中心,需要且必須是單例。一個程序中只能有一處,如果有兩處,并不能同時在兩處連接。我曾試過,最多只能在兩處掃描到設備。道理很簡單,在手機上,藍牙就跟相機一樣都只有一個,能同時實現兩個攝像頭拍照嗎,不能。如何解決,只能在程序中繼承,傳遞主設對象或建一個全局變量。self.MyCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];對于這個方法,第一個參數沒得說,你非要賦值為nil也可以的,再用self.MyCentralManager.delegate=self;也可以實現。第二個參數,If the value is nil, the central manager dispatches central role events using the main queue.如果設置為nil,默認在主線程中跑。

2.?CBCentralManagerDelegate委托方法,必須要實現的一個方法,- (void)centralManagerDidUpdateState:(CBCentralManager *)central用于檢測當前設備的藍牙狀態。而我通常喜歡在CBCentralManagerStatePoweredOn藍牙開啟時才開始掃描。

3.掃描的方法是[self.MyCentralManager scanForPeripheralsWithServices:nil options:nil];?這里兩個參數都是nil,也可以不用nil,那這兩個參數是什么意思呢?第一個參數是指,掃描指定的服務(Services)。第二個參數是掃描過程中的一些設置。服務是什么?打個比方,如果你需要到銀行取錢,第一步,你需要找到銀行的網點,第二步,找一個柜臺的服務員。找到網點并不能進行存錢取錢操作,但是必須找到網點,才能找到服務員,而存錢取錢操作必須在網點內進行才被允許。對應到藍牙上,服務員就是特性(characteristic),如果要進行數據的交互,只能對特性進行。一個藍牙設備,可能有多個服務,如果你只需要掃描指定的服務,就可以指定第一個參數。第二個參數,可以有很多其他設置。

停止掃描的方法[self.MyCentralManager stopScan];這個方法,通常會在重新搜索附近藍牙設備的時候用到。

實現重新掃描?,將委托再指定一次。停止掃描,同時移除數組中所有到的掃描,再開啟掃描。通常,在掃描到某一個設備后,都加入到一個數組中,以便進行連接。

-(void)seachAction{
// NSLog(@“重新搜索");
self.cbCentralMgr.delegate=self;
[self.cbCentralMgr stopScan];

if (dataArray.count) {
    [dataArray removeAllObjects];
}

NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[self.cbCentralMgr scanForPeripheralsWithServices:nil options:dic];

}
4.掃描中的設置參數:如果第二個參數為nil,掃描到設備的次數一般為兩次,就是- (void)centralManager: didDiscoverPeripheral: advertisementData: RSSI:執行的次數為兩次。而對于一些特殊的APP,如藍牙稱或者通過廣播辨別設備狀態時,需要實時接收廣播數據。那可以用CBCentralManagerScanOptionAllowDuplicatesKey,代碼為:

NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],CBCentralManagerScanOptionAllowDuplicatesKey, nil];

[self.MyCentralManager scanForPeripheralsWithServices:nil options:dic];

CBCentralManagerScanOptionSolicitedServiceUUIDsKey

An array (an instance of NSArray) of service UUIDs (represented by CBUUID objects) that you want to scan for.Specifying this scan option causes the central manager to also scan for peripherals soliciting any of the services contained in the array.這是蘋果的說明,簡單說就是給一個數組,然后掃描指定數組中的服務,這個方法跟scanForPeripheralsWithServices的第一個參數一樣的功能。而掃描只有CBCentralManagerScanOptionAllowDuplicatesKey和CBCentralManagerScanOptionSolicitedServiceUUIDsKey兩個參數可以選擇。比較有用的是第一個。

5.連接的方法 [self.MyCentralManager connectPeripheral:peripheral options:nil];如果連接成功建立,則會調用centralManager:didConnectPeripheral:回調方法,如果連接建立失敗,則調用 centralManager:didFailToConnectPeripheral:error:方法。這個連接的方法會一直執行。如何實現自動斷線重連,就是在斷開的委托方法中,執行連接藍牙的方法。由于藍牙的有效距離在10米,當手機離開藍牙設備10米范圍之后,手機可能會失去連接,而有些情況下,需要手機在回到10范圍內的時候自動連接。那我們只需要在斷開連接的時候,執行連接操作,因為藍牙會一直處于嘗試連接指定藍牙的操作,沒有時間限制。但如果當藍牙對象被釋放后,潛在的藍牙連接嘗試操作也會被取消掉。第一個參數,連接的藍牙對象,沒什么說的;第二個參數,可以有三種:CBConnectPeripheralOptionNotifyOnConnectionKey,CBConnectPeripheralOptionNotifyOnDisconnectionKey和CBConnectPeripheralOptionNotifyOnNotificationKey這三種參數的用處在于沒有使用background mode?的時候是否顯示Alert提醒信息,三種參數如果不做任何設置,都默認為NO,第一種參數OnConnectionKey在程序被掛起時,連接成功顯示Alert提醒框,第二種參數,OnDisconnectionKey在程序被掛起時,斷開連接顯示Alert提醒框,第三種參數,OnNotificationKey在程序被掛起時,顯示所有的提醒消息。

斷開連接的方法[self.MyCentralManager? cancelPeripheralConnection:peripheral];這個方法會取消已經連接成功的藍牙,也會取消正在連接中的藍牙。這個方法并不是使用的塊方法,當執行斷開連接之后繼續對這個藍牙對象進行操作指令,這個操作指令也許能完成,也許不能。因為很有可能其他app可能仍然保持著對這個藍牙的連接,斷開本地的藍牙連接并不能保證潛在的物理連接會立刻斷開,但是從app的角度看,會認為藍牙是立刻斷開了的,而且藍牙主設管理中心也會立刻執行這個委托方法centralManager:didDisconnectPeripheral:error:。所以在理論上,iOS設備是可以同時連接10個藍牙設備的,但是當之前的連接斷開之后,并不能在物理層保證藍牙已經斷開連接,所以有時候會發生,連接數還沒達到10個,藍牙就死掉的情況。?

6.?- retrieveConnectedPeripheralsWithServices:根據制定的服務,找到當前系統處于連接狀態的藍牙中包含這個服務的所有藍牙對象。- retrievePeripheralsWithIdentifiers:根據UUID找到所有匹配的藍牙對象。

7.發送數據?- (void)writeValue:(NSData *)data forCharacteristic:(CBCharacteristic *)characteristic type:(CBCharacteristicWriteType)type;通常我會使用下面的寫法,遍歷整個服務,找到通信需要的特性,當然,如果做過多種藍牙的同學應該會知道,這個函數的最后一個參數,可能有兩種,如果你的程序出現連接正常,而你確定執行了寫數據的函數,但是硬件確實沒有反應,那很有可能是你的CBCharacteristicWriteType不對,需要使用另一種,一共是兩種CBCharacteristicWriteWithResponse和CBCharacteristicWriteWithoutResponse,一般寫IC程序的開發人員都是使用一個叫LightBlue的APP,用這個APP可以看到藍牙設備的服務,特性,以及讀寫類型。

for (CBCharacteristic *characteristic in [[peripheral.services objectAtIndex:i] characteristics])?

{ if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:UUID_FFF6]])

{        [self.peripheralOpration writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse];

}

}?

而如果主設備要接收來自從機的數據的話,需要給從機一個權限,而且還要指定特性?,[peripheral setNotifyValue:YES forCharacteristic:characteristic];這樣的話,從機就可以通過參數中的characteristic特性傳數據到主機,而主機響應的方式是通過-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error這個委托方法。

8,多個藍牙對象時,如何管理,可以將藍牙對象看成簡單的字典對象。在要求與多個藍牙設備同時通信時,逐個進行操作。有時候會產生分組的概念,而區分出每個藍牙對象不同的方法就是藍牙設備的UUID,UUID在每個手機設備上?生成的都不一樣,不同的藍牙設備,在同一臺手機上也不一樣。因為UUID是由唯一的MAC地址和手機的識別碼一起通過一個加密算法得到。目前市場上,出貨比較大的是藍牙燈,很多藍牙燈均有房間,和分組的概念,所以這一點也比較有用。

9.如何實時獲取RRSI值,當未連接的時候,可以設置一直接收廣播信息,方法看上面第3個知識點,在- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI的最后一個參數中就是RRSI值。如果對于已連接的設備,也需要實時檢測RRSI值,例如目前市場上大多數的藍牙防丟器或其他藍牙防丟設備,現在只能在程序中寫一個計時器,隔一定時間間隔,去獲取

-(void)ShowRSSI{
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0){ //倒計時結束,關閉
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
//設置界面的按鈕顯示 根據自己需求設置
// NSLog(@"--");
});
}else{
dispatch_async(dispatch_get_main_queue(), ^{
if (bleConnectViewContrller.peripheralOpration.state==2) {
if (IS_IOS_8) {
[bleConnectViewContrller.peripheralOpration readRSSI];
}else{
// NSLog(@"%@",[NSString stringWithFormat:@"%@",[bleConnectViewContrller.peripheralOpration RSSI]]);
}
}else{
// NSLog(@"--");
}
});
timeout--;
}
});
dispatch_resume(_timer);
}

10.關于將iPhone作為從機,像周圍發送廣播的用法,實際上這種需求比較少,通常手機都是主機,這里不做論述,如有需要可以提供demo。
11.通常藍牙設備會在連接設備之后,會去發現設備的服務和特性,甚至很多設備在連接成功的時候都會對設備做一個初始命令的設置,譬如藍牙燈泡在剛連上時,將燈泡亮度調到最大。而有的APP會有自動重連功能,那在程序啟動的時候就會發生周圍多個設備,并連接,尋找服務特性,并發送數據。我想說的是,這個時候如果程序中有重新搜索功能的話,會出現bug。之前講到過,藍牙連接執行了斷開方法后,并不能立即在物理連接上斷開。所以通常,不要將自動重連和重新搜索功能放在一起。

如果需要知道文章中文獻的,可以到QQ群460325065下載。

9月22號收到第一個質疑,連接個數,我寫的最多10個,有人說可以超過這個數,百度了一下,沒有找到直接證明可以超過10個的證據。實際上,藍牙協議并沒有規定上限,理論上可以連接無數個。但是在手機主設端做不到,一個原因為主設的藍牙資源有限;二個是因為連接的個數越多,手機需要跟所有設備保持連接,需要逐個輪訓,發送連接存在的消息。而蘋果上也對藍牙發送時間間隔做了一個設定。所以目前來說,連接個數終有上限。超過10個的限制也是時間問題,但是具體一臺手機能連多少個從機,就需要針對自己的產品做詳細測試了。也許有其他非TI廠家生產的芯片,可以做到超過10個。

有朋友說運行程序沒有任何反應,是因為附近根本就沒有藍牙設備,如果沒有藍牙設備,也可以通過兩臺iPhone或者iPad將其中一個設為從機進行測試。?

有朋友問到iOS中HFP開發?,通過藍牙設備實現打電話的功能。這個功能確實能實現,但是跟iOS APP關系不大,完全由藍牙設備配合系統協議實現的。APP端只能對BLE操作,如果要錄下通話內容,只能在開始通話時,讓藍牙設備傳一個信號到iPhone上,開始錄音;在通話結束時,再傳一個信號到手機,結束錄音。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 這里我們具體說明一下中心模式的應用場景。主設備(手機去掃描連接外設,發現外設服務和屬性,操作服務和屬性的應用。一般...
    丶逝水流年閱讀 2,280評論 3 4
  • 藍牙簡介 藍牙( Bluetooth? ):是一種無線技術標準,可實現固定設備、移動設備和樓宇個人域網之間的短距離...
    Chefil閱讀 2,055評論 2 19
  • 安卓4.3(API 18)為BLE的核心功能提供平臺支持和API,App可以利用它來發現設備、查詢服務和讀寫特性。...
    風雨byt閱讀 14,094評論 3 43
  • ――Abby 霜慘草瑟枯木破,冷月無鋒秋意磨。 孤鴛凌云一線過,但死春心意蹉跎。 ...
    AbbyMa閱讀 183評論 0 1
  • 一開始打算嘗試犒勞一下最近忙得莫名其妙的自己,滿心歡喜地在網上查閱了牛奶蒸蛋,結果很水到渠成地吃了幾口再也無法...
    橙子與眸子閱讀 297評論 0 0