bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

ios開發藍牙配對,藍牙配對iphone

iOS 藍牙開發(一)

iOS 藍牙開發(二)

成都創新互聯專注于南岔企業網站建設,成都響應式網站建設公司,商城網站建設。南岔網站建設公司,為南岔等地區提供建站服務。全流程按需定制開發,專業設計,全程項目跟蹤,成都創新互聯專業和態度為您提供的服務

iOS 藍牙開發(三)

iOS 藍牙開發(四)

在iOS中藍牙相關實現都是在CoreBluetooth這個framework中的,所以我們創建一個單例類中需要先導入 #import CoreBluetooth/CoreBluetooth.h ,再后即可使用這個單例類進行管理我們藍牙的掃描、連接、狀態等實現。

當 central.state 為CBManagerStatePoweredOn即可開始掃描, 具體方法 [self.centralManager scanForPeripheralsWithServices:nil options:nil] 當調用 scanForPeripheralsWithServices:options: 函數時就會實時調用其代理方法 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

peripheral 是外設類 advertisementData 是廣播的值,一般攜帶設備名, serviceUUID 等信息。 RSSI 絕對值越大,表示信號越差,設備離的越遠。如果想裝換成百分比強度, (RSSI+100)/1001 (這是一個約數,藍牙信號值并不一定是-100 - 0的值)

藍牙的連接是當中心設備掃描到可用外設后, 利用函數 [self.centralManager connectPeripheral:peripheral options:nil]; 進行鏈接, 當函數被調用后, 就會回調其對應的代理函數。

本篇筆記主要是記錄如何初始化藍牙的 CBCentralManager 的中心管理類,并記錄如何實現掃描周邊外設、如何鏈接、獲取藍牙當前狀態。

iOS藍牙開發:藍牙的連接和數據的讀寫

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

? 藍牙開發分為兩種模式:管理者模式和中心者模式。管理者模式基本很少用到,相當于iPhone手機作為外設,自己創建服務和特性,然后用其他設備連接iPhone手機;中心者模式一般是大部分情況下都會使用的,使用中心者模式開發相當于iPhone手機作為主機,連接藍牙外設,下面介紹藍牙開發的例子就是使用的中心者模式來講解的。

在這里我還是要推薦下我自己建的iOS開發學習群:680565220,群里都是學ios開發的,如果你正在學習ios ,我歡迎你加入,今天分享的這個案例已經上傳到群文件,大家都是軟件開發黨,不定期分享干貨(只有iOS軟件開發相關的),包括我自己整理的一份2018最新的iOS進階資料和高級開發教程

一、關于藍牙開發的一些重要的理論概念:

1、服務(services):藍牙外設對外廣播的時候一定會有一個服務,有些時候也可以是有多個服務,服務下面包含一些特性,服務可以理解成一個模塊的窗口;

2、特征(characteristic):特征存在于服務下面的,一個服務下面可以有多個特征,特征可以理解成具體實現功能的窗口,一般的特性都會有value,也就是特征值,是特征和外界交互的最小單位;

? 3、UUID:藍牙上的唯一標示符,為了區分不同服務和特征,就用UUID來表示。

二、藍牙連接的主要步驟

?1、創建一個CBCentralManager實例來進行藍牙管理;

?2、搜索掃描外圍設備;

?3、連接外圍設備;

?4、獲得外圍設備的服務;

?5、獲得服務的特征;

?6、從外圍設備讀取數據;

?7、給外圍設備發送(寫入)數據。

三、藍牙連接和數據讀寫的具體步驟

?1、導入蘋果系統藍牙框架

#import

?2、遵循兩個藍牙框架相關的協議

3、新建兩個實例屬性,一個特征屬性

@property (nonatomic, strong) CBCentralManager *centralManager; //中心管理者

@property (nonatomic, strong) CBPeripheral *peripheral; //連接到的外設

@property (nonatomic, strong) CBCharacteristic *characteristic; //特征

?4、初始化CBCentralManager,進行藍牙管理

- (void)viewDidLoad {

[super viewDidLoad];

self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; ? ? //創建實例進行藍牙管理

}

//若中心管理者初始化之后 就會觸發下面這個代理方法 該代理方法是用來判斷手機藍牙的狀態的

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {

// 藍牙可用,開始掃描外設

if (central.state == CBManagerStatePoweredOn) {

NSLog(@"藍牙可用");

//在中心管理者成功開啟之后再進行一些操作

//搜索掃描外設

// 根據SERVICE_UUID來掃描外設,如果不設置SERVICE_UUID,則掃描所有藍牙設備

// [self.centralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:SERVICE_UUID]]}];

[central scanForPeripheralsWithServices:nil options:nil];

}

if(central.state == CBManagerStateUnsupported) {

NSLog(@"該設備不支持藍牙");

}

if (central.state == CBManagerStatePoweredOff) {

NSLog(@"藍牙已關閉");

}

if (central.state == CBManagerStateUnknown) {

NSLog(@"藍牙當前狀態不明確");

}

if (central.state == CBManagerStateUnauthorized) {

NSLog(@"藍牙未被授權");

}

}

? 5、搜索外圍設備

//執行掃描動作之后,如果掃描到外設了,就會自動回調下面的協議方法

/** 發現符合要求的外設,回調 */

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

NSLog(@"%@====",peripheral.name);

//根據外設名字有選擇性的篩選連接藍牙設備

if ([peripheral.name hasPrefix:@"TEAMOSA"]) {

//在這里對外設攜帶的廣播數據進行進一步的處理

if ([self.peripheraNames containsObject:peripheral.name]) {

//如果數組中包含了就不再添加

return;

}

//添加到外設名字數組中

[self.peripheraNames addObject:peripheral.name];

//標記外設,讓它的生命周期與控制器的一致

self.peripheral = peripheral;

// 可以根據外設名字來過濾外設

// [central connectPeripheral:peripheral options:nil];

}

// 連接外設

// [central connectPeripheral:peripheral options:nil];

}

6、連接外圍設備

//連接外圍設備,中心管理者連接外設成功,如果連接成功就會回調這個協議方法

/** 連接成功 */

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{

//連接成功之后,可以進行服務和特性的發現。 停止中心管理設備的掃描動作,要不然在你和已經連接好的外設進行數據溝通時,如果又有一個外設進行廣播且符合你的連接條件,那么你的iOS設備也會去連接這個設備(因為iOS BLE4.0是支持一對多連接的),導致數據的混亂。

//停止掃描動作

[self.centralManager stopScan];

// 設置外設的代理

peripheral.delegate = self;

// 根據UUID來尋找服務

// [peripheral discoverServices:@[[CBUUID UUIDWithString:SERVICE_UUID]]];

//外設發現服務,傳nil代表不過濾,一次性讀出外設的所有服務

[peripheral discoverServices:nil];

NSLog(@"%s, line = %d, %@=連接成功", __FUNCTION__, __LINE__, peripheral.name);

}

//外設連接失敗

/** 連接失敗的回調 */

- (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);

// 斷開連接可以設置重新連接

[central connectPeripheral:peripheral options:nil];

}

7、獲取外圍設備服務和特征

/** 發現服務 */

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {

// 遍歷出外設中所有的服務

for (CBService *service in peripheral.services) {

// NSLog(@"所有的服務:%@",service);

}

// 這里僅有一個服務,所以直接獲取

CBService *service = peripheral.services.lastObject;

// 根據UUID尋找服務中的特征

// [peripheral discoverCharacteristics:@[[CBUUID UUIDWithString:CHARACTERISTIC_UUID]] forService:service];

// [peripheral discoverCharacteristics:@[service.UUID] forService:service];

[peripheral discoverCharacteristics:nil forService:service];

}

8、從外圍設備讀取數據

// 更新特征的value的時候會調用 (凡是從藍牙傳過來的數據都要經過這個回調,簡單的說這個方法就是你拿數據的唯一方法) 你可以判斷是否 從外圍設備讀數據

/** 接收到數據回調 */

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

// if (characteristic == @"你要的特征的UUID或者是你已經找到的特征") {

// //characteristic.value就是你要的數據

// }

if ([peripheral.name hasPrefix:@"TEAMOSA"]){

NSData *data = characteristic.value;

NSString *value = [self hexadecimalString:data];

// NSLog(@"characteristic(讀取到的): %@, data : %@, value : %@", characteristic, data, value);

}

// 拿到外設發送過來的數據

// NSData *data = characteristic.value;

// self.textFild.text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}

9、向外圍設備發送(寫入)數據

//這個方法你可以放在button的響應里面,也可以在找到特征的時候就寫入,具體看你業務需求怎么用

//[self.peripherale writeValue:_batteryData forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];//第一個參數是已連接的藍牙設備; 第二個參數是要寫入到哪個特征; 第三個參數是通過此響應記錄是否成功寫入 需要注意的是特征的屬性是否支持寫數據

/** 寫入數據回調 */

- (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

};

打印出特征的權限(characteristic.properties),可以看到有很多種,這是一個NS_OPTIONS的枚舉,可以是多個值

常見的又read,write,noitfy,indicate.知道這幾個基本夠用了,前倆是讀寫權限,后倆都是通知,倆不同的通知方式

*/

// NSLog(@"%s, line = %d, char.pro = %d", __FUNCTION__, __LINE__, characteristic.properties);

// 此時由于枚舉屬性是NS_OPTIONS,所以一個枚舉可能對應多個類型,所以判斷不能用 = ,而應該用包含

NSLog(@"write value success(寫入成功) : %@", characteristic);

}

10、具體調用給藍牙外設寫入數據方法,這里的例子是以按鈕點擊事件里面來調用處理

//發送按鈕點擊事件

- (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];

// 根據上面的特征self.characteristic來寫入數據

[self.peripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];

iOS 藍牙BLE開發

GAP(Generic Access Profile):它用來控制設備連接和廣播,GAP 使你的設備被其他設備可見,并決定了你的設備是否可以或者怎樣與合同設備進行交互。

GATT(Generic Attribute Profile):BLE連接都是建立在GATT協議之上的。GATT 是一個在藍牙連接之上的發送和接收很短的數據段的通用規范,這些很短的數據段被稱為屬性(Attribute)。

BLE中主要有兩個角色:外圍設備(Peripheral)和中心設備(Central)。一個中心設備可以連接多個外圍設備,一個外圍設備包含一個或多個服務(services),一個服務包含一個或多個特征(characteristics)。

使用CoreBluetooth庫,創建CBPeripheralManager,實現CBPeripheralManagerDelegate代理

創建完該對象,會回調peripheralManagerDidUpdateState:方法判斷藍牙狀態,藍牙可用,給外設配置服務和特征

注意CBAttributePermissions

當中心設備讀寫設置CBAttributePermissionsReadEncryptionRequired/CBAttributePermissionsWriteEncryptionRequired權限的Characteristic時,會彈出彈框,請求建立安全連接

給外設配置服務特征后,會調用peripheralManager:didAddService:error: 服務特征全部添加完后發起廣播,如果在廣播時設置CBAdvertisementDataServiceUUIDsKey,會把該service廣播出去,中心設備在掃描時可根據該uuid找到該設備。外圍設備靠不斷發廣播,使中心設備發現它。

當中央端連接上了此設備并訂閱了特征時會回調 didSubscribeToCharacteristic:

當接收到中央端讀的請求時會調用didReceiveReadRequest:

創建CBCentralManager對象,實現CBCentralManagerDelegate代理

回調centralManagerDidUpdateState:代理方法,當central.state==CBManagerStatePoweredOn時,開啟掃描,設置serviceUUIDs可掃描特定外設,CBCentralManagerScanOptionAllowDuplicatesKey設為NO不重復掃描已發現設備,YES是允許

掃描到設備會回調centralManager:didDiscoverPeripheral:advertisementData:RSSI:,RSS絕對值越大,表示信號越差,設備離的越遠

關閉掃描

連接設備

發現服務

發現特征

當前標題:ios開發藍牙配對,藍牙配對iphone
瀏覽路徑:http://vcdvsql.cn/article16/dsdgjgg.html

成都網站建設公司_創新互聯,為您提供域名注冊網站排名外貿網站建設企業網站制作搜索引擎優化關鍵詞優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站托管運營