新用户注册恢复喜悦村十周年
乱讲啦,通过网关是:

用户发送短信到SP的端口,先通过用户所在地的SMC,然后SP对短信作相应的业务处理后(如天气预报信息捆绑),发送CMPP_Submit信号给ISMG互联网短消息网关,再由ISMG寻址到短信的接受方所在地的SMC,发送后返回状态,SP可通过CMPP_Query信号查询短信状态。

没见过SP还用手机发送的。还是前辈说得对,SP通过英斯克这样的网关接口,实现控制层的功能,然后自己做一点应用层的东西(捞钱的地方)。至少目前敢肯定,应用层PHP没问题。控制层PHP是否能够介入,或者说有没有必要介入,看看先。
不删光,藐视你
实用的AT指令
  单片机和GSM引擎之间采用AT指令实现互相之间的通信,因此有必要了解一下AT指令的格式和几条常用的指令。更详细的资料可以参考GSM07.05和GSM07.07规范。
  单片机发出的AT指令用来建立通信链路,AT指令集的命令格式帧都以AT开头,下面是几个常用的AT指令。
1.设置短消息中心
AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。)
2.接收短消息
+CMTI:“SM”,X   (X表示接收短消息的SIM卡存储号码)
AT+CMGR=X回车  (从X存储区读短消息)
AT+CMGD=X回车  (从X存储区删除短消息)
3.发送短消息
AT+CMGF=1回车(采用文本格式发送,如用PDU格式,则AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”回车
>输入短消息。Crtl+Z结束并发送。
4.重要的指令
ATZ;E 回车        Echo OFF
ATZ;E1回车       Echo ON
AT+CREG?回车  回答x(X=2脱网,X=1注册,X=0状态不明)
AT+COPS?回车 表示SIM卡是否被网络接受
一、        一般命令
1、        AT+CGMI 给出模块厂商的标识。
2、        AT+CGMM 获得模块标识。这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900)。当模块有多频带时,回应可能是不同频带的结合。
3、        AT+CGMR 获得改订的软件版本。
4、        AT+CGSN 获得GSM模块的IMEI(国际移动设备标识)序列号。
5、        AT+CSCS 选择TE特征设定。这个命令报告TE用的是哪个状态设定上的ME。ME于是可以转换每一个输入的或显示的字母。这个是用来发送、读取或者撰写短信。
6、        AT+WPCS 设定电话簿状态。这个特殊的命令报告通过TE电话簿所用的状态的ME。ME于是可以转换每一个输入的或者显示的字符串字母。这个用来读或者写电话簿的入口。
7、        AT+CIMI 获得IMSI。这命令用来读取或者识别SIM卡的IMSI(国际移动签署者标识)。在读取IMSI之前应该先输入PIN(如果需要PIN的话)。
8、        AT+CCID 获得SIM卡的标识。这个命令使模块读取SIM卡上的EF-CCID文件。
9、        AT+GCAP 获得能力表。(支持的功能)
10、        A/ 重复上次命令。只有A/命令不能重复。这命令重复前一个执行的命令。
11、        AT+CPOF 关机。这个特殊的命令停止GSM软件堆栈和硬件层。命令AT+CFUN=0的功能与+CPOF相同。
12、        AT+CFUN 设定电话机能。这个命令选择移动站点的机能水平。
13、        AT+CPAS 返回移动设备的活动状态。
14、        AT+CMEE 报告移动设备的错误。这个命令决定允许或不允许用结果码“+CME ERROR:<xxx>”或者“+CMS ERROR:<xxx>”代替简单的“ERROR”。
15、        AT+CKPD 小键盘控制。仿真ME小键盘执行命令。
16、        AT+CCLK 时钟管理。这个命令用来设置或者获得ME真实时钟的当前日期和时间。
17、        AT+CALA 警报管理。这个命令用来设定在ME中的警报日期/时间。(闹铃)
18、        AT+CRMP 铃声旋律播放。这个命令在模块的蜂鸣器上播放一段旋律。有两种旋律可用:到来语音、数据或传真呼叫旋律和到来短信声音。
19、        AT+CRSL 设定或获得到来的电话铃声的声音级别。
二、        呼叫控制命令
1、        ATD 拨号命令。这个命令用来设置通话、数据或传真呼叫。
2、        ATH 挂机命令。
3、        ATA 接电话。
4、        AT+CEER 扩展错误报告。这个命令给出当上一次通话设置失败后中断通话的原因。
5、        AT+VTD 给用户提供应用GSM网络发送DTMF(双音多频)双音频。这个命令用来定义双音频的长度(默认值是300毫秒)。
6、        AT+VTS 给用户提供应用GSM网络发送DTMF双音频。这个命令允许传送双音频。
7、        ATDL 重拨上次电话号码。
8、        AT%Dn 数据终端就绪(DTR)时自动拨号。
9、        ATS0 自动应答。
10、        AT+CICB 来电信差。
11、        AT+CSNS 单一编号方案。
12、        AT+VGR,AT+VGT 增益控制。这个命令应用于调节喇叭的接收增益和麦克风的传输增益。
13、        AT+CMUT 麦克风静音控制。
14、        AT+SPEAKER 喇叭/麦克风选择。这个特殊命令用来选择喇叭和麦克风。
15、        AT+ECHO 回音取消。
16、        AT+SIDET 侧音修正。
17、        AT+VIP 初始化声音参数。
18、        AT+DUI 用附加的用户信息拨号。
19、        AT+HUI 用附加的用户信息挂机。
20、        AT+RUI 接收附加用户信息。
三、        网络服务命令
1、        AT+CSQ 信号质量。
2、        AT+COPS 服务商选择。
3、        AT+CREG 网络注册。获得手机的注册状态。
4、        AT+WOPN 读取操作员名字。
5、        AT+CPOL 优先操作员列表。
四、        安全命令
1、        AT+CPIN 输入PIN。
2、        AT+CPIN2 输入PIN2。
3、        AT+CPINC PIN的剩余的尝试号码。
4、        AT+CLCK 设备锁。
5、        AT+CPWD 改变密码。
五、        电话簿命令
1、        AT+CPBS 选择电话簿记忆存储。
2、        AT+CPBR 读取电话簿表目。
3、        AT+CPBF 查找电话簿表目。
4、        AT+CPBW 写电话簿表目。
5、        AT+CPBP 电话簿电话查询。
6、        AT+CPBN 电话簿移动动作。这个特殊命令使电话簿中的条目前移或后移(按字母顺序)
7、        AT+CNUM 签署者号码。
8、        AT+WAIP 防止在下一次重起时初始化所有的电话簿。
9、        AT+WDCP 删除呼叫电话号码。
10、        AT+CSVM 设置语音邮件号码。
六、        短消息命令
1、        AT+CSMS 选择消息服务。支持的服务有GSM-MO、SMS-MT、SMS-CB。
2、        AT+CNMA 新信息确认应答。
3、        AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。
4、        AT+CMGF 优先信息格式。执行格式有TEXT方式和PDU方式。
5、        AT+CSAS 保存设置。保存+CSAS和+CSMP的参数。
6、        AT+CRES 恢复设置。
7、        AT+CSDH 显示文本方式的参数。
8、        AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。
9、        AT+CMGR 读短信。信息从+CPMS命令设定的存储器读取。
10、        AT+CMGL 列出存储的信息。
11、        AT+CMGS 发送信息。
12、        AT+CMGW 写短信息并存储。
13、        AT+CMSS 从存储器中发送信息。
14、        AT+CSMP 设置文本模式的参数。
15、        AT+CMGD 删除短信息。删除一个或多个短信息。
16、        AT+CSCA 短信服务中心地址。
17、        AT+CSCB 选择单元广播信息类型。
18、        AT+WCBM 单元广播信息标识。
19、        AT+WMSC 信息状态(是否读过、是否发送等等)修正。
20、        AT+WMGO 信息覆盖写入。
21、        AT+WUSS 不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
七、        追加服务命令
1、        AT+CCFC 呼叫继续。
2、        AT+CLCK 呼叫禁止。
3、        AT+CPWD 改变追加服务密码。
4、        AT+CCWA 呼叫等待。
5、        AT+CLIR 呼叫线确认限制。
6、        AT+CLIP 呼叫线确认陈述。
7、        AT+COLP 联络线确认陈述。
8、        AT+CAOC 费用报告。
9、        AT+CACM 累计呼叫计量。
10、        AT+CAMM 累计呼叫计量最大值。
11、        AT+CPUC 单价和货币表。
12、        AT+CHLD 呼叫相关的追加服务。
13、        AT+CLCC 列出当前的呼叫。
14、        AT+CSSN 追加服务通知。
15、        AT+CUSD 无组织的追加服务数据。
16、        AT+CCUG 关闭的用户组。
八、        数据命令
1、        AT+CBST 信差类型选择。
2、        AT+FCLASS 选择模式。这个命令把模块设置成数据或传真操作的特殊模式。
3、        AT+CR 服务报告控制。这个命令允许更为详细的服务报告。
4、        AT+CRC 划分的结果代码。这个命令在呼叫到来时允许更为详细的铃声指示。
5、        AT+ILRR 本地DTE-DCE速率报告。
6、        AT+CRLP 无线电通信线路协议参数。
7、        AT+DOPT 其他无线电通信线路参数。
8、        AT%C 数据压缩选择。
9、        AT+DS 是否允许V42二度数据压缩。
10、        AT+DR 是否报告V42二度数据压缩。
11、        AT\N 数据纠错选择。
九、        传真命令
1、        AT+FTM 传送速率。
2、        AT+FRM 接收速率
3、        AT+FTH 用HDLC协议设置传真传送速率。
4、        AT+FRH 用HDLC协议设置传真接收速率。
5、        AT+FTS 停止特定时期的传送并等待。
6、        AT+FRS 接收沉默。
十、        第二类传真命令
1、        AT+FDT 传送数据。
2、        AT+FDR 接收数据。
3、        AT+FET 传送页标点。
4、        AT+FPTS 页转换状态参数。
5、        AT+FK 终止会议。
6、        AT+FBOR 页转换字节顺序。
7、        AT+FBUF 缓冲大小报告。
8、        AT+FCQ 控制拷贝质量检验。
9、        AT+FCR 控制接收传真的能力。
10、        AT+FDIS 当前会议参数。
11、        AT+FDCC 设置DCE功能参数。
12、        AT+FLID 定义本地ID串。
13、        AT+FPHCTO 页转换超时参数。
十一、V24-V25命令
1、        AT+IPR 确定DTE速率。
2、        AT+ICF 确定DTE-DCE特征结构。
3、        AT+IFC 控制DTE-DCE本地流量。
4、        AT&C 设置DCD(数据携带检测)信号。
5、        AT&D 设置DTR(数据终端就绪)信号。
6、        AT&S 设置DST(数据设置就绪)信号。
7、        ATO 回到联机模式。
8、        ATQ 决定手机是否发送结果代码。
9、        ATV 决定DCE响应格式。
10、        ATZ 恢复为缺省设置。
11、        AT&W 保存设置。
12、        AT&T 自动测试。
13、        ATE 决定是否回显字符。
14、        AT&F 回到出厂时的设定。
15、        AT&V 显示模块设置情况。
16、        ATI 要求确认信息。这命令使GSM模块传送一行或多行特定的信息文字。
17、        AT+WMUX 数据/命令多路复用。
十二、特殊AT命令
1、        AT+CCED 电池环境描述。
2、        AT+CCED 自动RxLev指示。
3、        AT+WIND 一般指示。
4、        AT+ALEA 在ME和MSC之间的数据密码模式。
5、        AT+CRYPT 数据密码模式。
6、        AT+EXPKEY 键管理。
7、        AT+CPLMN 在PLMN上的信息。
8、        AT+ADC 模拟数字转换度量。
9、        AT+CMER 移动设备事件报告。这个命令决定是否允许在键按下时是否主动发送结果代码。
10、        AT+WLPR 读取语言偏好。
11、        AT+WLPW 写语言偏好。
12、        AT+WIOR 读取GPIO值。
13、        AT+WIOW 写GPIO值。
14、        AT+WIOM 输入/输出管理。
15、        AT+WAC 忽略命令。这个特殊命令允许忽略SMS、SS和可用的PLMN。
16、        AT+WTONE 播放旋律。
17、        AT+WDTMF 播放DTMF旋律。
18、        AT+WDWL 下载模式。
19、        AT+WVR 配置信差的声音速率。
20、        AT+WDR 配置数据速率。
21、        AT+WHWV 显示硬件的版本。
22、        AT+WDOP 显示产品的出厂日期。
23、        AT+WSVG 声音增益选择。
24、        AT+WSTR 返回指定状态的状态。
25、        AT+WSCAN 扫描。
26、        AT+WRIM 设置或返回铃声指示模式。
27、        AT+W32K 是否允许32kHz掉电方式。
28、        AT+WCDM 改变缺省旋律。
29、        AT+WSSW 显示内部软件版本。
30、        AT+WCCS 编辑或显示订制性质设置表。
31、        AT+WLCK 允许在特定的操作符上个性化ME。
32、        AT+CPHS 设置CPHS命令。
33、        AT+WBCM 电池充电管理。
34、        AT+WFM 特性管理。是否允许模块的某些特性,如带宽模式、SIM卡电压等。
35、        AT+WCFM 商业特性管理。是否允许Wavecom特殊特性。
36、        AT+WMIR 允许从当前存储的参数值创建定制的存储镜像。
37、        AT+WCDP 改变旋律的缺省播放器。
38、        AT+WMBN 设置SIM卡中的不同邮箱号码。
十三、SIM卡工具箱命令
1、        AT+STSF 配置工具箱实用程序。
2、        AT+STIN 工具箱指示。
3、        AT+STGI 获得从SIM卡发来的预期命令的信息。
4、        AT+STCR 主动提供的结果:工具箱控制反应。
5、        AT+STGR 给出响应。允许程序或用户从主菜单上选择项目,或响应某些命令。
感谢[B]Belltree前辈[/B][/COLOR],代码全部看完

自己明白,彻底的明白了。。。:crying: 有一点点失望,比我想象中的要简单得多;我深深的知道,原本小辈要花几周,甚至几个月才能弄懂的东西,之所以能够在短短的6个小时里全部搞清楚,完全归功[B]Belltree前辈[/B][/COLOR]的无私教导。。。好感动的说:crying:

从理论上讲,PHP完全可以实现,但是实际中效果怎么样,需要实践检验;不过说句老实话,我更愿意BEAN封装后,用PHP去调用。。。终于理解两位前辈的话了,“技术不复杂,关键是业务创新”。继续深入学习,如果有机会实践一下,酝酿得差不多后,再发帖子阐述全部过程。

阿水同志,不管你是不是金格的,我都要告诉你;你走错路了,SP是通过连接某个SOCKET,通过向这个SOCKET写入/读取信息,来实现和运营商信息的交互。链接的开始需要SP的业务代码和密码,相当于用户名和密码,通讯的过程仅限于应用层的交流。就有点像我么们拨号上网一样,上了网,就能发送电子邮件。

我发一个[B]CMPP_Connect[/B]给移动,告诉它我要联网,移动回我一个[B]CMPP_ConnectRep[/B]告诉我可以联网,我再发一个[B]CMPP_Submit[/B]给移动告诉它我要酱紫发短信,移动说知道了[B]CMPP_SubmitRep[/B]这样对吧,并且[B]CMPP_Deliver[/B]给我一个短信白条,但是我不放心啊,钱都花了,天知道发送成功没有,于是我发了个[B]CMPP_Query[/B]给移动,问问发送的情况,移动回你一个[B]CMPP_QueryRep[/B]安慰一下你,你坐看右看看不出问题,心里想还在网上挂着不要浪费钱了我还是先下吧,于是你[B]CMPP_Terminate[/B]给移动要求断网,移动小姐还是那种吃人不吐骨头的甜蜜声音,回个[B]CMPP_TerminateRep[/B]欢迎你下次再来。移动的老大看着不爽,说你丫的敢泡我移动的MM,以后你联网不要那么啰里啰唆输用户名密码趁机泡小姐了,给我包时间段/包月包年,你丫的只要联网,就记下你的IP,以后让小姐认IP不认人。SP也是在玩这样的游戏。。。就这么简单。。。好失望啊,SP原来这样的不值钱。

真不知道,会有多少短信高手在下面笑俺菜:blowzy: 。。。

再次感谢[B]Belltree前辈[/B][/COLOR],回去一定好好学习,天天上网。。。
不删光,藐视你
我也在看
在学习,
但我不能在六个小时内搞懂.
菜哪!!
还望开心果指点
我将改贴置顶,希望大家对短信有更多的认识,斑竹见谅
标题太牛了一点~    是不是该改改~  哈哈~
java的可不可以??
最初由 lingtoss 发布
[B]标题太牛了一点~    是不是该改改~  哈哈~ [/B]
:blowzy: ,不吊一点。。。点击率不够,很快就要沉底了

出此下策
不删光,藐视你
帮前辈贴出来,希望更多的人来看看,也不枉俺在村口吆喝了这么多天

mo方的主程序
  1. import cmpp12.*;
  2. import java.net.*;
  3. import java.io.*;
  4. public class testcomplexmo {

  5.   public static void main(String[] args) {
  6.          testcomplexmo atestprocesse=new testcomplexmo();
  7.   }

  8.   public testcomplexmo() {
  9.          Socket so=null;
  10.          OutputStream out=null;
  11.          InputStream input=null;
  12.          CMPP_Command command=null;
  13.          CMPP_Seq seq=new CMPP_Seq(212);
  14.            int error=0;
  15.       

  16.          try {
  17.              so=new Socket("192.168.1.62",700);
  18.              input=so.getInputStream();
  19.              out=so.getOutputStream();
  20.              command=new CMPP_Command();
  21.                                
  22.                         //CMPP_Connect
  23.                         CMPP_Connect con=new CMPP_Connect(seq.getGlobalSeq(), //设置sequenceid,
  24.                                 //可不用API提供的类CMPP_Seq所提供的方法,自己输入sequenceid
  25.                                 "xlmo",//CP_ID
  26.                                 "xl",//密码
  27.                                 0); //版本号一般填0
  28.                         error=con.write(out);//发送消息
  29.                         System.out.println("connect.error="+error);
  30.                         System.out.println();
  31.                                
  32.              boolean loop=true;

  33.              while (loop) {


  34.              CMPP_Command tmpCMD=command.read(input);//读消息

  35.              switch (command.getCommandID()) {
  36.                     //CMPP_Deliver
  37.                     case CMPP_Command.ID_CMPP_DELIVER :
  38.                          CMPP_Deliver deliver=(CMPP_Deliver)tmpCMD;//强制转换

  39.                          int result=deliver.readbody();//解包

  40.                          System.out.println("get cmpp deliver");
  41.                          System.out.println("total_length:"+deliver.getTotalLength());
  42.                          System.out.println("command_id:"+deliver.getCommandID());
  43.                          System.out.println("seq:"+deliver.getSequenceId());
  44.                          //get the information of header

  45.                          System.out.println("msg_id0:"+deliver.getMsgId0());
  46.                          System.out.println("msg_id1:"+deliver.getMsgId1());
  47.                          //MsgID is the message number.
  48.                          //it is int

  49.                          System.out.println("destination_id:"+deliver.getDestnationId());
  50.                          //the Destnation_id is SP MO phone number,
  51.                          //eg. "2000"
  52.                          // it is String

  53.                          System.out.println("service_id:"+deliver.getServiceId());
  54.                          //the Service_id is Service id
  55.                          //it is String

  56.                          System.out.println("tp_pid:"+deliver.getTP_pid());
  57.                          //TP_pid is GSM protocal type
  58.                          //it is int

  59.                          System.out.println("tp_udhi:"+deliver.getTP_udhi());
  60.                          //TP_udhi is GSM protocal type
  61.                          //it is int

  62.                          System.out.println("Msg_Fmt:"+deliver.getMsgFmt());
  63.                          //Msg_Fmt - the formate of this message
  64.                          //int

  65.                          System.out.println("usernumber(SrcTerminalId):"+deliver.getSrcTerminalId());
  66.                          //SrcTerminalId - the user's mobile number
  67.                          //String

  68.                          System.out.println("registered_deliver:"+deliver.getRegisteredDelivery());
  69.                          //Registered_Delivery specify if this MO message is a message Response
  70.                          //0 means not a Response message
  71.                          //1 means is a Response message
  72.                          //it is int

  73.                          System.out.println("msglen:"+deliver.getMsgLength());
  74.                          //MessageLength means the length of this message
  75.                          //it is int

  76.                          System.out.println("content:"+deliver.getMsgContent());
  77.                          //MessageContent - the content of this message
  78.                          //String

  79.                          System.out.println("msgid_submit0:"+deliver.getMsgId_Submit0());
  80.                          System.out.println("msgid_submit1:"+deliver.getMsgId_Submit1());
  81.                          //MsgID_Submit is the message number. the same as MsgID
  82.                          //it is int

  83.                          System.out.println("cmppstat:"+deliver.getStat());
  84.                          //Stat - Response result the meaning follows SMPP3.3 protocol
  85.                          //String

  86.                          System.out.println("submittime:"+deliver.getSubmitTime());
  87.                          //YYMMDDHHMM
  88.                          //String

  89.                          System.out.println("donttime:"+deliver.getDoneTime());
  90.                          //YYMMDDHHMM
  91.                          //String

  92.                          System.out.println("Dest_terminal_id:"+deliver.getDestnationId());
  93.                          //Dest_terminal_id - the user's mobile number who receive the message
  94.                          //String

  95.                          System.out.println("smscseq:"+deliver.getSMSCSequence());
  96.                          //the sequence number that the SMSC provides
  97.                          //int

  98.                     //CMPP_DeliverRep
  99.                          CMPP_DeliverRep deliverRep=
  100.                                          new CMPP_DeliverRep(deliver.getSequenceId(),//SequenceId
  101.                                                             deliver.getMsgId0(),//MsgId,要求和收到的deliver一致
  102.                                                             deliver.getMsgId1(),//MsgId,要求和收到的deliver一致
  103.                                                             55);//Result
  104.                                          //new CMPP_DeliverRep(deliver.getSequenceId(),
  105.                                              //deliver.getMsgId0(),deliver.getMsgId1(),result);
  106.                          deliverRep.write(out);//发送消息

  107.                          System.out.println("deliver responce have send out!");
  108.                          System.out.println();
  109.                          System.out.println("-------------------------------");
  110.                     break;

  111.                     //CMPP_Terminate
  112.                     case CMPP_Command.ID_CMPP_TERMINATE :
  113.                         CMPP_Terminate terminate=(CMPP_Terminate)tmpCMD;//强制转换
  114.                         System.out.println("get cmpp terminate");
  115.                         System.out.println("total_length:"+terminate.getTotalLength());
  116.                         System.out.println("command_id:"+terminate.getCommandID());
  117.                         System.out.println("seq:"+terminate.getSequenceId());

  118.                     //CMPP_TerminateRep
  119.                          CMPP_TerminateRep terminateRep=
  120.                                          new CMPP_TerminateRep(terminate.getSequenceId());//SequenceId
  121.                          terminateRep.write(out);//发送消息
  122.                          System.out.println("termination responce have send out!");
  123.                          System.out.println();
  124.                          System.out.println("--------------------------------");
  125.                          loop=false;
  126.                     break;

  127.                     //CMPP_ActiveTest
  128.                     case CMPP_Command.ID_CMPP_ACTIVE_TEST :
  129.                         CMPP_ActiveTest activetest=(CMPP_ActiveTest)tmpCMD;//强制转换
  130.                         System.out.println("get active test");
  131.                         System.out.println("total_length:"+activetest.getTotalLength());
  132.                         System.out.println("command_id:"+activetest.getCommandID());
  133.                         System.out.println("seq:"+activetest.getSequenceId());

  134.                     //CMPP_ActiveTestRep
  135.                          CMPP_ActiveTestRep activetestRep=
  136.                                          new CMPP_ActiveTestRep(activetest.getSequenceId());//SequenceId
  137.                          activetestRep.write(out);//发送消息

  138.                          System.out.println("active test responce have send out!");
  139.                          System.out.println();
  140.                          System.out.println("--------------------------------");


  141.                     break;

  142.              }
  143.              }
  144.          } catch (Exception e) {
  145.                  System.out.println(e.toString());
  146.          } finally {
  147.                    try {
  148.                        System.out.println("the end of motest");
  149.                        System.in.read();
  150.                        //it just for debug
  151.                    } catch (Exception s) {
  152.                            System.out.println(s.toString());
  153.                    }
  154.          }

  155.   }

  156. }
复制代码
不删光,藐视你