RTLS Toolbox User Guide

原文連接

Valid I/Q Samples For Angle Calculation

BLE規(guī)范定義了兩個(gè)術(shù)語(yǔ)“Switch slot” 和 “Sample slot”。“Switch slot”和 “Sample slot”的長(zhǎng)度必須相等搀继,且只能設(shè)置兩個(gè)值(1us和2us)吼畏。
在CTE開(kāi)始時(shí),要丟棄的元素?cái)?shù)量取決于“Switch slot” 和 “Sample slot”的長(zhǎng)度以及采樣頻率秧了。

下圖顯示了CTE的采樣方式:
  • When using 1us slots:
    • the guard period is 4us(guard period不采樣/不需要丟棄任何樣本)
    • 參考周期是8us。在參考周期內(nèi)采集的所有樣本都必須丟棄(例如,如果采樣頻率為4MHz税灌,則意味著必須丟棄32=8us x 4個(gè)/us 個(gè)樣本-如果采樣頻率為1Mhz則必須丟棄8個(gè)樣本)
    • 第一個(gè)開(kāi)關(guān)槽(和所有其他)持續(xù)1us。在一個(gè)開(kāi)關(guān)槽期間采樣的數(shù)據(jù)必須被丟棄(例如硬耍,如果采樣頻率是4MHz垄琐,這意味著在每個(gè)開(kāi)關(guān)槽期間必須丟棄4個(gè)樣本-如果采樣頻率是1MHz,每個(gè)開(kāi)關(guān)槽必須丟棄1個(gè)樣本)经柴。
      因此狸窘,當(dāng)采樣頻率為4MHz時(shí),首先考慮的是第37個(gè)樣本坯认。當(dāng)采樣頻率為1MHz時(shí)翻擒,首先考慮的是第10個(gè)樣本氓涣。
  • When using 2us slots:
    • the guard period is still 4us (guard period不采樣/不需要丟棄任何樣本)
    • 參考時(shí)間仍然是8us。在參考周期內(nèi)采集的所有樣本都必須丟棄(例如陋气,如果采樣頻率為4MHz劳吠,則意味著必須丟棄32個(gè)樣本-如果采樣頻率為1Mhz則必須丟棄8個(gè)樣本)
    • 第一個(gè)開(kāi)關(guān)槽(和所有其他)持續(xù)2us。在一個(gè)開(kāi)關(guān)槽期間采樣的數(shù)據(jù)必須被丟棄(例如巩趁,如果采樣頻率是4MHz痒玩,這意味著在每個(gè)開(kāi)關(guān)槽期間必須丟棄8個(gè)樣本-如果采樣頻率是1MHz,每個(gè)開(kāi)關(guān)槽必須丟棄2個(gè)樣本)议慰。
    • the sampling slots are divided in two:
      1.一個(gè)1us的空閑槽(用來(lái)使天線穩(wěn)定)蠢古。在空閑槽中采樣的數(shù)據(jù)必須被丟棄(例如,如果采樣頻率是4MHz别凹,這意味著在每個(gè)空閑槽中必須丟棄4個(gè)樣本-如果采樣頻率是1MHz草讶,每個(gè)空閑槽必須丟棄1個(gè)樣本)。
      2.一個(gè)1us的采樣槽(例如炉菲,如果采樣頻率為4MHz堕战,每個(gè)采樣槽記錄4個(gè)樣本-如果采樣頻率為1MHz,每個(gè)采樣槽記錄1個(gè)樣本)
      因此拍霜,當(dāng)采樣頻率為4MHz時(shí)嘱丢,首先考慮的是第45個(gè)樣本。當(dāng)采樣頻率為1MHz時(shí)沉御,首先考慮的是第12個(gè)樣本屿讽。
      下圖展示了每個(gè)樣本槽是如何劃分的:

需要注意的是,只有天線能夠切換并安置在小于1us的位置吠裆,才可以使用1us交換槽伐谈。如果天線不能切換和安置在小于1us的采樣槽期間的部分?jǐn)?shù)據(jù)將不正確,將不得不被丟棄试疙。

確定I/Q樣本的另一個(gè)好方法是繪制所有的I/Q樣本诵棵。
下圖顯示了使用4MHz采樣率和2us槽位的rtls_passive和rtls_master和rtls_slave的I/Q樣本。



在沒(méi)有天線切換的情況下祝旷,在參考周期內(nèi)采集前32個(gè)(0~31)樣本履澳。因此,I/Q曲線看起來(lái)就像正弦波怀跛。
在第32個(gè)之后距贷,你可以看到當(dāng)切換發(fā)生時(shí),I/Q樣本出現(xiàn)了不連續(xù)吻谋。


當(dāng)確實(shí)存在相位差時(shí)忠蝗,比較容易看出相的不連續(xù)。因此漓拾,在采集I/Q數(shù)據(jù)前阁最,請(qǐng)確保rtls_passive和rtls_slave的夾角不為0度戒祠。

Angle Compensation(角度補(bǔ)償)

在AoA_getPairAngles()下,獲得基于I和Q數(shù)據(jù)的相位差速种。之后姜盈,添加角度補(bǔ)償。請(qǐng)看下面的代碼配阵。這是因?yàn)榻嵌裙烙?jì)受天線對(duì)和頻率的影響馏颂。p->gain, p->offset,channelOffset_A1和channelOffset_A2的值是基于實(shí)驗(yàn)室測(cè)量的闸餐。不同的天線板設(shè)計(jì)和頻率會(huì)給你不同的p->gain, p->offset, channelOffset_A1和channelOffset_A2饱亮。下面的代碼可以在AOA.c AoA_getPairAngles()中找到,這是天線對(duì)補(bǔ)償舍沙。

// Write back result for antenna pairs
for (int pair = 0; pair < numPairs; ++pair)
{
  const AoA_AntennaPair *p = &gAoaReport.antConfig->pairs[pair];
  gAoaReport.antResult->pairAngle[pair] = (int)((p->sign * antenna_versus_avg[p->a][p->b] + p->offset) * p->gain);
}

正如你從上面的圖中看到的,偏移量是用來(lái)確保在0度處接收到的數(shù)據(jù)在計(jì)算后會(huì)得到0度剔宪,然后改變斜率拂铡,使其更好地適應(yīng)所有其他角度。
天線陣1的補(bǔ)償值見(jiàn):ant_array1_config_boostxl_rev1v1.c AoA_AntennaPair pair_A1[]

AoA_AntennaPair pair_A1[] =
{
   {// v12
    .a = 0,       // First antenna in pair
    .b = 1,       // Second antenna in pair
    .sign = 1,    // Sign for the result
    .offset = -5, // Measurement offset compensation
    .gain = 0.95, // Measurement gain compensation
   },
   {// v23
    .a = 1,
    .b = 2,
    .sign = 1,
    .offset = -20,
    .gain = 0.9,
   },
   {// v13
    .a = 0,
    .b = 2,
    .sign = 1,
    .offset = -20,
    .gain = 0.50,
   },
};

在天線對(duì)補(bǔ)償?shù)幕A(chǔ)上葱绒,增加了頻率補(bǔ)償感帅。對(duì)于天線陣1,用于頻率補(bǔ)償?shù)闹悼梢栽赼nt_array1_config_boostxl_rev1v1.c int8_t channelOffset_A1[40]中找到地淀。

int8_t channelOffset_A1[40] = {2, // Channel 0
                               2, // Channel 1
                               1, // Channel 2
                               1, // Channel 3
                               1, // Channel 4
                               1, // Channel 5
                               1, // Channel 6
                               1, // Channel 7
                               0, // Channel 8
                               0, // Channel 9
                               0, // Channel 10
                               3, // Channel 11
                               3, // Channel 12
                               2, // Channel 13
                               3, // Channel 14
                               3, // Channel 15
                               3, // Channel 16
                               3, // Channel 17
                               3, // Channel 17
                               3, // Channel 18
                               3, // Channel 20
                               3, // Channel 21
                               2, // Channel 22
                               3, // Channel 23
                               3, // Channel 24
                               3, // Channel 25
                               3, // Channel 26
                               3, // Channel 27
                               3, // Channel 28
                               2, // Channel 29
                               2, // Channel 30
                               2, // Channel 31
                               2, // Channel 32
                               2, // Channel 33
                               2, // Channel 34
                               2, // Channel 35
                               1, // Channel 36
                               0, // Channel 37
                               0, // Channel 38
                               0, // Channel 39
                               };

AoA Functions Overview

Here is the list of the most important functions for AoA users.

Python
  1. aoa_set_params:
class AoaSetParamsReq(NpiRequest, SyncReq, FromAp):
   command = Commands.RTLS_CMD_AOA_SET_PARAMS
   struct = Struct(
       "aoaRole" / Enum(Int8ul, AoaRole),  # AOA_MASTER, AOA_SLAVE, AOA_PASSIVE
       "aoaResultMode" / Enum(Int8ul, AoaResultMode),  # AOA_MODE_ANGLE, AOA_MODE_PAIR_ANGLES, AOA_MODE_RAW
       "connHandle" / Int16ul,
       "slotDurations" / Int8ul,  # 1us/2us sampling slots
       "sampleRate" / Int8ul,  # 1Mhz (BT5.1 spec), 2Mhz, 3Mhz or 4Mhz - this enables oversampling
       "sampleSize" / Int8ul,  # 8 bit sample (as defined by BT5.1 spec), 16 bit sample (higher accuracy)
       "sampleCtrl" / Int8ul,  # sample control flags 0x0-default filtering, 0x1-RAW_RF no filtering
       "samplingEnable" / Int8ul,
       # 0 = mask CTE even if enabled, 1 = don't mask CTE, even if disabled (support Unrequested CTE)
       "numAnt" / Int8ul,  # Number of antennas in antenna array
       "antArray" / Int8ul[this.numAnt],  # GPIO's of antennas
   )

slotDurations Setting

Value Description
2 2us for antenna switching and 2us for I/Q sampling.
1 1us for antenna switching and 1us for I/Q sampling.

Note:
對(duì)于選擇slotDuration = 1的用戶(hù)失球,需要確保自定義板上的RF開(kāi)關(guān)能在1 us內(nèi)穩(wěn)定下來(lái)。

sampleRate Setting

Value Description
4 Process packets with AoA present in the header and sample CTE at 4 MHz.
3 Process packets with AoA present in the header and sample CTE at 3 MHz.
2 Process packets with AoA present in the header and sample CTE at 2 MHz.
1 Process packets with AoA present in the header and sample CTE at 1 MHz.

sampleSize Setting

Value Description
2 I/Q samples returned with 13 bits resolution.
1 I/Q samples returned with 8 bits resolution.

sampleCtrl I/Q data Filter Setting

bit[0] Description
1 BLE5-Stack returns whole I/Q data to the application.
0 BLE5-Stack filters out the I/Q data from switching period and returns the rest to application.

sampleCtrl Antenna Array Setting

bit[4:5] Description
0b01 Application use only antenna array 1.
0b10 Application use only antenna array 2.

Integration

發(fā)射載波頻率+ 250khz tone(音頻)的I帮毁、Q采樣可以在主MCU不工作的情況下由射頻核進(jìn)行采集实苞、預(yù)處理和緩沖。

由于預(yù)處理烈疚,應(yīng)用程序可以確定相移黔牵,而不必去除直流偏移量或 IF first,顯著地簡(jiǎn)化了估計(jì)過(guò)程爷肝,并使應(yīng)用程序MCU可以做更多的事情猾浦。

對(duì)于rtls_passive, I/Q采樣率目前不可配置, 固定為4Mhz灯抛。每個(gè)I/Q對(duì)在radio RAM中占用32位空間金赦,radio RAM可以存儲(chǔ)512個(gè)樣本(即2048字節(jié)- 2 kB)。這種限制僅僅是由于微型堆棧限制了無(wú)線RAM中讀取的數(shù)據(jù)量对嚼。無(wú)線電RAM長(zhǎng)度為4 kB夹抗。

當(dāng)采樣率為4MHz時(shí),每4us將有16個(gè)I/Q對(duì)猪半,等于16 * 4(一個(gè)I/Q對(duì)占用4字節(jié)空間)= 64字節(jié)每4us兔朦。
這意味著即使CTE是160us長(zhǎng)偷线,4MHz采樣率,rtls_passive的無(wú)線電RAM也只能存儲(chǔ)I/Q數(shù)據(jù)沽甥,持續(xù)時(shí)間為128us声邦。目前沒(méi)有解決的辦法,除非我們縮短CTE的長(zhǎng)度摆舟。這對(duì)rtls_master來(lái)說(shuō)不是問(wèn)題亥曹。

Note:對(duì)于rtls_passive, I和Q樣本只有13位的分辨率,即使它們占用RF核心RAM中的16位空間恨诱。因?yàn)樗鼈冎挥?3位的分辨率媳瞪,你將觀察到的有符號(hào)整數(shù)的最大值和最小值是[4095,-4096]照宝。

對(duì)于rtls_master, I/Q采樣設(shè)置是可配置的蛇受,從1MHz到4MHz。每個(gè)I/Q對(duì)在無(wú)線RAM中占用32位空間厕鹃,無(wú)線RAM最多可以存儲(chǔ)624個(gè)樣本(2496字節(jié)-約2.5kB)兢仰。當(dāng)采樣頻率達(dá)到最大值(4Mhz)時(shí),在每個(gè)CTE中正好存儲(chǔ)624個(gè)樣本剂碴。(CTE持續(xù)160us把将,減去4us的守衛(wèi)時(shí)間。當(dāng)采樣頻率為4Mhz時(shí)忆矛,在156 us中存儲(chǔ)156*4 = 624個(gè)樣本察蹲。更多細(xì)節(jié)可在有效I/Q樣本中提供,用于角度計(jì)算催训。)

對(duì)于rtls_master, I和Q樣本分辨率是可配置的洽议,請(qǐng)參見(jiàn)sampleSize設(shè)置。您可以選擇只有13位分辨率的16位或8位分辨率瞳腌,這是藍(lán)牙核心規(guī)范版本5.1標(biāo)準(zhǔn)绞铃。選擇哪個(gè)分辨率無(wú)關(guān)緊要,每個(gè)I/Q對(duì)總是在無(wú)線RAM中占用32位空間嫂侍。

應(yīng)用層將天線切換表傳入射頻核儿捧,射頻核在采集I/Q樣本的同時(shí)進(jìn)行天線切換。

在從機(jī)中挑宠,射頻核心保證CTE被插入到連接事件包的末尾而不被白噪聲濾波器扭曲菲盾。

在passive 和 master 中,射頻核心分析數(shù)據(jù)包并在同步天線切換時(shí)在正確的時(shí)間開(kāi)始捕獲樣本各淀。樣本留在RF核心RAM中懒鉴,由主MCU進(jìn)行分析

AoA Driver

對(duì)于rtls_passive,一個(gè)使用Micro BLE Stack的例子,AoA驅(qū)動(dòng)程序負(fù)責(zé)pin初始化临谱,AoA啟用璃俗,數(shù)據(jù)提取和角度估計(jì)。
rtls_master中的AoA功能實(shí)現(xiàn)為符合藍(lán)牙核心規(guī)范5.1版悉默,因此城豁,初始化、支持AoA和數(shù)據(jù)提取都被移到主機(jī)模塊抄课。然而唱星,用戶(hù)仍然可以使用RTLS控制模塊來(lái)設(shè)置需要的參數(shù)。

Configurations Supported

  • Sampling frequency supported: 1 Mhz, 2 Mhz, 3 Mhz or 4 Mhz
  • Sampling slot length supported: 1 us* or 2 us .注意:根據(jù)BLE規(guī)格跟磨,采樣槽和交換槽必須有相同的持續(xù)時(shí)間间聊。
  • Sample size supported: 8bit or 16bit

Sampling slot of 1us is supported by the AoA driver but some limitations exist when using the BOOSTXL-AOA hardware. The antennas of the BOOSTXL-AOA require 1.6 us to switch and settle (leaving 0.4 us in the sampling period to collect data). Other designs with faster RF switches can support 1us switching.

Data Collection Flow

當(dāng)RF Core檢測(cè)到AoA包時(shí),根據(jù)用戶(hù)定義的周期切換天線的同時(shí)開(kāi)始采樣音頻上的I/Q抵拘。

對(duì)于rtls_master, IQ樣本將從RTLS服務(wù)主機(jī)模塊發(fā)送到應(yīng)用程序哎榴,事件類(lèi)型為RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT。

根據(jù)python設(shè)置的AoA結(jié)果模式僵蛛,調(diào)用不同的函數(shù)集并返回相應(yīng)的數(shù)據(jù)集叹话,如下圖所示:


Note:對(duì)于rtls_master,當(dāng)使用AOA_MODE_RAW時(shí)墩瞳,如果sampleCtrl中的[0]位設(shè)置為0,則BLE5-Stack將過(guò)濾掉切換周期中的I/Q數(shù)據(jù)氏豌。要獲得完整的I/Q數(shù)據(jù)集喉酌,需要將sampleCtrl中的[0]位設(shè)置為1。請(qǐng)參閱sampleCtrl I/Q數(shù)據(jù)過(guò)濾器設(shè)置概述泵喘。

Warning:對(duì)于rtls_master泪电,當(dāng)sampleCtrl= 1的[0]位時(shí),不支持AOA_MODE_PAIR_ANGLE和AOA_MODE_ANGLE纪铺。

  class AoaSetParamsReq(NpiRequest, SyncReq, FromAp):
      command = Commands.RTLS_CMD_AOA_SET_PARAMS
      struct = Struct(
          "aoaRole" / Enum(Int8ul, AoaRole),  # AOA_MASTER, AOA_SLAVE, AOA_PASSIVE
          "aoaResultMode" / Enum(Int8ul, AoaResultMode),  # AOA_MODE_ANGLE, AOA_MODE_PAIR_ANGLES, AOA_MODE_RAW
          "connHandle" / Int16ul,
          "slotDurations" / Int8ul,  # 1us/2us sampling slots
          "sampleRate" / Int8ul,  # 1Mhz (BT5.1 spec), 2Mhz, 3Mhz or 4Mhz - this enables oversampling
          "sampleSize" / Int8ul,  # 8 bit sample (as defined by BT5.1 spec), 16 bit sample (higher accuracy)
          "sampleCtrl" / Int8ul,  # sample control flags bit[0] = 0-default filtering, bit[0]= 1-RAW_RF no filtering
                                  # bit 4,5 - 0x10 - ONLY_ANT_1, 0x20 - ONLY_ANT_2
                                  # 0x00 is not a valid option.
          "samplingEnable" / Int8ul,
          # 0 = mask CTE even if enabled, 1 = don't mask CTE, even if disabled (support Unrequested CTE)
          "numAnt" / Int8ul,  # Number of antennas in antenna array
          "antArray" / Int8ul[this.numAnt],  # GPIO's of antennas
      )

當(dāng)使用AOA_MODE_ANGLE時(shí)相速,天線圖場(chǎng)必須為0、1鲜锚、2突诬,天線陣2時(shí)必須為3、4芜繁、5旺隙。

當(dāng)使用AOA_MODE_RAW模式時(shí),采樣率固定在4MHz骏令。

Connectionless AoA

為了不泛濫廣告通道蔬捷,connectionless AoA只被允許作為輔助包(即透過(guò)次要通道,參考 Bluetooth Core Specification Version 5.1 Vol 6, Part B, §2.3 for details on the PDUs allowed to be appended with a CTE
)。在BLE5-Stack中周拐,支持周期性廣告的無(wú)連接AoA

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铡俐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子妥粟,更是在濱河造成了極大的恐慌审丘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罕容,死亡現(xiàn)場(chǎng)離奇詭異备恤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锦秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)露泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旅择,你說(shuō)我怎么就攤上這事惭笑。” “怎么了生真?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沉噩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柱蟀,道長(zhǎng)川蒙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任长已,我火速辦了婚禮畜眨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘术瓮。我一直安慰自己康聂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布胞四。 她就那樣靜靜地躺著恬汁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辜伟。 梳的紋絲不亂的頭發(fā)上氓侧,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音游昼,去河邊找鬼甘苍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烘豌,可吹牛的內(nèi)容都是我干的载庭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囚聚!你這毒婦竟也來(lái)了靖榕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顽铸,失蹤者是張志新(化名)和其女友劉穎茁计,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谓松,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡星压,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鬼譬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜膘。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖优质,靈堂內(nèi)的尸體忽然破棺而出竣贪,到底是詐尸還是另有隱情,我是刑警寧澤巩螃,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布演怎,位于F島的核電站,受9級(jí)特大地震影響避乏,放射性物質(zhì)發(fā)生泄漏爷耀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一拍皮、第九天 我趴在偏房一處隱蔽的房頂上張望畏纲。 院中可真熱鬧,春花似錦春缕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至女阀,卻和暖如春宅荤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浸策。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工冯键, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庸汗。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓惫确,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子改化,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容