藍(lán)牙開發(fā)說簡單也簡單,說不簡單也有點(diǎn)難,開發(fā)人員在首次開發(fā)藍(lán)牙前首先需要搞清楚藍(lán)牙開發(fā)的概念,還要了解掌握藍(lán)牙開發(fā)的一整套流程,這樣才能快速上手開發(fā)藍(lán)牙。

在惠東等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),惠東網(wǎng)站建設(shè)費(fèi)用合理。
? 藍(lán)牙開發(fā)分為兩種模式:管理者模式和中心者模式。管理者模式基本很少用到,相當(dāng)于iPhone手機(jī)作為外設(shè),自己創(chuàng)建服務(wù)和特性,然后用其他設(shè)備連接iPhone手機(jī);中心者模式一般是大部分情況下都會使用的,使用中心者模式開發(fā)相當(dāng)于iPhone手機(jī)作為主機(jī),連接藍(lán)牙外設(shè),下面介紹藍(lán)牙開發(fā)的例子就是使用的中心者模式來講解的。
在這里我還是要推薦下我自己建的iOS開發(fā)學(xué)習(xí)群:680565220,群里都是學(xué)ios開發(fā)的,如果你正在學(xué)習(xí)ios ,我歡迎你加入,今天分享的這個(gè)案例已經(jīng)上傳到群文件,大家都是軟件開發(fā)黨,不定期分享干貨(只有iOS軟件開發(fā)相關(guān)的),包括我自己整理的一份2018最新的iOS進(jìn)階資料和高級開發(fā)教程
一、關(guān)于藍(lán)牙開發(fā)的一些重要的理論概念:
1、服務(wù)(services):藍(lán)牙外設(shè)對外廣播的時(shí)候一定會有一個(gè)服務(wù),有些時(shí)候也可以是有多個(gè)服務(wù),服務(wù)下面包含一些特性,服務(wù)可以理解成一個(gè)模塊的窗口;
2、特征(characteristic):特征存在于服務(wù)下面的,一個(gè)服務(wù)下面可以有多個(gè)特征,特征可以理解成具體實(shí)現(xiàn)功能的窗口,一般的特性都會有value,也就是特征值,是特征和外界交互的最小單位;
? 3、UUID:藍(lán)牙上的唯一標(biāo)示符,為了區(qū)分不同服務(wù)和特征,就用UUID來表示。
二、藍(lán)牙連接的主要步驟
?1、創(chuàng)建一個(gè)CBCentralManager實(shí)例來進(jìn)行藍(lán)牙管理;
?2、搜索掃描外圍設(shè)備;
?3、連接外圍設(shè)備;
?4、獲得外圍設(shè)備的服務(wù);
?5、獲得服務(wù)的特征;
?6、從外圍設(shè)備讀取數(shù)據(jù);
?7、給外圍設(shè)備發(fā)送(寫入)數(shù)據(jù)。
三、藍(lán)牙連接和數(shù)據(jù)讀寫的具體步驟
?1、導(dǎo)入蘋果系統(tǒng)藍(lán)牙框架
#import
?2、遵循兩個(gè)藍(lán)牙框架相關(guān)的協(xié)議
3、新建兩個(gè)實(shí)例屬性,一個(gè)特征屬性
@property (nonatomic, strong) CBCentralManager *centralManager; //中心管理者
@property (nonatomic, strong) CBPeripheral *peripheral; //連接到的外設(shè)
@property (nonatomic, strong) CBCharacteristic *characteristic; //特征
?4、初始化CBCentralManager,進(jìn)行藍(lán)牙管理
- (void)viewDidLoad {
[super viewDidLoad];
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; ? ? //創(chuàng)建實(shí)例進(jìn)行藍(lán)牙管理
}
//若中心管理者初始化之后 就會觸發(fā)下面這個(gè)代理方法 該代理方法是用來判斷手機(jī)藍(lán)牙的狀態(tài)的
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
// 藍(lán)牙可用,開始掃描外設(shè)
if (central.state == CBManagerStatePoweredOn) {
NSLog(@"藍(lán)牙可用");
//在中心管理者成功開啟之后再進(jìn)行一些操作
//搜索掃描外設(shè)
// 根據(jù)SERVICE_UUID來掃描外設(shè),如果不設(shè)置SERVICE_UUID,則掃描所有藍(lán)牙設(shè)備
// [self.centralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:SERVICE_UUID]]}];
[central scanForPeripheralsWithServices:nil options:nil];
}
if(central.state == CBManagerStateUnsupported) {
NSLog(@"該設(shè)備不支持藍(lán)牙");
}
if (central.state == CBManagerStatePoweredOff) {
NSLog(@"藍(lán)牙已關(guān)閉");
}
if (central.state == CBManagerStateUnknown) {
NSLog(@"藍(lán)牙當(dāng)前狀態(tài)不明確");
}
if (central.state == CBManagerStateUnauthorized) {
NSLog(@"藍(lán)牙未被授權(quán)");
}
}
? 5、搜索外圍設(shè)備
//執(zhí)行掃描動作之后,如果掃描到外設(shè)了,就會自動回調(diào)下面的協(xié)議方法
/** 發(fā)現(xiàn)符合要求的外設(shè),回調(diào) */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
NSLog(@"%@====",peripheral.name);
//根據(jù)外設(shè)名字有選擇性的篩選連接藍(lán)牙設(shè)備
if ([peripheral.name hasPrefix:@"TEAMOSA"]) {
//在這里對外設(shè)攜帶的廣播數(shù)據(jù)進(jìn)行進(jìn)一步的處理
if ([self.peripheraNames containsObject:peripheral.name]) {
//如果數(shù)組中包含了就不再添加
return;
}
//添加到外設(shè)名字?jǐn)?shù)組中
[self.peripheraNames addObject:peripheral.name];
//標(biāo)記外設(shè),讓它的生命周期與控制器的一致
self.peripheral = peripheral;
// 可以根據(jù)外設(shè)名字來過濾外設(shè)
// [central connectPeripheral:peripheral options:nil];
}
// 連接外設(shè)
// [central connectPeripheral:peripheral options:nil];
}
6、連接外圍設(shè)備
//連接外圍設(shè)備,中心管理者連接外設(shè)成功,如果連接成功就會回調(diào)這個(gè)協(xié)議方法
/** 連接成功 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
//連接成功之后,可以進(jìn)行服務(wù)和特性的發(fā)現(xiàn)。 停止中心管理設(shè)備的掃描動作,要不然在你和已經(jīng)連接好的外設(shè)進(jìn)行數(shù)據(jù)溝通時(shí),如果又有一個(gè)外設(shè)進(jìn)行廣播且符合你的連接條件,那么你的iOS設(shè)備也會去連接這個(gè)設(shè)備(因?yàn)閕OS BLE4.0是支持一對多連接的),導(dǎo)致數(shù)據(jù)的混亂。
//停止掃描動作
[self.centralManager stopScan];
// 設(shè)置外設(shè)的代理
peripheral.delegate = self;
// 根據(jù)UUID來尋找服務(wù)
// [peripheral discoverServices:@[[CBUUID UUIDWithString:SERVICE_UUID]]];
//外設(shè)發(fā)現(xiàn)服務(wù),傳nil代表不過濾,一次性讀出外設(shè)的所有服務(wù)
[peripheral discoverServices:nil];
NSLog(@"%s, line = %d, %@=連接成功", __FUNCTION__, __LINE__, peripheral.name);
}
//外設(shè)連接失敗
/** 連接失敗的回調(diào) */
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
NSLog(@"%s, line = %d, %@=連接失敗", __FUNCTION__, __LINE__, peripheral.name);
}
//丟失連接 掉線
/** 斷開連接 */
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error {
NSLog(@"%s, line = %d, %@=斷開連接", __FUNCTION__, __LINE__, peripheral.name);
// 斷開連接可以設(shè)置重新連接
[central connectPeripheral:peripheral options:nil];
}
7、獲取外圍設(shè)備服務(wù)和特征
/** 發(fā)現(xiàn)服務(wù) */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
// 遍歷出外設(shè)中所有的服務(wù)
for (CBService *service in peripheral.services) {
// NSLog(@"所有的服務(wù):%@",service);
}
// 這里僅有一個(gè)服務(wù),所以直接獲取
CBService *service = peripheral.services.lastObject;
// 根據(jù)UUID尋找服務(wù)中的特征
// [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:CHARACTERISTIC_UUID]] forService:service];
// [peripheral discoverCharacteristics:@[service.UUID] forService:service];
[peripheral discoverCharacteristics:nil forService:service];
}
8、從外圍設(shè)備讀取數(shù)據(jù)
// 更新特征的value的時(shí)候會調(diào)用 (凡是從藍(lán)牙傳過來的數(shù)據(jù)都要經(jīng)過這個(gè)回調(diào),簡單的說這個(gè)方法就是你拿數(shù)據(jù)的唯一方法) 你可以判斷是否 從外圍設(shè)備讀數(shù)據(jù)
/** 接收到數(shù)據(jù)回調(diào) */
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
// if (characteristic == @"你要的特征的UUID或者是你已經(jīng)找到的特征") {
// //characteristic.value就是你要的數(shù)據(jù)
// }
if ([peripheral.name hasPrefix:@"TEAMOSA"]){
NSData *data = characteristic.value;
NSString *value = [self hexadecimalString:data];
// NSLog(@"characteristic(讀取到的): %@, data : %@, value : %@", characteristic, data, value);
}
// 拿到外設(shè)發(fā)送過來的數(shù)據(jù)
// NSData *data = characteristic.value;
// self.textFild.text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
9、向外圍設(shè)備發(fā)送(寫入)數(shù)據(jù)
//這個(gè)方法你可以放在button的響應(yīng)里面,也可以在找到特征的時(shí)候就寫入,具體看你業(yè)務(wù)需求怎么用
//[self.peripherale writeValue:_batteryData forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];//第一個(gè)參數(shù)是已連接的藍(lán)牙設(shè)備; 第二個(gè)參數(shù)是要寫入到哪個(gè)特征; 第三個(gè)參數(shù)是通過此響應(yīng)記錄是否成功寫入 需要注意的是特征的屬性是否支持寫數(shù)據(jù)
/** 寫入數(shù)據(jù)回調(diào) */
- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error {
/*
typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {
CBCharacteristicPropertyBroadcast = 0x01,
CBCharacteristicPropertyRead = 0x02,
CBCharacteristicPropertyWriteWithoutResponse = 0x04,
CBCharacteristicPropertyWrite = 0x08,
CBCharacteristicPropertyNotify = 0x10,
CBCharacteristicPropertyIndicate = 0x20,
CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,
CBCharacteristicPropertyExtendedProperties = 0x80,
CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x100,
CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x200
};
打印出特征的權(quán)限(characteristic.properties),可以看到有很多種,這是一個(gè)NS_OPTIONS的枚舉,可以是多個(gè)值
常見的又read,write,noitfy,indicate.知道這幾個(gè)基本夠用了,前倆是讀寫權(quán)限,后倆都是通知,倆不同的通知方式
*/
// NSLog(@"%s, line = %d, char.pro = %d", __FUNCTION__, __LINE__, characteristic.properties);
// 此時(shí)由于枚舉屬性是NS_OPTIONS,所以一個(gè)枚舉可能對應(yīng)多個(gè)類型,所以判斷不能用 = ,而應(yīng)該用包含
NSLog(@"write value success(寫入成功) : %@", characteristic);
}
10、具體調(diào)用給藍(lán)牙外設(shè)寫入數(shù)據(jù)方法,這里的例子是以按鈕點(diǎn)擊事件里面來調(diào)用處理
//發(fā)送按鈕點(diǎn)擊事件
- (void)sendClick {
if (!self.characteristic) {
return;
}
_tempValue = [NSString stringWithFormat:@"%.0f", progressView.centigradeDegree];
_timeValue = [NSString stringWithFormat:@"%.0ld", (long)progressView1.timeDegree];
NSString *ttData = [NSString stringWithFormat:@"%@,%@U", _tempValue, _timeValue];
// NSString *aaa = [DataCoverTool coverFromStringToHexStr:ttData];
// 用NSData類型來寫入
// NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arry];
NSData *data = [ttData dataUsingEncoding:NSUTF8StringEncoding];
// NSData *data = [self dataWithString:ttData];
// 根據(jù)上面的特征self.characteristic來寫入數(shù)據(jù)
[self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];
當(dāng)下藍(lán)牙開發(fā)可謂是越來越火,不論是智能穿戴的興起還是藍(lán)牙家具,車聯(lián)網(wǎng)藍(lán)牙等等,很多同學(xué)也會接觸到藍(lán)牙的項(xiàng)目,我從事藍(lán)牙開發(fā)也有一段時(shí)間了,經(jīng)手了兩個(gè)項(xiàng)目。廢話不多說了,先向大家簡單的介紹有關(guān)藍(lán)牙開發(fā)的知識。藍(lán)牙低能耗(BLE),以下介紹的都是圍繞iOS的 CoreBluetooth/CoreBluetooth.h 框架展開的。
藍(lán)牙開發(fā)分為中心者模式和管理者模式:1.常用的(其實(shí)99.99%)就是使用中心者模式作為開發(fā),就是我們手機(jī)作為主機(jī),連接藍(lán)牙外設(shè);2.管理者模式,這個(gè)基本用到的比較少,我們手機(jī)自己作為外設(shè),自己創(chuàng)建服務(wù)和特征,然后有其他的設(shè)備連接我們的手機(jī)。
在做藍(lán)牙開發(fā)之前,最好先了解一些概念:
服務(wù)(services):藍(lán)牙外設(shè)對外廣播的必定會有一個(gè)服務(wù),可能也有多個(gè),服務(wù)下面包含著一些特征,服務(wù)可以理解成一個(gè)模塊的窗口;
特征(characteristic):存在于服務(wù)下面的,一個(gè)服務(wù)下面也可以存在多個(gè)特征,特征可以理解成具體實(shí)現(xiàn)功能的窗口,一般特征都會有value,也就是特征值,特征是與外界交互的最小單位;
UUID:可以理解成藍(lán)牙上的唯一標(biāo)識符(硬件上肯定不是這個(gè)意思,但是這樣理解便于我們開發(fā)),為了區(qū)分不同的服務(wù)和特征,或者給服務(wù)和特征取名字,我們就用UUID來代表服務(wù)和特征。
藍(lán)牙連接可以大致分為以下幾個(gè)步驟
1.建立一個(gè)Central Manager實(shí)例進(jìn)行藍(lán)牙管理
2.搜索外圍設(shè)備
3.連接外圍設(shè)備
4.獲得外圍設(shè)備的服務(wù)
5.獲得服務(wù)的特征
6.從外圍設(shè)備讀數(shù)據(jù)
7.給外圍設(shè)備發(fā)送數(shù)據(jù)
其他:提醒
首先我們先導(dǎo)入系統(tǒng)的BLE的框架
#import CoreBluetooth/CoreBluetooth.h
必須遵守2個(gè)協(xié)議
CBCentralManagerDelegate, CBPeripheralDelegate
/** 中心管理者 */
@property (nonatomic, strong) CBCentralManager *cMgr;
/** 連接到的外設(shè) */
@property (nonatomic, strong) CBPeripheral *peripheral;
1.建立一個(gè)Central Manager實(shí)例進(jìn)行藍(lán)牙管理
2.搜索外圍設(shè)備 (我這里為了舉例,采用了自己身邊的一個(gè)手環(huán))
3.連接外圍設(shè)備
4.獲得外圍設(shè)備的服務(wù) 5.獲得服務(wù)的特征
6.從外圍設(shè)備讀數(shù)據(jù)
7.給外圍設(shè)備發(fā)送數(shù)據(jù)(也就是寫入數(shù)據(jù)到藍(lán)牙)
這個(gè)方法你可以放在button的響應(yīng)里面,也可以在找到特征的時(shí)候就寫入,具體看你業(yè)務(wù)需求怎么用啦
其他:提醒
有那么多的特征,我們怎么知道哪些特征是用來讀數(shù)據(jù)的,哪些是用來寫入的,哪些是需要訂閱之后再讀的呢?
如果你們硬件工程師事先告訴你了,或者有完成的開發(fā)文檔,那么就可以直接知道了,否則你就需要自己去查看特征的屬性,推介可以使用下第三方的app——LightBlue,讓你更能清楚的看到你藍(lán)牙里面的服務(wù),特征,特征的屬性。
其他后續(xù)有關(guān)文章,我會慢慢整理發(fā)出來,我也可以回答相關(guān)的問題,有錯(cuò)誤的地方可以幫忙指出來呦!
1 AirDrop (UIActivityViewController類)
功能:實(shí)現(xiàn)iOS設(shè)備間的文件和數(shù)據(jù)分享。AirDrop使用藍(lán)牙來掃描周圍的設(shè)備,當(dāng)兩臺設(shè)備通過藍(lán)牙建立起了連接,考慮到更快速的數(shù)據(jù)傳輸,它就會創(chuàng)建點(diǎn)對點(diǎn)的WiFi網(wǎng)絡(luò)來連接兩部iOS 設(shè)備。但并不意味著為了使用AirDrop而需要把設(shè)備連接至WiFi網(wǎng)絡(luò)。
傳輸方式:藍(lán)牙、WiFi
支持系統(tǒng):iOS
2 GameKit 框架
功能:GameKit主要是完成iOS設(shè)備間聯(lián)網(wǎng)的相關(guān)功能,包括藍(lán)牙和Internet兩種方式。
傳輸方式:藍(lán)牙、WiFi
支持系統(tǒng):iOS
3 MultipeerConnectivity 框架
功能:利用Multipeer Connectivity框架,即使在沒有連接到WiFi(WLAN)或移動網(wǎng)絡(luò)(xG)的情況下,距離較近的Apple設(shè)備(iMac/iPad/iPhone)之間可基于藍(lán)牙和WiFi(P2P WiFi)技術(shù)進(jìn)行發(fā)現(xiàn)和連接實(shí)現(xiàn)近場通信。
傳輸方式:藍(lán)牙、WiFi
支持系統(tǒng):iOS
4 ExternalAccessory 框架
功能:External Accessory Framework提供了配件連接iOS設(shè)備的通道。開發(fā)者可以通過它來開發(fā)連接配件的app。配件可以通過30pin、藍(lán)牙、USB的方式連接iOS設(shè)備。
傳輸方式:藍(lán)牙、WiFi
支持系統(tǒng):iOS
5 CoreBluetooth 框架
功能:藍(lán)牙4.0協(xié)議之間信息傳輸,支持iOS和Android設(shè)備。
傳輸方式:藍(lán)牙
支持系統(tǒng):iOS、Android
6 Socket
功能:通過TCP或UDP進(jìn)行相同局域網(wǎng)內(nèi)信息傳輸,支持iOS和Android設(shè)備。
傳輸方式:WiFi
支持系統(tǒng):iOS、Android
7 Bonjour
功能:Bonjour是一種能夠自動查詢接入網(wǎng)絡(luò)中的設(shè)備或應(yīng)用程序的協(xié)議。Bonjour 抽象掉 ip 和 port 的概念,讓我們聚焦于更容易為人類思維理解的 service。通過 Bonjour,一個(gè)應(yīng)用程序 publish 一個(gè)網(wǎng)絡(luò)服務(wù) service,然后網(wǎng)絡(luò)中的其他程序就能自動發(fā)現(xiàn)這個(gè) service,從而可以向這個(gè) service 查詢其 ip 和 port,然后通過獲得的 ip 和 port 建立 socket 鏈接進(jìn)行通信,支持iOS和Android設(shè)備。
傳輸方式:WiFi
支持系統(tǒng):iOS、Android
8 AllJoyn
功能:AllJoyn,由高通公司主導(dǎo)的高創(chuàng)新中心的開源項(xiàng)目開發(fā)的,主要用于近距離無線傳輸,通過WiFi或藍(lán)牙技術(shù),定位和點(diǎn)對點(diǎn)文件傳輸。支持平臺:RTOS、Arduino、Linux、Android、iOS、Windows、Mac。
傳輸方式:藍(lán)牙、WiFi
支持系統(tǒng):RTOS、Arduino、Linux、Android、iOS、Windows、Mac
當(dāng)前題目:ios開發(fā)藍(lán)牙發(fā)送數(shù)據(jù),蘋果和安卓怎么用藍(lán)牙傳數(shù)據(jù)
網(wǎng)頁路徑:http://chinadenli.net/article10/dsgdhdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、企業(yè)建站、用戶體驗(yàn)、網(wǎng)站制作、云服務(wù)器、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)