LM005A Lora Module test
Dependents: LoRaTest OnenetTest
BC95B/BC95B.cpp@1:0cad46274201, 2018-07-31 (annotated)
- Committer:
- yao6116601
- Date:
- Tue Jul 31 02:55:28 2018 +0000
- Revision:
- 1:0cad46274201
BC95B -- For China Mobile oneNet IoT
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yao6116601 | 1:0cad46274201 | 1 | /* BC95B oneNet Application |
yao6116601 | 1:0cad46274201 | 2 | * reference document:Quectel_BC95_OneNET_Application_Note_V1.2.pdf |
yao6116601 | 1:0cad46274201 | 3 | * By modular-2 team 2018/7/26 |
yao6116601 | 1:0cad46274201 | 4 | */ |
yao6116601 | 1:0cad46274201 | 5 | |
yao6116601 | 1:0cad46274201 | 6 | #include "BC95B.h" |
yao6116601 | 1:0cad46274201 | 7 | |
yao6116601 | 1:0cad46274201 | 8 | #define BC95B_DEFAULT_BAUD_RATE 9600 |
yao6116601 | 1:0cad46274201 | 9 | #define READ 0 |
yao6116601 | 1:0cad46274201 | 10 | #define WRITE 1 |
yao6116601 | 1:0cad46274201 | 11 | #define DISCOVER 2 |
yao6116601 | 1:0cad46274201 | 12 | BC95B::BC95B(PinName tx, PinName rx, bool debug) |
yao6116601 | 1:0cad46274201 | 13 | : _serial(tx, rx, BC95B_DEFAULT_BAUD_RATE), |
yao6116601 | 1:0cad46274201 | 14 | _parser(&_serial), |
yao6116601 | 1:0cad46274201 | 15 | _fail(false) |
yao6116601 | 1:0cad46274201 | 16 | { |
yao6116601 | 1:0cad46274201 | 17 | _serial.set_baud( BC95B_DEFAULT_BAUD_RATE ); |
yao6116601 | 1:0cad46274201 | 18 | _parser.debug_on(debug); |
yao6116601 | 1:0cad46274201 | 19 | _parser.set_delimiter("\r\n"); |
yao6116601 | 1:0cad46274201 | 20 | _parser.oob("+MIPLWRITE:", callback(this, &BC95B::_write_handler)); |
yao6116601 | 1:0cad46274201 | 21 | _parser.oob("+MIPLREAD:", callback(this, &BC95B::_read_handler)); |
yao6116601 | 1:0cad46274201 | 22 | _parser.oob("+MIPLOBSERVE:", callback(this, &BC95B::_obs_handler)); |
yao6116601 | 1:0cad46274201 | 23 | _parser.oob("+MIPLDISCOVER:", callback(this, &BC95B::_discover_handler)); |
yao6116601 | 1:0cad46274201 | 24 | } |
yao6116601 | 1:0cad46274201 | 25 | |
yao6116601 | 1:0cad46274201 | 26 | const char * BC95B::get_firmware_version() |
yao6116601 | 1:0cad46274201 | 27 | { |
yao6116601 | 1:0cad46274201 | 28 | if (!(_parser.send("AT+MIPLVER?") |
yao6116601 | 1:0cad46274201 | 29 | && _parser.recv("+MIPLVER:%s\n",buffer) |
yao6116601 | 1:0cad46274201 | 30 | && _parser.recv("OK"))) { |
yao6116601 | 1:0cad46274201 | 31 | return NULL; |
yao6116601 | 1:0cad46274201 | 32 | } |
yao6116601 | 1:0cad46274201 | 33 | return buffer; |
yao6116601 | 1:0cad46274201 | 34 | |
yao6116601 | 1:0cad46274201 | 35 | } |
yao6116601 | 1:0cad46274201 | 36 | const char * BC95B::get_imei() |
yao6116601 | 1:0cad46274201 | 37 | { |
yao6116601 | 1:0cad46274201 | 38 | if (!(_parser.send("AT+CGSN=1") |
yao6116601 | 1:0cad46274201 | 39 | && _parser.recv("+CGSN:%s\n",buffer) |
yao6116601 | 1:0cad46274201 | 40 | && _parser.recv("OK"))) { |
yao6116601 | 1:0cad46274201 | 41 | return NULL; |
yao6116601 | 1:0cad46274201 | 42 | } |
yao6116601 | 1:0cad46274201 | 43 | return buffer; |
yao6116601 | 1:0cad46274201 | 44 | |
yao6116601 | 1:0cad46274201 | 45 | } |
yao6116601 | 1:0cad46274201 | 46 | const char * BC95B::get_imsi() |
yao6116601 | 1:0cad46274201 | 47 | { |
yao6116601 | 1:0cad46274201 | 48 | if (!(_parser.send("AT+CIMI") |
yao6116601 | 1:0cad46274201 | 49 | && _parser.recv("%s\n",buffer) |
yao6116601 | 1:0cad46274201 | 50 | && _parser.recv("OK"))) { |
yao6116601 | 1:0cad46274201 | 51 | return NULL; |
yao6116601 | 1:0cad46274201 | 52 | } |
yao6116601 | 1:0cad46274201 | 53 | return buffer; |
yao6116601 | 1:0cad46274201 | 54 | |
yao6116601 | 1:0cad46274201 | 55 | } |
yao6116601 | 1:0cad46274201 | 56 | bool BC95B::get_SignalStrength(int* rssi,int* ber) |
yao6116601 | 1:0cad46274201 | 57 | { |
yao6116601 | 1:0cad46274201 | 58 | if (!(_parser.send("AT+CSQ") |
yao6116601 | 1:0cad46274201 | 59 | && _parser.recv("+CSQ:%d,%d\n",rssi,ber) |
yao6116601 | 1:0cad46274201 | 60 | && _parser.recv("OK"))) { |
yao6116601 | 1:0cad46274201 | 61 | return false; |
yao6116601 | 1:0cad46274201 | 62 | } |
yao6116601 | 1:0cad46274201 | 63 | return true; |
yao6116601 | 1:0cad46274201 | 64 | |
yao6116601 | 1:0cad46274201 | 65 | } |
yao6116601 | 1:0cad46274201 | 66 | int BC95B::create_suite() |
yao6116601 | 1:0cad46274201 | 67 | { int result; |
yao6116601 | 1:0cad46274201 | 68 | if (!(_parser.send("AT+MIPLCREATE") |
yao6116601 | 1:0cad46274201 | 69 | && _parser.recv("+MIPLCREATE:%d",&result) |
yao6116601 | 1:0cad46274201 | 70 | && _parser.recv("OK"))) { |
yao6116601 | 1:0cad46274201 | 71 | return -1; |
yao6116601 | 1:0cad46274201 | 72 | } |
yao6116601 | 1:0cad46274201 | 73 | return result; |
yao6116601 | 1:0cad46274201 | 74 | |
yao6116601 | 1:0cad46274201 | 75 | } |
yao6116601 | 1:0cad46274201 | 76 | bool BC95B::create_object(int ch,const int name,int insCount,const char * bitmap,int attrCount,int actCount) |
yao6116601 | 1:0cad46274201 | 77 | { |
yao6116601 | 1:0cad46274201 | 78 | |
yao6116601 | 1:0cad46274201 | 79 | if (!(_parser.send("AT+MIPLADDOBJ=%d,%d,%d,\"%s\",%d,%d",ch,name,insCount,bitmap,attrCount,actCount) |
yao6116601 | 1:0cad46274201 | 80 | && _parser.recv("OK"))) { |
yao6116601 | 1:0cad46274201 | 81 | return false; |
yao6116601 | 1:0cad46274201 | 82 | } |
yao6116601 | 1:0cad46274201 | 83 | return true; |
yao6116601 | 1:0cad46274201 | 84 | } |
yao6116601 | 1:0cad46274201 | 85 | bool BC95B::register_request(int ref,int lifetime,int timeout) |
yao6116601 | 1:0cad46274201 | 86 | { |
yao6116601 | 1:0cad46274201 | 87 | if (!(_parser.send("AT+MIPLOPEN=%d,%d,%d",ref,lifetime,timeout) |
yao6116601 | 1:0cad46274201 | 88 | && _parser.recv("OK") |
yao6116601 | 1:0cad46274201 | 89 | && _parser.recv("+MIPLEVENT: 0,1") |
yao6116601 | 1:0cad46274201 | 90 | && _parser.recv("+MIPLEVENT: 0,2") |
yao6116601 | 1:0cad46274201 | 91 | && _parser.recv("+MIPLEVENT: 0,4") |
yao6116601 | 1:0cad46274201 | 92 | && _parser.recv("+MIPLEVENT: 0,6"))) |
yao6116601 | 1:0cad46274201 | 93 | { |
yao6116601 | 1:0cad46274201 | 94 | return false; |
yao6116601 | 1:0cad46274201 | 95 | } |
yao6116601 | 1:0cad46274201 | 96 | return true; |
yao6116601 | 1:0cad46274201 | 97 | } |
yao6116601 | 1:0cad46274201 | 98 | /*bool BC95B::respond_discover(int ref,int result ,int length,char *valuestring) |
yao6116601 | 1:0cad46274201 | 99 | { |
yao6116601 | 1:0cad46274201 | 100 | if (!(_parser.send("AT+MIPLDISCOVERRSP=%d,%s,%d,%d,%S",ref,msg,result,length,valuestring) |
yao6116601 | 1:0cad46274201 | 101 | && _parser.recv("OK"))){ |
yao6116601 | 1:0cad46274201 | 102 | return false; |
yao6116601 | 1:0cad46274201 | 103 | } |
yao6116601 | 1:0cad46274201 | 104 | return true; |
yao6116601 | 1:0cad46274201 | 105 | } */ |
yao6116601 | 1:0cad46274201 | 106 | bool BC95B::delete_object(int ref,const char * objid) |
yao6116601 | 1:0cad46274201 | 107 | { |
yao6116601 | 1:0cad46274201 | 108 | if (!(_parser.send("AT+MIPLDELOBJ=%d,%s",ref,objid) |
yao6116601 | 1:0cad46274201 | 109 | && _parser.recv("OK"))){ |
yao6116601 | 1:0cad46274201 | 110 | return false; |
yao6116601 | 1:0cad46274201 | 111 | } |
yao6116601 | 1:0cad46274201 | 112 | return true; |
yao6116601 | 1:0cad46274201 | 113 | } |
yao6116601 | 1:0cad46274201 | 114 | bool BC95B::deregister(int ref) |
yao6116601 | 1:0cad46274201 | 115 | { |
yao6116601 | 1:0cad46274201 | 116 | if (!(_parser.send("AT+MIPLCLOSE=%d",ref) |
yao6116601 | 1:0cad46274201 | 117 | && _parser.recv("OK"))){ |
yao6116601 | 1:0cad46274201 | 118 | return false; |
yao6116601 | 1:0cad46274201 | 119 | } |
yao6116601 | 1:0cad46274201 | 120 | return true; |
yao6116601 | 1:0cad46274201 | 121 | } |
yao6116601 | 1:0cad46274201 | 122 | bool BC95B::notify_resource(int ref,int objid,int ins,int resid,int valueType,int len,const char * value,int index,int flg) |
yao6116601 | 1:0cad46274201 | 123 | { |
yao6116601 | 1:0cad46274201 | 124 | if (!(_parser.send("AT+MIPLNOTIFY=%d,%d,%d,%d,%d,%d,%d,%s,%d,%d", ref,obsmsg,objid,ins,resid,valueType,len,value,index,flg) |
yao6116601 | 1:0cad46274201 | 125 | && _parser.recv("OK"))){ |
yao6116601 | 1:0cad46274201 | 126 | return false; |
yao6116601 | 1:0cad46274201 | 127 | } |
yao6116601 | 1:0cad46274201 | 128 | return true; |
yao6116601 | 1:0cad46274201 | 129 | } |
yao6116601 | 1:0cad46274201 | 130 | |
yao6116601 | 1:0cad46274201 | 131 | bool BC95B::init(void) |
yao6116601 | 1:0cad46274201 | 132 | { |
yao6116601 | 1:0cad46274201 | 133 | if (!_parser.recv("Bootup Completed!!!")) |
yao6116601 | 1:0cad46274201 | 134 | return false; |
yao6116601 | 1:0cad46274201 | 135 | return true; |
yao6116601 | 1:0cad46274201 | 136 | } |
yao6116601 | 1:0cad46274201 | 137 | bool BC95B::reset(void) |
yao6116601 | 1:0cad46274201 | 138 | { |
yao6116601 | 1:0cad46274201 | 139 | if (!(_parser.send("AT+NRB") |
yao6116601 | 1:0cad46274201 | 140 | &&_parser.recv("REBOOTING"))) { |
yao6116601 | 1:0cad46274201 | 141 | return false; |
yao6116601 | 1:0cad46274201 | 142 | } |
yao6116601 | 1:0cad46274201 | 143 | return true; |
yao6116601 | 1:0cad46274201 | 144 | } |
yao6116601 | 1:0cad46274201 | 145 | |
yao6116601 | 1:0cad46274201 | 146 | |
yao6116601 | 1:0cad46274201 | 147 | |
yao6116601 | 1:0cad46274201 | 148 | |
yao6116601 | 1:0cad46274201 | 149 | /* |
yao6116601 | 1:0cad46274201 | 150 | +MIPLWRITE--平台下发的写指令 |
yao6116601 | 1:0cad46274201 | 151 | +MIPLWRITE: <ref>,<msgId>,<objI d>,<insId>,<resId>,<valueType>,<len>,<value>,<flag>,<index> |
yao6116601 | 1:0cad46274201 | 152 | response: |
yao6116601 | 1:0cad46274201 | 153 | AT+MIPLWRITERSP=<ref>,<msgId>,< result> |
yao6116601 | 1:0cad46274201 | 154 | */ |
yao6116601 | 1:0cad46274201 | 155 | |
yao6116601 | 1:0cad46274201 | 156 | |
yao6116601 | 1:0cad46274201 | 157 | void BC95B::_write_handler() |
yao6116601 | 1:0cad46274201 | 158 | { |
yao6116601 | 1:0cad46274201 | 159 | if (!(_parser.recv("%d,%d,%d,%d,%d,%d,%d,",&ref,&msg,&objId,&insId,&resId,&valueType,&len) |
yao6116601 | 1:0cad46274201 | 160 | && _parser.read(value,len*2) |
yao6116601 | 1:0cad46274201 | 161 | &&_parser.recv(",%d,%d\n",&flag,&index))) { |
yao6116601 | 1:0cad46274201 | 162 | return; |
yao6116601 | 1:0cad46274201 | 163 | } |
yao6116601 | 1:0cad46274201 | 164 | |
yao6116601 | 1:0cad46274201 | 165 | // printf("v=%.*s\n",len*2,value); |
yao6116601 | 1:0cad46274201 | 166 | currCode=WRITE; |
yao6116601 | 1:0cad46274201 | 167 | curr_objId=objId; |
yao6116601 | 1:0cad46274201 | 168 | curr_insId=insId; |
yao6116601 | 1:0cad46274201 | 169 | curr_resId=resId; |
yao6116601 | 1:0cad46274201 | 170 | valueLength=len*2; |
yao6116601 | 1:0cad46274201 | 171 | _callback(); |
yao6116601 | 1:0cad46274201 | 172 | result=2; |
yao6116601 | 1:0cad46274201 | 173 | if (! _parser.send("AT+MIPLWRITERSP=%d,%d,%d",ref,msg,result)) |
yao6116601 | 1:0cad46274201 | 174 | { |
yao6116601 | 1:0cad46274201 | 175 | return; |
yao6116601 | 1:0cad46274201 | 176 | } |
yao6116601 | 1:0cad46274201 | 177 | |
yao6116601 | 1:0cad46274201 | 178 | } |
yao6116601 | 1:0cad46274201 | 179 | /* |
yao6116601 | 1:0cad46274201 | 180 | +MIPLREAD--平台下发的读指令 |
yao6116601 | 1:0cad46274201 | 181 | +MIPLREAD: <ref>,<msgId>,<objId>,<insId>, <resId> |
yao6116601 | 1:0cad46274201 | 182 | response: |
yao6116601 | 1:0cad46274201 | 183 | AT+MIPLREADRSP=<ref>,<msgId>, <result>[,<objId>,<insId>,<resId>,< valueType>,<len>,<value>,<index>, <flag>] |
yao6116601 | 1:0cad46274201 | 184 | */ |
yao6116601 | 1:0cad46274201 | 185 | void BC95B::_read_handler() |
yao6116601 | 1:0cad46274201 | 186 | { int valueType,len,index,flg; |
yao6116601 | 1:0cad46274201 | 187 | if (!_parser.recv("%d,%d,%d,%d,%d\n",&ref,&msg,&objId,&insId,&resId)) |
yao6116601 | 1:0cad46274201 | 188 | { |
yao6116601 | 1:0cad46274201 | 189 | return ; |
yao6116601 | 1:0cad46274201 | 190 | } |
yao6116601 | 1:0cad46274201 | 191 | //getValue(objId,insId,resId); |
yao6116601 | 1:0cad46274201 | 192 | //"AT+MIPLREADRSP=%d,%s",ref,msgId,result,objId,insId,resId,valueType,len,value,index,flg) |
yao6116601 | 1:0cad46274201 | 193 | currCode=READ; |
yao6116601 | 1:0cad46274201 | 194 | curr_objId=objId; |
yao6116601 | 1:0cad46274201 | 195 | curr_insId=insId; |
yao6116601 | 1:0cad46274201 | 196 | curr_resId=resId; |
yao6116601 | 1:0cad46274201 | 197 | _callback(); |
yao6116601 | 1:0cad46274201 | 198 | len=4;index=0;flg=0;result=1;valueType=currType; |
yao6116601 | 1:0cad46274201 | 199 | // memcpy(value,"3.8",3); |
yao6116601 | 1:0cad46274201 | 200 | if (! _parser.send("AT+MIPLREADRSP=%d,%d,%d,%d,%d,%d,%d,%d,%s,%d,%d ",ref,msg,result,objId,insId,resId,valueType,len,value,index,flg)) |
yao6116601 | 1:0cad46274201 | 201 | { |
yao6116601 | 1:0cad46274201 | 202 | return; |
yao6116601 | 1:0cad46274201 | 203 | } |
yao6116601 | 1:0cad46274201 | 204 | } |
yao6116601 | 1:0cad46274201 | 205 | /* |
yao6116601 | 1:0cad46274201 | 206 | +MIPLOBSERVE: <ref>,<msgId>,<flag>,<objI d>,<insId>,<resId> |
yao6116601 | 1:0cad46274201 | 207 | AT+MIPLDISCOVERRSP=<ref>,<msgI d>,<result>[,<length>,<valuestring>] |
yao6116601 | 1:0cad46274201 | 208 | */ |
yao6116601 | 1:0cad46274201 | 209 | void BC95B::_obs_handler() |
yao6116601 | 1:0cad46274201 | 210 | { |
yao6116601 | 1:0cad46274201 | 211 | if (!_parser.recv("%d,%d,%d,%d,%d,%d\n",&ref,&obsmsg,&flag,&objId,&insId,&resId)) { |
yao6116601 | 1:0cad46274201 | 212 | return; |
yao6116601 | 1:0cad46274201 | 213 | } |
yao6116601 | 1:0cad46274201 | 214 | result=1; |
yao6116601 | 1:0cad46274201 | 215 | if (! _parser.send("AT+MIPLOBSERVERSP=%d,%d,%d",ref,obsmsg,result)) |
yao6116601 | 1:0cad46274201 | 216 | { |
yao6116601 | 1:0cad46274201 | 217 | return; |
yao6116601 | 1:0cad46274201 | 218 | } |
yao6116601 | 1:0cad46274201 | 219 | } |
yao6116601 | 1:0cad46274201 | 220 | void BC95B::_discover_handler() |
yao6116601 | 1:0cad46274201 | 221 | { |
yao6116601 | 1:0cad46274201 | 222 | if (!_parser.recv("%d,%d,%d\n",&ref,&msg,&objId)) { |
yao6116601 | 1:0cad46274201 | 223 | return; |
yao6116601 | 1:0cad46274201 | 224 | } |
yao6116601 | 1:0cad46274201 | 225 | // printf("discover\n"); |
yao6116601 | 1:0cad46274201 | 226 | currCode=DISCOVER; |
yao6116601 | 1:0cad46274201 | 227 | curr_objId=objId; |
yao6116601 | 1:0cad46274201 | 228 | _callback(); |
yao6116601 | 1:0cad46274201 | 229 | result=1; |
yao6116601 | 1:0cad46274201 | 230 | if (! _parser.send("AT+MIPLDISCOVERRSP=0,%d,%d,%d,\"%s\"",msg,result,resLength,resNames)) |
yao6116601 | 1:0cad46274201 | 231 | { |
yao6116601 | 1:0cad46274201 | 232 | return; |
yao6116601 | 1:0cad46274201 | 233 | } |
yao6116601 | 1:0cad46274201 | 234 | } |
yao6116601 | 1:0cad46274201 | 235 | bool BC95B::recv() |
yao6116601 | 1:0cad46274201 | 236 | { |
yao6116601 | 1:0cad46274201 | 237 | if (!_parser.process_oob()) { |
yao6116601 | 1:0cad46274201 | 238 | return false; |
yao6116601 | 1:0cad46274201 | 239 | } |
yao6116601 | 1:0cad46274201 | 240 | return true; |
yao6116601 | 1:0cad46274201 | 241 | } |
yao6116601 | 1:0cad46274201 | 242 | |
yao6116601 | 1:0cad46274201 | 243 | void BC95B::setTimeout(uint32_t timeout_ms) |
yao6116601 | 1:0cad46274201 | 244 | { |
yao6116601 | 1:0cad46274201 | 245 | _parser.set_timeout(timeout_ms); |
yao6116601 | 1:0cad46274201 | 246 | } |
yao6116601 | 1:0cad46274201 | 247 | |
yao6116601 | 1:0cad46274201 | 248 | void BC95B::attach(void (*func)(void)) |
yao6116601 | 1:0cad46274201 | 249 | { |
yao6116601 | 1:0cad46274201 | 250 | _callback=func; |
yao6116601 | 1:0cad46274201 | 251 | |
yao6116601 | 1:0cad46274201 | 252 | } |
yao6116601 | 1:0cad46274201 | 253 | |
yao6116601 | 1:0cad46274201 | 254 | int BC95B::getEventCode() |
yao6116601 | 1:0cad46274201 | 255 | { |
yao6116601 | 1:0cad46274201 | 256 | return currCode; |
yao6116601 | 1:0cad46274201 | 257 | } |
yao6116601 | 1:0cad46274201 | 258 | ; |
yao6116601 | 1:0cad46274201 | 259 | void BC95B::getCurrentID(long *msgId,int *objId,int *insId,int *resId) |
yao6116601 | 1:0cad46274201 | 260 | { |
yao6116601 | 1:0cad46274201 | 261 | *msgId=curr_msgId; |
yao6116601 | 1:0cad46274201 | 262 | *objId=curr_objId; |
yao6116601 | 1:0cad46274201 | 263 | *insId=curr_insId; |
yao6116601 | 1:0cad46274201 | 264 | *resId=curr_resId; |
yao6116601 | 1:0cad46274201 | 265 | }; |
yao6116601 | 1:0cad46274201 | 266 | int BC95B::getCurrentValue(char *buf) |
yao6116601 | 1:0cad46274201 | 267 | { |
yao6116601 | 1:0cad46274201 | 268 | memcpy(buf,value,valueLength); |
yao6116601 | 1:0cad46274201 | 269 | return valueLength; |
yao6116601 | 1:0cad46274201 | 270 | }; |
yao6116601 | 1:0cad46274201 | 271 | int BC95B::putCurrentValue(int type,char *buf,int length) |
yao6116601 | 1:0cad46274201 | 272 | { |
yao6116601 | 1:0cad46274201 | 273 | valueLength= length ; |
yao6116601 | 1:0cad46274201 | 274 | currType=type; |
yao6116601 | 1:0cad46274201 | 275 | memcpy(value,buf,valueLength); |
yao6116601 | 1:0cad46274201 | 276 | return valueLength; |
yao6116601 | 1:0cad46274201 | 277 | }; |
yao6116601 | 1:0cad46274201 | 278 | |
yao6116601 | 1:0cad46274201 | 279 | int BC95B::putCurrentResNames(int type,char *buf,int length) |
yao6116601 | 1:0cad46274201 | 280 | { |
yao6116601 | 1:0cad46274201 | 281 | printf("reslength=%d\n",length); |
yao6116601 | 1:0cad46274201 | 282 | resLength= length ; |
yao6116601 | 1:0cad46274201 | 283 | currType=type; |
yao6116601 | 1:0cad46274201 | 284 | memcpy(resNames,buf,resLength); |
yao6116601 | 1:0cad46274201 | 285 | return resLength; |
yao6116601 | 1:0cad46274201 | 286 | }; |
yao6116601 | 1:0cad46274201 | 287 |