1. 程式人生 > >iOS之藍芽開發

iOS之藍芽開發

因工作的需要, 前段時間整理了一下IOS藍芽通訊相關的東西,把整理的一個成果給大家分享一下。如果有不足的地方歡迎指正。
一、專案背景
簡單介紹一下我所做的東西,裝置目前有四個,分別是體脂秤、血壓計、血糖儀、監護儀等。從名稱大家應該知道這些是什麼東西了。對,沒錯,這些裝置主要是用來測量人體的一些 資料,諸如血壓血糖,脂肪等等。通過這些資料來反應使用者的身體健康狀況。 通過藍芽與iphone手機通訊。手機端的app通過傳送不同的指令(通過藍芽)控制相應的裝置執行一些動作,比如讀取裝置上的資料,待使用者測量完成後將使用者的資料傳送到伺服器,然後返回使用者的健康狀態到手機上等。 話不多說,下面讓我們開始吧。

二、IOS 藍芽介紹
藍芽協議本身經歷了從1.0到4.0的升級演變,最新的4.0以其低功耗著稱,所以一般也叫BLE(Bluetoothlow energy)。
ios中藍芽有四個框架,其中兩個支援與外設連線。一個是 ExternalAccessory。從ios3.0就開始支援,也是在iphone4s出來之前用的比較多的一種模式,但是它有個不好的地方,External Accessory需要拿到蘋果公司的MFI認證。另一個框架則是本文要介紹的CoreBluetooth,在iphone4s開始支援,專門用於與BLE裝置通訊(因為它的API都是基於BLE的)。這個不需要MFI,並且現在很多藍芽裝置都支援4.0,所以也是在IOS比較推薦的一種開發方法。

三、CoreBluetooth介紹
CoreBluetooth框架的核心其實是兩個東西,peripheral和central, 可以理解成外設和中心裝置。對應他們分別有一組相關的API和類,如下圖所示:


CoreBluetooth的結構
如果你要程式設計的裝置是central那麼你大部分用到,反之亦然。在我們這個示例中,血壓計、體脂秤等等是peripheral,我們的iphone手機是central,所以我將大部分使用上圖中左邊部分的類。使用peripheral程式設計的例子也有很多,比如像用一個ipad和一個iphone通訊,ipad可以認為是central,iphone端是peripheral,這種情況下在iphone端就要使用上圖右邊部分的類來開發了。

四 、服務和特徵
有個概念有必要先說明一下。什麼是服務和特徵呢(service and characteristic)?
每個藍芽4.0的裝置都是通過服務和特徵來展示自己的,一個裝置必然包含一個或多個服務,每個服務下面又包含若干個特徵。特徵是與外界互動的最小單位。比如說,一臺藍芽4.0裝置,用特徵A來描述自己的出廠資訊,用特徵B來與收發資料等。

服務和特徵都是用UUID來唯一標識的,UUID的概念如果不清楚請自行google,國際藍芽組織為一些很典型的裝置(比如測量心跳和血壓的裝置)規定了標準的service UUID(特徵的UUID比較多,這裡就不列舉了),如下:

 #define     BLE_UUID_ALERT_NOTIFICATION_SERVICE   0x1811  
 #define     BLE_UUID_BATTERY_SERVICE   0x180F  
 #define     BLE_UUID_BLOOD_PRESSURE_SERVICE   0x1810  
 #define     BLE_UUID_CURRENT_TIME_SERVICE   0x1805  
 #define     BLE_UUID_CYCLING_SPEED_AND_CADENCE   0x1816  
 #define     BLE_UUID_DEVICE_INFORMATION_SERVICE   0x180A  
 #define     BLE_UUID_GLUCOSE_SERVICE   0x1808  
 #define     BLE_UUID_HEALTH_THERMOMETER_SERVICE   0x1809  
 #define     BLE_UUID_HEART_RATE_SERVICE   0x180D  
 #define     BLE_UUID_HUMAN_INTERFACE_DEVICE_SERVICE   0x1812  
 #define     BLE_UUID_IMMEDIATE_ALERT_SERVICE   0x1802  
 #define     BLE_UUID_LINK_LOSS_SERVICE   0x1803  
 #define     BLE_UUID_NEXT_DST_CHANGE_SERVICE   0x1807  
 #define     BLE_UUID_PHONE_ALERT_STATUS_SERVICE   0x180E  
 #define     BLE_UUID_REFERENCE_TIME_UPDATE_SERVICE   0x1806  
 #define     BLE_UUID_RUNNING_SPEED_AND_CADENCE   0x1814  
 #define     BLE_UUID_SCAN_PARAMETERS_SERVICE   0x1813  
 #define     BLE_UUID_TX_POWER_SERVICE   0x1804  
 #define     BLE_UUID_CGM_SERVICE   0x181A

當然還有很多裝置並不在這個標準列表裡,比如我用的這個體脂秤血壓計等等。藍芽裝置硬體廠商通常都會提供他們的裝置裡面各個服務(service)和特徵(characteristics)的功能,比如哪些是用來互動(讀寫),哪些可獲取模組資訊(只讀)等。

五、實現細節
作為一箇中心要實現完整的通訊,一般要經過這樣幾個步驟:
建立中心角色—掃描外設(discover)—連線外設(connect)—掃描外設中的服務和特徵(discover)—與外設做資料互動(explore and interact)—斷開連線(disconnect)。
1、建立中心角色

首先在我自己類的標頭檔案中要包含CoreBluetooth的標頭檔案,並繼承兩個協議<CBCentralManagerDelegate,CBPeripheralDelegate>,程式碼如下:

#import <CoreBluetooth/CoreBluetooth.h>  
// 中心裝置管理者
@property (nonatomic, strong) CBCentralManager *centerManager;

// 在viewDidLoad中初始化中心裝置並設定代理
self.centerManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];

2、掃描外設(discover)

[self.centerManager scanForPeripheralsWithServices:nil options:options];

這個引數應該也是可以指定特定的peripheral的UUID,那麼理論上這個central只會discover這個特定的裝置,但是我實際測試發現,如果用特定的UUID傳參根本找不到任何裝置.可能是由於裝置本身在的廣播包有關

3、連線外設(connect)

當掃描到4.0的裝置後,系統會通過回撥函式告訴我們裝置的資訊,然後我們就可以連線相應的裝置,程式碼如下:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI  
{  
    // _dicoveredPeripherals是用來存放已經掃描到的外部裝置
    // 如果發現了這個外圍裝置我就把它新增到這個數組裡面
    if(![_dicoveredPeripherals containsObject:peripheral])  
        [_dicoveredPeripherals addObject:peripheral];  

    NSLog(@"dicoveredPeripherals:%@", _dicoveredPeripherals);  
}

// 連線指定的裝置  
- (BOOL)connect:(CBPeripheral *)peripheral  
{  
    NSLog(@"connect start");  
    _testPeripheral = nil;  

    [self.centerManager connectPeripheral:peripheral  
                       options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];  

    //開一個定時器監控連線超時的情況  
    connectTimer = [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(connectTimeout:) userInfo:peripheral repeats:NO];  

    return (YES);  
}

4、掃描外設中的服務和特徵(discover)

同樣的,當連線成功後,系統會通過回撥函式告訴我們,然後我們就在這個回撥裡去掃描裝置下所有的服務和特徵,程式碼如下:

// 連線外設
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral  
{  
    [connectTimer invalidate];//停止時鐘 
    NSLog(@"Did connect to peripheral: %@", peripheral);  
    _testPeripheral = peripheral;  

    [peripheral setDelegate:self];  
    [peripheral discoverServices:nil];  
}

個裝置裡的服務和特徵往往比較多,大部分情況下我們只是關心其中幾個,所以一般會在發現服務和特徵的回撥裡去匹配我們關心那些,比如下面的程式碼:

// 發現外圍裝置中的服務
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error  
{  
    NSLog(@"didDiscoverServices");     
    if (error)   {  
        NSLog(@"Discovered services for %@ with error: %@", peripheral.name, [error localizedDescription]);  

        if ([self.delegate respondsToSelector:@selector(DidNotifyFailConnectService:withPeripheral:error:)])  
            [self.delegate DidNotifyFailConnectService:nil withPeripheral:nil error:nil];  

        return;  
    }  

    // 遍歷外圍裝置中的服務
    for (CBService *service in peripheral.services)  {  
        // 如果發現是我們需要的服務,那我們就去掃描特徵值
        if ([service.UUID isEqual:[CBUUID UUIDWithString:UUIDSTR_ELECTRONIC_SCALE_SERVICE]]) 
        {  
            NSLog(@"Service found with UUID: %@", service.UUID);  
            [peripheral discoverCharacteristics:nil forService:service];  
            break;  
        }    
    }  
}

// 根據服務找到對應的特徵值
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error   
{  
    if (error)   
    {  
        NSLog(@"Discovered characteristics for %@ with error: %@", service.UUID, [error localizedDescription]);  

        if ([self.delegate respondsToSelector:@selector(DidNotifyFailConnectChar:withPeripheral:error:)])  
            [self.delegate DidNotifyFailConnectChar:nil withPeripheral:nil error:nil];   
        return;  
    }  
    // 遍歷服務中所有的特徵值
    for (CBCharacteristic *characteristic in service.characteristics)  
    {  
        // 找到我們需要的特徵
        if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:UUIDSTR_SCALE]])  
        {  
            NSLog(@"Discovered read characteristics:%@ for service: %@", characteristic.UUID, service.UUID);  

            _readCharacteristic = characteristic;//儲存讀的特徵  

            if ([self.delegate respondsToSelector:@selector(DidFoundReadChar:)])  
                [self.delegate DidFoundReadChar:characteristic];  
            break;  
        }  
    }  


    for (CBCharacteristic * characteristic in service.characteristics)  
    {  
        if ([characteristic.UUID isEqual:[CBUUID UUIDWithString:UUIDSTR_ISSC_TRANS_RX]])  
        {  
            NSLog(@"Discovered write characteristics:%@ for service: %@", characteristic.UUID, service.UUID);  
            _writeCharacteristic = characteristic;//儲存寫的特徵  

            if ([self.delegate respondsToSelector:@selector(DidFoundWriteChar:)])  
                [self.delegate DidFoundWriteChar:characteristic];  
            break;     
        }  
    }  

    if ([self.delegate respondsToSelector:@selector(DidFoundCharacteristic:withPeripheral:error:)])  
        [self.delegate DidFoundCharacteristic:nil withPeripheral:nil error:nil];  
}

相信你應該已經注意到了,回撥函式都是以"did"開頭的,這些函式不用你呼叫,達到條件後系統後自動呼叫。

5、與外設做資料互動(explore and interact)

傳送資料很簡單,我們可以封裝一個如下的函式:

// 寫資料  
- (void)writeChar:(NSData *)data  {  
    [_testPeripheral writeValue:data forCharacteristic:_writeCharacteristic type:CBCharacteristicWriteWithResponse];  
}

_testPeripheral和_writeCharacteristic是前面我們儲存的裝置物件和可以讀寫的特徵。

然後我們可以在外部呼叫它,比如當然我要測量體重時,先組好資料包,然後呼叫傳送函式:

- (void)sendData {
    NSData *data = _characteristic.value;
    if (data) { //當有資料的時候, 才會對返回的資料進行處理,不然會拋異常
        // 將NSData轉化成byte
        Byte *byte    = (Byte *)[data bytes];
        // 取出其中用用的兩位
        Byte b[]      = {byte[5],byte[6]};
        // 在轉化成NSData
        NSData *adata = [[NSData alloc] initWithBytes:b length:sizeof(b)];
        NSLog(@"adata = %@", adata);
        // 轉化成字串
        NSString *str = [adata ConvertToNSString];
        TSLog(@"%@",str);
    }
}

資料的讀分為兩種,一種是直接讀(reading directly),另外一種是訂閱(subscribe)。從名字也能基本理解兩者的不同。實際使用中具體用一種要看具體的應用場景以及特徵本身的屬性。前一個好理解,特徵本身的屬性是指什麼呢?特徵有個properties欄位(characteristic.properties),它是一個整型值,有如下幾個定義:

enum {  
     CBCharacteristicPropertyBroadcast = 0x01,  
     CBCharacteristicPropertyRead = 0x02,  
     CBCharacteristicPropertyWriteWithoutResponse = 0x04,  
     CBCharacteristicPropertyWrite = 0x08,  
     CBCharacteristicPropertyNotify = 0x10,  
     CBCharacteristicPropertyIndicate = 0x20,  
     CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,  
     CBCharacteristicPropertyExtendedProperties = 0x80,  
     };

比如說,你要互動的特徵,它的properties的值是0x10,表示你只能用訂閱的方式來接收資料。我這裡是用訂閱的方式,啟動訂閱的程式碼如下:

//監聽裝置  
-(void)startSubscribe  {  
    [_testPeripheral setNotifyValue:YES forCharacteristic:_readCharacteristic];  
}
// 當裝置有資料返回時,同樣是通過一個系統回撥通知我,如下所示:
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error  
{   
    if (error)   
    {  
        NSLog(@"Error updating value for characteristic %@ error: %@", characteristic.UUID, [error localizedDescription]);  

        if ([_mainMenuDelegate respondsToSelector:@selector(DidNotifyReadError:)])  
            [_mainMenuDelegate DidNotifyReadError:error];  
        return;  
    }  

    [_recvData appendData:characteristic.value];  

    if ([_recvData length] >= 5)//已收到長度  
    {  
        unsigned charchar *buffer = (unsigned charchar *)[_recvData bytes];  
        int nLen = buffer[3]*256 + buffer[4];  
        if ([_recvData length] == (nLen+3+2+2))  
        {  
            //接收完畢,通知代理做事  
            if ([_mainMenuDelegate respondsToSelector:@selector(DidNotifyReadData)])  
                [_mainMenuDelegate DidNotifyReadData];  
        }  
    }  
}

6、斷開連線(disconnect)
這個比較簡單,只需要一個API就行了,程式碼如下:
//主動斷開裝置  
- (void)disConnect  {  
    if (_testPeripheral != nil)   {  
        NSLog(@"disConnect start");  
        [self.centerManager cancelPeripheralConnection:_testPeripheral];  
    }  
}


六、小結

至此一個簡單的藍芽開發流程就走完了。在這裡補充一點如何判斷藍芽的開啟和關閉狀態。(不好意思,這個應該是寫在開頭才對。 不管啦,就寫在這裡吧)。直接上程式碼嘍。

//中心伺服器狀態更新後呼叫此方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    switch (central.state) {
        case CBCentralManagerStatePoweredOff:
        // 如果是關閉狀態就提示使用者藍芽是關閉的,請開啟
            _msg = BLE_OFF;
            break;
        case CBCentralManagerStatePoweredOn:
            _msg = BLE_ON;
            // 藍芽開啟了,就可以掃描外部裝置了.
            //掃描外圍裝置
            [central scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];
            break;

        default:
            break;
    }
    if(_msg!=nil&&_msg.length!=0) {
        TSLog(@"_msg == %@",self.msg);
    }
}


為了使互動更好,我添加了一個提示框UIAlertController。因為你要使用這些硬體與手機連線是需要開啟藍芽服務的。 當用戶沒有開啟藍芽的時候,引用提示使用者“你的應用需要開啟藍芽” 。只有當手機的藍芽開啟後,才可以掃描連線等等。 這裡當我們點選允許的時候,就跳轉到系統的藍芽設定裡面。

程式碼如下:

// 檢查藍芽是否開啟
    [self centralManagerDidUpdateState:_centerManager];
    if (_centerManager.state == CBCentralManagerStatePoweredOff) {
        // 彈出提示框
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"你的應用想要開啟藍芽" preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"拒絕" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            TSLog(@"拒絕");
            // 拒絕不作任何處理
        }];

        UIAlertAction *otherAction = [UIAlertAction actionWithTitle:@"允許" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            TSLog(@"允許");
            // 允許使用者開啟藍芽就會跳轉到藍芽設定頁面
            // 關於系統的各個服務設定的url會在結尾給出
            NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"];
            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                [[UIApplication sharedApplication] openURL:url];
            }
        }];
        [alertController addAction:cancelAction];
        [alertController addAction:otherAction];
        [self presentViewController:alertController animated:YES completion:nil];

ios系統中各種設定項的url連結 文/Mr_Victory(簡書作者)
原文連結:http://www.jianshu.com/p/c09d2fcc1701
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關推薦

iOS開發—CoreBluetooth詳解

CoreBluetooth的API是基於BLE4.0的標準的。這個框架涵蓋了BLE標準的所有細節。僅僅只有新的iOS裝置和Mac是和BLE標準相容.在CoreBluetooth框架中,有兩個主要的角色:周邊和中央(Peripheral and Central) ,整個框架

iOS開發

因工作的需要, 前段時間整理了一下IOS藍芽通訊相關的東西,把整理的一個成果給大家分享一下。如果有不足的地方歡迎指正。 一、專案背景 簡單介紹一下我所做的東西,裝置目前有四個,分別是體脂秤、血壓計、血糖儀、監護儀等。從名稱大家應該知道這些是什麼東西了。對,沒錯,這些裝置主要

IOS Ble開發實現

1.本篇博文闡述如何開發Ble藍芽。在藍芽中的一些常見服務,掃描,以及連結; 主藍芽類檔案.h 主藍芽類檔案.m UUID檔案 藍芽列表展示的檔案 一:引入Ble藍芽的框架<CoreBluetooth/CoreBluetooth.h>

iOS開發4.0技術完美實現

前言 前端時間,同學在做專案過程中遇到關於藍芽方面的問題,今天我就給大家進行詳細的進行講解下藍芽在iOS開發中的具體實現.在介紹藍芽前,大家要搞清楚什麼是藍芽? 什麼是藍芽? 隨著藍芽低功耗技術BLE(Bluetooth Low Energy)的發展,

ios開發4.0技術

前言 前端時間,同學在做專案過程中遇到關於藍芽方面的問題,今天我就給大家進行詳細的進行講解下藍芽在iOS開發中的具體實現.在介紹藍芽前,大家要搞清楚什麼是藍芽? 什麼是藍芽? 隨著藍芽低功耗技術BLE(Bluetooth Low Energy)的發展

電子產品開發耳機收納盒控制微控制器晶片

今日分享一款電子產品—藍芽耳機收納盒及藍芽耳機收納盒控制微控制器晶片。使用藍芽耳機的各位肯定都是曉得藍芽耳機收納盒的。大部分藍芽耳機都會隨機配備一款與之匹配的充電盒,充電盒能為其提供電力以及收納存放的功能。 藍芽耳機充電很多事使用Micro USB充電,充電口附近會有充電指示燈。拿出耳機

Android開發低功耗(4.0)開發全記錄

主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法

Android開發經典2.0)開發全記錄

前言部分 最近因為需要開始藍芽相關開發,所以在網上搜索了很多內容,並且結合自己的開發過程做了一個總結,先儲備上,也許可能幫到正在做藍芽開發的同學。 藍芽很早就是android裝置上基本通訊功能了,只是以前的沒有那麼多藍芽裝置,現在藍芽裝置種類繁多,所以經常會有人遇到藍芽相關的開發

iOS開發(二)在裝置端實現Central角色

若想在裝置上實現Central角色的功能,主要有以下步驟: 2.搜尋周圍廣播的裝置 3.與一個外設進行連線,並探索外設提供的服務 4.向外設傳送讀寫characteristic的請求,如果有需要訂閱characteristic值得更新,來跟蹤資料的變化。 myCe

iOS開發 —— 連線列印機發送16進位制資料的問題

最近在做公司的一個藍芽連線印表機的專案,正常的藍芽連線印表機進行列印沒問題,但是要傳送一個16進位制的指令來獲取藍芽裝置資訊時頗費了一番功夫,現做如下記錄: Byte byteArray[] = {0x1d ,0x67 ,0x61}; NSData *sendData = [NSData data

Android 開發搜尋、配對、連線、通訊大全

        藍芽( Bluetooth®):是一種無線技術標準,可實現固定裝置、移動裝置和樓宇個人域網之間的短距離資料交換(使用2.4—2.485GHz的ISM波段的UHF無線電波)。藍芽裝置最多可以同時和7個其它藍芽裝置建立連線,進行通訊,當然並不是每一個藍芽都可以達到

iOS開發

原作者:===>https://blog.csdn.net/swibyn/article/details/20531593 demo下載 http://download.csdn.net/detail/swibyn/9717588 直接看程式碼 http://blog.

iOS基於CoreBlutooth的開發

首先如同網路一般,藍芽也類似的可以分服務端和客戶端,CoreBlutooth中有兩個角色,一個是Peripheral,相當於伺服器端,也就是我們開啟手機藍芽搜尋時找到的各個裝置;一個是Central,相當於客戶端,也就是我們使用的手機,這兩個角色和一般的手機使用主權引起的角

Android開發詳解(一)

一.概述 這篇文章是我學習Android開發官網以及網上一些其他文章總結而來,主要就是為了好好研究一下藍芽開發,看完這篇文章以後,我們就知道了怎樣使用藍芽API完成建立藍芽連線的必要四步:1.開啟藍芽;2.查詢附近已配對或可用的裝置;3.連線裝置;4.裝置間資

iOS近場通訊(開發,WiFi開發)

標籤: ios it 近場通訊 藍芽 wifi 分類: iOS 1 AirDrop (UIActivityViewController類) 功能:實現iOS裝置間的檔案和資料分享。AirDrop使用藍芽來掃描周圍的裝置,當兩臺裝置通過藍芽建立起了連線,考慮到

iOS開發連線和資料讀寫

當下藍芽開發可謂是越來越火,不論是智慧穿戴的興起還是藍芽傢俱,車聯網藍芽等等,很多同學也會接觸到藍芽的專案,我從事藍芽開發也有一段時間了,經手了兩個專案。廢話不多說了,先向大家簡單的介紹有關藍芽開發的知識。藍芽低能耗(BLE),以下介紹的都是圍繞iOS的框架展開

iOS開發(二):iOS 4.0中心模式 程式碼實現

上一篇簡單介紹了藍芽的部分基礎知識,詳細的東西大家可以去github上搜babyBluetooth,裡面有一些學習資料 iOS連線外設的流程 建立中心管理者 掃描外設 discoverPeripheral 連線外設 connectPeripheral

Android開發(一)開啟和裝置搜尋

Android藍芽開發系列目錄: 一、判斷是否系統是否支援藍芽 在使用藍芽之前,我們首先要判斷手機裝置是否支援藍芽,雖然現在基本都支援藍芽了,但是為了程式碼的嚴謹性我們還是需要在程式碼中判斷: private BluetoothManager bluetoothma

ios開發(三)app作為外設被連線的實現

再上一節說了app作為central連線peripheral的情況,這一節介紹如何使用app釋出一個peripheral,給其他的central連線 還是這張圖,central模式用的都是左邊的類,而peripheral模式用的是右邊的類 peripheral模式的流

iOS開發的連線和資料的讀寫

       藍芽開發說簡單也簡單,說不簡單也有點難,開發人員在首次開發藍芽前首先需要搞清楚藍芽開發的概念,還要了解掌握藍芽開發的一整套流程,這樣才能快速上手開發藍芽。       藍芽開發分為兩種模式:管理者模式和中心者模式。管理者模式基本很少用到,相當於iPhone手機