日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程

瀏覽:135日期:2022-07-26 13:01:46

一、CAN報(bào)文簡介

CAN是控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)的簡稱,是由以研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國BOSCH公司開發(fā)的,并最終成為國際標(biāo)準(zhǔn)(ISO 11898),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。 在北美和西歐,CAN總線協(xié)議已經(jīng)成為汽車計(jì)算機(jī)控制系統(tǒng)和嵌入式工業(yè)控制局域網(wǎng)的標(biāo)準(zhǔn)總線,并且擁有以CAN為底層協(xié)議專為大型貨車和重工機(jī)械車輛設(shè)計(jì)的J1939協(xié)議。

CAN總線以報(bào)文為單位進(jìn)行數(shù)據(jù)傳送。CAN報(bào)文按照幀格式可分為標(biāo)準(zhǔn)幀和擴(kuò)展幀,標(biāo)準(zhǔn)幀是具有11位標(biāo)識符的CAN幀,擴(kuò)展幀是具有29位標(biāo)識符的CAN幀。按照幀類型可分為:1.從發(fā)送節(jié)點(diǎn)向其它節(jié)點(diǎn)發(fā)送數(shù)據(jù);2.遠(yuǎn)程幀:向其它節(jié)點(diǎn)請求發(fā)送具有同一識別符的數(shù)據(jù)幀;3.錯(cuò)誤幀:指明已檢測到總線錯(cuò)誤;4.過載幀:過載幀用以在數(shù)據(jù)幀(或遠(yuǎn)程幀)之間提供一附加的延時(shí)。共有兩種編碼格式:Intel格式和Motorola格式,在編碼優(yōu)缺點(diǎn)上,Motorola格式與Intel格式并沒有孰優(yōu)孰劣之分,只不過根據(jù)設(shè)計(jì)者的習(xí)慣,由用戶自主選擇罷了。當(dāng)然,對于使用者來講,在進(jìn)行解析之前,就必須要知道編碼的格式是哪一種,否則,就不能保證正確地解析信號的含義。以下就以8位字節(jié)編碼方式的CAN總線信號為例,詳細(xì)分析一下兩者之間的區(qū)別。

Intel編碼格式

當(dāng)一個(gè)信號的數(shù)據(jù)長度不超過1個(gè)字節(jié)(8位)并且信號在一個(gè)字節(jié)內(nèi)實(shí)現(xiàn)(即該信號沒有跨字節(jié)實(shí)現(xiàn)):該信號的高位(S_msb)將被放在該字節(jié)的高位,信號的低位(S_lsb)將被放在該字節(jié)的低位。

當(dāng)一個(gè)信號的數(shù)據(jù)長度超過1個(gè)字節(jié)(8位)或者數(shù)據(jù)長度不超過一個(gè)字節(jié)但是采用跨字節(jié)方式實(shí)現(xiàn)時(shí):該信號的高位(S_msb)將被放在高字節(jié)(MSB)的高位,信號的低位(S_lsb)將被放在低字節(jié)(LSB)的低位。

Motorola編碼格式

當(dāng)一個(gè)信號的數(shù)據(jù)長度不超過1個(gè)字節(jié)(8位)并且信號在一個(gè)字節(jié)內(nèi)實(shí)現(xiàn)(即該信號沒有跨字節(jié)實(shí)現(xiàn)):該信號的高位(S_msb)將被放在該字節(jié)的高位,信號的低位(S_lsb)將被放在該字節(jié)的低位。

當(dāng)一個(gè)信號的數(shù)據(jù)長度超過1個(gè)字節(jié)(8位)或者數(shù)據(jù)長度不超過一個(gè)字節(jié)但是采用跨字節(jié)方式實(shí)現(xiàn)時(shí):該信號的高位(S_msb)將被放在低字節(jié)(MSB)的高位,信號的低位(S_lsb)將被放在高字節(jié)(LSB)的低位。

可以看出,當(dāng)一個(gè)信號的數(shù)據(jù)長度不超過1Byte時(shí),Intel與Motorola兩種格式的編碼結(jié)果沒有什么不同,完全一樣。當(dāng)信號的數(shù)據(jù)長度超過1Byte時(shí),兩者的編碼結(jié)果出現(xiàn)了明顯的不同。

二、CAN報(bào)文轉(zhuǎn)換工具需求分析

1、 支持標(biāo)準(zhǔn)幀的CAN報(bào)文的轉(zhuǎn)換,擴(kuò)展幀暫不支持

2、 CAN報(bào)文支持Intel、motorola兩種編碼,先支持motorola格式,后期追加Intel格式

3、 工具具有一定的容錯(cuò)處理能力、報(bào)告生成能力

4、 制定統(tǒng)一格式,方便使用者修改測試腳本

5、增加交互模式,鍵盤輸入,控制臺輸出;例如:

提示語:startBit:length:minValue:maxValue:setValue

輸入:35:1:0:1:1

或:35:1:::1

控制臺輸出:00 00 00 00 08 00 00 00

Intel和Motorola編碼舉例:

Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程

三、交互模式

代碼如下:

import sysprint('----------------歡迎使用CAN報(bào)文轉(zhuǎn)換工具交互模式----------------')print('請輸入CAN信號,格式為:startBit:length:minValue:maxValue:setValue')print('例如:32:1:0:1:1')print('或者省略minValue和maxValue:35:1:::1')print('信號輸入結(jié)束請?jiān)侔匆淮位剀?) #十進(jìn)制轉(zhuǎn)換成二進(jìn)制listdef octToBin(octNum, bit): while(octNum != 0): bit.append(octNum%2) octNum = int(octNum/2) for i in range(64-len(bit)): bit.append(0) sig = []startBit = []length = []setValue = []#輸入CAN信號while True: input_str = input() if not len(input_str): break if(input_str.count(':')<4): print('輸入格式錯(cuò)誤,參數(shù)缺少setValue,請重新輸入!') continue if(input_str.split(':')[4]==''): print('setValue參數(shù)不能為空,請重新輸入!') continue sig.append(input_str)#解析CAN信號for i in range(len(sig)): startBit.append(int(sig[i].split(':')[0])) length.append(int(sig[i].split(':')[1])) setValue.append(int(sig[i].split(':')[4]))#CAN數(shù)組存放CAN報(bào)文值 CAN = []for i in range(64): CAN.append(-1)for i in range(len(startBit)): #長度超過1Byte的情況,暫不支持 if(length[i]>16): print('CAN信號長度超過2Byte,暫不支持?。?!') sys.stdin.readline() sys.exit() #長度未超過1Byte的情況且未跨字節(jié)的信號 if((startBit[i]%8 + length[i])<=8): for j in range(length[i]): bit = [] #setValue的二進(jìn)制值按字節(jié)位從低到高填 octToBin(setValue[i],bit) #填滿字節(jié)長度值 if(CAN[startBit[i]+j]==-1): CAN[startBit[i]+j] = bit[j] #字節(jié)存在沖突 else: print(sig[i] + '字節(jié)位存在沖突,生成CAN報(bào)文失?。。?!') sys.stdin.readline() sys.exit() #跨字節(jié)的信號 else: #高位位數(shù)和低位位數(shù) highLen = 8 - startBit[i]%8 lowLen = length[i] - highLen bit = [] #setValue的二進(jìn)制值按字節(jié)位從低到高填 octToBin(setValue[i],bit) #先填進(jìn)信號的高位 for j1 in range(highLen): if(CAN[startBit[i]+j1]==-1): CAN[startBit[i]+j1] = bit[j1] #字節(jié)存在沖突 else: print(sig[i] + '字節(jié)位存在沖突,生成CAN報(bào)文失?。。?!') sys.stdin.readline() sys.exit() #再填進(jìn)信號的低位 for j2 in range(lowLen): if(CAN[(int(startBit[i]/8)-1)*8+j2]==-1): CAN[(int(startBit[i]/8)-1)*8+j2] = bit[highLen+j2] #字節(jié)存在沖突 else: print(sig[i] + '字節(jié)位存在沖突,生成CAN報(bào)文失?。。?!') sys.stdin.readline() sys.exit()#剩余位默認(rèn)值設(shè)為0for i in range(64): if(CAN[i]==-1): CAN[i] = 0#----------------將二進(jìn)制list每隔8位轉(zhuǎn)換成十六進(jìn)制輸出----------------#其中,map()將list中的數(shù)字轉(zhuǎn)成字符串,按照Motorola格式每隔8位采用了逆序# ’’.join()將二進(jìn)制list轉(zhuǎn)換成二進(jìn)制字符串,int()將二進(jìn)制字符串轉(zhuǎn)換成十進(jìn)制#hex()再將十進(jìn)制轉(zhuǎn)換成十六進(jìn)制,upper()轉(zhuǎn)換成大寫,兩個(gè)lstrip()將'0X'刪除,#zfill()填充兩位,輸出不換行,以空格分隔print(hex(int(’’.join(map(str,CAN[7::-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[15:7:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[23:15:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[31:23:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[39:31:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[47:39:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[55:47:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='')print(hex(int(’’.join(map(str,CAN[63:55:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2))

運(yùn)行截圖:

Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程

錯(cuò)誤提示:

Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程

四、配置項(xiàng)模式

配置文件如下:

##注釋::start#編碼格式:0=Intel;1=MotorolaencodeType=1#幀格式:0=標(biāo)準(zhǔn)幀;1=擴(kuò)展幀;canMode=0#幀類型:0=數(shù)據(jù)幀;...canType=0#默認(rèn)初始值(0~1)defaultValue=0#MSG定義msgName=BCM_FrP01msgID=0x2CD#長度(BYTE)msgLength=8#signal定義#sigName=name:startBit:length:minValue:maxValue:setValue#sigName=ReverseSw:25:6:0:1:13#sigName=Trunk_BackDoor_Sts:33:2:0:1:2#sigName=DRVUnlockState:37:2:0:1:3#sigName=HeadLampLowBeam:40:8:0:1:60#sigName=HoodStatus:51:1:0:1:0#sigName=HeadLampHighBeam:52:1:0:1:0#sigName=RLDoorStatus:59:1:0:1:0#sigName=RRDoorStatus:58:1:0:1:0#sigName=PsgDoorStatus:57:2:0:1:0sigName=One:0:8:0:255:165sigName=Two:24:12:0:4095:1701sigName=Three:54:5:0:31:25::end::start#編碼格式:0=Intel;1=MotorolaencodeType=1#幀格式:0=標(biāo)準(zhǔn)幀;1=擴(kuò)展幀;canMode=0#幀類型:0=數(shù)據(jù)幀;...canType=0#默認(rèn)初始值(0~1)defaultValue=0#MSG定義msgName=BCM_FrPmsgID=0x2CD#長度(BYTE)msgLength=8#signal定義#sigName=name:startBit:length:minValue:maxValue:setValue#sigName=ReverseSw:25:6:0:1:13#sigName=Trunk_BackDoor_Sts:33:2:0:1:2#sigName=DRVUnlockState:37:2:0:1:3#sigName=HeadLampLowBeam:40:8:0:1:60#sigName=HoodStatus:51:1:0:1:0#sigName=HeadLampHighBeam:52:1:0:1:0#sigName=RLDoorStatus:59:1:0:1:0#sigName=RRDoorStatus:58:1:0:1:0#sigName=PsgDoorStatus:57:2:0:1:0sigName=One:35:1:0:1:1::end

代碼如下:

#!/usr/bin/pythondefaultValue = 0sigName = []startBit = []length = []minValue = []maxValue = []setValue = []#CAN數(shù)組存放CAN報(bào)文值CAN = []logFile = open('log.txt','w')def parseConfig(): config = open('Config.txt','r') count = 0 isError = False for line in config: line = line.strip() #注釋 if(line.find('#')>=0): continue #開始標(biāo)記 elif(line.find('::start')>=0): count = count + 1 isError = False if(count>1): sigName.clear() startBit.clear() length.clear() setValue.clear() continue else: continue elif(isError == True): continue #編碼格式 elif(line.find('encodeType')>=0): encodeType = line.split('=')[1] if(encodeType != '1'): isError = True print(str(count) + '. CAN報(bào)文生成失?。。?!目前僅支持Motorola編碼格式,暫不支持Intel編碼格式!') logFile.write('%d. CAN報(bào)文生成失?。。?!目前僅支持Motorola編碼格式,暫不支持Intel編碼格式!n' % count) continue #幀格式 elif(line.find('canMode')>=0): canMode = line.split('=')[1] if(canMode != '0'): isError = True print(str(count) + '. CAN報(bào)文生成失敗?。。∧壳皟H支持標(biāo)準(zhǔn)幀,暫不支持?jǐn)U展幀!') logFile.write('%d. CAN報(bào)文生成失敗?。。∧壳皟H支持標(biāo)準(zhǔn)幀,暫不支持?jǐn)U展幀!n' % count) continue #幀類型 elif(line.find('canType')>=0): canType = line.split('=')[1] if(canType != '0'): isError = True print(str(count) + '. CAN報(bào)文生成失?。。?!目前僅支持?jǐn)?shù)據(jù)幀,暫不支持其他幀!') logFile.write('%d. CAN報(bào)文生成失?。。?!目前僅支持?jǐn)?shù)據(jù)幀,暫不支持其他幀!n' % count) continue #默認(rèn)初始值 elif(line.find('defaultValue')>=0): global defaultValue defaultValue = int(line.split('=')[1]) #MSG名稱 elif(line.find('msgName')>=0): msgName = line.split('=')[1] #MSGID elif(line.find('msgID')>=0): msgID = line.split('=')[1] #MSG長度 elif(line.find('msgLength')>=0): msgLength = line.split('=')[1] #signal定義 elif(line.find('sigName')>=0): sigName.append(line.split(':')[0].split('=')[1]) startBit.append(int(line.split(':')[1])) length.append(int(line.split(':')[2])) #minValue.append(int(line.split(':')[3])) #maxValue.append(int(line.split(':')[4])) setValue.append(int(line.split(':')[5])) elif(line.find('::end')>=0): rV,errMsg = getCANMessage() if(rV == '-1'): isError = True print(str(count) + '. CAN報(bào)文生成失敗?。?!' + errMsg) logFile.write('%d. CAN報(bào)文生成失?。。?!%sn' % (count,errMsg)) continue print(str(count) + '. CAN報(bào)文生成成功!!!') logFile.write('%d. CAN報(bào)文生成成功!!!n' % count) #----------------------------輸出標(biāo)題信息---------------------------- print('msgNamettmsgIDttmsgLenttmsgData') logFile.write('msgNamettmsgIDttmsgLenttmsgDatan') if(len(msgName)<8): print(msgName + 'tt',end='') logFile.write('%stt' % msgName) else: print(msgName + 't',end='') logFile.write('%st' % msgName) print(msgID + 'tt',end='') logFile.write('%stt' % msgID) print(msgLength + 'tt',end='') logFile.write('%stt' % msgLength) #----------------將二進(jìn)制list每隔8位轉(zhuǎn)換成十六進(jìn)制輸出---------------- #其中,map()將list中的數(shù)字轉(zhuǎn)成字符串,按照Motorola格式每隔8位采用了逆序 # ’’.join()將二進(jìn)制list轉(zhuǎn)換成二進(jìn)制字符串,int()將二進(jìn)制字符串轉(zhuǎn)換成十進(jìn)制 #hex()再將十進(jìn)制轉(zhuǎn)換成十六進(jìn)制,upper()轉(zhuǎn)換成大寫,兩個(gè)lstrip()將'0X'刪除, #zfill()填充兩位,輸出不換行,以空格分隔 print(hex(int(’’.join(map(str,CAN[7::-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[15:7:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[23:15:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[31:23:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[39:31:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[47:39:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[55:47:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2) + ' ',end='') print(hex(int(’’.join(map(str,CAN[63:55:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[7::-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[15:7:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[23:15:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[31:23:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[39:31:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[47:39:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%s ' % hex(int(’’.join(map(str,CAN[55:47:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) logFile.write('%sn' % hex(int(’’.join(map(str,CAN[63:55:-1])),2)).upper().lstrip('0').lstrip('X').zfill(2)) config.close() #十進(jìn)制轉(zhuǎn)換成二進(jìn)制list def octToBin(octNum, bit): while(octNum != 0): bit.append(octNum%2) octNum = int(octNum/2) for i in range(64-len(bit)): bit.append(0) #獲取CAN報(bào)文值def getCANMessage(): CAN.clear() for i in range(64): CAN.append(-1) for i in range(len(startBit)): #長度超過1Byte的情況,暫不支持 if(length[i]>16): errMsg = ' CAN信號長度超過2Byte,暫不支持?。?!' #print(sigName[i] + errMsg) return '-1',errMsg #長度未超過1Byte的情況且未跨字節(jié)的信號 if((startBit[i]%8 + length[i])<=8): for j in range(length[i]): bit = [] #setValue的二進(jìn)制值按字節(jié)位從低到高填 octToBin(setValue[i],bit) #填滿字節(jié)長度值 if(CAN[startBit[i]+j]==-1): CAN[startBit[i]+j] = bit[j] #字節(jié)存在沖突 else: errMsg = ' 字節(jié)位存在沖突,生成CAN報(bào)文失敗!??!' #print(sigName[i] + errMsg) return '-1',errMsg #跨字節(jié)的信號 else: #高位位數(shù)和低位位數(shù) highLen = 8 - startBit[i]%8 lowLen = length[i] - highLen bit = [] #setValue的二進(jìn)制值按字節(jié)位從低到高填 octToBin(setValue[i],bit) #先填進(jìn)信號的高位 for j1 in range(highLen): if(CAN[startBit[i]+j1]==-1): CAN[startBit[i]+j1] = bit[j1] #字節(jié)存在沖突 else: errMsg = ' 字節(jié)位存在沖突,生成CAN報(bào)文失?。。。? #print(sigName[i] + errMsg) return '-1',errMsg #再填進(jìn)信號的低位 for j2 in range(lowLen): if(CAN[(int(startBit[i]/8)-1)*8+j2]==-1): CAN[(int(startBit[i]/8)-1)*8+j2] = bit[highLen+j2] #字節(jié)存在沖突 else: errMsg = ' 字節(jié)位存在沖突,生成CAN報(bào)文失敗?。?!' #print(sigName[i] + errMsg) return '-1',errMsg #剩余位設(shè)為默認(rèn)值 for i in range(64): if(CAN[i]==-1): CAN[i] = defaultValue #若無錯(cuò)誤則返回正確值 return '0','success!' if __name__ == '__main__': #調(diào)用parseConfig()函數(shù)開始執(zhí)行程序 parseConfig()

運(yùn)行結(jié)果:

1. CAN報(bào)文生成成功?。?!msgNamemsgIDmsgLenmsgDataBCM_FrP010x2CD8A5 00 06 A5 00 06 40 002. CAN報(bào)文生成成功!??!msgNamemsgIDmsgLenmsgDataBCM_FrP0x2CD800 00 00 00 08 00 00 00

以上這篇Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品av| 综合亚洲色图| 亚洲最新av| 蜜臀av一区二区在线免费观看 | 欧产日产国产精品视频| 成人精品久久| 日韩精品免费一区二区在线观看 | 蜜桃精品在线| 亚洲国产成人精品女人| 99综合视频| 四虎精品一区二区免费| 国产精品第一国产精品| 伊人久久av| 99亚洲视频| 中文视频一区| 欧美日韩国产在线一区| 免费在线观看视频一区| 欧美精品国产白浆久久久久| 久久久久久久久成人| 国产v综合v| 亚洲一区av| 精品国产欧美日韩一区二区三区| 成人羞羞视频播放网站| 亚洲综合不卡| 97久久精品| 日韩欧美一区二区三区免费观看| 久久亚洲不卡| 欧美激情在线精品一区二区三区| 久久精选视频| 欧美影院视频| 99久久激情| 久久国产三级| 美女少妇全过程你懂的久久| 日韩高清中文字幕一区| 高清av不卡| 日韩高清不卡一区| 999国产精品| 国产精品一区二区三区av麻 | 免费在线成人| 一区免费在线| 精品视频免费| 亚洲性视频在线| 日韩免费高清| 国产伦精品一区二区三区视频| 欧美一区三区| 日本 国产 欧美色综合| 综合欧美精品| 日韩不卡免费高清视频| 综合五月婷婷| 亚洲一级高清| 久久女人天堂| 日本欧洲一区二区| 久久三级中文| 亚洲精品无吗| 精品欧美久久| 老牛国内精品亚洲成av人片 | 亚洲天堂av资源在线观看| 最近高清中文在线字幕在线观看1| 亚洲专区视频| 亚洲激精日韩激精欧美精品| 久久精品资源| 日本欧美一区二区| 在线一区免费观看| 久久夜夜操妹子| 日韩三级一区| 性一交一乱一区二区洋洋av| 色老板在线视频一区二区| 美日韩一区二区三区| 日韩1区2区日韩1区2区| 蜜桃视频在线观看一区| 亚洲二区精品| av中文资源在线资源免费观看| 国产麻豆一区二区三区| 日韩欧美三区| 亚洲精品免费观看| 免费精品视频| 夜久久久久久| 欧美日韩日本国产亚洲在线 | 亚洲精品在线二区| 日韩一区二区免费看| 成午夜精品一区二区三区软件| 国产欧美日韩一区二区三区四区| 亚洲日产国产精品| 三级在线观看一区二区| 婷婷激情综合| 欧美不卡高清| 免费av一区| 欧美美女一区| 激情久久久久久久| 欧美1区免费| 99视频一区| 一区二区视频欧美| 老牛国产精品一区的观看方式| 日韩视频中文| 亚洲一区欧美激情| 国产模特精品视频久久久久| 亚洲一区二区三区高清| 蜜桃久久av一区| 日韩成人在线看| 国产免费播放一区二区| 国产精品任我爽爆在线播放| 国产精品资源| 欧美激情福利| 激情黄产视频在线免费观看| 色偷偷色偷偷色偷偷在线视频| 极品av在线| 久久久夜夜夜| 久久国产99| 日韩视频1区| 精品视频一区二区三区在线观看| 在线天堂资源www在线污| 成人日韩在线观看| 中文在线不卡| 欧美另类中文字幕 | 欧美精品二区| 欧美视频一区| 麻豆中文一区二区| 91欧美在线| 日韩成人精品一区| 少妇精品导航| 最新国产精品久久久| 国产精品密蕾丝视频下载| 久久这里只有| 伊人久久大香线蕉av不卡| 亚洲一区二区三区无吗| 国产精品s色| 久久精品国产99久久| 亚洲一区二区三区在线免费| 国产精品xxx在线观看| 99久久亚洲精品| 日韩中文字幕无砖| 水蜜桃精品av一区二区| 在线亚洲激情| 国产伦精品一区二区三区千人斩| 九九久久国产| 国产亚洲精品自拍| 国产精品网址| 欧美精品一区二区三区精品| 日韩欧美中文字幕一区二区三区| 久久久免费人体| 亚洲激情另类| 国产精品蜜月aⅴ在线| 亚洲高清久久| 欧美黑人巨大videos精品| 欧美手机在线| 国产探花在线精品一区二区| 日本а中文在线天堂| 最新亚洲国产| 日韩欧美二区| 日韩专区视频网站| 久久久夜夜夜| 久久国内精品自在自线400部| 99久久亚洲精品蜜臀| 国产精品色婷婷在线观看| 国精品一区二区三区| 国产精品18| 蜜桃视频在线观看一区| 色老板在线视频一区二区| 国产亚洲久久| 狠狠色狠狠色综合日日tαg| 国产精品99久久久久久董美香| 999在线观看精品免费不卡网站| 久久精品一本| 最近国产精品视频| 99成人在线视频| 精品国产18久久久久久二百| 亚洲精品成a人ⅴ香蕉片| 特黄特色欧美大片| 国产精品一级| 亚洲九九精品| 欧美精品九九| 999久久久精品国产| 精品午夜视频| 青青国产精品| 老鸭窝毛片一区二区三区| 97se综合| 另类欧美日韩国产在线| 日韩欧美中文字幕一区二区三区| 欧美日韩在线二区| 精品国产乱码| 国产精品久久久久久久免费软件| 日韩精品一级中文字幕精品视频免费观看 | 日韩午夜av在线| 久久精品网址| 奇米狠狠一区二区三区| 羞羞答答国产精品www一本| 久久久一本精品| 国产在线观看www| 久久精品国产久精国产爱| 欧美综合精品| 日韩va亚洲va欧美va久久| 亚洲一区av| 一级欧美视频| 亚洲天堂日韩在线| 男人的天堂亚洲一区| 亚洲激情av| 亚洲调教视频在线观看| 日韩理论片av| 久久激情一区| 欧美亚洲国产一区|