一 藍芽介紹
隨著藍芽低功耗技術ble(bluetooth low energy)的發展,藍芽技術正在一步步成熟,如今的大部分移動裝置都配備有藍芽4.0,相比之前的藍芽技術耗電量大大降低。從ios的發展史也不難看出蘋果目前對藍芽技術也是越來越關注,例如蘋果於2023年9月發布的ios7就配備了ibeacon技術,這項技術完全基於藍芽傳輸。但是眾所周知蘋果的裝置對於許可權要求也是比較高的,因此在ios中並不能像android一樣隨意使用藍芽進行檔案傳輸(除非你已經越獄)。在ios中進行藍芽傳輸應用開發常用的框架有如下幾種:
gamekit.framework:ios7之前的藍芽通訊框架,從ios7開始過期,但是目前多數應用還是基於此框架。
multipeerconnectivity.framework:ios7開始引入的新的藍芽通訊開發框架,用於取代gamekit。
corebluetooth.framework:功能強大的藍芽開發框架,要求裝置必須支援藍芽4.0。
前兩個框架使用起來比較簡單,但是缺點也比較明顯:僅僅支援ios裝置,傳輸內容僅限於沙盒或者**庫中使用者選擇的檔案,並且第乙個框架只能在同乙個應用之間進行傳輸(乙個ios裝置安裝應用a,另乙個ios裝置上安裝應用b是無法傳輸的)。當然corebluetooth就擺脫了這些束縛,它不再侷限於ios裝置之間進行傳輸,你可以通過ios裝置向android、windows phone以及其他安裝有藍芽4.0晶元的智慧型裝置傳輸,因此也是目前智慧型家居、無線支付等熱門智慧型裝置所推崇的技術。
本文要介紹的
corebluetooth從
iphone4s開始支援,專門用於與ble裝置通訊。
二 裝置和特徵
什麼是服務和特徵呢(service and characteristic)?
每個藍芽4.0的裝置都是通過服務和特徵來展示自己的,乙個裝置必然包含乙個或多個服務,每個服務下面又包含若干個特徵。特徵是與外界互動的最小單位。比如說,一台藍芽4.0裝置,用特徵a來描述自己的出廠資訊,用特徵b來與收發資料等。
服務和特徵都是用uuid來唯一標識的,uuid的概念如果不清楚請自行google,國際藍芽組織為一些很典型的裝置(比如測量心跳和血壓的裝置)規定了標準的service uuid。例如,我所用的裝置uuiid如下
#define ble_service_uuid @"9f989d1f-9e7b-b4d7-9322-59f2dcc2d646"
三 實現過程
1 建立中心角色
首先在我自己類的標頭檔案中要包含corebluetooth的標頭檔案,並繼承兩個協議,**如下:
[objc]view plain
copy
#import
cbcentralmanager
*manager;
manager = [[cbcentralmanageralloc
]initwithdelegate
:self
queue
:nil]
2 掃瞄外設(discover)
//步驟2 掃瞄
[self.manager scanforperipheralswithservices:nil options:nil];
3連線外設(connect)
- (void)centralmanager:(cbcentralmanager *)central diddiscoverperipheral:(cbperipheral *)peripheral advertisementdata:(nsdictionary *)advertisementdata rssi:(nsnumber *)rssi
}
//連線指定的裝置
-(bool)connect:(cbperipheral *)peripheral
4掃瞄外設中的服務和特徵(discover)
- (void)centralmanager:(cbcentralmanager *)central didconnectperipheral:(cbperipheral *)peripheral
- (void)peripheral:(cbperipheral *)peripheral diddiscoverservices:(nserror *)error
for (cbservice *service in peripheral.services)
} }
- (void
)peripheral:(
cbperipheral
*)peripheral
diddiscovercharacteristicsforservice
:(cbservice
*)service
error
:(nserror
*)error
for(cbcharacteristic
*characteristic in service
.characteristics
)
} for
(cbcharacteristic
* characteristic in service
.characteristics
)
} if
([self
.delegate
respondstoselector
:@selector
(didfoundcharacteristic:withperipheral:error:)])
[self
.delegate
didfoundcharacteristic
:nil
withperipheral
:nil
error
:nil
];
}
5與外設做資料互動(explore and interact)
-(
void
)msrread
; unsigned char
char
*ptmp;
intnsendlen =
0;
unsigned char
uccrc[
3] = ;
_commandtype = command_msr_read;
ptmp = command;
*ptmp = 0x0
2;//start
ptmp++;
*ptmp = 0xc1
;//main cmd
ptmp++;
*ptmp = 0x0
7;//sub cmd
ptmp++;
nsendlen = 2
; *ptmp = nsendlen/256
; ptmp++;
*ptmp = nsendlen%256
; ptmp++;
*ptmp = 0x0
0;//sub cmd
ptmp++;
*ptmp = 0x0
0;//sub cmd
ptmp++;
crc1
6ccitt(command+
1,ptmp-command-
1,uccrc);
memcpy(ptmp,uccrc,2
);
nsdata
*data = [[nsdata
alloc
]initwithbytes
:&command
length:9
];
nslog(@"send data:%@"
, data);
[g_bleinstance.recvdata
setlength:0
];
[g_bleinstancewritechar
:data];
}
//收到資料
- (void)peripheral:(cbperipheral *)peripheral didupdatevalueforcharacteristic:(cbcharacteristic *)characteristic error:(nserror *)error
// nslog(@"收到的資料:%@",characteristic.value);
[self decodedata:characteristic.value];
}
// 解碼返回的資料
- (void)decodedata:(nsdata *)receivedata
6斷開連線(disconnect)。
if (self.peripheral != nil)
iOS藍芽4 0開發 BLE
模型與corebluetooth的對應關係 這裡主要討論模型一,這也是當前大多數手環裝置和ios 互動的方式 開發流程 1.建立工程,匯入corebluetooth.framework 2.初始化 cbcentralmanager 並準備掃瞄周圍藍芽裝置 初始化 themanager cbcentr...
iOS藍芽4 0 BLE 開發
本文將一步一步講解如何使用corebluetooth框架來與各種可穿戴裝置進行通訊,使用 小公尺手環 來進行基本的測試。macbook pro mac os x 10.10 xcode 6.3.2 iphone 5s v8.1 小公尺手環 從上面這幅圖可以看到,我們的ios裝置是central,用來...
iOS藍芽4 0開發01 前期準備
根據實際需求選擇藍芽4.0,蘋果開放了ble通道,支援藍芽4.0的裝置都可以被檢索到,4.0之前的只能是ios裝置和mfi認證的裝置才能被檢索到。引用 開發準備工作,使用xcode的模擬器來對ble 藍芽4.0 進行除錯工作,需買乙個支援mac的csr藍芽4.0介面卡。引用 0808說明,因為出現6...