找回密码
 注册
关于网站域名变更的通知
查看: 368|回复: 1
打印 上一主题 下一主题

关于手机音频通信实际开发经验分享(2012年旧贴备份)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-9 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 seewolf 于 2021-6-9 18:11 编辑 3 P! ~, e* ~/ r
. }" G8 Z  K% `# q
自12年毕业至今工作将近一年,也积累了一些经验,接下来会一一分享出来,算是对阿莫的感恩吧!第一篇是关于手机音频通信方面的,12年上半年从事过几个月的手机音频通信的开发(我主要负责设备一端的程序和电路,手机软件部分不负责),积累了一点经验,在这里献丑了。
  v- G5 {* u6 O1 ~一、手机音频通信的特点
" i; P2 d$ g8 g9 y: x1、通用性强:在智能手机普及的今天,手机的对外通信接口多种多样,而其中以3.5mm的音频接口通用新最强,基本所有的手机、平板电脑都会有这个接口,所以在一些要求通用性的设备上,音频接口登上了舞台。. Y5 |7 S8 i' m/ {* E" h) m
2、速率低:由于手机音频部分的采样频率一般为44.1KHZ(部分国产山寨为8KHZ),这极大的限制了音频通讯的速率。我们都知道44.1KHZ的采样频率,那么最高的信号频率只能为20KHZ左右,而信号周期也不可能只有2个采样点,通常要到10个以上,这样层层下来通讯速率可想而知。2 i5 f6 }; o: a% ~, n- Y& c+ K4 ?
3、小信号:音频通信的信号都是毫伏级的,各个手机厂商略有不同,但通常最大不超过200mv,通常我们通信使用的信号强度也就100mv左右,这导致信号比较容易受干扰,且在开发阶段对工具有着种种限制。
* ?, x6 K$ @& |+ o! G, z& m, S二、手机音频通信分类
, Z) T! ?* y3 ?! {* |8 b1、无线方式:7 @- J8 u1 h; c  K, I) T
a) 无线方式大家可能不太熟悉,容我慢慢道来。我们都知道人耳能听到的声音频率为20HZ~20KHZ,而手机通信的信号频率最高也就20KHZ,所以无线通信方式是可行的。因为虽然人耳的极限听力能到20KHZ,但普通人一般在19KHZ以上时基本就听不到了,所以如果信号的强度比较弱,且控制在19KHZ到20KHZ之间,那么我们就可以将之当做是“超声波”来看待了。, N7 H; K% x3 o# L2 N
b) 其实在此提到手机音频通信的无线方式,算是给大家一种产品开发思路吧。它的通讯半径在10M左右,前景还是很广阔的,大家有兴趣的可以试试。(其实已经有这方面的产品了)! A. i7 R# y/ z# J: c- u# B, Q
2、有线方式:
, q2 K' @) j8 r" Ea) 有线方式分为单向(设备→手机)和双向两种,单向的限制少,开发难度也小一些,但实际应用时会受限制。而双向通信限制多,开发难度也大一些,但实际应用时更方便些。& B4 I: K" b0 X0 C- Z( ?- G; O
b) 设备→手机:曼彻斯特编码;FSK;DTMF;自定义正弦波
0 R( J3 n) A) E& sc)  手机→设备:由于手机输出的音频信号很小,无法直接使用,要么用运放发大到合适的范围,要么用电压比较器转换成TTL方波。  b6 d7 a; @, J, v) d8 X/ m
三、手机音频通信硬件通信方式分类:手机音频通信的硬件通信方式大体可分为方波和正弦波两种。
! y* `9 K& e& v! e! B1、方波:方波通常使用的是曼彻斯特编码方式(什么是曼彻斯特编码自己去查),它的好处是可以用单片机直接输出方波,经过衰减后即可使用,方便简单。缺点是兼容性不好,因为手机音频部分有这样一个特性,它只识别变化的电平信号,当麦克输入的信号长时间保持在某一非零电平时,手机会将其视为零,而强行拉回零电位。这就是采用方波通讯方式的兼容性不好的最大原因了,并且方波也容易受干扰。7 S  s4 b, s. F$ g/ l2 ]
2、正弦波:正弦波不会出现上面所说的方波的问题,故正弦波的兼容性和稳定性更好一些。通常采用方案有FSK、DTMF、信号发生器、或方波转正弦波等。(后面会对以上方案逐一分析)6 X$ A+ M! r+ f1 w
3、通信信道分析
# ?5 h3 H, W; ]6 R0 K% J4 c' |+ Pa) 我们知道音频接口有4根线,MIC、地、左、右声道。设备→手机用MIC,手机→设备用地、左、右声道中的任意一个。这里说一下,实际产品中,有一些厂家会更换地线,即将原本左、有声道中的一根改为地线来用,其实道理是一样的。因为音频通信的信号时交流信号,而地其实也是悬浮地,即便地线换了,最终的波形还是一样的,因为最终手机解析信号时需要的是频率和幅值。这样还剩下一个声道,通常被用来帮助设备进行上电识别,因为音频通信的设备通常都是电池供电的。2 ]9 ~" ]0 F9 R7 b) n
b) 另外还要在MIC和地之间并联一个4.99K的电阻,因为手机是通过检测MIC和地之间的阻抗是否为4.99K(也有其他阻值的)来判断是否有设备(耳机)插入,这一点要谨记。
7 e( c8 y" P4 Y9 L四、各个通信方案对比分析
- C7 G9 ^1 M. ]4 S% O" I1、设备→手机:
* B, U! l5 x5 R. E+ qa) 曼彻斯特编码:在诸多通信方式中,曼彻斯特编码是最灵活简便的一种方法,编码信号可由单片机直接产生,经衰减电路衰减后便可直接使用。注意事项:曼彻斯特编码信号的生成有两种方式,一种是用PWM生成,一种是用定时器中断翻转IO,我个人比较倾向于定时器中断方式。因为我们知道曼彻斯特编码中有宽沿河窄沿之分,且宽沿和窄沿可能会灵活变化,而用PWM方式不容易精确控制宽沿、窄沿输出的变化,而定时器中断方式则非常灵活且容易控制。(后面会送上我自己写的曼彻斯特编码、解码函数)
9 N% Z3 `) S4 Vb) FSK、DTMF方式:FSK和DTMF两种方式大同小异,使用时通常都是用集成的芯片来生成的,而这些芯片通常都是遵守固定的通信协议的的要求(FSK为Bell202或V.23协议,DTMF记不清名字了)。这两种通信方式的优点是采用正弦波通信、稳定性好且使用简便。但由于固定通信协议的限制导致通信速率、比特率也受到限制而缺乏灵活性。在这里跟他家推荐一款英国的通信芯片CMX系列,这个系列的芯片融合的FSK、DTMF的编码、解码,还是很不错的,大家有兴趣可以试试。(相关手册在附件里)
% \$ e( `9 T6 u& [7 E6 |+ W$ jc) 信号发生器、锁相环方式:这种方式用信号发生器或者锁相环来产生方波或正玄波,由单片机来控制波形的输出,也可以实现音频通信,且十分灵活。但缺点是电路较复杂,且不同频率信号之间衔接不好掌握,用不好反而是麻烦。(相关手册在附件里)
% R$ ^: J$ O6 ^/ i2 ~0 sd) 在这里送上一种我个人认为比较好的方案:就是曼彻斯特编码加低通滤波器,由单片机输出曼彻斯特编码,再经由低通滤波器将方波滤成正弦波后输出。既解决了FSK、DTMF灵活性的问题,又解决了曼彻斯特编码方波稳定性、通用性的问题。在低通滤波器方面我个人采用的是“集成低通开关电容滤波器”,它成本虽然高一些,但好处也是明显的,电路简单,使用方便,且占用的空间亦很小。(相关手册在附件里)
7 M7 E) w  r. S3 E& E2、手机→设备:
/ z7 L7 q; ^, Z2 U" Sa) 放大电路方式:将手机输出信号经放大电路放大到合适的幅值,然后有锁相环或者结成FSK、DTMF芯片进行解析。该中方式难度最大,需要非常强的模拟电路功底,我个人水平有限,故采用的另一种方式。4 A4 f# Y# s( h) D
b) 电压比较器方式:将手机输出的交流信号经电路强行拉到Vcc/2级别,然后加到电压比较器一端,另一段接比较电压Vcc/2,这样交流信号即被转化为TTL方波信号,此时再进行解析就变得很简单了。/ i9 W- f7 G) ]
五、研发注意事项(通讯方案分析部分由于过长,放到最后来讲)
; P. K9 |' s8 L6 p* k1、一个好手机录音软件是必须的,最好能在手机上直接看到波形的。. |) o) A; A& b( l) E- A
2、建议用笔记本电脑进行开发,而非台式机。因为音频信号很小,容易受干扰,而台式机干扰较大,笔记本还有一个好处是必要时可将外接电源拔掉,用电池供电。
! ]# m' J3 c3 Z$ o3、一个好录音笔必不可少,有时需要得到纯净的音频信号,方便更加准确的分析。: L* r% H; B7 O3 s: \
4、做一个转接板,一边接音频母座,一边接音频公头,将MIC、地、左、右声道4跟线用排阵引出,方便录音。: l. Y6 i: ^9 s; i8 O. I2 Y
5、做一个信号衰减电路,可将设备电路产生的信号衰减至音频接口能承受的范围内。前期调试时,我们可以用该电路将信号录进电脑进行信号分析。(推荐一个电脑音频信号分析软件:Goldwave)
8 D5 b6 D2 k: o: g0 p$ p5 H9 i) R6、录音用的音频线切记不要太长,不然会给你带来不少麻烦。最好自己做,用音频裸头、杜邦线、排阵即可制作,方便好用。( l1 i$ h4 }7 m% Z3 X" a- r
: r% h3 x. ~$ k6 g
曼彻斯特编码的编码解码函数如下:: F; H9 k* @7 F' v
  1. /**********************************************************************. R- w; `, u- Q
  2. 注释:编码函数都是采用定时器中断的形式,以曼彻斯特编码的窄沿作为定时器周期。
    3 M1 X& h* {) e8 e
  3. 发送的数据包括1个起始位、8个数据位、1个奇偶校验位、3个停止位。
    5 E. Q. ^% M- t2 p# P
  4. ***********************************************************************/4 {* k+ e  x+ G5 l  B
  5. static void VIC_VECT_Fucton_00(void)//发送编码数据中断函数( M( `$ ]* f8 e
  6. {
    6 y/ R, a# T2 m6 c/ ^! m
  7.         TIMER0IS =0x0;
    : i3 P2 D# v2 \! {7 ~. o4 V% Z" w
  8.         if((send_time%2==0) && (send_start==1))
    * s8 q5 X2 E1 H+ Q+ G' Q4 j
  9.         {  l/ J8 ?1 N5 L, y
  10.                 switch(FSK_txState)
    ( e' C& V0 f3 Z, z, V6 Y% }2 m
  11.         {
    7 D7 p! X+ R4 N$ H
  12.           case STARTBIT:4 J' d% ^/ J6 q" M
  13.                 if((GPIODATA&0x00000002)==0x00000000)//如果检测到数据发送管脚为零
    / u8 Q* Z2 Q( a
  14.                         send_time++;5 ~0 R$ z: U8 V9 e1 V6 [
  15.                         else* i9 `4 H- B- l! \: S4 ?* u
  16.                         {
    $ [+ y+ X( u3 g0 @0 b
  17.                                 currentSym=0;
    6 t( r1 A. S; D! ~* i
  18.                                 FSK_txState = BYTE;
    " ?8 |' v9 Z$ c1 ~1 w9 @
  19.                         }( ~4 x1 _8 X/ w
  20.                         break;
    9 e+ J" y9 C& M3 q) L8 ~% s- u
  21.           case BYTE:
    9 n) b9 G8 y% X; K- q
  22.             if(txBit < 8)0 q/ k, G% Q! V) \( a
  23.             {; g1 j% q2 c3 W. Q
  24.                     currentSym = (send_byte >> txBit) & 0x01;  |7 }/ _- ^2 f6 z% E: c
  25.                 txBit++;
    $ H3 |! _3 p# @0 P' E
  26.                 txParity += currentSym;                  //奇偶校验位
    3 q9 W  `% M# W' j2 _
  27.             } / y" `, v5 A/ `$ I. S; I! i
  28.                         else if (txBit == 8)
    ( y2 o' k' C  S( v8 E' y
  29.             {! O- N) q  L/ \/ w: \/ l4 g8 A
  30.                     currentSym = txParity & 0x01; //发送奇偶校验位! B8 c" L, T5 ~7 M1 X% J
  31.                 txBit++;! k) c6 N- X. _9 Z- r
  32.             }
    9 M+ S) M/ c- Z7 q; u; k
  33.                         else if(txBit>8 && txBit<12)6 L/ n! B( v: R: E
  34.             {
    2 U1 F/ h) F4 U) `9 g$ H# P
  35.                     // next bit is the stop bit
    4 N$ [! o3 H6 r, X* h( f* R
  36.                 currentSym = 1;                                  //发送停止位4 v/ s- [; t# }0 y) w
  37.                                 txBit++;& B& R* z0 M; I
  38.             }
    ! B+ }9 c2 h! z( e
  39.                         else if(txBit == 12)
      V4 t# ~" C- m: d
  40.                         FSK_txState = STOPBIT;        $ M6 r3 F6 N' s; N& {
  41.             break;
    6 @: d1 A4 n) C! U- Q: F
  42.           case STOPBIT :
    ' t& l$ S4 b( I; K) i
  43.             txBit=0;9 v0 j# @% f- S/ d/ k) t& v6 X! d
  44.                         FSK_txState=IDLE;
    ' X; l  f! F- q- ^! [" A
  45.                         send_start=0;: w" e0 S- M! Y- {
  46.                         txParity=0;# E6 n+ e0 g/ G
  47.                         send_byte=0;
    - y6 p9 c5 O* ^! h
  48.                         break;
    $ k/ G4 p/ t2 Z' B7 e) F
  49.                }
    9 `4 ^1 }, R4 O, N9 c- G
  50.                 if(lastSym!=currentSym), {! Y' p, W  J9 L- ~
  51.                 {
    5 h0 `6 K* M/ h
  52.                         timer1_num++;
    / B5 O3 [$ _8 Z( c9 d
  53.                         lastSym=currentSym;
    2 t/ o$ g  s8 `
  54.                 }
    ) {. L0 x. A# m$ Z/ ~
  55.         }
    7 U- q# C* y! c
  56.         if(timer1_num%2==0)
    ) Y" w' V' W7 Q* ^9 v
  57.         GPIODATA&=0xFFFFFFFD;//输出管脚复位
    8 Z- J0 `/ e3 A- F  l. |: G
  58.         else; w) ~( E+ L/ z1 V, {3 J
  59.         GPIODATA|=0x00000002;//输出管脚置位2 E' `2 t. ]3 l) ?4 C' F" J& R! J
  60. 6 Z0 G+ z, k( {# I% t) m! P
  61.         timer1_num++;//用来控制IO口的电平翻转- E- o. X2 @" T; @# f
  62.         send_time++;//用来控制发送的字节的每一位4 J" x6 `6 ?7 `& a
  63.         Delay++;//Delay就是延时函数% R  A7 i" }- S7 l
  64. }
    & M9 ^' n2 S& `, v; R
  65. /**********************************************************************% c1 B5 v1 P) B, a. O0 ?
  66. 注释:解码函数采用外部IO中断形式(上升沿或下降沿中断,即电平电平跳变中断),
    ! X6 @8 u  H  X. K! z
  67. 用一个定时器作为时钟,每次产生中断时便从定时器见时间值取出,并和上一次的
    2 N+ \  B. g. V( h4 R( H4 ]( \+ ]
  68. 记录做差求出时间间隔,以此来判断当前为宽沿还是窄沿。9 Z, S$ ]3 q* U" _0 G; O
  69. ***********************************************************************/
    ! a+ m3 y  \3 a$ ?1 c, z
  70. static void VIC_VECT_Fucton_04(void)//接受解码数据中断函数
    * o1 p! D3 G4 u  k7 `2 o. s
  71. {2 G: C+ S) S8 C" d; i
  72.         GPIOIC|=0x00000001;//清楚上一次中断内容
    $ |/ z: x) V+ n
  73.         RX_time=TIMER1VALUE;
    6 `  m( y# [* i' D
  74.         if(RX_lasttime>=RX_time)
    ! |9 e  p: p1 l. e* ^, v0 _) _6 s' ~9 X
  75.         RX_diff=RX_lasttime-RX_time;                  //lasttime初始值为0
      U' F) ?5 f; \+ y
  76.         else8 w( C# R. U+ ~+ r
  77.         RX_diff=65535-RX_time+RX_lasttime;' x# m( H% ~5 W
  78.         RX_lasttime=RX_time;        9 a: T. J$ s' h# O
  79.     switch(RX_state)                  //启动代码时state已经被配置为STARTBIT
    . ]0 `8 j& \5 [( [" t
  80.     {- F9 d  m1 v1 U# m6 O; x6 m4 Z
  81.           case STARTBIT_FALL:
    * A0 z% L9 e) N# L+ y  ^
  82.             if ((SHORTINTERVAL<RX_diff) && (RX_diff<LONGINTERVAL))
      A+ W$ B. l' J$ G6 a9 G& D
  83.         {4 w* \4 z8 m: O+ d. G7 P  A2 s7 X
  84.                 if(RX_ones<5)           //ones初始值为0! i8 f( f8 B. c2 T: N/ Z; ~" V1 l
  85.             {3 y9 A  `- a$ a% @8 a+ z- i# A
  86.                     RX_ones = 0;' d/ T% }, Z: A/ M0 O- F
  87.             }
    - f  N/ N: ^6 e6 s- e
  88.                         else 4 R4 R  [4 `9 i7 T" ]' ?4 S7 s
  89.                         {
    9 w, L2 U; d2 ~
  90.                                 RX_state = DECODE;        //将状态配置为解码6 L6 H9 U5 r7 ^
  91.             }
    9 _1 j$ f; C  |2 }
  92.         }
    % e4 r+ x! z. B
  93.         else if(RX_diff < SHORTINTERVAL)
    ; N' A" w; W$ I! K0 k; t  X" I
  94.         RX_ones++;
    ; ?$ G9 X) @) ^5 ^4 b/ E: r
  95.                 else
    ) a! P3 X; ]+ i- V
  96.                 RX_ones=0;
    8 `; Q" X5 O, m2 R8 P0 J/ d% d
  97.         break;
    ( |- [; f& Z: [0 O
  98.       case DECODE:& _$ U" s, v  B: b1 A5 k
  99.               /**************通过间隔长短来判定数据**************/
    6 ?6 p, N- j* E/ U
  100.                 if ((SHORTINTERVAL<RX_diff) && (RX_diff<LONGINTERVAL))// 若间距在范围内则当前数据位值和前一个相反, `) j' H; |% s! i& O
  101.         {                                                0 l$ U- O. @7 f. b3 P% Q$ T$ g
  102.                         currentbit=(currentbit+1)&0x01;' j$ l$ d5 R) @- w& B4 p  l
  103.                         RX_times+=2;
    $ b# M8 |+ M4 z3 y! r( w3 l
  104.         }% Z, Q5 o; Q; K% [$ ]; R, B# d$ u
  105.         else if( RX_diff < SHORTINTERVAL)                                         / p* N  w. G& q, r. T
  106.         {6 m+ c- h' V4 s. [
  107.                         currentbit=currentbit;6 J6 F4 ^* C6 q
  108.                         RX_times++;
    6 X- D5 Z; Y4 C) ]4 e3 \- [# D" p
  109.                 }
    # V5 z/ f3 M. t
  110.         else) y6 x7 ^4 {7 ?% Z( B+ o
  111.                 RX_state = DATAINIT;                           ! J; d! ^; z4 O& t  o3 r
  112.   T5 B( @* K/ i3 H8 u. Y9 s* e$ \
  113.                 /****************接受数据位,从低位接起****************/
    ( k, B2 b# S" [, r, K4 [
  114.                 if(RX_times%2==0)% r( c: [- g/ y$ s+ o
  115.                 {
    / I$ U. {* i5 m: Y) C% F/ Y
  116.                         if(RX_bitcounter<8)
    2 {; O& N$ Z9 ?
  117.                         {+ Y3 H0 `& {! U$ C3 _
  118.                                 if (currentbit==1)
    ! ?. W9 U% |# q4 I2 r
  119.                             {
    % h* F( V/ y6 i) @
  120.                                       uartByteRx = (uartByteRx >> 1) + (1<<7);
    ) A7 y( }; n( T, W. V( r) E
  121.                                         rxParity++;                                                //奇偶校验位8 u- V8 f  d" E8 B
  122.                                         RX_bitcounter++;                                //接受数据位数
    8 y7 c9 ?* L2 x. Q" O
  123.                             }- \3 }' j& I/ O$ q' Q
  124.                             else6 L1 r. R8 C9 b5 w% S( k" B4 s
  125.                             {
    ! ]% D4 @; h% ?9 L  N# @
  126.                                         uartByteRx = (uartByteRx >> 1);
    6 ^6 a* T( L! D* H8 M7 h& r" I
  127.                                         RX_bitcounter++;0 R8 {' m3 b& M8 I5 C1 [  T% K5 F
  128.                             }: m# S8 t: d, Q, y7 t6 i/ S0 Z
  129.                         }
    & U3 L( p1 S8 w
  130.                         else
    ( p2 P5 E+ j5 T+ X
  131.                         {$ ?# @# D' u& q
  132.                                 rxParity&=0x01;                                                 //进行奇偶校验) P, j! a9 M1 ?2 Y
  133.                                 if(rxParity==currentbit)6 R" J4 ]7 d2 Y# U/ M- h, b1 g
  134.                                 {
    1 R" ^+ x( \) c: S6 V
  135.                                         RX_bitcounter++;
      `5 X  f' l* k
  136.                                         RX_finish=1;
    - V0 ?. V8 q& Y" M4 Z  \9 [
  137.                                         RX_state=DATAINIT;5 l3 F3 ]+ K- g$ m4 r) C
  138.                                 }
    7 P2 H% V5 b# X& n) F
  139.                                 else
    3 o* `' ~+ u5 \
  140.                                 RX_state=DATAINIT;                                         //若奇偶校验错误则,重新检测( s; i! k2 e' J$ W; y. }& a+ X
  141.                         }, f' Q  i8 y* N, z! F: u0 v/ O
  142.                 }/ N( p' a9 F7 n7 M- P. @
  143.                 break;
    ' J$ j" N! R$ w+ U& o9 A
  144.       case DATAINIT :                                                                 //初始化参数状态
    ) V9 A8 T; f) g, A
  145.                 RX_bitcounter=0;. \7 Q4 T" ]$ I; @
  146.                 RX_ones=0;& K, S; r' i! W7 m# [
  147.                 rxParity=0;0 x; u+ g4 p& }, l6 ~  g
  148.                 currentbit=0;
    ! n5 X, _6 O, E4 ?
  149.                 RX_state=STARTBIT_FALL;& r6 i2 w$ @. K
  150.                 RX_times=0;! J! b. x9 Y, R  l4 i. a6 C& g
  151.                 break;
      @4 I1 z6 l9 S9 I' ~  H
  152.       default:
    , k# ^- g% h" F, M* G" Z
  153.         break;
    ' {- Q" p* m; ~: p! {( P
  154.     }) E+ X& ?2 k! e- e+ N
  155. }
复制代码
6 T6 n2 J2 ~, U
7 F9 e/ x0 t- p, r

FSK、DTMF通信类.zip

4.56 MB, 下载次数: 0, 下载积分: 威望 -5

方波信号发生器.zip

1.05 MB, 下载次数: 0, 下载积分: 威望 -5

开关电容滤波器.zip

1.15 MB, 下载次数: 0, 下载积分: 威望 -5

耦合电感.zip

2.24 MB, 下载次数: 0, 下载积分: 威望 -5

锁相环及信号发生.zip

4.05 MB, 下载次数: 0, 下载积分: 威望 -5

  • TA的每日心情
    开心
    2022-12-5 15:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2021-6-10 08:56 | 只看该作者
    这个好,都是经验之谈
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-18 17:32 , Processed in 0.125000 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表