從上家公司離職已經快半年了,與藍牙打了一年的交道,從小白一個到略知一二。最近在整理上一家公司作的一些項目,突發奇想,本身封裝一個藍牙庫,方便之後的使用。說幹就幹,若是須要項目代碼,猛擊這裏GJLightBlueTooth。若是有用,請賞顆小星星。git
當初爲了避免在一個類裏面同時處理髮送與接收邏輯,也本着對外封閉的原則,爲了給使用庫的人一個簡單的類,就設計了:github
用戶 ——> GJLightBlueTooth ——> CoreBlueTooth ——> GJLightBlueTooth ——> 用戶
複製代碼
這樣的架構bash
其中:架構
另外,在Demo中,你還會看到MyBLETool這個類,這是爲了將Demo項目中頁面與業務分離而單獨出來的一個類,能夠理解爲設備類。爲了咱們不須要在具體的頁面中去設置回傳的block。工具
在建立頁面後,你應該初始化GJLightBlueTooth藍牙工具:self.BLE = [[GJLightBlueTooth alloc] init]。post
在獲取到Characteristic後,你應該根據實際讀寫的Characteristic匹配出設備上的CBCharacteristic,保存在本地,用於後面的寫與讀。ui
[self.BLE setBlockWhenDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
strongify(self);
for (CBCharacteristic *cha in service.characteristics){
if ([cha.UUID.UUIDString isEqualToString:CharacteristicUUIDWrite]){
self.writeCharacter = cha;
}
}
//[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoverCharacteristics" object:service];
}];
複製代碼
[self.BLE scan]
複製代碼
[self.BLE stopScan]
複製代碼
[self.BLE connectWithPeripheral:peri]
複製代碼
[self.BLE cancelConnectWithPeripheral:peri]
複製代碼
[self.BLE readRSSIWithPeriperal:peri]
複製代碼
[self.BLE sendDataToPeriperal:peri WriteCharacteristic:self.writeCharacter Command:command NSEncoding:encoding]
複製代碼
這裏針對如今不少公司提出須要手機與設備有心跳的要求,開啓了一個線程隊列。該隊列設置可以同時存在的指令數爲3。spa
NSData *cmdData = [[NSString stringWithFormat:@"%@",command] dataUsingEncoding:encoding];
NSOperation *opration = [NSBlockOperation blockOperationWithBlock:^{
[peripheral writeValue:cmdData
forCharacteristic:writeCharacteristics
type:CBCharacteristicWriteWithoutResponse];
/*
* you can set thread time interval.but the order while delay when there are a lot of orders.
*/
//[NSThread sleepForTimeInterval:SleepTimeGap];
}];
[self.writeQueue addOperation:opration];
複製代碼
你也能夠設置指令間隔時間,可是這樣會形成因心跳刷新過快形成的延遲發送。線程
char nameKey;
- (void)setRssi:(NSNumber *)rssi{
objc_setAssociatedObject(self, &nameKey, rssi, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSNumber *)rssi{
return objc_getAssociatedObject(self, &nameKey);
}
複製代碼
weakify(self);
[self.BLE setBlockWhenDiscoverCharacteristics:^(CBPeripheral *peripheral, CBService *service, NSError *error) {
strongify(self);
for (CBCharacteristic *cha in service.characteristics){
if ([cha.UUID.UUIDString isEqualToString:CharacteristicUUIDWrite]){
self.writeCharacter = cha;
}
}
//[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoverCharacteristics" object:service];
}];
複製代碼
若是須要項目代碼,猛擊這裏GJLightBlueTooth。若是有用,請賞顆小星星。設計