日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS开发 蓝牙技术4.0详解

發布時間:2023/12/13 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS开发 蓝牙技术4.0详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

前端時間,同學在做項目過程中遇到關于藍牙方面的問題,今天我就給大家進行詳細的進行講解下藍牙在iOS開發中的具體實現.在介紹藍牙前,大家要搞清楚什么是藍牙?

什么是藍牙?

隨著藍牙低功耗技術BLE(Bluetooth Low Energy)的發展,藍牙技術正在一步步成熟,如今的大部分移動設備都配備有藍牙4.0,相比之前的藍牙技術耗電量大大降低。從iOS的發展史也不難看出蘋果目前對藍牙技術也是越來越關注,例如蘋果于2013年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芯片的智能設備傳輸,因此也是目前智能家居、無線支付等熱門智能設備所推崇的技術。

    藍牙框架之GameKit框架

    其實從名稱來看這個框架并不是專門為了支持藍牙傳輸而設計的,它是為游戲設計的。而很多游戲中會用到基于藍牙的點對點信息傳輸,因此這個框架中集成了藍牙傳輸模塊。前面也說了這個框架本身有很多限制,但是在iOS7之前的很多藍牙傳輸都是基于此框架的,所以有必要對它進行了解。GameKit中的藍牙使用設計很簡單,并沒有給開發者留有太多的復雜接口,而多數連接細節開發者是不需要關注的。GameKit中提供了兩個關鍵類來操作藍牙連接:

    GKPeerPickerController:藍牙查找、連接用的視圖控制器,通常情況下應用程序A打開后會調用此控制器的show方法來展示一個藍牙查找的視圖,一旦發現了另一個同樣在查找藍牙連接的客戶客戶端B就會出現在視圖列表中,此時如果用戶點擊連接B,B客戶端就會詢問用戶是否允許A連接B,如果允許后A和B之間建立一個藍牙連接。

    GKSession:連接會話,主要用于發送和接受傳輸數據。一旦A和B建立連接GKPeerPickerController的代理方法會將A、B兩者建立的會話(GKSession)對象傳遞給開發人員,開發人員拿到此對象可以發送和接收數據。

    其實理解了上面兩個類之后,使用起來就比較簡單了,下面就以一個圖片發送程序來演示GameKit中藍牙的使用。此程序一個客戶端運行在模擬器上作為客戶端A,另一個運行在iPhone真機上作為客戶端B(注意A、B必須運行同一個程序,GameKit藍牙開發是不支持兩個不同的應用傳輸數據的)。兩個程序運行之后均調用GKPeerPickerController來發現周圍藍牙設備,一旦A發現了B之后就開始連接B,然后iOS會詢問用戶是否接受連接,一旦接受之后就會調用GKPeerPickerController的-(void)peerPickerController:(GKPeerPickerController?)picker didConnectPeer:(NSString?)peerID toSession:(GKSession *)session代理方法,在此方法中可以獲得連接的設備id(peerID)和連接會話(session);此時可以設置會話的數據接收句柄(相當于一個代理)并保存會話以便發送數據時使用;一旦一端(假設是A)調用會話的sendDataToAllPeers: withDataMode: error:方法發送數據,此時另一端(假設是B)就會調用句柄的?
    - (void) receiveData:(NSData?)data fromPeer:(NSString?)peer inSession: (GKSession?)session context:(void?)context方法,在此方法可以獲得發送數據并處理。下面是程序代碼:

    #import "ViewController.h" #import <GameKit/GameKit.h>@interface ViewController ()<GKPeerPickerControllerDelegate,UIImagePickerControllerDelegate,UINavigationBarDelegate>@property (weak, nonatomic) IBOutlet UIImageView *imageView;//照片顯示視圖 @property (strong,nonatomic) GKSession *session;//藍牙連接會話@end@implementation ViewController#pragma mark - 控制器視圖方法 - (void)viewDidLoad {[super viewDidLoad];GKPeerPickerController *pearPickerController=[[GKPeerPickerController alloc]init];pearPickerController.delegate=self;[pearPickerController show]; }#pragma mark - UI事件 - (IBAction)selectClick:(UIBarButtonItem *)sender {UIImagePickerController *imagePickerController=[[UIImagePickerController alloc]init];imagePickerController.delegate=self;[self presentViewController:imagePickerController animated:YES completion:nil]; }- (IBAction)sendClick:(UIBarButtonItem *)sender {NSData *data=UIImagePNGRepresentation(self.imageView.image);NSError *error=nil;[self.session sendDataToAllPeers:data withDataMode:GKSendDataReliable error:&error];if (error) {NSLog(@"發送圖片過程中發生錯誤,錯誤信息:%@",error.localizedDescription);} }#pragma mark - GKPeerPickerController代理方法 /*** 連接到某個設備** @param picker 藍牙點對點連接控制器* @param peerID 連接設備藍牙傳輸ID* @param session 連接會話*/ -(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{self.session=session;NSLog(@"已連接客戶端設備:%@.",peerID);//設置數據接收處理句柄,相當于代理,一旦數據接收完成調用它的-receiveData:fromPeer:inSession:context:方法處理數據[self.session setDataReceiveHandler:self withContext:nil];[picker dismiss];//一旦連接成功關閉窗口 }#pragma mark - 藍牙數據接收方法 - (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context{UIImage *image=[UIImage imageWithData:data];self.imageView.image=image;UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);NSLog(@"數據發送成功!"); } #pragma mark - UIImagePickerController代理方法 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{self.imageView.image=[info objectForKey:UIImagePickerControllerOriginalImage];[self dismissViewControllerAnimated:YES completion:nil]; }-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{[self dismissViewControllerAnimated:YES completion:nil]; } @end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    運行效果(左側是真機,右側是模擬器,程序演示了兩個客戶端互發圖片的場景:首先是模擬器發送圖片給真機,然后真機發送圖片給模擬器)?

    藍牙框架之MultipeerConnectivity框架

    前面已經說了GameKit相關的藍牙操作類從iOS7已經全部過期,蘋果官方推薦使用MultipeerConnectivity代替。但是應該了解,MultipeerConnectivity.framework并不僅僅支持藍牙連接,準確的說它是一種支持Wi-Fi網絡、P2P Wi-Fi已經藍牙個人局域網的通信框架,它屏蔽了具體的連接技術,讓開發人員有統一的接口編程方法。通過MultipeerConnectivity連接的節點之間可以安全的傳遞信息、流或者其他文件資源而不必通過網絡服務。此外使用MultipeerConnectivity進行近場通信也不再局限于同一個應用之間傳輸,而是可以在不同的應用之間進行數據傳輸(當然如果有必要的話你仍然可以選擇在一個應用程序之間傳輸)。

    要了解MultipeerConnectivity的使用必須要清楚一個概念:廣播(Advertisting)和發現(Disconvering),這很類似于一種Client-Server模式。假設有兩臺設備A、B,B作為廣播去發送自身服務,A作為發現的客戶端。一旦A發現了B就試圖建立連接,經過B同意二者建立連接就可以相互發送數據。在使用GameKit框架時,A和B既作為廣播又作為發現,當然這種情況在MultipeerConnectivity中也很常見。

    A.廣播

    無論是作為服務器端去廣播還是作為客戶端去發現廣播服務,那么兩個(或更多)不同的設備之間必須要有區分,通常情況下使用MCPeerID對象來區分一臺設備,在這個設備中可以指定顯示給對方查看的名稱(display name)。另外不管是哪一方,還必須建立一個會話MCSession用于發送和接受數據。通常情況下會在會話的-(void)session:(MCSession?)session peer:(MCPeerID?)peerID didChangeState:(MCSessionState)state代理方法中跟蹤會話狀態(已連接、正在連接、未連接);在會話的-(void)session:(MCSession?)session didReceiveData:(NSData?)data fromPeer:(MCPeerID *)peerID代理方法中接收數據;同時還會調用會話的-(void)sendData: toPeers:withMode: error:方法去發送數據。

    廣播作為一個服務器去發布自身服務,供周邊設備發現連接。在MultipeerConnectivity中使用MCAdvertiserAssistant來表示一個廣播,通常創建廣播時指定一個會話MCSession對象將廣播服務和會話關聯起來。一旦調用廣播的start方法周邊的設備就可以發現該廣播并可以連接到此服務。在MCSession的代理方法中可以隨時更新連接狀態,一旦建立了連接之后就可以通過MCSession的connectedPeers獲得已經連接的設備。

    B.發現

    前面已經說過作為發現的客戶端同樣需要一個MCPeerID來標志一個客戶端,同時會擁有一個MCSession來監聽連接狀態并發送、接受數據。除此之外,要發現廣播服務,客戶端就必須要隨時查找服務來連接,在MultipeerConnectivity中提供了一個控制器MCBrowserViewController來展示可連接和已連接的設備(這類似于GameKit中的GKPeerPickerController),當然如果想要自己定制一個界面來展示設備連接的情況你可以選擇自己開發一套UI界面。一旦通過MCBroserViewController選擇一個節點去連接,那么作為廣播的節點就會收到通知,詢問用戶是否允許連接。由于初始化MCBrowserViewController的過程已經指定了會話MCSession,所以連接過程中會隨時更新會話狀態,一旦建立了連接,就可以通過會話的connected屬性獲得已連接設備并且可以使用會話發送、接受數據。

    下面用兩個不同的應用程序來演示使用MultipeerConnectivity的使用過程,其中一個應用運行在模擬器中作為廣播節點,另一個運行在iPhone真機上作為發現節點,并且實現兩個節點的圖片互傳。

    首先看一下作為廣播節點的程序:

    界面:?
    ?
    點擊“開始廣播”來發布服務,一旦有節點連接此服務就可以使用“選擇照片”來從照片庫中選取一張圖片并發送到所有已連接節點。?
    程序:

    #import "ViewController.h" #import <MultipeerConnectivity/MultipeerConnectivity.h>@interface ViewController ()<MCSessionDelegate,MCAdvertiserAssistantDelegate, UIImagePickerControllerDelegate,UINavigationControllerDelegate> @property (strong,nonatomic) MCSession *session; @property (strong,nonatomic) MCAdvertiserAssistant *advertiserAssistant; @property (strong,nonatomic) UIImagePickerController *imagePickerController;@property (weak, nonatomic) IBOutlet UIImageView *photo;@end@implementation ViewController#pragma mark - 控制器視圖事件 - (void)viewDidLoad {[super viewDidLoad];//創建節點,displayName是用于提供給周邊設備查看和區分此服務的MCPeerID *peerID=[[MCPeerID alloc]initWithDisplayName:@"KenshinCui_Advertiser"];_session=[[MCSession alloc]initWithPeer:peerID];_session.delegate=self;//創建廣播_advertiserAssistant=[[MCAdvertiserAssistant alloc]initWithServiceType:@"cmj-stream" discoveryInfo:nil session:_session];_advertiserAssistant.delegate=self;}#pragma mark - UI事件 - (IBAction)advertiserClick:(UIBarButtonItem *)sender {//開始廣播[self.advertiserAssistant start]; } - (IBAction)selectClick:(UIBarButtonItem *)sender {_imagePickerController=[[UIImagePickerController alloc]init];_imagePickerController.delegate=self;[self presentViewController:_imagePickerController animated:YES completion:nil]; }#pragma mark - MCSession代理方法 -(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{NSLog(@"didChangeState");switch (state) {case MCSessionStateConnected:NSLog(@"連接成功.");break;case MCSessionStateConnecting:NSLog(@"正在連接...");break;default:NSLog(@"連接失敗.");break;} } //接收數據 -(void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{NSLog(@"開始接收數據...");UIImage *image=[UIImage imageWithData:data];[self.photo setImage:image];//保存到相冊UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);} #pragma mark - MCAdvertiserAssistant代理方法#pragma mark - UIImagePickerController代理方法 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];[self.photo setImage:image];//發送數據給所有已連接設備NSError *error=nil;[self.session sendData:UIImagePNGRepresentation(image) toPeers:[self.session connectedPeers] withMode:MCSessionSendDataUnreliable error:&error];NSLog(@"開始發送數據...");if (error) {NSLog(@"發送數據過程中發生錯誤,錯誤信息:%@",error.localizedDescription);}[self.imagePickerController dismissViewControllerAnimated:YES completion:nil]; } -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{[self.imagePickerController dismissViewControllerAnimated:YES completion:nil]; } @end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    再看一下作為發現節點的程序:

    界面:

    ?
    點擊“查找設備”瀏覽可用服務,點擊服務建立連接;一旦建立了連接之后就可以點擊“選擇照片”會從照片庫中選擇一張圖片并發送給已連接的節點。

    程序:

    #import "ViewController.h" #import <MultipeerConnectivity/MultipeerConnectivity.h>@interface ViewController ()<MCSessionDelegate,MCBrowserViewControllerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate> @property (strong,nonatomic) MCSession *session; @property (strong,nonatomic) MCBrowserViewController *browserController; @property (strong,nonatomic) UIImagePickerController *imagePickerController;@property (weak, nonatomic) IBOutlet UIImageView *photo; @end@implementation ViewController#pragma mark - 控制器視圖事件 - (void)viewDidLoad {[super viewDidLoad];//創建節點MCPeerID *peerID=[[MCPeerID alloc]initWithDisplayName:@"KenshinCui"];//創建會話_session=[[MCSession alloc]initWithPeer:peerID];_session.delegate=self;} #pragma mark- UI事件 - (IBAction)browserClick:(UIBarButtonItem *)sender {_browserController=[[MCBrowserViewController alloc]initWithServiceType:@"cmj-stream" session:self.session];_browserController.delegate=self;[self presentViewController:_browserController animated:YES completion:nil]; } - (IBAction)selectClick:(UIBarButtonItem *)sender {_imagePickerController=[[UIImagePickerController alloc]init];_imagePickerController.delegate=self;[self presentViewController:_imagePickerController animated:YES completion:nil]; }#pragma mark - MCBrowserViewController代理方法 -(void)browserViewControllerDidFinish:(MCBrowserViewController *)browserViewController{NSLog(@"已選擇");[self.browserController dismissViewControllerAnimated:YES completion:nil]; } -(void)browserViewControllerWasCancelled:(MCBrowserViewController *)browserViewController{NSLog(@"取消瀏覽.");[self.browserController dismissViewControllerAnimated:YES completion:nil]; }#pragma mark - MCSession代理方法 -(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{NSLog(@"didChangeState");switch (state) {case MCSessionStateConnected:NSLog(@"連接成功.");[self.browserController dismissViewControllerAnimated:YES completion:nil];break;case MCSessionStateConnecting:NSLog(@"正在連接...");break;default:NSLog(@"連接失敗.");break;} } //接收數據 -(void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID{NSLog(@"開始接收數據...");UIImage *image=[UIImage imageWithData:data];[self.photo setImage:image];//保存到相冊UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);} #pragma mark - UIImagePickerController代理方法 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];[self.photo setImage:image];//發送數據給所有已連接設備NSError *error=nil;[self.session sendData:UIImagePNGRepresentation(image) toPeers:[self.session connectedPeers] withMode:MCSessionSendDataUnreliable error:&error];NSLog(@"開始發送數據...");if (error) {NSLog(@"發送數據過程中發生錯誤,錯誤信息:%@",error.localizedDescription);}[self.imagePickerController dismissViewControllerAnimated:YES completion:nil]; } -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{[self.imagePickerController dismissViewControllerAnimated:YES completion:nil]; } @end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    在兩個程序中無論是MCBrowserViewController還是MCAdvertiserAssistant在初始化的時候都指定了一個服務類型“cmj-photo”,這是唯一標識一個服務類型的標記,可以按照官方的要求命名,應該盡可能表達服務的作用。需要特別指出的是,如果廣播命名為“cmj-photo”那么發現節點只有在MCBrowserViewController中指定為“cmj-photo”才能發現此服務。

    運行效果:?

    藍牙框架之CoreBluetooth框架

    無論是GameKit還是MultipeerConnectivity,都只能在iOS設備之間進行數據傳輸,這就大大降低了藍牙的使用范圍,于是從iOS6開始蘋果推出了CoreBluetooth.framework,這個框架最大的特點就是完全基于BLE4.0標準并且支持非iOS設備。當前BLE應用相當廣泛,不再僅僅是兩個設備之間的數據傳輸,它還有很多其他應用市場,例如室內定位、無線支付、智能家居等等,這也使得CoreBluetooth成為當前最熱門的藍牙技術。

    CoreBluetooth設計同樣也是類似于客戶端-服務器端的設計,作為服務器端的設備稱為外圍設備(Peripheral),作為客戶端的設備叫做中央設備(Central),CoreBlueTooth整個框架就是基于這兩個概念來設計的。

    ?
    外圍設備和中央設備在CoreBluetooth中使用CBPeripheralManager和CBCentralManager表示。

    CBPeripheralManager:外圍設備通常用于發布服務、生成數據、保存數據。外圍設備發布并廣播服務,告訴周圍的中央設備它的可用服務和特征。

    CBCentralManager:中央設備使用外圍設備的數據。中央設備掃描到外圍設備后會就會試圖建立連接,一旦連接成功就可以使用這些服務和特征。

    外圍設備和中央設備之間交互的橋梁是服務(CBService)和特征(CBCharacteristic),二者都有一個唯一的標識UUID(CBUUID類型)來唯一確定一個服務或者特征,每個服務可以擁有多個特征,下面是他們之間的關系:?
    ?
    一臺iOS設備(注意iPhone4以下設備不支持BLE,另外iOS7.0、8.0模擬器也無法模擬BLE)既可以作為外圍設備又可以作為中央設備,但是不能同時即是外圍設備又是中央設備,同時注意建立連接的過程不需要用戶手動選擇允許,這一點和前面兩個框架是不同的,這主要是因為BLE應用場景不再局限于兩臺設備之間資源共享了。?
    A.外圍設備

    創建一個外圍設備通常分為以下幾個步驟:?
    1. 創建外圍設備CBPeripheralManager對象并指定代理。?
    2. 創建特征CBCharacteristic、服務CBSerivce并添加到外圍設備?
    3. 外圍設備開始廣播服務(startAdvertisting:)。?
    4. 和中央設備CBCentral進行交互。?
    下面是簡單的程序示例,程序有兩個按鈕“啟動”和“更新”,點擊啟動按鈕則創建外圍設備、添加服務和特征并開始廣播,一旦發現有中央設備連接并訂閱了此服務的特征則通過更新按鈕更新特征數據,此時已訂閱的中央設備就會收到更新數據。?

    #import "ViewController.h" #import <CoreBluetooth/CoreBluetooth.h> #define kPeripheralName @"Kenshin Cui's Device" //外圍設備名稱 #define kServiceUUID @"C4FB2349-72FE-4CA2-94D6-1F3CB16331EE" //服務的UUID #define kCharacteristicUUID @"6A3E4B28-522D-4B3B-82A9-D5E2004534FC" //特征的UUID@interface ViewController ()<CBPeripheralManagerDelegate>@property (strong,nonatomic) CBPeripheralManager *peripheralManager;//外圍設備管理器@property (strong,nonatomic) NSMutableArray *centralM;//訂閱此外圍設備特征的中心設備@property (strong,nonatomic) CBMutableCharacteristic *characteristicM;//特征 @property (weak, nonatomic) IBOutlet UITextView *log; //日志記錄@end@implementation ViewController #pragma mark - 視圖控制器方法 - (void)viewDidLoad {[super viewDidLoad]; }#pragma mark - UI事件 //創建外圍設備 - (IBAction)startClick:(UIBarButtonItem *)sender {_peripheralManager=[[CBPeripheralManager alloc]initWithDelegate:self queue:nil]; } //更新數據 - (IBAction)transferClick:(UIBarButtonItem *)sender {[self updateCharacteristicValue]; }#pragma mark - CBPeripheralManager代理方法 //外圍設備狀態發生變化后調用 -(void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral{switch (peripheral.state) {case CBPeripheralManagerStatePoweredOn:NSLog(@"BLE已打開.");[self writeToLog:@"BLE已打開."];//添加服務[self setupService];break;default:NSLog(@"此設備不支持BLE或未打開藍牙功能,無法作為外圍設備.");[self writeToLog:@"此設備不支持BLE或未打開藍牙功能,無法作為外圍設備."];break;} } //外圍設備添加服務后調用 -(void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error{if (error) {NSLog(@"向外圍設備添加服務失敗,錯誤詳情:%@",error.localizedDescription);[self writeToLog:[NSString stringWithFormat:@"向外圍設備添加服務失敗,錯誤詳情:%@",error.localizedDescription]];return;}//添加服務后開始廣播NSDictionary *dic=@{CBAdvertisementDataLocalNameKey:kPeripheralName};//廣播設置[self.peripheralManager startAdvertising:dic];//開始廣播NSLog(@"向外圍設備添加了服務并開始廣播...");[self writeToLog:@"向外圍設備添加了服務并開始廣播..."]; } -(void)peripheralManagerDidStartAdvertising:(CBPeripheralManager *)peripheral error:(NSError *)error{if (error) {NSLog(@"啟動廣播過程中發生錯誤,錯誤信息:%@",error.localizedDescription);[self writeToLog:[NSString stringWithFormat:@"啟動廣播過程中發生錯誤,錯誤信息:%@",error.localizedDescription]];return;}NSLog(@"啟動廣播...");[self writeToLog:@"啟動廣播..."]; } //訂閱特征 -(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic{NSLog(@"中心設備:%@ 已訂閱特征:%@.",central,characteristic);[self writeToLog:[NSString stringWithFormat:@"中心設備:%@ 已訂閱特征:%@.",central.identifier.UUIDString,characteristic.UUID]];//發現中心設備并存儲if (![self.centralM containsObject:central]) {[self.centralM addObject:central];}/*中心設備訂閱成功后外圍設備可以更新特征值發送到中心設備,一旦更新特征值將會觸發中心設備的代理方法:-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error*/// [self updateCharacteristicValue]; } //取消訂閱特征 -(void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didUnsubscribeFromCharacteristic:(CBCharacteristic *)characteristic{NSLog(@"didUnsubscribeFromCharacteristic"); } -(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(CBATTRequest *)request{NSLog(@"didReceiveWriteRequests"); } -(void)peripheralManager:(CBPeripheralManager *)peripheral willRestoreState:(NSDictionary *)dict{NSLog(@"willRestoreState"); } #pragma mark -屬性 -(NSMutableArray *)centralM{if (!_centralM) {_centralM=[NSMutableArray array];}return _centralM; }#pragma mark - 私有方法 //創建特征、服務并添加服務到外圍設備 -(void)setupService{/*1.創建特征*///創建特征的UUID對象CBUUID *characteristicUUID=[CBUUID UUIDWithString:kCharacteristicUUID];//特征值 // NSString *valueStr=kPeripheralName; // NSData *value=[valueStr dataUsingEncoding:NSUTF8StringEncoding];//創建特征/** 參數* uuid:特征標識* properties:特征的屬性,例如:可通知、可寫、可讀等* value:特征值* permissions:特征的權限*/CBMutableCharacteristic *characteristicM=[[CBMutableCharacteristic alloc]initWithType:characteristicUUID properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];self.characteristicM=characteristicM; // CBMutableCharacteristic *characteristicM=[[CBMutableCharacteristic alloc]initWithType:characteristicUUID properties:CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable]; // characteristicM.value=value;/*創建服務并且設置特征*///創建服務UUID對象CBUUID *serviceUUID=[CBUUID UUIDWithString:kServiceUUID];//創建服務CBMutableService *serviceM=[[CBMutableService alloc]initWithType:serviceUUID primary:YES];//設置服務的特征[serviceM setCharacteristics:@[characteristicM]];/*將服務添加到外圍設備*/[self.peripheralManager addService:serviceM]; } //更新特征值 -(void)updateCharacteristicValue{//特征值NSString *valueStr=[NSString stringWithFormat:@"%@ --%@",kPeripheralName,[NSDate date]];NSData *value=[valueStr dataUsingEncoding:NSUTF8StringEncoding];//更新特征值[self.peripheralManager updateValue:value forCharacteristic:self.characteristicM onSubscribedCentrals:nil];[self writeToLog:[NSString stringWithFormat:@"更新特征值:%@",valueStr]]; } /*** 記錄日志** @param info 日志信息*/ -(void)writeToLog:(NSString *)info{self.log.text=[NSString stringWithFormat:@"%@\r\n%@",self.log.text,info]; } @end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156

    流程如下(圖中藍色代表外圍設備操作,綠色部分表示中央設備操作):?

    B.中央設備

    中央設備的創建一般可以分為如下幾個步驟:

  • 創建中央設備管理對象CBCentralManager并指定代理。
  • 掃描外圍設備,一般發現可用外圍設備則連接并保存外圍設備。
  • 查找外圍設備服務和特征,查找到可用特征則讀取特征數據。?
    下面是一個簡單的中央服務器端實現,點擊“啟動”按鈕則開始掃描周圍的外圍設備,一旦發現了可用的外圍設備則建立連接并設置外圍設備的代理,之后開始查找其服務和特征。一旦外圍設備的特征值做了更新,則可以在代理方法中讀取更新后的特征值。?
  • #import "ViewController.h" #import <CoreBluetooth/CoreBluetooth.h> #define kServiceUUID @"C4FB2349-72FE-4CA2-94D6-1F3CB16331EE" //服務的UUID #define kCharacteristicUUID @"6A3E4B28-522D-4B3B-82A9-D5E2004534FC" //特征的UUID@interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>@property (strong,nonatomic) CBCentralManager *centralManager;//中心設備管理器 @property (strong,nonatomic) NSMutableArray *peripherals;//連接的外圍設備 @property (weak, nonatomic) IBOutlet UITextView *log;//日志記錄@end@implementation ViewController #pragma mark - 控制器視圖事件 - (void)viewDidLoad {[super viewDidLoad]; }#pragma mark - UI事件 - (IBAction)startClick:(UIBarButtonItem *)sender {//創建中心設備管理器并設置當前控制器視圖為代理_centralManager=[[CBCentralManager alloc]initWithDelegate:self queue:nil]; }#pragma mark - CBCentralManager代理方法 //中心服務器狀態更新后 -(void)centralManagerDidUpdateState:(CBCentralManager *)central{switch (central.state) {case CBPeripheralManagerStatePoweredOn:NSLog(@"BLE已打開.");[self writeToLog:@"BLE已打開."];//掃描外圍設備 // [central scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:kServiceUUID]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];[central scanForPeripheralsWithServices:nil options:@{CBCentralManagerScanOptionAllowDuplicatesKey:@YES}];break;default:NSLog(@"此設備不支持BLE或未打開藍牙功能,無法作為外圍設備.");[self writeToLog:@"此設備不支持BLE或未打開藍牙功能,無法作為外圍設備."];break;} } /*** 發現外圍設備** @param central 中心設備* @param peripheral 外圍設備* @param advertisementData 特征數據* @param RSSI 信號質量(信號強度)*/ -(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{NSLog(@"發現外圍設備...");[self writeToLog:@"發現外圍設備..."];//停止掃描[self.centralManager stopScan];//連接外圍設備if (peripheral) {//添加保存外圍設備,注意如果這里不保存外圍設備(或者說peripheral沒有一個強引用,無法到達連接成功(或失敗)的代理方法,因為在此方法調用完就會被銷毀if(![self.peripherals containsObject:peripheral]){[self.peripherals addObject:peripheral];}NSLog(@"開始連接外圍設備...");[self writeToLog:@"開始連接外圍設備..."];[self.centralManager connectPeripheral:peripheral options:nil];}} //連接到外圍設備 -(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{NSLog(@"連接外圍設備成功!");[self writeToLog:@"連接外圍設備成功!"];//設置外圍設備的代理為當前視圖控制器peripheral.delegate=self;//外圍設備開始尋找服務[peripheral discoverServices:@[[CBUUID UUIDWithString:kServiceUUID]]]; } //連接外圍設備失敗 -(void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error{NSLog(@"連接外圍設備失敗!");[self writeToLog:@"連接外圍設備失敗!"]; }#pragma mark - CBPeripheral 代理方法 //外圍設備尋找到服務后 -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{NSLog(@"已發現可用服務...");[self writeToLog:@"已發現可用服務..."];if(error){NSLog(@"外圍設備尋找服務過程中發生錯誤,錯誤信息:%@",error.localizedDescription);[self writeToLog:[NSString stringWithFormat:@"外圍設備尋找服務過程中發生錯誤,錯誤信息:%@",error.localizedDescription]];}//遍歷查找到的服務CBUUID *serviceUUID=[CBUUID UUIDWithString:kServiceUUID];CBUUID *characteristicUUID=[CBUUID UUIDWithString:kCharacteristicUUID];for (CBService *service in peripheral.services) {if([service.UUID isEqual:serviceUUID]){//外圍設備查找指定服務中的特征[peripheral discoverCharacteristics:@[characteristicUUID] forService:service];}} } //外圍設備尋找到特征后 -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{NSLog(@"已發現可用特征...");[self writeToLog:@"已發現可用特征..."];if (error) {NSLog(@"外圍設備尋找特征過程中發生錯誤,錯誤信息:%@",error.localizedDescription);[self writeToLog:[NSString stringWithFormat:@"外圍設備尋找特征過程中發生錯誤,錯誤信息:%@",error.localizedDescription]];}//遍歷服務中的特征CBUUID *serviceUUID=[CBUUID UUIDWithString:kServiceUUID];CBUUID *characteristicUUID=[CBUUID UUIDWithString:kCharacteristicUUID];if ([service.UUID isEqual:serviceUUID]) {for (CBCharacteristic *characteristic in service.characteristics) {if ([characteristic.UUID isEqual:characteristicUUID]) {//情景一:通知/*找到特征后設置外圍設備為已通知狀態(訂閱特征):*1.調用此方法會觸發代理方法:-(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error*2.調用此方法會觸發外圍設備的訂閱代理方法*/[peripheral setNotifyValue:YES forCharacteristic:characteristic];//情景二:讀取 // [peripheral readValueForCharacteristic:characteristic]; // if(characteristic.value){ // NSString *value=[[NSString alloc]initWithData:characteristic.value encoding:NSUTF8StringEncoding]; // NSLog(@"讀取到特征值:%@",value); // }}}} } //特征值被更新后 -(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{NSLog(@"收到特征更新通知...");[self writeToLog:@"收到特征更新通知..."];if (error) {NSLog(@"更新通知狀態時發生錯誤,錯誤信息:%@",error.localizedDescription);}//給特征值設置新的值CBUUID *characteristicUUID=[CBUUID UUIDWithString:kCharacteristicUUID];if ([characteristic.UUID isEqual:characteristicUUID]) {if (characteristic.isNotifying) {if (characteristic.properties==CBCharacteristicPropertyNotify) {NSLog(@"已訂閱特征通知.");[self writeToLog:@"已訂閱特征通知."];return;}else if (characteristic.properties ==CBCharacteristicPropertyRead) {//從外圍設備讀取新值,調用此方法會觸發代理方法:-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error[peripheral readValueForCharacteristic:characteristic];}}else{NSLog(@"停止已停止.");[self writeToLog:@"停止已停止."];//取消連接[self.centralManager cancelPeripheralConnection:peripheral];}} } //更新特征值后(調用readValueForCharacteristic:方法或者外圍設備在訂閱后更新特征值都會調用此代理方法) -(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{if (error) {NSLog(@"更新特征值時發生錯誤,錯誤信息:%@",error.localizedDescription);[self writeToLog:[NSString stringWithFormat:@"更新特征值時發生錯誤,錯誤信息:%@",error.localizedDescription]];return;}if (characteristic.value) {NSString *value=[[NSString alloc]initWithData:characteristic.value encoding:NSUTF8StringEncoding];NSLog(@"讀取到特征值:%@",value);[self writeToLog:[NSString stringWithFormat:@"讀取到特征值:%@",value]];}else{NSLog(@"未發現特征值.");[self writeToLog:@"未發現特征值."];} }#pragma mark - 屬性 -(NSMutableArray *)peripherals{if(!_peripherals){_peripherals=[NSMutableArray array];}return _peripherals; }#pragma mark - 私有方法 /*** 記錄日志** @param info 日志信息*/ -(void)writeToLog:(NSString *)info{self.log.text=[NSString stringWithFormat:@"%@\r\n%@",self.log.text,info]; }@end
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196

    上面程序運行的流程圖如下:?
    ?
    有了上面兩個程序就可以分別運行在兩臺支持BLE的iOS設備上,當兩個應用建立連接后,一旦外圍設備更新特征之后,中央設備就可以立即獲取到更新后的值。需要強調的是使用CoreBluetooth開發的應用不僅僅可以和其他iOS設備進行藍牙通信,還可以同其他第三方遵循BLE規范的設備進行藍牙通訊,這里就不再贅述。

    總結

    源碼下載網址:?
    http://download.csdn.net/detail/baihuaxiu123/9507802?
    請關注:http://blog.csdn.net/baihuaxiu123/article/details/51289499

    總結

    以上是生活随笔為你收集整理的iOS开发 蓝牙技术4.0详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    深爱激情五月婷婷 | 特级a老妇做爰全过程 | 中文字幕 国产视频 | 黄色国产高清 | 日本久久久亚洲精品 | 99在线视频播放 | 黄色网大全 | 成人天堂网 | 美女国产免费 | 久久99国产一区二区三区 | 亚洲最大成人免费网站 | 成人一级片在线观看 | 亚洲午夜精品在线观看 | 婷婷夜夜 | 91精品啪在线观看国产 | 国产成人精品综合 | 精品国产理论 | 亚洲无吗视频在线 | 免费在线黄 | 国产高清网站 | 免费午夜视频在线观看 | 黄色大片网 | 亚洲午夜精品一区二区三区电影院 | 中文字幕 成人 | 国产精品美女久久久免费 | 91精品免费看 | 精品国产一区二区三区av性色 | av直接看| 中文字幕亚洲欧美 | 天堂入口网站 | 久草在线视频在线 | 国产69久久久 | 成人久久久久久久久 | 国产亚洲资源 | 久久久美女| 中文字幕在线观看网 | 日韩中文字幕免费 | 黄色毛片网站在线观看 | 日韩免费在线观看 | 国产高潮久久 | 97精品视频在线播放 | 久久久精品免费观看 | 日韩精品亚洲专区在线观看 | 中文字幕免费播放 | 天天干天天拍天天操天天拍 | 99久高清在线观看视频99精品热在线观看视频 | 国产淫a| 久久精品屋 | 国产精品va在线观看入 | 99色网站 | 青春草视频在线播放 | 国产一区二区三区高清播放 | 天堂av在线中文在线 | 久久久久久国产一区二区三区 | 婷婷久月 | 久久精品国产免费 | 亚洲精品乱码久久久久久按摩 | 亚洲天堂精品 | 久久黄页| 91中文字幕在线视频 | 婷婷在线不卡 | 久久精品欧美一区二区三区麻豆 | 亚洲激情在线观看 | 国内精品小视频 | 国产99久久久久久免费看 | 中文字幕在线视频网站 | 在线观看深夜视频 | 国产 一区二区三区 在线 | 亚州视频在线 | 国产成人综合在线观看 | 亚洲免费观看视频 | 精品久久久久久综合日本 | 国产精品欧美久久久久无广告 | 黄色av高清 | 久久国产精品网站 | 色噜噜噜噜| 欧美日韩国产精品一区二区 | 中文字幕乱码视频 | 欧美精品一区二区三区一线天视频 | 色夜影院| 欧美作爱视频 | 一级性av | 日产中文字幕 | 99在线精品观看 | 成人一级免费视频 | 91精品国产成人www | 成人一级影视 | 激情综合狠狠 | 日本特黄特色aaa大片免费 | 免费在线观看日韩 | 国产精品婷婷午夜在线观看 | 91你懂的 | 成人黄大片 | 美女啪啪图片 | 黄色影院在线免费观看 | 激情五月伊人 | 欧美一区二区视频97 | 日韩欧美成人网 | 欧美一级裸体视频 | 国产一区二区不卡视频 | 最新日韩视频 | 西西444www大胆高清视频 | 成人香蕉视频 | 久久久久久久久久久久久影院 | 爱干视频 | 久久综合中文字幕 | 二区三区在线视频 | 久久精品国产一区二区三区 | 日韩高清不卡一区二区三区 | 国产中文视频 | 东方av在线免费观看 | 伊人电影在线观看 | 精品久久久99 | 97av在线视频 | 色婷婷成人网 | 免费三级网 | 91麻豆精品国产91久久久无限制版 | 久久精品国产v日韩v亚洲 | 久久五月天色综合 | 久久久久久久av | 国产偷v国产偷∨精品视频 在线草 | 国产精品99久久久久久久久久久久 | 欧美日韩综合在线 | 91在线观看高清 | 91精品入口 | 国产一级免费播放 | 久久综合狠狠综合久久激情 | 久久九九影院 | av在线一 | 91久久久久久久一区二区 | 在线观看视频你懂 | 在线播放 亚洲 | 久久a v电影| 国产精品毛片一区二区 | 国产91精品久久久久 | 91影视成人 | 9999毛片 | 久久玖| 中文字幕色婷婷在线视频 | 国产特级毛片aaaaaaa高清 | 国产一区免费 | 人人干人人爽 | 国产精品理论片 | 成人久久18免费网站 | 亚洲激情综合网 | 黄色av免费电影 | 成人中文字幕+乱码+中文字幕 | 日韩av不卡在线观看 | 五月天天色 | 免费成人av| 婷婷久久一区二区三区 | 亚洲色图av | 最新av网址在线观看 | 国产免费国产 | 91视频88av| 国产日韩欧美网站 | 日韩v在线91成人自拍 | 四虎伊人 | av成人免费在线观看 | 亚洲精品在线资源 | 超碰97久久 | 天天综合日 | 欧美另类一二三四区 | 精品成人国产 | 亚洲人成人在线 | free. 性欧美.com | 中国精品一区二区 | 成人黄色一级视频 | 日本99热 | 国产不卡免费 | 免费精品人在线二线三线 | 国产高清久久久久 | 美女搞黄国产视频网站 | 亚洲3级| 久久视频这里有久久精品视频11 | 国内精品久久久久影院一蜜桃 | 九九电影在线 | a电影在线观看 | 亚洲一区久久 | 国产视频欧美视频 | 青青河边草免费观看 | 99免费在线视频 | 97成人在线视频 | 一区二区三区四区不卡 | 国产一区二区三区黄 | 一二三区高清 | 美女精品在线 | 伊人官网 | 毛片黄色一级 | av中文字幕在线播放 | 久草在线观| 在线一区观看 | 国产在线观看地址 | 国产在线一卡 | 欧美日韩破处 | 国产97在线播放 | 亚洲欧洲av | 天天综合网国产 | 婷婷综合影院 | 91在线蜜桃臀 | 国产小视频网站 | 久久综合狠狠综合 | 99热官网 | 成人免费网视频 | 91精品老司机久久一区啪 | 伊人色**天天综合婷婷 | 99国产一区 | 激情伊人五月天久久综合 | 人人爽人人干 | 麻豆传媒电影在线观看 | 成人三级网址 | 91免费网 | 久久论理| 国产精品久久久久久久av电影 | 毛片3| 国产综合在线视频 | 手机在线小视频 | 国产精品一区二区视频 | 美女视频永久黄网站免费观看国产 | 日韩成人黄色av | 色婷婷六月天 | 一区二区三区久久 | 久久免费在线观看视频 | 成人毛片一区二区三区 | 欧美黑吊大战白妞欧美 | 色婷婷激情四射 | 国产精品aⅴ | 国产二区免费视频 | 久久视频网址 | 免费av网站观看 | 亚洲视频 中文字幕 | 欧美一级片在线观看视频 | 日日爱影视 | 久久99精品久久久久婷婷 | 久久免费看毛片 | 91精品高清| wwwwww国产| 亚洲黄色一级电影 | 国产精品原创av片国产免费 | 亚洲综合婷婷 | 91最新在线视频 | 国产精品久久久久久久久久久久午夜片 | 久草资源在线观看 | 亚洲欧美在线综合 | 国产精品露脸在线 | 成人黄色资源 | 一级黄色片在线观看 | 久久久人人爽 | 亚洲精品免费在线播放 | 久久激情电影 | 亚洲欧洲精品一区二区精品久久久 | 五月婷婷中文字幕 | 99在线免费观看视频 | 国产一级淫片在线观看 | 国内视频在线 | 99久久成人 | 99精品国产99久久久久久福利 | 色婷婷av一区| 2023国产精品自产拍在线观看 | 欧美日韩国产综合网 | 免费观看一区二区 | 国产a级片免费观看 | 亚洲成人av一区 | 久久图 | 国产精品国产三级在线专区 | 精品在线视频一区二区三区 | 午夜精品福利一区二区三区蜜桃 | 三级黄色在线观看 | 免费观看v片在线观看 | 97在线看| 国产成人精品不卡 | 成人小视频在线 | 91日本在线播放 | 丁香五香天综合情 | 国产视频一区二区三区在线 | 国产精品理论片 | 在线免费观看视频a | 中文字幕影片免费在线观看 | 日本xxxxav| 国产视频一区在线免费观看 | 在线国产一区二区三区 | 久综合网 | 日本公妇在线观看 | 亚洲一级理论片 | 在线免费黄色片 | 国产啊v在线 | 久久综合99 | 18岁免费看片 | 91成人在线观看高潮 | 亚洲人人av | 国产亚洲情侣一区二区无 | 亚洲精品国精品久久99热一 | 欧美伊人网 | 欧美日韩国产精品久久 | 菠萝菠萝在线精品视频 | 亚洲欧洲在线视频 | 精品久久久久久久久久久久久久久久 | 国产一级久久 | 91探花在线 | av不卡中文| a级国产乱理论片在线观看 特级毛片在线观看 | 五月婷婷综合在线视频 | 91在线日韩 | 99在线精品视频观看 | 天天综合网~永久入口 | 91视频在线自拍 | 国内精品在线观看视频 | 激情综合亚洲 | 久久成人视屏 | 精品视频免费 | 日韩高清不卡一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产字幕在线看 | 77国产精品| 亚洲免费av在线播放 | 午夜国产在线 | 亚洲国产中文字幕在线观看 | 五月天久久婷 | 国产高清在线视频 | 岛国av在线不卡 | 午夜久久久久久久 | 九九在线高清精品视频 | 国产男女无遮挡猛进猛出在线观看 | 精品免费国产一区二区三区四区 | 亚洲第一成网站 | 中文字幕亚洲高清 | 久久高清毛片 | 97超碰.com | 91爱爱视频 | 亚洲国产中文字幕在线 | 久久色在线播放 | 东方av在| 最新精品视频在线 | 成人精品99 | ww亚洲ww亚在线观看 | 婷婷丁香色 | 日韩欧美一区二区不卡 | 日韩高清免费在线观看 | 亚洲激情电影在线 | 精品国产成人在线 | 婷婷综合影院 | 97人人添人澡人人爽超碰动图 | 亚洲aⅴ乱码精品成人区 | 成人久久久电影 | 五月天激情视频在线观看 | 国产精品久久久777 成人手机在线视频 | 欧美视频在线二区 | 亚洲美女在线一区 | 99亚洲精品视频 | 91成人精品国产刺激国语对白 | 精品自拍sae8—视频 | 亚洲精品乱码久久久一二三 | 久久久久久久av麻豆果冻 | 97狠狠操| 国产精品久久综合 | 欧美日韩伦理一区 | 日日夜夜精品网站 | 久久久久国产一区二区 | 免费看一级一片 | 国产精品淫片 | 五月婷婷丁香激情 | 91麻豆精品国产91久久久久久久久 | 在线亚洲高清视频 | 国产中文字幕网 | 五月综合网站 | 波多野结衣在线播放一区 | 综合网av | 色婷婷av国产精品 | 国产原厂视频在线观看 | 国产成人三级三级三级97 | 亚洲综合激情小说 | 国产不卡视频在线 | 国产a级片免费观看 | 伊人精品影院 | 99视频导航 | 激情小说网站亚洲综合网 | 看黄色.com| 欧洲视频一区 | 亚洲高清免费在线 | 又黄又爽又刺激视频 | 日本丶国产丶欧美色综合 | 日本精品一二区 | 免费一级片久久 | 五月天色丁香 | www.888av| 日韩高清在线一区二区 | 超碰在线观看99 | 久草免费在线观看视频 | 三级免费黄 | 国产精品99久久免费观看 | 久久久久日本精品一区二区三区 | 1024久久 | av色综合网 | 日韩欧美一区二区在线观看 | 午夜视频99 | 午夜精品久久久久久99热明星 | 丁香综合五月 | 在线观看黄色大片 | 97超碰超碰久久福利超碰 | 日韩综合色 | 久射网| 免费碰碰 | 狠狠狠操 | 在线观看福利网站 | 91色一区二区三区 | 在线成人免费av | 国产又粗又猛又色又黄网站 | 狠狠地操| 国产在线观看不卡 | 中文字幕成人在线 | ,午夜性刺激免费看视频 | 友田真希av| 国产精品久久久久久久久久久免费 | 狠狠色噜噜狠狠狠 | 久久久久成 | 国产精品亚| 国产精品ⅴa有声小说 | 六月丁香婷婷久久 | 国产精品成人久久久久久久 | 99性视频| 一本大道久久精品懂色aⅴ 五月婷社区 | 精品国产一区二区三区日日嗨 | 国产精品女人久久久 | 欧美成年人在线视频 | 黄色电影网站在线观看 | 在线视频日韩精品 | 亚洲成成品网站 | 国产午夜不卡 | 日韩和的一区二在线 | 免费一级毛毛片 | 精品国产乱码久久 | 久久久久综合网 | 国产精品一区在线观看你懂的 | 国内精品久久久久久久久久久久 | 久久电影中文字幕视频 | 免费看的黄色小视频 | 狠狠艹夜夜干 | 免费观看一区二区三区视频 | 黄色免费网站大全 | 99精品视频免费全部在线 | 丁香六月天 | 99精品热视频 | 国产高清日韩 | 久久99国产精品免费网站 | av在线进入| 亚洲国产美女精品久久久久∴ | 91九色精品 | 在线观看视频你懂的 | 精品久久久久久久久中文字幕 | 开心丁香婷婷深爱五月 | 亚洲成人av电影在线 | 久久a国产 | 亚洲专区在线播放 | 亚洲欧美色婷婷 | 中文字幕观看视频 | 亚洲精品国产第一综合99久久 | 久草久热 | 国产99久久久国产精品免费二区 | 国产精品国产精品 | 九九视频免费在线观看 | 日韩欧美区 | 欧美五月婷婷 | 亚洲国产精品999 | 国产麻豆剧果冻传媒视频播放量 | 国产精品久久伊人 | 国产系列精品av | 一区二区三区免费在线观看 | 中文字幕av最新更新 | 夜夜视频 | 欧美日韩裸体免费视频 | 二区视频在线观看 | 97超碰超碰久久福利超碰 | 美女网站色在线观看 | 99精品观看 | 欧美激情综合色综合啪啪五月 | 片网站 | 国产精品午夜久久 | 337p欧美 | 懂色av懂色av粉嫩av分享吧 | 日韩久久精品一区二区三区下载 | 欧美日韩中文字幕视频 | 四虎永久网站 | 国产高清绿奴videos | 久久久午夜精品福利内容 | 免费在线观看a v | 91在线日韩| 国产精品女主播一区二区三区 | 欧美一二三专区 | www.五月婷婷.com | 美女视频黄是免费的 | 综合久久影院 | 欧美一级性生活视频 | av激情五月 | 亚洲国产精品人久久电影 | 黄色大片中国 | 亚州av免费 | 五月婷婷丁香六月 | 国产亚洲精品美女 | 国产精品美女久久久久久 | 欧美va天堂va视频va在线 | 99精品视频一区二区 | 成人av网站在线观看 | av黄色免费在线观看 | 欧美乱码精品一区二区 | 91一区二区三区久久久久国产乱 | 91丨九色丨高潮 | 不卡av免费在线观看 | 成人一区二区三区在线 | 久久黄色精品视频 | 日韩久久久久久久久久久久 | 中文字幕4 | 久久99欧美 | 免费成人在线网站 | 久久久久成人精品 | 午夜10000| 热久久99这里有精品 | 92av视频| 91九色蝌蚪国产 | 国产精品永久久久久久久www | 久久黄网站 | 91在线产啪 | 欧美日性视频 | 五月丁色 | 亚洲资源在线 | 五月天视频网站 | 欧美aa一级片 | 免费看黄在线看 | 99视频一区 | 国产99一区二区 | 99久久精品免费看国产一区二区三区 | 午夜性盈盈 | 中文区中文字幕免费看 | 国产亚洲精品日韩在线tv黄 | 亚洲伦理电影在线 | 亚洲精品网站 | 久久亚洲综合色 | 人人搞人人搞 | 69性欧美 | 激情五月综合网 | www.久草.com | 久久人人精品 | www.午夜 | av中文在线 | 国产一级在线看 | 一区二精品 | 午夜久久久影院 | 日韩免费电影一区二区 | 国产欧美在线一区二区三区 | 美女免费网站 | 国产精品网红福利 | 国产精品日韩欧美一区二区 | 国产毛片在线 | 亚洲国产小视频在线观看 | 91丨九色丨国产丨porny精品 | 亚洲免费视频在线观看 | 久久免费视频精品 | 91桃色在线播放 | 日韩精品中文字幕av | 婷婷国产视频 | 日韩三级.com | 欧美日韩国产二区 | 日韩av成人 | 丝袜+亚洲+另类+欧美+变态 | 综合久久久久久久久 | 亚洲婷婷在线 | 亚洲精品午夜国产va久久成人 | 久久久国产精品网站 | 欧美成人黄 | 国产精品久久久久久久久免费看 | www国产亚洲 | 国产一线天在线观看 | 天天操天天操天天操天天操天天操天天操 | 绯色av一区 | 69国产成人综合久久精品欧美 | 亚洲综合黄色 | 久久调教视频 | 国产精品女主播一区二区三区 | a在线播放 | 久久免费的视频 | 日本黄色免费网站 | 四虎在线观看视频 | 福利视频一二区 | 97视频亚洲 | 精品一二三四在线 | 人人舔人人爱 | 91精品国自产在线偷拍蜜桃 | 色射爱 | 天天色棕合合合合合合 | 亚洲最新av在线网址 | 欧美日韩精品在线免费观看 | 精品国产亚洲日本 | 国产精品福利无圣光在线一区 | 久久99国产精品免费网站 | 亚洲国产免费 | 色婷婷播放| 韩国av电影网 | 久久夜色电影 | 麻豆视频国产在线观看 | 国产精品不卡在线观看 | 日韩在线视频免费播放 | 成人久久久久久久久久 | 国产精品一区二区白浆 | 久久成人亚洲欧美电影 | 成人国产精品久久久春色 | 日本女人逼 | 懂色av一区二区三区蜜臀 | 一级久久久 | 中文字幕免费观看 | 日韩字幕 | 亚洲精品2区| 久久综合五月天 | 久热这里有精品 | 亚洲五月激情 | 三级av网站 | 五月天电影免费在线观看一区 | 婷婷综合亚洲 | 在线视频区 | 中文字幕中文字幕在线一区 | 一级黄色片在线播放 | 精品国产亚洲日本 | 99精品在线| 中文av不卡| 97精品久久人人爽人人爽 | 国产护士hd高朝护士1 | 色婷婷欧美 | 欧美成人黄色片 | 91精品国产成人 | 免费看一级一片 | 国产中文字幕一区二区三区 | 国产成人精品一区在线 | 亚洲精品综合在线观看 | 国产乱码精品一区二区三区介绍 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产精品第一页在线观看 | 久久精品高清 | 欧美一区二区三区免费观看 | 日本精品久久久久影院 | 毛片视频网址 | 国产精品中文字幕在线观看 | 国产精品福利无圣光在线一区 | 日韩精品五月天 | a级片久久久 | 欧美精品久久久久久久久免 | 在线观看视频中文字幕 | 免费能看的av | 丁香在线观看完整电影视频 | 日韩经典一区二区三区 | 麻豆播放 | 精品久久精品久久 | 探花视频免费观看 | 在线小视频 | 精品一区二区av | 久久伊人热 | 亚洲精品综合久久 | 欧日韩在线视频 | 在线观看中文字幕2021 | 久草网站| 超碰人人在线观看 | 狠狠干天天 | 中文字幕视频在线播放 | 精品亚洲一区二区三区 | 精品一区免费 | 久久综合九色综合久久久精品综合 | 国产精品一区二区三区四 | 久久婷婷视频 | 99精品视频免费在线观看 | 天天操天天操天天操天天 | 九九九热精品免费视频观看 | 中文字幕免费高清在线 | 亚洲一级片在线观看 | www免费网站在线观看 | 日韩视频在线一区 | 男女精品久久 | av免费观看网站 | 久久免费精品视频 | 丰满少妇对白在线偷拍 | 黄色www | 五月天丁香视频 | 中文字幕麻豆 | 日韩国产精品一区 | 最近更新中文字幕 | 午夜久久久久久久久久久 | 日韩成人免费电影 | 69视频国产 | 亚洲国产99 | 欧美激情精品久久久久久免费 | 中文av免费| bbw av| 国产精品美女在线 | 国产在线毛片 | 亚洲精品高清一区二区三区四区 | 国产成人精品一区二区三区网站观看 | 国产日韩中文字幕在线 | 91人人爽久久涩噜噜噜 | 久久这里只有精品久久 | 中文字幕av一区二区三区四区 | 午夜av免费看 | 亚洲午夜久久久久久久久电影网 | 在线国产片 | 最新日本中文字幕 | 玖玖爱国产在线 | 日本中文字幕在线 | 色香蕉在线视频 | 天天操天天操天天操 | 亚洲成年人在线播放 | 国产精品一区二 | 免费在线观看成人 | 99在线免费视频观看 | 日韩精品视频免费在线观看 | 精品xxx| 日韩一区二区在线免费观看 | a黄色一级片 | 丁香激情综合久久伊人久久 | 欧美成人在线网站 | 国产黄色片免费在线观看 | 操操综合| 一区二区三区免费在线 | 一区二区三区高清 | 天天操偷偷干 | 精品国产一区二区三区久久久蜜月 | 久久免费av | 久久xxxx | 国产精品久久久久久久久久久免费看 | 日韩大片在线 | 国产精品11| 一区 二区 精品 | 日韩黄色免费 | 三级av免费看 | 久草在线资源免费 | 日韩视频一二三区 | 国模视频一区二区三区 | 亚洲区色 | 久久国产精品99久久久久久进口 | 久亚洲 | 亚洲国产丝袜在线观看 | 日韩免费av片 | 91在线www| 激情综合色综合久久 | 亚洲色图色 | av成人动漫 | 国产资源网| 中文字幕a∨在线乱码免费看 | 亚洲日韩欧美视频 | 国产精品一区二区免费在线观看 | 国产一区不卡在线 | 97狠狠干| 日韩a级免费视频 | 97在线精品视频 | 91麻豆精品国产91久久久更新时间 | 国产精品国产三级国产专区53 | 欧美日韩精品电影 | 麻豆成人小视频 | 亚洲国产伊人 | 在线看片一区 | 亚洲午夜在线视频 | 亚洲理论电影 | 91片在线观看 | 色综合中文综合网 | 亚洲精品在线视频观看 | 久草免费在线视频观看 | 中文字幕视频播放 | 在线成人高清电影 | 国语自产偷拍精品视频偷 | 久久精品国产一区 | 一本一本久久a久久精品综合妖精 | 在线观看国产永久免费视频 | 欧美污污网站 | 91九色国产视频 | 中文字幕一区二区三区精华液 | 国内精品久久久久影院日本资源 | 九九国产视频 | 91在线视频免费91 | 日日射av | 久草在线观看 | 在线观看视频你懂的 | 91在线播放视频 | 中文字幕在线观看亚洲 | 99久久精品国产一区二区成人 | 国产视频91在线 | 午夜精品导航 | 美女网站色免费 | 五月婷婷六月丁香在线观看 | 精品96久久久久久中文字幕无 | 久久精品免费观看 | 欧美成人黄色片 | 成人午夜毛片 | 9在线观看免费高清完整版在线观看明 | 97成人精品视频在线观看 | 国产精品入口a级 | 91一区二区三区久久久久国产乱 | 97精品国产97久久久久久粉红 | 91在线视频精品 | 日韩精品五月天 | 亚洲天堂自拍视频 | 福利视频区 | 在线观看视频一区二区三区 | 日韩毛片久久久 | 亚洲欧美观看 | 欧美久久久久久久久久 | 国产99久久精品 | 国产精品成人久久久久久久 | 国产婷婷视频在线 | 麻豆91在线播放 | 久久看免费视频 | 99爱这里只有精品 | av在线官网 | 国产精品成人自产拍在线观看 | 久久久久久久av | 日韩精品中文字幕在线 | 亚洲成人精品久久 | 国产精品一区二区三区99 | 一二三区视频在线 | www.天天干 | 亚洲午夜久久久久久久久电影网 | 四川bbb搡bbb爽爽视频 | 成人欧美一区二区三区在线观看 | 最新av在线网址 | 国产成人精品一区二区三区福利 | 成人一级免费电影 | 五月婷婷开心中文字幕 | 国产精品免费久久久久 | www五月婷婷 | 激情校园亚洲 | 六月色婷| 国产69精品久久99不卡的观看体验 | 日韩中文字幕免费 | 麻豆传媒在线视频 | 中文字幕在线网 | 麻豆视频免费网站 | 欧美日韩免费在线观看视频 | 午夜av不卡 | 国产99区 | 欧美福利久久 | 精品一区二区在线免费观看 | 精品国产123 | 国产二区视频在线 | 国产成人久久久77777 | 91亚洲欧美| 99久久99久久精品免费 | 欧洲在线免费视频 | avwww在线观看 | a级国产毛片 | 四虎影视成人精品国库在线观看 | 成人国产一区 | 在线a人v观看视频 | 久久精品亚洲 | 狠狠狠狠狠狠干 | www.夜夜骑.com| 91视频 - 114av| 97夜夜澡人人双人人人喊 | 一区二区三区在线观看免费视频 | 国产99久久九九精品免费 | 在线中文字幕网站 | 日韩午夜大片 | 国产我不卡 | 国内成人精品2018免费看 | 国产成人1区 | 国产真实在线 | 91色国产在线 | 精品久久在线 | 久久网站免费 | 日本成人中文字幕在线观看 | 欧美日韩国产二区三区 | 五月婷婷亚洲 | 国产精品白浆 | 在线观看中文av | 日韩免费二区 | 91最新中文字幕 | 午夜影院一级 | 天天操天天操天天操天天操天天操天天操 | 91久久国产综合精品女同国语 | 欧美日韩超碰 | 六月丁香婷婷久久 | 91福利视频久久久久 | 国产青草视频在线观看 | 欧美午夜视频在线 | 五月天电影免费在线观看一区 | 又粗又长又大又爽又黄少妇毛片 | 91精品国自产在线观看 | 日本最新高清不卡中文字幕 | 国产日韩视频在线播放 | 日韩欧美精选 | 在线91观看| 黄色大片日本免费大片 | 久久婷婷视频 | 青青河边草免费直播 | 久草在线视频新 | 亚洲精品国精品久久99热 | 综合久久网站 | 最新免费av在线 | 在线视频日韩 | 中文字幕文字幕一区二区 | 成人v| 久久天堂影院 | 久草视频看看 | 韩国av免费在线 | 中文字幕亚洲精品在线观看 | 色欧美视频 | 日日夜夜精品视频天天综合网 | 国产精品一区二区免费 | 亚洲午夜av电影 | 97视频在线观看视频免费视频 | 99成人免费视频 | 国产日韩欧美在线影视 | 久久久久久久久久久久久9999 | 亚洲毛片一区二区三区 | 午夜国产在线 | 美女av在线免费 | 国产白浆在线观看 | av丁香花| 激情五月开心 | 久久国产精品久久精品 | 97视频网址 | 日韩欧美在线观看一区二区 | 精品亚洲午夜久久久久91 | 成人av网址大全 | 亚洲狠狠操 | 久久香蕉电影 | 国产97色在线 | 伊人永久 | 国产日韩亚洲 | 国产精品99久久免费黑人 | 丁香5月婷婷久久 | 国产小视频在线看 | h视频在线看 | 中文字幕第一页在线视频 | av片免费播放 | 成人手机在线视频 | 在线成人短视频 | 制服丝袜欧美 | 99午夜| 91在线看视频免费 | 日韩国产欧美视频 | 久久久久国 | www.伊人网.com| 久久一精品 | 综合久久综合久久 | 九九九热精品免费视频观看网站 | 激情 一区二区 | 久久九九影视网 | 黄网在线免费观看 | 国产精品久久久久久一区二区 | 免费一级特黄录像 | 国产人成看黄久久久久久久久 | 久久久久9999亚洲精品 | 精品福利视频在线 | 在线有码中文字幕 | 婷婷在线观看视频 | 日韩在线视频线视频免费网站 | 国产视频精选在线 | 日本3级在线观看 | 香蕉一区| 最新av网站在线观看 | 六月天色婷婷 | 国产一区播放 | 中文字幕观看av | 天天射日| 91精品在线免费观看 | 91精品一区国产高清在线gif | 日韩在线观看一区二区三区 | 久久你懂得| 特黄特黄的视频 | 亚洲理论片 | 免费观看性生活大片3 | 九九热在线观看 | 精品福利视频在线 | 黄色av在| 免费网站v | 国产成a人亚洲精v品在线观看 | 天天夜操| 亚洲精品成人免费 | 天天综合亚洲 | 久久艹艹 | 中文字幕视频三区 | 日韩免费不卡av | 精品国内自产拍在线观看视频 | 国产xx在线 | 国产在线毛片 | 国产美女视频网站 | 国产精品a成v人在线播放 | 最近更新好看的中文字幕 | 最新黄色av网址 | 又污又黄的网站 | 视频1区2区 | 中文字幕黄色av | 九七视频在线观看 | 伊人国产在线播放 | 久久久久99精品国产片 | 九九有精品 | 啪啪动态视频 | 亚洲少妇影院 | 日韩一级电影在线 | 99精品在线播放 | 亚洲精品午夜久久久久久久 | 久99久精品| 欧美激情亚洲综合 | 亚洲永久精品一区 | 精品久久福利 |