青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

  1 
  2 /*
  3     name:     btsc.h
  4     desc:   藍牙串口通信數(shù)據(jù)包裝    
  5     writer:    zhangbin 
  6     date:    2007-01-25
  7     history:    
  8             2007-0206    zhangbin    
  9                 1. btsc_context增加 user
 10                 2. notifier函數(shù)原型增加 btsc_context參數(shù),便于訪問上下文
 11             2008.06.16    scott
 12                 1. 增加crc校驗屬性 
 13                     CRC=12345
 14                     crc校驗和計算: 準備發(fā)送一個數(shù)據(jù)包之前,將默認crc屬性(CRC=00000)作為屬性包加入,然后將整個屬性包進行crc計算出校驗和
 15                                      將16位的crc sum 轉(zhuǎn)換成5字節(jié)的字符串替換包屬性CRC的值
 16                     <MSG=DEVICE-OPEN  CRC=00000> =>計算機校驗和 45322 
 17                     替換數(shù)據(jù)包屬性值=> <MSG=DEVICE-OPEN CRC=45322>  
 18                     發(fā)送
 19                 2. 增加 DataChecker
 20 */
 21 
 22 #ifndef _BTSC_H
 23 #define _BTSC_H
 24 
 25 #include <stdio.h>
 26 
 27 #define OUT
 28 #define INOUT
 29 #define IN
 30 
 31 #define INIT_LIST_HEAD(x)    
 32 
 33 #define btsc_TRUE     0
 34 #define btsc_FALSE    1
 35 #define btsc_NULL     0
 36 
 37 struct list_head{
 38     struct list_head* prev,*next;
 39 };
 40 
 41 
 42 struct btsc_Property{
 43     char *         name;
 44     char *         value;        
 45 };
 46 
 47 
 48 struct btsc_Packet{
 49     /*struct list_head    list;*/
 50     struct btsc_Property**     properties; 
 51     int                size;
 52     int                capacity;
 53     struct btsc_Context    *    ctx;
 54 };
 55 
 56 struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* );
 57 void                    btsc_Packet_Free(struct btsc_Packet*);
 58 
 59 struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);
 60 void                    btsc_Property_Free(struct btsc_Property*);
 61 
 62 
 63 
 64 struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* packet,char * name);     
 65 void                    btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );
 66 
 67 
 68 
 69 struct btsc_Context{
 70     void (*tx)(struct btsc_Context*,unsigned char * data,int len);        
 71     int (*notifier)(struct btsc_Packet* packet);/*外部釋放packet,返回NULL*/        
 72     int        packet_cached_size;
 73     int        recv_cached_capacity;                        
 74     char*    recv_buff;                                    
 75     int        recv_size;        
 76     void*    user;    // 外部數(shù)據(jù)傳遞                            
 77     int        crc_check;    // 0 - nocrc, 1 crc check
 78 };
 79 
 80 
 81 int     btsc_init(struct btsc_Context* IN ctx);    
 82 void     btsc_cleanup(struct btsc_Context* IN ctx);
 83 int        btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);    
 84 void    btsc_Parse(struct btsc_Context* , char * data,int len);
 85 
 86 
 87 #define BTSC_PACKET_BEGIN(ctx) {\
 88                                 struct btsc_Context* _ctx_internel;\
 89                                 struct btsc_Packet * _pkt ;\
 90                                 _ctx_internel= (ctx);\
 91                                 _pkt = btsc_Packet_Alloc(_ctx_internel);
 92                                 
 93 /* key is not suitable for vairable*/                                
 94 #define BTSC_NEW_PROPERTY(key,value)    {\
 95                                             struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\
 96                                             btsc_Property_Append(_pkt,_ppt);\
 97                                         }
 98 #define BTSC_PACKET_END()        btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\
 99                                 btsc_Packet_Free(_pkt);\
100                                 }
101 
102 #define BTSC_FOREACH(packet,ppt)    {\
103                                     int n;\
104                                     for(n=0;n<packet->size;n++){\
105                                         ppt = packet->properties[n];
106 #define BTSC_END_FOREACH()            }\
107                                 }
108 
109 #endif
110 
111 


  1 
  2 
  3 /*
  4     name:            btsc
  5                     serial communicating  with bluetooth and app-user
  6     desc:            pair parameter codec
  7     
  8         packet=[ key:name,]
  9         
 10     implemented:     zhangbin 
 11     date:            2007-01-26
 12 */
 13 
 14 #include <stdio.h>
 15 #include <stdlib.h>
 16 #include <string.h>
 17 #ifdef _UNIX
 18 #include <unistd.h>
 19 #endif
 20 #include "btsc.h"
 21 #include "crc.h"
 22 
 23 #define CRC_DEFAULT_STRING "CRC=00000"
 24 #define PACKET_HEAD        '<'
 25 #define PACKET_TAIL        '>'
 26 #define PROPERTY_DELIMITER    ','
 27 #define PAIR_DELIMITER        '='
 28 //#define PAIR_DELIMITER        '$'
 29 #define ESCAPE_CHAR            '\\'
 30 
 31 
 32 int calcEscapleLength(char * str);
 33 char* escape_copy(char * dest,char * src);
 34 void trim_escape_copy(char * dest,char * src,int size);
 35 int  calcPacketLength(struct btsc_Packet* pkt);
 36 int    is_escape_char(char c);
 37 void parseProperty(struct btsc_Packet * pkt,char * s,char * e);
 38 void parsePacket(struct btsc_Context* ctx,char * s,char* e);
 39 char*     __memchr(char * s,char* e,char c);
 40 
 41 char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};
 42 
 43 struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* ctx){    
 44     struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));        
 45     pt->size = 0;
 46     pt->capacity = ctx->packet_cached_size;
 47     pt->properties=malloc(pt->capacity*sizeof(struct btsc_Property*));    
 48     pt->ctx = ctx;
 49     return pt;    
 50 }
 51 
 52 void    btsc_Packet_Free(struct btsc_Packet* pt){    
 53     struct btsc_Property** tmp;
 54     if!pt )     return ;
 55     tmp = pt->properties;
 56     while(pt->size--){
 57         btsc_Property_Free(*tmp++);                
 58     }        
 59     if( pt->properties){
 60         free(pt->properties);  
 61     }
 62     free(pt);
 63 }
 64 
 65 
 66 struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){
 67     struct btsc_Property * ppt;
 68 /*    printf("enter btsc_Property_Alloc()\n");*/
 69     ppt = malloc( sizeof( struct btsc_Property) );
 70     if(!ppt)    printf("error: malloc failed (s1)\n");
 71     ppt->name = malloc( strlen(name)+1);
 72     if!ppt->name ) printf("error: malloc failed (s2)\n");
 73     strcpy(ppt->name,name);    
 74     ppt->value = malloc( strlen(value)+1);
 75     if!ppt->value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);
 76     strcpy( ppt->value,value);
 77     return ppt;
 78 }
 79 
 80 void        btsc_Property_Free(struct btsc_Property* ppt){
 81     if!ppt )    return;
 82     free( ppt->name);
 83     free( ppt->value);
 84     free( ppt);
 85 }
 86 
 87 /* scan pointer array */
 88 struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* pkt,char * name){
 89     int size;
 90     struct btsc_Property* ppt;
 91     size = pkt->size;
 92     while(size--){
 93         ppt = pkt->properties[size];
 94         if!strcmp( name, ppt->name ) ){
 95             return ppt;/*that's ok */
 96         }
 97     }
 98     return btsc_NULL;
 99 }
100 
101 /* low effeciency, memory allocation,more costs*/
102 void    btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){
103     struct btsc_Property** tmpppt;
104     if( pt->size==pt->capacity){         
105         pt->capacity += pt->ctx->packet_cached_size;    
106         tmpppt = pt->properties;        
107         pt->properties = malloc( pt->capacity * sizeof( struct btsc_Property**) ); 
108         memcpy( pt->properties, tmpppt, pt->size * sizeof( struct btsc_Property**));
109         free( tmpppt); 
110     }
111     pt->properties[pt->size++]=ppt;    
112 }
113 
114 int     btsc_init(struct btsc_Context* ctx){    
115     ctx->packet_cached_size = 10;    
116     if( ctx->recv_cached_capacity==0){
117         ctx->recv_cached_capacity = 1024*2;    
118     }
119     ctx->recv_buff = malloc( ctx->recv_cached_capacity );
120     ctx->recv_size = 0;
121     ctx->crc_check = 1;
122     return btsc_TRUE;
123 }
124 
125 void     btsc_cleanup(struct btsc_Context* ctx){
126     free(ctx->recv_buff);    
127 }
128 
129 /*
130 **    name:    calcEscapleLength
131 **    desc:    計算含轉(zhuǎn)義字符串長度
132 */
133 int     calcEscapleLength(char * str){
134     int len;
135     char * pesc;
136     len = 0;    
137     while*str ){
138         pesc = escape_ch_table;
139         while*pesc ){
140             if*pesc==*str){
141                 len++;
142                 break;
143             }
144             pesc++;
145         }        
146         str++
147     }    
148     return len;
149 }
150 
151 
152 char* escape_copy(char * dest,char * src){
153     char * pesc;
154     while*src ){
155         pesc = escape_ch_table;
156         while*pesc ){
157             if*pesc==*src){
158                 *dest++=ESCAPE_CHAR;
159                 break;
160             }
161             pesc++;
162         }
163         *dest++=*src++;                
164     }    
165     return dest;    
166 }
167 
168 void trim_escape_copy(char * dest,char * src,int size){
169     int last_escape = btsc_FALSE;
170     while( size--){
171         if*src == ESCAPE_CHAR && last_escape != btsc_TRUE){        
172             last_escape = btsc_TRUE    ;
173             src++;
174             continue;
175         }
176         last_escape = btsc_FALSE;
177         *dest++=*src++;        
178     }
179 }
180 
181 int       calcPacketLength(struct btsc_Packet* pkt){
182     int len;
183     int size;
184     struct btsc_Property* ppt;    
185     len = 0;
186     size = pkt->size;
187     while( size--){
188         ppt = pkt->properties[size];    
189         len+=strlen(ppt->name)+strlen(ppt->value);    
190 
191         len+= calcEscapleLength(ppt->name);
192         len+= calcEscapleLength(ppt->value);    
193     }
194     len+= pkt->size*2+1
195     return  len;
196 }
197 
198 
199 int        btsc_Pack(struct btsc_Context*  ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){
200     struct btsc_Property* ppt;
201     int size;
202     int len;
203     unsigned char * buff;
204     char * pbuff;
205     len = calcPacketLength( pkt);
206     /*crc scott 2008.6.16*/
207     if( ctx->crc_check ){
208         len += strlen(CRC_DEFAULT_STRING)+1/*1 is ,*/
209     }
210     /*end crc*/
211     buff = malloc( len );
212     size = pkt->size;
213     pbuff = (char*)buff;
214     *pbuff++=PACKET_HEAD;    
215     /* crc */
216     if( ctx->crc_check ){
217         memcpy(pbuff,CRC_DEFAULT_STRING,strlen(CRC_DEFAULT_STRING));
218         *(pbuff+ strlen(CRC_DEFAULT_STRING))=PROPERTY_DELIMITER;
219         pbuff+=strlen(CRC_DEFAULT_STRING)+1;    
220     }
221     /*end crc*/
222     while( size--){
223         ppt = pkt->properties[size];    
224         pbuff = escape_copy(pbuff,ppt->name);
225         *pbuff++=PAIR_DELIMITER;
226         pbuff = escape_copy(pbuff,ppt->value);
227         if( size ){
228             *pbuff++=PROPERTY_DELIMITER;            
229         }
230     }
231     *pbuff = PACKET_TAIL;
232     /* calc crc sum*/
233     if( ctx->crc_check ){
234         uint16 sum ;
235         char sum_str[4+6];
236         char * crc;
237         sum = crc16_block(buff,pbuff-buff+1);
238         sprintf(sum_str,"CRC=%05d",sum); // must be five chars
239         crc = strstr(buff,CRC_DEFAULT_STRING);
240         memcpy(crc,sum_str,strlen(sum_str));
241     }
242     /*end crc*/
243     if( ctx->tx ){
244         ctx->tx(ctx,buff,len);
245     } 
246     if( obuff && *osize >=len){
247         memcpy( obuff, buff ,len);
248         *osize = len;
249     }
250 
251     free(buff);
252     return btsc_TRUE;    
253 }
254 
255 /* e not in range*/
256 char*     __memchr(char * s,char* e,char c){
257     while( s!=e){
258         if*== c){
259             return s;
260         }        
261         s++;
262     }
263     return btsc_NULL;
264 }
265 
266 int        is_escape_char(char c){
267     return btsc_FALSE;    
268 }
269 
270 /*
271     name: parseProperty
272     desc: 指定內(nèi)存范圍中提取屬性  key=>value
273         搜索包含e
274     params:    
275         pkt    --    消息數(shù)據(jù)包
276         s    --    起始內(nèi)存地址 
277         e    --    結(jié)束地址 ,
278 */
279 void parseProperty(struct btsc_Packet * pkt,char * s,char * e){
280     char * p1,*p2;
281     int n;
282     struct btsc_Property*    ppt;
283     p1 = s ;
284     p2 = e;
285 __REPEAT:    
286     p1 = __memchr(p1,e+1,PAIR_DELIMITER);
287     if( p1 ){
288         if*(p1-1== ESCAPE_CHAR ){
289             p1++;
290             goto __REPEAT;
291         }
292         ppt = malloc( sizeof( struct btsc_Property ));
293         n = p1-s;         
294         ppt->name = malloc( n+1 );
295         memset(ppt->name,0,n+1);        
296         trim_escape_copy(ppt->name,s,n);
297         
298         n =e-p1;
299         ppt->value = malloc( n+1);
300         memset(ppt->value,0,n+1);
301         trim_escape_copy(ppt->value,p1+1,n);
302         
303         btsc_Property_Append(pkt,ppt);
304     }
305 }
306 
307 /*
308 func: crc_check
309 brief: 對數(shù)據(jù)包進行crc完整性檢測
310     提取屬性 CRC,填充默認的crc校驗和 00000; 校驗; 比較
311     crc_check運行完畢, s,e區(qū)段的數(shù)據(jù)被污染(CRC 屬性被清除為"CRC=00000")
312 params:
313     pkt     解析出來的數(shù)據(jù)包 <MSG=XXX,MSG2=XXX2>
314     s        '<'
315     e        '<'
316 return:
317         btsc_TRUE/btsc_FALSE    
318     編碼時 CRC屬性必須放于屬性集的首部
319 */
320 
321 int crc_check(struct btsc_Packet * packet, char *s,char *e){
322     struct btsc_Property * ppt;
323     char * crc;
324     uint16 sum;
325     ppt = btsc_Property_Get(packet,"CRC");
326     if(!ppt){        
327         return -1// no crc sum
328     }
329     if( strlen( ppt->value) != strlen("00000")){
330         return -2;
331     }
332     sum= (uint16) atoi( ppt->value); // 
333     
334     //*e='\0'; // set for strstr() CRC must be existed
335     crc = strstr(s,"CRC");
336     /*substitute default crc sum*/
337     memcpy(crc,CRC_DEFAULT_STRING,strlen(CRC_DEFAULT_STRING));
338     if( sum!=crc16_block(s,e-s+1)){    /*<..> pass into crc */
339         return -3;    /* crc error*/
340     }
341     
342     return btsc_TRUE; 
343 }
344 
345 /*
346     name: parsePacket
347     desc:    分解指定內(nèi)存到包結(jié)構(gòu)
348             成功分解出包立刻回送到應(yīng)用接收者 ( btsc_Context::notifier)
349     param:
350         s,e     內(nèi)存地址 (處e)
351         s ='<'
352         e ='>'
353 ** 緩沖區(qū)還需進一步測試,包括緩沖區(qū)大小調(diào)節(jié), 不完整協(xié)議包格式的容錯
354 */
355 void     parsePacket(struct btsc_Context* ctx,char * s,char* e){
356     char *p,*p1,*p2;
357     struct btsc_Packet * pkt;
358     if( e-<=1 ){
359         return ;
360     }
361     pkt = btsc_Packet_Alloc(ctx);
362     
363     p1 = s+1;
364     p2 = e-1;
365     p = p1;
366 __REPEAT:    
367     p = __memchr(p,e,PROPERTY_DELIMITER);
368     if( p ){
369         if*(p-1)==ESCAPE_CHAR){
370             p = p+1;
371             goto __REPEAT;
372         }
373         parseProperty(pkt,p1,p-1);
374         p1 = ++p;
375         goto __REPEAT;
376     }
377     /*allow one property reside in*/
378     parseProperty(pkt,p1,e-1);
379     /*2008.6.16 scott add crc check*/
380     if( ctx->crc_check ){
381         if( crc_check(pkt,s,e)==btsc_FALSE ){ /*crc check error*/
382             btsc_Packet_Free(pkt);    
383             return ;
384         }
385     }
386     /*end crc check*/
387     if( ctx->notifier ){
388         if(ctx->notifier(pkt)){ /* nonzero value, delete internal*/
389             btsc_Packet_Free(pkt);            
390         }
391     }else{
392        btsc_Packet_Free(pkt);    
393     }
394 }
395 
396 void    btsc_Parse(struct btsc_Context* ctx, char * data,int size){
397     int len ;
398 _RESTART:
399     while( size ){
400         len = ctx->recv_cached_capacity - ctx->recv_size;
401         if( len >0){ 
402             if( size <= len){
403                 len = size;
404                 size = 0;
405             }else{
406                 size-=len;
407             }
408             memcpy( ctx->recv_buff+ctx->recv_size,data,len);
409             ctx->recv_size+=len;
410             data+=len;
411         }    
412         
413         {
414             char * p1,*p2;            
415 _RESCAN:            
416             p1 = ctx->recv_buff;
417 _RESCAN_HEAD:             
418             p1 = __memchr(p1,ctx->recv_buff+ctx->recv_size,PACKET_HEAD);            
419             if!p1 ){ 
420                 ctx->recv_size =0;
421                 if( size ){
422                     goto _RESTART;
423                 }else{
424                     return ;//scott by 2007.06.15 add 
425                 }
426             }
427             if( p1>ctx->recv_buff && *(p1-1)==ESCAPE_CHAR){ /* "\<" */
428                 p1++;
429                 goto _RESCAN_HEAD;    
430             }
431             
432             /*move backward*/
433             ctx->recv_size -=(p1-ctx->recv_buff);
434             memmove(ctx->recv_buff,p1, ctx->recv_size);
435             p1=ctx->recv_buff;
436             p2 = p1+1;
437 _RESCAN_TAIL:            
438             p2 = __memchr(p2,ctx->recv_buff+ctx->recv_size,PACKET_TAIL);
439             if!p2 ){
440                 if( ctx->recv_size == ctx->recv_cached_capacity ){
441                     ctx->recv_size  = 0
442                 }
443                 goto _RESTART;
444             }
445             if*(p2-1== ESCAPE_CHAR ){
446                 p2++;
447                 goto _RESCAN_TAIL;    
448             }
449             
450             parsePacket(ctx,p1,p2);
451             ctx->recv_size -=p2-p1+1;
452             if( ctx->recv_size ){
453                 memmove(ctx->recv_buff,p2+1,ctx->recv_size);
454                 goto _RESCAN; 
455             }             
456         }        
457     }
458 }
459 
460 /*   debug */
461 #ifdef _DEBUG
462 void tx(unsigned char * data,int len);
463 void notifier(struct btsc_Packet* packet);
464 /*初始化上下文, tx=發(fā)送處理函數(shù),notifier=接收函數(shù)*/
465 //struct btsc_Context c={tx:tx,notifier:notifier};
466 struct btsc_Context c={tx,notifier};
467 
468 /*測試數(shù)據(jù)接收并解析*/
469 void rx(unsigned char * buff,int len){    
470      char * msg="<MSG=HELLO,NAME=SCOTT>"
471                  "<MSG2=HELLO2,NAME2=SCOTT2>"
472                  "<MSG3=HELLO3,NAME3=SCOTT3>"/*simulating data*/
473     //int len = strlen(msg);
474     btsc_Parse(&c,buff,len);
475 }
476 /*發(fā)送處理過程*/
477 void tx(struct btsc_Context*  ctx,unsigned char * buff,int len){    
478     char *outmsg = malloc(1024*10);
479     memset(outmsg,0,1024*10);
480     memcpy(outmsg,buff,len);
481     printf("encode str: %s\n",outmsg);
482     free(outmsg);
483     btsc_Parse(&c,buff,len);
484 }
485 
486 void notifier(struct btsc_Packet* packet){
487     struct btsc_Property * ppt;
488     ppt = btsc_Property_Get(packet,"MSG");
489     if(ppt)
490         printf("property get: MSG=>%s\n",ppt->value);
491     /*遍歷包內(nèi)屬性參數(shù)*/
492     BTSC_FOREACH(packet,ppt);
493     printf("packet: %s=>%s\n",ppt->name,ppt->value);
494     BTSC_END_FOREACH();
495 }
496 
497 int test_main(){
498     int r;
499     /*optional*/
500     c.recv_cached_capacity = 1024/*初始化接收緩沖區(qū)大小 byte*/
501     c.packet_cached_size = 5;    /*消息包緩沖屬性個數(shù)*/
502     btsc_init(&c);            /*上下文初始化*/
503     //c.crc_check = 0;
504     puts("test rx()");
505 //    rx();    /*接*/
506     puts("escape testing");    
507     do{
508         /*構(gòu)造消息包,并完成發(fā)送*/
509         BTSC_PACKET_BEGIN(&c);
510         BTSC_NEW_PROPERTY("MSG","calling");
511 
512         BTSC_PACKET_END();    
513     //    usleep(1000*50);
514         printf(">>seq:%d\n",r);
515     }while(0);
516         
517     btsc_cleanup(&c);    
518     
519     return 0;
520 }
521 
522 
523 #endif
524 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜片在线观看| 久久久91精品| 欧美亚州一区二区三区| 亚洲男人av电影| 午夜精品久久久久久久白皮肤| 国产精品日本一区二区| 久久黄色网页| 母乳一区在线观看| 99这里只有久久精品视频| 中日韩高清电影网| 久久只精品国产| 日韩视频免费在线观看| 国产精品日韩欧美一区二区三区| 久久国产精品久久久久久久久久| 久久久久久久久久久久久9999 | 亚洲国产一区二区三区高清| 欧美sm极限捆绑bd| 亚洲欧美日韩视频一区| 久久久噜噜噜久久| 亚洲一区bb| 久久久亚洲综合| 亚洲午夜女主播在线直播| 欧美在线一二三区| 一本到高清视频免费精品| 亚洲欧美国产视频| 一本色道久久88综合日韩精品| 亚洲免费影院| 亚洲少妇在线| 久热精品视频在线| 欧美在线地址| 欧美日韩一区二区免费视频| 久久综合五月| 国产精品欧美一区二区三区奶水| 欧美国产日韩亚洲一区| 国产精品视频午夜| 亚洲精品欧洲| 亚洲人成高清| 久久久精品国产免费观看同学| 亚洲尤物在线| 欧美黄色免费网站| 麻豆国产精品777777在线| 欧美三日本三级三级在线播放| 欧美大片第1页| 韩国免费一区| 欧美一级二区| 午夜精品视频在线| 欧美日韩免费观看一区二区三区| 美女91精品| 国产日韩欧美一区二区三区四区| 亚洲精品国产精品久久清纯直播| 尤物网精品视频| 久久激情视频久久| 久久国产精品网站| 国产精品日韩欧美一区二区| 一本色道精品久久一区二区三区| 亚洲日本va在线观看| 久久久久国产精品人| 久久久国产视频91| 国内精品模特av私拍在线观看| 亚洲一区二区三区四区中文| 亚洲免费视频观看| 国产精品高清免费在线观看| 夜夜嗨av一区二区三区免费区| 一本色道久久综合| 欧美日韩精选| 99视频有精品| 欧美亚洲网站| 国产一区二区三区精品欧美日韩一区二区三区 | 久久久久国内| 日韩一级片网址| 欧美理论电影网| 999亚洲国产精| 亚洲一区国产一区| 国产精品入口| 久久超碰97中文字幕| 麻豆精品网站| 亚洲人体偷拍| 欧美视频福利| 午夜久久久久| 欧美激情视频免费观看| 亚洲免费av电影| 欧美午夜视频网站| 欧美中文字幕在线视频| 亚洲第一偷拍| 亚洲综合丁香| 国内外成人在线视频| 欧美a级在线| 亚洲天堂成人| 免费毛片一区二区三区久久久| 亚洲人成艺术| 国产精品看片你懂得| 久久米奇亚洲| 在线亚洲观看| 久久在线91| 亚洲午夜女主播在线直播| 国产一区二区三区日韩欧美| 免费在线看成人av| 亚洲午夜羞羞片| 免费黄网站欧美| 亚洲午夜av在线| 精品成人免费| 国产精品vvv| 欧美成人一区二区三区| 亚洲欧美日韩国产一区二区三区| 美女日韩在线中文字幕| 亚洲图中文字幕| 亚洲成人在线视频播放| 国产精品久久久久久久午夜片| 久久久亚洲国产美女国产盗摄| 一本色道久久综合亚洲精品婷婷 | 黄色一区二区三区四区| 欧美日韩一区二区免费在线观看| 久久精品国产亚洲a| 99在线精品观看| 亚洲高清不卡在线| 久久久噜噜噜久久中文字幕色伊伊 | 久久综合网络一区二区| 亚洲手机成人高清视频| 欧美激情一区二区久久久| 欧美专区在线| 亚洲欧美日本日韩| 一区二区久久| 亚洲免费av网站| 亚洲区国产区| 亚洲成色最大综合在线| 国产色婷婷国产综合在线理论片a| 欧美理论电影网| 欧美电影电视剧在线观看| 久久资源在线| 久久综合给合久久狠狠狠97色69| 篠田优中文在线播放第一区| 亚洲一区三区电影在线观看| 99热精品在线| 日韩亚洲欧美一区二区三区| 亚洲国产免费| 亚洲国产精品一区| 亚洲国产裸拍裸体视频在线观看乱了| 久久久夜夜夜| 久久一区二区精品| 久久综合导航| 免费久久精品视频| 韩日欧美一区| 国产精品盗摄一区二区三区| 欧美日韩一区二区三区在线看| 欧美日韩成人| 欧美亚洲成人精品| 国产精品日韩在线一区| 国产日本欧美视频| 国一区二区在线观看| 国产综合精品一区| 在线观看欧美一区| 亚洲国产一区二区三区青草影视| 亚洲电影免费在线观看| 亚洲国产精品一区二区www在线| 在线不卡欧美| 亚洲精品国产精品国自产观看| 日韩午夜激情| 亚洲欧美色婷婷| 久久久国产一区二区三区| 久久久久久综合| 亚洲国产精品ⅴa在线观看| 亚洲精品日日夜夜| 亚洲一区三区视频在线观看| 欧美中文字幕视频| 欧美成人免费大片| 国产精品www网站| 国产一区91精品张津瑜| 亚洲丰满在线| 亚洲欧美国产精品va在线观看 | …久久精品99久久香蕉国产| 亚洲精品日韩激情在线电影| 一区二区欧美日韩视频| 欧美在线视频二区| 欧美韩日一区| 亚洲欧美电影在线观看| 久久综合伊人| 国产精品久久久久毛片大屁完整版 | 欧美一区二区播放| 鲁鲁狠狠狠7777一区二区| 欧美日韩在线视频一区| 国产亚洲免费的视频看| 亚洲精品影视| 久久久五月天| 一区二区日韩伦理片| 久久这里只有精品视频首页| 国产精品国产三级国产a| 一区二区在线观看av| 亚洲一区国产一区| 亚洲国产婷婷| 久久久久五月天| 国产精品试看| 在线性视频日韩欧美| 欧美大片va欧美在线播放| 亚洲欧美日韩精品在线| 欧美日韩一区在线播放| 亚洲福利视频在线| 久久永久免费| 久久不见久久见免费视频1| 国产精品成人观看视频免费 | 国产一级揄自揄精品视频|