1. 程式人生 > >iOS coreBluetooth程式設計中需要注意的問題

iOS coreBluetooth程式設計中需要注意的問題

一、iOS 裝置作為中心裝置(central device)時需要注意:

(1)一定要對central Manager保持強引用,也就是說central Manager需要是一個全域性變數不能是區域性變數,否則不能啟動掃描。
(2)連線到peripheral之後,一定記得為peripheral設定代理,否則無法進行服務和特徵的發現。
(3)有關CBCentralManagerDelegate協議
協議方法的意義都不難理解,但需要注意的是,藍芽從開啟、發現裝置、連線裝置、發現服務、發現特徵到讀寫特徵值、訂閱特徵著這六個步驟之間是有前後依賴關係的,每個步驟的執行都依賴前一個步驟的成功執行。
CBCentralManagerDelegate協議為以上6個步驟都定義了對應的回撥方法,並且在回撥方法中可以獲取到當前步驟的執行結果。那麼,就可以通過這個結果來決定是否繼續進行下一個步驟。
比如每次呼叫CBCentralManager的初始化方法,都會回撥代理方法-(void)centralManagerDidUpdateState:(CBCentralManager *)central。這個代理方法的呼叫意味著CBCentralManager物件初始化完畢,並且已經獲取到當前裝置的藍芽功能狀態,在這個回撥方法中訪問central.state就可以知道裝置是否支援(已開啟)藍芽功能。只有當裝置已開啟藍芽功能才能繼續下一步——發現遠端裝置。
這種機制應該貫穿與整個藍芽連線過程。
(4)確定遠端裝置是否支援某種功能
應該在對特徵值進行讀寫或訂閱操作之前,需要先知道這個特徵是否支援和允許這些操作。判斷特徵支援和允許的操作可以通過特徵的屬性。特徵的屬性是個列舉值,可選的值有CBCharacteristicPropertyRead表示可讀,CBCharacteristicPropertyNotify表示可訂閱等等,具體可以參照介面文件。可以通過對特徵的屬性進行與操作來判定它是否支援某個選項。
例如:
if(CBCharacteristicPropertyNotify&certainCharacteristic.properties==CBCharacteristicPropertyNotify){
//可以訂閱。。。。
}
(5)注意,BLE 4.0中規定,不會在裝置之間建立長連線,而是啟動了定時器,每隔一段時間,進行一次連線,連線持續時間只是一瞬間。因此,在BLE4.0中,發起連線的意義不是建立一條連線,而是開啟這種定時連線的過程。發起連線的動作是由中心裝置完成的,當呼叫了central的connectToPeripheral:方法後,這個定時連線的過程就開始了。中心裝置每隔一段時間(在iPhone 5c上測試是一秒多)與目標遠端裝置連線一次,每次只是一瞬間,中心裝置的所有讀寫操作都排著隊,需要等待這一瞬間的到來才能夠處理。如果佇列中等待的讀寫操作過多,在這一次的連線時間中未能全部處理,就要等待下一次連線的瞬間到來,才能繼續處理。
(6)每一次連線瞬間的發生,都會觸發didConnectPeripheral:代理方法。如果在這個方法中不加判斷地啟動服務的發現,進而在發現服務的回撥方法中又不加判斷地啟動特徵的發現,那麼這個從連線到發現特徵的整個流程會定時從頭到尾走一遍。如果實際上沒有這個必要,最好對寫在didConnectPeripheral:中的動作加一些判斷,免得有太多無用的程式碼在執行。
(7)關於訂閱功能,訂閱某個特徵值的更新,收到的特徵值有可能和之前相同也可能不同,在使用特徵值之前需要進行必要的判斷。
(8)在需要發現裝置的時候才需要掃描,其他動作比如發現服務、發現特徵等由peripheral發出的動作都不依賴於掃描。理論上只要發現了裝置就可以呼叫stopScan停止掃描了。在實際運用中,有時需要保證找到指定的特徵,此時可以在找到了指定的特徵後再停止掃描,否則繼續掃描。當然也可以一發現裝置就stopScan,如果發現特徵不符的時候再重寫開啟掃描也可以。儘快停止掃描有利於省電。
(9)個人比較推薦在發現服務和發現特徵的回撥方法中,可以將發現到的所需的服務和特徵儲存下來,以便之後操作。
(10)如果對特徵值進行的訂閱,在不需要的時候最好儘快取消訂閱,這樣為遠端裝置省點。在完成藍芽傳輸以後,儘快呼叫cancelPeripheralConnection:方法取消與目標遠端裝置的連線,為中心裝置的省電。

二、iOS裝置作為遠端裝置(peripheral device)時需要注意:

(1)在某個特徵值接受訂閱以後,如果要持續更新這個特徵值,可以藉助定時器。
(2)對於中心裝置為iPhone的情況下,一個特徵值,即NSData物件的長度不可以超過一定長度(用iPhone 5c作為中心裝置測過它只能接收155位元組;傳送超過155位元組的內容,不會報錯,但中心裝置只能接收到155位元組)。
(3)在需要用一個特徵值傳送超過155位元組的內容時需要對內容進行分割後傳送。如果檔案比較大,需要拆成比較多次傳送,為了保證傳送速度,推薦通過訂閱來實現。特徵值接受訂閱以後,可以主動更新特徵值,也就是可以主動傳送分拆的內容,不用受到中心裝置的連線間隔時間的限制。
(4)當呼叫的updateValue:ForCharacteristic:OnSubscribedCentrals:方法對被訂閱的特徵值進行更新,如果此時藍芽的快取滿了,或者處理更新的佇列滿了,那麼這次更新請求就會被丟棄。因此這個方法本身是有返回值的,成功傳送了更新的特徵值返回YES,被丟棄則返回NO。當遇到(3)中所述的要求內容完整性的情況,就需要用這個返回值判斷需不需要進行重發。
(5) CBCharacteristic不支援mutableCopy。
(6)注意,不要往同一個peripheral manager中重複新增同一個服務,否則會出錯。曾因為往peripheral manager中重複添加了一個服務,導致中心裝置無法收到peripheral發出的訂閱特徵值的更新。也就是,呼叫了updateValue:ForCharacteristic:ToCentrals:方法,並且方法返回YES,也就是成功傳送了。但是中心裝置就是接收不到,還沒有任何錯誤提示。。。。

相關推薦

iOS coreBluetooth程式設計需要注意的問題

一、iOS 裝置作為中心裝置(central device)時需要注意: (1)一定要對central Manager保持強引用,也就是說central Manager需要是一個全域性變數不能是區域性變數,否則不能啟動掃描。 (2)連線到peripheral

java的socket-tcp程式設計需要注意的東西

題記 這不是一篇關於java的socket程式設計例項,而是記敘那些踩過的坑。 前言 java的socket程式設計最直接的就是用socket相關的API,還有就是結合NIO方式。 socket的API使用起來還是略覺複雜。因此,使用中我還是習慣對其

在學習Python的過程需要注意的點

  一、學習流程 1.學習過程中(看視訊、直播課程、書籍) 跟上思路 一旦發現不懂的概念, 先記錄在筆記中, 事後再查 搜尋引擎(不要在意百度,谷歌哪個逼格高;自己注意篩選就好) 查不到,或者查到不理解;來群裡吧(516107834)

Spring+MyBatis 在Junit測試需要注意的細節

    在Spring+MyBatis框架下Junit測試時如果直接@Autowired ServiceImpl service 的話會報錯:nullpointerexception; 需要在類上添加註解 @RunWith(SpringJUnit4Clas

軟體測試員必備:Web測試需要注意的16個小細節

隨著Internet和Intranet/Extranet的快速增長,Web已經對商業、工業、銀行、財政、教育、政府和娛樂及我們的工作和生活產生了深遠的影響。許多傳統的資訊和資料庫系統正在被移植到網際網路上,電子商務迅速增長,早已超過了國界。範圍廣泛的、複雜的分散式應用正在Web環境中出現。Web的流

移動端網頁佈局需要注意事項以及解決方法總結

  移動端網頁佈局中需要注意事項以及解決方法總結,這份對我們在佈局移動端網頁的時候非常有用! winphone系統a、input標籤被點選時產生的半透明灰色背景怎麼去掉 <meta name="msapplication-tap-highlight"&nbs

轉:軟體測試員必備:Web測試需要注意的16個小細節

http://blog.sina.com.cn/s/blog_679bde160102xyj8.html   軟體測試員必備:Web測試中需要注意的16個小細節 轉載 2018-11-07 17:55:38 標籤:軟體測試web測試 隨著Internet和Intrane

Java基礎系列(三十六):泛型需要注意的地方

一、不能用型別引數代替基本型別 因為型別擦除之後,原本的型別會被替代為Object型別的域,而Object不能儲存基本型別的值。就是說沒有Pair<double>,取而代之的是該基本型別的包裝器型別Pair<Double> 二、執行時型別查詢之適用於原始型

css筆記--css需要注意的知識點

css筆記–css中需要注意的知識點 css尺寸 css的尺寸屬性 屬性 功能 height 設定元素的高度 width 設定寬度

依附自媒體平臺推廣過程需要注意的四大事項

自媒體又被稱之為是個人媒體文化指的就是平民化,自主化的傳播者,現代人基本上通過現代的電子化手段,向特定的人群傳遞出各種各樣的資訊,在當今這個新媒體的時代,強調的就是一定要影音文字相互整合的資訊,帶有互動的新媒體就更加具備魅力。同樣也是真正能夠吸引到使用者的原因所在,都說自媒體的內容,如果能夠結合

論文投稿需要注意什麼?

投稿是論文發表的最核心環節,我們要引起重視。只要我們深刻的瞭解,就能找到準確的期刊,才能進行鍼對性的投稿,讓論文結果達到最優、快速的發表在期刊。那麼問題來了,我們該怎樣去找準期刊呢?怎樣去對期刊進行有效的選擇與區別?整理了以下四個方面進行了分析,希望對你們有所幫助。 (一)”準”體

檔案讀取和檔案寫入需要注意的一些小知識

1,   is_file()函式:用來判斷 是否是為檔案或者是否存在該檔案 is_dir()函式:用來判斷 是否為目錄(資料夾)或者是夠存在該目錄 file_exists(檔案路徑):作用是判斷對應的路徑下 是否存在對應的檔案 它們的區別是如果已經存在該檔案或者資料夾,

敏捷開發需要注意的事情

1.團隊中各個隊員的直接面對面相互溝通勝過任何的工具溝通; 2.可以工作的軟體勝過詳細的文件,程式碼才是最好的文件; 3.良好的客戶關係比死板的合同更具有意義; 4.及時的響應變化勝過時刻遵循計劃; 5.儘早的持續的交付有價值的軟體使客戶滿意; 6.任何時候都積極的擁

如何註冊金象信達卡管家及使用需要注意的相關事項教程

金象信達是一款交易信用管家APP,是由中國國內領先的第三方支付公司與福建九融資訊科技有限公司戰略合作、高規格打造,經銀聯報備的綜合生活服務平臺。 支付是生活當中不可或缺的一部分,也是商業模式的關鍵環節。金象信達是一款具有支付、收款、代還為一體的

spring-data-redis 使用過程需要注意的一點(序列化選擇)

在專案中需要用到redis做快取,於是採用spring-data-redis,並且打算自己封裝一個redis的靜態工具類。後來在進行單元測試的過程中發現了一個容易出錯的地方,於是打算記錄下來,並分享給各位朋友。 這裡主要說下碰到的問題,首先,採用了spring-

Go語言需要注意結構體方法副本傳參與指標傳參的區別

我們來看個例子: package main import ( "fmt" ) type B struct { Name string } func(b B) Test1() { fmt.Printf("Test1 add

使用Dubbo需要注意的事項

一、前言 Dubbo作為高效能RPC框架,已經進入Apache卵化器專案,雖然官方給出了dubbo使用的使用者手冊,但是大多是一概而過,使用dubbo時候要儘量瞭解原始碼,不然會很容易入坑。 二 、服務消費端ReferenceConfig需要自行快取 ReferenceConfig例項是個很重

移動端開發過程需要注意的問題

1、防止手機中網頁放大和縮小,這點是最基本的,最為手機網站開發者來說應該都知道的,就是設定meta中的viewport <meta name="viewport" content="width=device-width, initial-scale=1.0, max

Spring 整合redis叢集 實現 以及過程需要注意的問題點

一,準備工作: 1.首先安裝好redis叢集,啟動並配置叢集。 2.SpringMVC環境,看專案或個人需要,可以使SpringMVC的web專案,也可以是隻使用SpringBean管理器。 二,著手配置: 由於專案是由maven管理的所以需要的jar 包新增到maven

人工智慧和大資料的開發過程需要注意這12點

https://www.toutiao.com/i6636522371094151694/   2018-12-19 10:16:15 人工智慧是近年來科技發展的重要方向,在大資料時代,對資料採集、挖掘、應用的技術越來越受到矚目。在人工智慧和大資料的開發過程中,有哪些特別需要注