Murata RF modules are designed to simplify wireless development and certification by minimizing the amount of RF expertise you need to wirelessly enable a wide range of applications.

Committer:
yangcq88517
Date:
Wed Mar 16 15:04:46 2016 +0000
Revision:
9:0ce800923eda
Parent:
8:5856c23794b1
bug fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yangcq88517 0:8e83b9448758 1 #include "MuRata.h"
yangcq88517 0:8e83b9448758 2
yangcq88517 0:8e83b9448758 3 using namespace SmartLabMuRata;
yangcq88517 0:8e83b9448758 4
yangcq88517 0:8e83b9448758 5 MuRata::MuRata(PinName tx, PinName rx)
yangcq88517 9:0ce800923eda 6 : _SSIDRecordIndication(NULL),_WIFIConnectionIndication(NULL),_TCPStatusIndication(NULL),_SocketReceiveInidcation(NULL),
yangcq88517 9:0ce800923eda 7 _UDPReceivedIndication(NULL),_HTTPResponseIndication(NULL),
yangcq88517 9:0ce800923eda 8 _WIFIStatusResponse(NULL),_InitializationResponse(NULL),_SendFromSocketResponse(NULL),_DHCPInfoResponse(NULL),_SocketStartReceiveResponse(NULL),_CreateSocketResponse(NULL),_HTTPResponse(NULL)
yangcq88517 0:8e83b9448758 9 {
yangcq88517 0:8e83b9448758 10 serial = new Serial(tx,rx);
yangcq88517 0:8e83b9448758 11 serial->format();
yangcq88517 0:8e83b9448758 12 serial->baud(DEFAULT_BAUDRATE );
yangcq88517 0:8e83b9448758 13 }
yangcq88517 0:8e83b9448758 14
yangcq88517 0:8e83b9448758 15 MuRata::MuRata(PinName tx, PinName rx, int baudrate ,int bits, Serial::Parity parity, int stop_bits)
yangcq88517 9:0ce800923eda 16 : _SSIDRecordIndication(NULL),_WIFIConnectionIndication(NULL),_TCPStatusIndication(NULL),_SocketReceiveInidcation(NULL),
yangcq88517 9:0ce800923eda 17 _UDPReceivedIndication(NULL),_HTTPResponseIndication(NULL),
yangcq88517 9:0ce800923eda 18 _WIFIStatusResponse(NULL),_InitializationResponse(NULL),_SendFromSocketResponse(NULL),_DHCPInfoResponse(NULL),_SocketStartReceiveResponse(NULL),_CreateSocketResponse(NULL),_HTTPResponse(NULL)
yangcq88517 0:8e83b9448758 19 {
yangcq88517 0:8e83b9448758 20 serial = new Serial(tx,rx);
yangcq88517 0:8e83b9448758 21 serial->format(bits, parity, stop_bits);
yangcq88517 9:0ce800923eda 22 serial->baud(baudrate);
yangcq88517 0:8e83b9448758 23 }
yangcq88517 0:8e83b9448758 24
yangcq88517 0:8e83b9448758 25 SSIDRecordIndication * MuRata::Get_ScanResultIndication()
yangcq88517 0:8e83b9448758 26 {
yangcq88517 8:5856c23794b1 27 if (FrameReceive())
yangcq88517 4:7388451219ee 28 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 29 && _frame.GetCommandID() == CMD_ID_WIFI
yangcq88517 9:0ce800923eda 30 && _payload.GetSubCommandID() == WIFI_SCAN_RESULT_IND) {
yangcq88517 9:0ce800923eda 31 _SSIDRecordIndication.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 32 return &_SSIDRecordIndication;
yangcq88517 9:0ce800923eda 33 }
yangcq88517 0:8e83b9448758 34
yangcq88517 0:8e83b9448758 35 return NULL;
yangcq88517 0:8e83b9448758 36 }
yangcq88517 0:8e83b9448758 37
yangcq88517 0:8e83b9448758 38 WIFIConnectionIndication * MuRata::Get_WiFiStatusIndication()
yangcq88517 0:8e83b9448758 39 {
yangcq88517 8:5856c23794b1 40 if (FrameReceive())
yangcq88517 4:7388451219ee 41 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 42 && _frame.GetCommandID() == CMD_ID_WIFI
yangcq88517 9:0ce800923eda 43 && _payload.GetSubCommandID() == WIFI_NETWORK_STATUS_IND) {
yangcq88517 9:0ce800923eda 44 _WIFIConnectionIndication.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 45 return &_WIFIConnectionIndication;
yangcq88517 9:0ce800923eda 46 }
yangcq88517 0:8e83b9448758 47
yangcq88517 0:8e83b9448758 48 return NULL;
yangcq88517 0:8e83b9448758 49 }
yangcq88517 0:8e83b9448758 50
yangcq88517 9:0ce800923eda 51 ResetCode MuRata::Get_PowerUpIndication()
yangcq88517 1:fd19bd683e90 52 {
yangcq88517 8:5856c23794b1 53 if (FrameReceive())
yangcq88517 4:7388451219ee 54 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 55 && _frame.GetCommandID() == CMD_ID_GEN
yangcq88517 4:7388451219ee 56 && _payload.GetSubCommandID() == GEN_PWR_UP_IND)
yangcq88517 9:0ce800923eda 57 return (ResetCode)(_payload.GetData()[2] << 8 | _payload.GetData()[3]);
yangcq88517 1:fd19bd683e90 58
yangcq88517 9:0ce800923eda 59 return N0_Indication;
yangcq88517 1:fd19bd683e90 60 }
yangcq88517 1:fd19bd683e90 61
yangcq88517 1:fd19bd683e90 62 TCPStatusIndication * MuRata::Get_TcpConnectionStatusIndication()
yangcq88517 1:fd19bd683e90 63 {
yangcq88517 8:5856c23794b1 64 if (FrameReceive())
yangcq88517 4:7388451219ee 65 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 66 && _frame.GetCommandID() == CMD_ID_SNIC
yangcq88517 9:0ce800923eda 67 && _payload.GetSubCommandID() == SNIC_TCP_CONNECTION_STATUS_IND) {
yangcq88517 9:0ce800923eda 68 _TCPStatusIndication.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 69 return &_TCPStatusIndication;
yangcq88517 9:0ce800923eda 70 }
yangcq88517 1:fd19bd683e90 71
yangcq88517 1:fd19bd683e90 72 return NULL;
yangcq88517 1:fd19bd683e90 73 }
yangcq88517 1:fd19bd683e90 74
yangcq88517 1:fd19bd683e90 75 SocketReceiveInidcation * MuRata::Get_SocketReceiveIndication()
yangcq88517 1:fd19bd683e90 76 {
yangcq88517 8:5856c23794b1 77 if (FrameReceive())
yangcq88517 4:7388451219ee 78 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 79 && _frame.GetCommandID() == CMD_ID_SNIC
yangcq88517 9:0ce800923eda 80 && _payload.GetSubCommandID() == SNIC_CONNECTION_RECV_IND) {
yangcq88517 9:0ce800923eda 81 _SocketReceiveInidcation.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 82 return &_SocketReceiveInidcation;
yangcq88517 9:0ce800923eda 83 }
yangcq88517 1:fd19bd683e90 84
yangcq88517 1:fd19bd683e90 85 return NULL;
yangcq88517 1:fd19bd683e90 86 }
yangcq88517 1:fd19bd683e90 87
yangcq88517 1:fd19bd683e90 88 UDPReceivedIndication * MuRata::Get_UDPReceiveIndication()
yangcq88517 1:fd19bd683e90 89 {
yangcq88517 8:5856c23794b1 90 if (FrameReceive())
yangcq88517 4:7388451219ee 91 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 92 && _frame.GetCommandID() == CMD_ID_SNIC
yangcq88517 9:0ce800923eda 93 && _payload.GetSubCommandID() == SNIC_UDP_RECV_IND) {
yangcq88517 9:0ce800923eda 94 _UDPReceivedIndication.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 95 return &_UDPReceivedIndication;
yangcq88517 9:0ce800923eda 96 }
yangcq88517 1:fd19bd683e90 97
yangcq88517 1:fd19bd683e90 98 return NULL;
yangcq88517 1:fd19bd683e90 99 }
yangcq88517 1:fd19bd683e90 100
yangcq88517 1:fd19bd683e90 101 HTTPResponseIndication * MuRata::Get_HTTPResponseIndication()
yangcq88517 1:fd19bd683e90 102 {
yangcq88517 8:5856c23794b1 103 if (FrameReceive())
yangcq88517 4:7388451219ee 104 if (_payload.GetResponseFlag() == Request_Indication
yangcq88517 4:7388451219ee 105 && _frame.GetCommandID() == CMD_ID_SNIC
yangcq88517 9:0ce800923eda 106 && _payload.GetSubCommandID() == SNIC_HTTP_RSP_IND) {
yangcq88517 9:0ce800923eda 107 _HTTPResponseIndication.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 108 return &_HTTPResponseIndication;
yangcq88517 9:0ce800923eda 109 }
yangcq88517 1:fd19bd683e90 110
yangcq88517 1:fd19bd683e90 111 return NULL;
yangcq88517 1:fd19bd683e90 112 }
yangcq88517 1:fd19bd683e90 113
yangcq88517 0:8e83b9448758 114 void MuRata::Send()
yangcq88517 0:8e83b9448758 115 {
yangcq88517 7:a71d7c24afc0 116 _frame.SetACKRequired(false);
yangcq88517 0:8e83b9448758 117 _payload.SetResponseFlag(Request_Indication);
yangcq88517 0:8e83b9448758 118 serial->putc(UARTFrame::SOM);
yangcq88517 0:8e83b9448758 119
yangcq88517 0:8e83b9448758 120 serial->putc(_frame.GetL0() | 0x80);
yangcq88517 0:8e83b9448758 121 serial->putc(_frame.GetL1() | 0x80 | (_frame.GetACKRequired() ? 0x40 : 0x00));
yangcq88517 0:8e83b9448758 122
yangcq88517 0:8e83b9448758 123 serial->putc(_frame.GetCommandID() | 0x80);
yangcq88517 0:8e83b9448758 124
yangcq88517 0:8e83b9448758 125 for (int i = 0; i < _payload.GetPosition(); i++)
yangcq88517 0:8e83b9448758 126 serial->putc(_payload.GetData()[i]);
yangcq88517 0:8e83b9448758 127
yangcq88517 0:8e83b9448758 128 serial->putc(_frame.GetChecksum() | 0x80);
yangcq88517 0:8e83b9448758 129
yangcq88517 0:8e83b9448758 130 serial->putc(UARTFrame::EOM);
yangcq88517 0:8e83b9448758 131 }
yangcq88517 0:8e83b9448758 132
yangcq88517 0:8e83b9448758 133 bool MuRata::FrameReceive()
yangcq88517 0:8e83b9448758 134 {
yangcq88517 8:5856c23794b1 135 timer.reset();
yangcq88517 8:5856c23794b1 136 timer.start();
yangcq88517 9:0ce800923eda 137
yangcq88517 9:0ce800923eda 138 while (serial->readable() <= 0) {
yangcq88517 9:0ce800923eda 139 if (timer.read_ms() > 1000) {
yangcq88517 8:5856c23794b1 140 timer.stop();
yangcq88517 8:5856c23794b1 141 return false;
yangcq88517 8:5856c23794b1 142 }
yangcq88517 8:5856c23794b1 143 }
yangcq88517 8:5856c23794b1 144 timer.stop();
yangcq88517 9:0ce800923eda 145
yangcq88517 0:8e83b9448758 146 int value = serial->getc();
yangcq88517 0:8e83b9448758 147 while (value != UARTFrame::SOM)
yangcq88517 0:8e83b9448758 148 value = serial->getc();
yangcq88517 0:8e83b9448758 149
yangcq88517 0:8e83b9448758 150 _frame.SetL0(serial->getc());
yangcq88517 0:8e83b9448758 151 _frame.SetL1(serial->getc());
yangcq88517 0:8e83b9448758 152
yangcq88517 0:8e83b9448758 153 _frame.SetCommandID(serial->getc());
yangcq88517 0:8e83b9448758 154
yangcq88517 0:8e83b9448758 155 int _size = _frame.GetPayloadLength();
yangcq88517 0:8e83b9448758 156
yangcq88517 0:8e83b9448758 157 _payload.Allocate(_size);
yangcq88517 0:8e83b9448758 158 while (_payload.GetPosition() < _size)
yangcq88517 0:8e83b9448758 159 _payload.SetContent(serial->getc());
yangcq88517 0:8e83b9448758 160
yangcq88517 0:8e83b9448758 161 _frame.SetChecksum(serial->getc());
yangcq88517 0:8e83b9448758 162
yangcq88517 0:8e83b9448758 163 if (serial->getc() == UARTFrame::EOM && _frame.VerifyChecksum())
yangcq88517 0:8e83b9448758 164 return true;
yangcq88517 0:8e83b9448758 165 else return false;
yangcq88517 0:8e83b9448758 166 }
yangcq88517 0:8e83b9448758 167
yangcq88517 9:0ce800923eda 168 const char * MuRata::GEN_GetFirmwareVersionInfo()
yangcq88517 0:8e83b9448758 169 {
yangcq88517 0:8e83b9448758 170 _payload.Rewind();
yangcq88517 0:8e83b9448758 171 _payload.SetSubCommandID(GEN_FW_VER_GET_REQ);
yangcq88517 0:8e83b9448758 172 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 173
yangcq88517 0:8e83b9448758 174 _frame.SetCommandID(CMD_ID_GEN);
yangcq88517 0:8e83b9448758 175 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 176
yangcq88517 0:8e83b9448758 177 Send();
yangcq88517 0:8e83b9448758 178
yangcq88517 9:0ce800923eda 179 while (FrameReceive()) {
yangcq88517 9:0ce800923eda 180 if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_FW_VER_GET_REQ) {
yangcq88517 9:0ce800923eda 181 if (_payload.GetData()[2] == GEN_SUCCESS) {
yangcq88517 9:0ce800923eda 182 // set the null for the string
yangcq88517 9:0ce800923eda 183 _payload.GetData()[4 + _payload.GetData()[3]] = 0x00;
yangcq88517 9:0ce800923eda 184 return _payload.GetData() + 4;
yangcq88517 9:0ce800923eda 185 }
yangcq88517 9:0ce800923eda 186 }
yangcq88517 9:0ce800923eda 187 }
yangcq88517 1:fd19bd683e90 188 return NULL;
yangcq88517 0:8e83b9448758 189 }
yangcq88517 0:8e83b9448758 190
yangcq88517 0:8e83b9448758 191 CMDCode MuRata::GEN_RestoreNVMtoFactoryDefault()
yangcq88517 0:8e83b9448758 192 {
yangcq88517 0:8e83b9448758 193 _payload.Rewind();
yangcq88517 0:8e83b9448758 194 _payload.SetSubCommandID(GEN_RESTORE_REQ);
yangcq88517 0:8e83b9448758 195 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 196
yangcq88517 0:8e83b9448758 197 _frame.SetCommandID(CMD_ID_GEN);
yangcq88517 0:8e83b9448758 198 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 199
yangcq88517 0:8e83b9448758 200 Send();
yangcq88517 0:8e83b9448758 201
yangcq88517 9:0ce800923eda 202 while (FrameReceive())
yangcq88517 1:fd19bd683e90 203 if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_RESTORE_REQ)
yangcq88517 1:fd19bd683e90 204 return (CMDCode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 205
yangcq88517 1:fd19bd683e90 206 return GEN_NORESPONSE;
yangcq88517 0:8e83b9448758 207 }
yangcq88517 0:8e83b9448758 208
yangcq88517 0:8e83b9448758 209 CMDCode MuRata::GEN_SoftReset()
yangcq88517 0:8e83b9448758 210 {
yangcq88517 0:8e83b9448758 211 _payload.Rewind();
yangcq88517 0:8e83b9448758 212 _payload.SetSubCommandID(GEN_RESET_REQ);
yangcq88517 0:8e83b9448758 213 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 214
yangcq88517 0:8e83b9448758 215 _frame.SetCommandID(CMD_ID_GEN);
yangcq88517 0:8e83b9448758 216 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 217
yangcq88517 0:8e83b9448758 218 Send();
yangcq88517 0:8e83b9448758 219
yangcq88517 9:0ce800923eda 220 while (FrameReceive())
yangcq88517 1:fd19bd683e90 221 if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_RESET_REQ)
yangcq88517 1:fd19bd683e90 222 return (CMDCode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 223
yangcq88517 1:fd19bd683e90 224 return GEN_NORESPONSE;
yangcq88517 0:8e83b9448758 225 }
yangcq88517 0:8e83b9448758 226
yangcq88517 9:0ce800923eda 227 CMDCode MuRata::GEN_UARTConfiguration(UARTConfig * config)
yangcq88517 0:8e83b9448758 228 {
yangcq88517 0:8e83b9448758 229 _payload.Rewind();
yangcq88517 0:8e83b9448758 230 _payload.SetSubCommandID(GEN_UART_CFG_REQ);
yangcq88517 0:8e83b9448758 231 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 9:0ce800923eda 232 _payload.SetContent(config->GetValue(), 0, 6);
yangcq88517 0:8e83b9448758 233
yangcq88517 0:8e83b9448758 234 _frame.SetCommandID(CMD_ID_GEN);
yangcq88517 0:8e83b9448758 235 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 236
yangcq88517 0:8e83b9448758 237 Send();
yangcq88517 0:8e83b9448758 238
yangcq88517 9:0ce800923eda 239 while (FrameReceive())
yangcq88517 1:fd19bd683e90 240 if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_UART_CFG_REQ)
yangcq88517 1:fd19bd683e90 241 return (CMDCode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 242
yangcq88517 1:fd19bd683e90 243 return GEN_NORESPONSE;
yangcq88517 0:8e83b9448758 244 }
yangcq88517 0:8e83b9448758 245
yangcq88517 0:8e83b9448758 246
yangcq88517 0:8e83b9448758 247 WIFICode MuRata::WIFI_TurnOn()
yangcq88517 0:8e83b9448758 248 {
yangcq88517 0:8e83b9448758 249 _payload.Rewind();
yangcq88517 0:8e83b9448758 250 _payload.SetSubCommandID(WIFI_ON_REQ);
yangcq88517 0:8e83b9448758 251 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 252 /*
yangcq88517 0:8e83b9448758 253 * Country code is a 2-character ASCII string. E.g., “US” = the United States. For the complete list, see Appendix A. The default country code is “US”, which is one of the startup parameters in NVM. If the WIFI_ON_REQ has no intention of changing the country code, put 0x0000 in the two-byte Country code, so that the firmware will use the country code configured in NVM.
yangcq88517 0:8e83b9448758 254 */
yangcq88517 0:8e83b9448758 255 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 256 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 257
yangcq88517 0:8e83b9448758 258 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 259 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 260
yangcq88517 0:8e83b9448758 261 Send();
yangcq88517 0:8e83b9448758 262
yangcq88517 9:0ce800923eda 263 while (FrameReceive())
yangcq88517 1:fd19bd683e90 264 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_ON_REQ)
yangcq88517 1:fd19bd683e90 265 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 266
yangcq88517 1:fd19bd683e90 267 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 268 }
yangcq88517 0:8e83b9448758 269
yangcq88517 0:8e83b9448758 270 WIFICode MuRata::WIFI_TurnOff()
yangcq88517 0:8e83b9448758 271 {
yangcq88517 0:8e83b9448758 272 _payload.Rewind();
yangcq88517 0:8e83b9448758 273 _payload.SetSubCommandID(WIFI_OFF_REQ);
yangcq88517 0:8e83b9448758 274 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 275
yangcq88517 0:8e83b9448758 276 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 277 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 278
yangcq88517 0:8e83b9448758 279 Send();
yangcq88517 0:8e83b9448758 280
yangcq88517 9:0ce800923eda 281 while (FrameReceive())
yangcq88517 1:fd19bd683e90 282 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_OFF_REQ)
yangcq88517 1:fd19bd683e90 283 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 284
yangcq88517 1:fd19bd683e90 285 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 286 }
yangcq88517 0:8e83b9448758 287
yangcq88517 9:0ce800923eda 288 /*
yangcq88517 9:0ce800923eda 289 * Parameters are as follows:
yangcq88517 9:0ce800923eda 290 * UINT8 Request Sequence
yangcq88517 9:0ce800923eda 291 * UINT8 Onoff
yangcq88517 9:0ce800923eda 292 * UINT8 Persistency
yangcq88517 9:0ce800923eda 293 * UINT8 SSID [up to 33]
yangcq88517 9:0ce800923eda 294 * UINT8 Channel
yangcq88517 9:0ce800923eda 295 * UINT8 Security mode
yangcq88517 9:0ce800923eda 296 * UINT8 Security key length (0-64)
yangcq88517 9:0ce800923eda 297 * … Security key [ ]
yangcq88517 9:0ce800923eda 298 * OnOff = 0 indicates AP is to be turned off. The rest of the parameters are ignored.
yangcq88517 9:0ce800923eda 299 * OnOff = 1 indicates turning on soft AP using existing NVM parameters,
yangcq88517 9:0ce800923eda 300 * OnOff = 2 indicates turning on AP with the parameters provided. If the soft AP is already on, it is first turned off.
yangcq88517 9:0ce800923eda 301 * Persistency=1 indicates the soft AP’s on/off state and parameters (if OnOff = 2) will be saved in NVM. For example, if OnOff =0 and Persistency=1, the soft AP will not be turned on after a reset.
yangcq88517 9:0ce800923eda 302 */
yangcq88517 0:8e83b9448758 303 WIFICode MuRata::WIFI_SoftAPControl(SoftAPConfig * config)
yangcq88517 0:8e83b9448758 304 {
yangcq88517 0:8e83b9448758 305 _payload.Rewind();
yangcq88517 0:8e83b9448758 306 _payload.SetSubCommandID(WIFI_AP_CTRL_REQ);
yangcq88517 0:8e83b9448758 307 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 308
yangcq88517 0:8e83b9448758 309 _payload.SetContent(config->GetOnOffStatus());
yangcq88517 0:8e83b9448758 310 _payload.SetContent(config->GetPersistency());
yangcq88517 9:0ce800923eda 311 if (config->GetOnOffStatus() == SoftAPConfig::ON_PARAMETERS) {
yangcq88517 9:0ce800923eda 312 const char * ssid = config->GetSSID();
yangcq88517 9:0ce800923eda 313 int length = strlen(ssid);
yangcq88517 9:0ce800923eda 314 _payload.SetContent(ssid, 0 , length);
yangcq88517 0:8e83b9448758 315 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 316 }
yangcq88517 0:8e83b9448758 317 _payload.SetContent(config->GetChannel());
yangcq88517 7:a71d7c24afc0 318 _payload.SetContent(config->GetSecurityMode());
yangcq88517 0:8e83b9448758 319
yangcq88517 9:0ce800923eda 320 const char * key = config->GetSecurityKey();
yangcq88517 9:0ce800923eda 321 int keyLength = 0;
yangcq88517 9:0ce800923eda 322 if (key != NULL)
yangcq88517 9:0ce800923eda 323 keyLength = strlen(key);
yangcq88517 9:0ce800923eda 324
yangcq88517 0:8e83b9448758 325 _payload.SetContent(keyLength);
yangcq88517 0:8e83b9448758 326 if (config->GetSecurityMode() != WIFI_SECURITY_OPEN && keyLength > 0)
yangcq88517 9:0ce800923eda 327 _payload.SetContent(key, 0 , keyLength);
yangcq88517 0:8e83b9448758 328
yangcq88517 0:8e83b9448758 329 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 330 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 331
yangcq88517 0:8e83b9448758 332 Send();
yangcq88517 0:8e83b9448758 333
yangcq88517 9:0ce800923eda 334 while (FrameReceive())
yangcq88517 1:fd19bd683e90 335 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_AP_CTRL_REQ)
yangcq88517 1:fd19bd683e90 336 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 337
yangcq88517 1:fd19bd683e90 338 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 339 }
yangcq88517 0:8e83b9448758 340
yangcq88517 0:8e83b9448758 341 WIFICode MuRata::WIFI_AssociateNetwork(WIFINetwork * AP)
yangcq88517 0:8e83b9448758 342 {
yangcq88517 0:8e83b9448758 343 _payload.Rewind();
yangcq88517 0:8e83b9448758 344 _payload.SetSubCommandID(WIFI_JOIN_REQ);
yangcq88517 0:8e83b9448758 345 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 1:fd19bd683e90 346 _payload.SetContent(AP->GetSSID(), 0, strlen(AP->GetSSID()));
yangcq88517 0:8e83b9448758 347 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 348
yangcq88517 7:a71d7c24afc0 349 _payload.SetContent(AP->GetSecurityMode());
yangcq88517 0:8e83b9448758 350
yangcq88517 1:fd19bd683e90 351 int keyLength = strlen(AP->GetSecurityKey());
yangcq88517 0:8e83b9448758 352 _payload.SetContent(keyLength);
yangcq88517 0:8e83b9448758 353 if (keyLength > 0)
yangcq88517 1:fd19bd683e90 354 _payload.SetContent(AP->GetSecurityKey(), 0, keyLength);
yangcq88517 0:8e83b9448758 355
yangcq88517 0:8e83b9448758 356 if (AP->GetBSSID() != NULL) {
yangcq88517 0:8e83b9448758 357 _payload.SetContent(AP->GetChannel());
yangcq88517 0:8e83b9448758 358 _payload.SetContent(AP->GetBSSID(), 0, 6);
yangcq88517 0:8e83b9448758 359 }
yangcq88517 0:8e83b9448758 360
yangcq88517 0:8e83b9448758 361 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 362 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 363
yangcq88517 0:8e83b9448758 364 Send();
yangcq88517 0:8e83b9448758 365
yangcq88517 9:0ce800923eda 366 while (FrameReceive())
yangcq88517 1:fd19bd683e90 367 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_JOIN_REQ)
yangcq88517 1:fd19bd683e90 368 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 369
yangcq88517 1:fd19bd683e90 370 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 371 }
yangcq88517 0:8e83b9448758 372
yangcq88517 0:8e83b9448758 373 WIFICode MuRata::WIFI_DisconnectNetwork()
yangcq88517 0:8e83b9448758 374 {
yangcq88517 0:8e83b9448758 375 _payload.Rewind();
yangcq88517 0:8e83b9448758 376 _payload.SetSubCommandID(WIFI_DISCONNECT_REQ);
yangcq88517 0:8e83b9448758 377 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 378
yangcq88517 0:8e83b9448758 379 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 380 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 381
yangcq88517 0:8e83b9448758 382 Send();
yangcq88517 0:8e83b9448758 383
yangcq88517 9:0ce800923eda 384 while (FrameReceive())
yangcq88517 1:fd19bd683e90 385 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_DISCONNECT_REQ)
yangcq88517 1:fd19bd683e90 386 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 387
yangcq88517 1:fd19bd683e90 388 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 389 }
yangcq88517 0:8e83b9448758 390 WIFIStatusResponse * MuRata::WIFI_GetStatus(const WIFIInterface WiFiInterface)
yangcq88517 0:8e83b9448758 391 {
yangcq88517 0:8e83b9448758 392 _payload.Rewind();
yangcq88517 0:8e83b9448758 393 _payload.SetSubCommandID(WIFI_GET_STATUS_REQ);
yangcq88517 0:8e83b9448758 394 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 395 _payload.SetContent(WiFiInterface);
yangcq88517 0:8e83b9448758 396
yangcq88517 0:8e83b9448758 397 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 398 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 399
yangcq88517 0:8e83b9448758 400 Send();
yangcq88517 0:8e83b9448758 401
yangcq88517 9:0ce800923eda 402 while (FrameReceive())
yangcq88517 9:0ce800923eda 403 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STATUS_REQ) {
yangcq88517 9:0ce800923eda 404 _WIFIStatusResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 405 return &_WIFIStatusResponse;
yangcq88517 9:0ce800923eda 406 }
yangcq88517 1:fd19bd683e90 407
yangcq88517 1:fd19bd683e90 408 return NULL;
yangcq88517 0:8e83b9448758 409 }
yangcq88517 0:8e83b9448758 410
yangcq88517 9:0ce800923eda 411 int8_t MuRata::WIFI_GetRSSI()
yangcq88517 0:8e83b9448758 412 {
yangcq88517 0:8e83b9448758 413 _payload.Rewind();
yangcq88517 0:8e83b9448758 414 _payload.SetSubCommandID(WIFI_GET_STA_RSSI_REQ);
yangcq88517 0:8e83b9448758 415 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 416
yangcq88517 0:8e83b9448758 417 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 418 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 419
yangcq88517 0:8e83b9448758 420 Send();
yangcq88517 0:8e83b9448758 421
yangcq88517 9:0ce800923eda 422 while (FrameReceive())
yangcq88517 9:0ce800923eda 423 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STA_RSSI_REQ)
yangcq88517 9:0ce800923eda 424 return _payload.GetData()[2];
yangcq88517 1:fd19bd683e90 425
yangcq88517 1:fd19bd683e90 426 return 127;
yangcq88517 0:8e83b9448758 427 }
yangcq88517 0:8e83b9448758 428
yangcq88517 0:8e83b9448758 429 WIFICode MuRata::WIFI_StartWPSProcess(const WPSMode mode, const char * pin, int pinLength)
yangcq88517 0:8e83b9448758 430 {
yangcq88517 0:8e83b9448758 431 _payload.Rewind();
yangcq88517 0:8e83b9448758 432 _payload.SetSubCommandID(WIFI_WPS_REQ);
yangcq88517 0:8e83b9448758 433 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 434 _payload.SetContent(mode);
yangcq88517 0:8e83b9448758 435
yangcq88517 0:8e83b9448758 436 if (mode == Pin) {
yangcq88517 0:8e83b9448758 437 if (Pin == NULL)
yangcq88517 0:8e83b9448758 438 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 439
yangcq88517 0:8e83b9448758 440 _payload.SetContent(pin, 0 , pinLength);
yangcq88517 0:8e83b9448758 441 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 442 }
yangcq88517 0:8e83b9448758 443
yangcq88517 0:8e83b9448758 444 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 445 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 446
yangcq88517 0:8e83b9448758 447 Send();
yangcq88517 0:8e83b9448758 448
yangcq88517 9:0ce800923eda 449 while (FrameReceive())
yangcq88517 1:fd19bd683e90 450 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_WPS_REQ)
yangcq88517 1:fd19bd683e90 451 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 452
yangcq88517 1:fd19bd683e90 453 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 454 }
yangcq88517 0:8e83b9448758 455
yangcq88517 0:8e83b9448758 456 WIFICode MuRata::WIFI_ScanNetworks(const ScanType scan, const BSSType bss)
yangcq88517 0:8e83b9448758 457 {
yangcq88517 0:8e83b9448758 458 /*
yangcq88517 0:8e83b9448758 459 * This command instructs the module to scan available networks. Parameters are as follows:
yangcq88517 0:8e83b9448758 460 * UINT8 Request Sequence
yangcq88517 0:8e83b9448758 461 * UINT8 Scan Type
yangcq88517 0:8e83b9448758 462 * UINT8 BSS Type
yangcq88517 0:8e83b9448758 463 * UINT8 BSSID [6]
yangcq88517 0:8e83b9448758 464 * UINT8 Channel list []
yangcq88517 0:8e83b9448758 465 * UINT8 SSID[]
yangcq88517 0:8e83b9448758 466 * BSSID, Channel List, and SSID are optional fields. All 0’s for BSSID, Channel list or SSID indicates it is not present.
yangcq88517 0:8e83b9448758 467 * - Scan Type: 0 = Active scan, 1= Passive scan
yangcq88517 0:8e83b9448758 468 * - BSS Type: 0 = Infrastructure, 1 = ad hoc, 2 = any
yangcq88517 0:8e83b9448758 469 * - BSSID: 6 bytes MAC address of the AP or STA. 6 bytes of 0’s indicates it is not present.
yangcq88517 0:8e83b9448758 470 * - Channel list: 0 terminated array, up to 10 array elements.
yangcq88517 0:8e83b9448758 471 * - SSID: 0 terminated string for the AP or STA SSID, up to 33 bytes including NUL-termination.
yangcq88517 0:8e83b9448758 472 */
yangcq88517 0:8e83b9448758 473
yangcq88517 0:8e83b9448758 474 _payload.Rewind();
yangcq88517 0:8e83b9448758 475 _payload.SetSubCommandID(WIFI_SCAN_REQ);
yangcq88517 0:8e83b9448758 476 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 477 _payload.SetContent(scan);
yangcq88517 7:a71d7c24afc0 478 _payload.SetContent(bss);
yangcq88517 0:8e83b9448758 479
yangcq88517 0:8e83b9448758 480 for (int i = 0; i < 8; i++)
yangcq88517 0:8e83b9448758 481 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 482
yangcq88517 0:8e83b9448758 483 _frame.SetCommandID(CMD_ID_WIFI);
yangcq88517 0:8e83b9448758 484 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 485
yangcq88517 0:8e83b9448758 486 Send();
yangcq88517 0:8e83b9448758 487
yangcq88517 8:5856c23794b1 488 if (FrameReceive())
yangcq88517 1:fd19bd683e90 489 if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_SCAN_REQ)
yangcq88517 1:fd19bd683e90 490 return (WIFICode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 491
yangcq88517 1:fd19bd683e90 492 return WIFI_NORESPONSE;
yangcq88517 0:8e83b9448758 493 }
yangcq88517 0:8e83b9448758 494
yangcq88517 0:8e83b9448758 495 InitializationResponse * MuRata::SNIC_Initialization(int receiveBufferSize)
yangcq88517 0:8e83b9448758 496 {
yangcq88517 0:8e83b9448758 497 _payload.Rewind();
yangcq88517 0:8e83b9448758 498 _payload.SetSubCommandID(SNIC_INIT_REQ);
yangcq88517 0:8e83b9448758 499 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 500 _payload.SetContent(receiveBufferSize >> 8);
yangcq88517 0:8e83b9448758 501 _payload.SetContent(receiveBufferSize);
yangcq88517 0:8e83b9448758 502
yangcq88517 0:8e83b9448758 503 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 504 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 505
yangcq88517 0:8e83b9448758 506 Send();
yangcq88517 0:8e83b9448758 507
yangcq88517 9:0ce800923eda 508 while (FrameReceive())
yangcq88517 9:0ce800923eda 509 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_INIT_REQ) {
yangcq88517 9:0ce800923eda 510 _InitializationResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 511 return &_InitializationResponse;
yangcq88517 9:0ce800923eda 512 }
yangcq88517 1:fd19bd683e90 513
yangcq88517 1:fd19bd683e90 514 return NULL;
yangcq88517 0:8e83b9448758 515 }
yangcq88517 0:8e83b9448758 516
yangcq88517 0:8e83b9448758 517 SNICCode MuRata::SNIC_Cleanup()
yangcq88517 0:8e83b9448758 518 {
yangcq88517 0:8e83b9448758 519 _payload.Rewind();
yangcq88517 0:8e83b9448758 520 _payload.SetSubCommandID(SNIC_CLEANUP_REQ);
yangcq88517 0:8e83b9448758 521 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 522
yangcq88517 0:8e83b9448758 523 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 524 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 525
yangcq88517 0:8e83b9448758 526 Send();
yangcq88517 0:8e83b9448758 527
yangcq88517 9:0ce800923eda 528 while (FrameReceive())
yangcq88517 1:fd19bd683e90 529 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_CLEANUP_REQ)
yangcq88517 1:fd19bd683e90 530 return (SNICCode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 531
yangcq88517 1:fd19bd683e90 532 return SNIC_NORESPONSE;
yangcq88517 0:8e83b9448758 533
yangcq88517 0:8e83b9448758 534 }
yangcq88517 0:8e83b9448758 535
yangcq88517 0:8e83b9448758 536
yangcq88517 0:8e83b9448758 537 SendFromSocketResponse * MuRata::SNIC_SendFromSocket(const char SocketID, const SocketSentOption option, const char * payload, int offset, int length)
yangcq88517 0:8e83b9448758 538 {
yangcq88517 0:8e83b9448758 539 _payload.Rewind();
yangcq88517 0:8e83b9448758 540 _payload.SetSubCommandID(SNIC_SEND_FROM_SOCKET_REQ);
yangcq88517 0:8e83b9448758 541 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 542 _payload.SetContent(SocketID);
yangcq88517 7:a71d7c24afc0 543 _payload.SetContent(option);
yangcq88517 0:8e83b9448758 544 _payload.SetContent(length >> 8);
yangcq88517 0:8e83b9448758 545 _payload.SetContent(length);
yangcq88517 0:8e83b9448758 546 _payload.SetContent(payload, offset, length);
yangcq88517 0:8e83b9448758 547
yangcq88517 0:8e83b9448758 548 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 549 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 550
yangcq88517 0:8e83b9448758 551 Send();
yangcq88517 0:8e83b9448758 552
yangcq88517 9:0ce800923eda 553 while (FrameReceive())
yangcq88517 9:0ce800923eda 554 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_SEND_FROM_SOCKET_REQ) {
yangcq88517 9:0ce800923eda 555 _SendFromSocketResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 556 return &_SendFromSocketResponse;
yangcq88517 9:0ce800923eda 557 }
yangcq88517 1:fd19bd683e90 558
yangcq88517 1:fd19bd683e90 559 return NULL;
yangcq88517 0:8e83b9448758 560 }
yangcq88517 0:8e83b9448758 561
yangcq88517 0:8e83b9448758 562 SNICCode MuRata::SNIC_SloseSocket(const char SocketID)
yangcq88517 0:8e83b9448758 563 {
yangcq88517 0:8e83b9448758 564 _payload.Rewind();
yangcq88517 0:8e83b9448758 565 _payload.SetSubCommandID(SNIC_CLOSE_SOCKET_REQ);
yangcq88517 0:8e83b9448758 566 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 567 _payload.SetContent(SocketID);
yangcq88517 0:8e83b9448758 568
yangcq88517 0:8e83b9448758 569 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 570 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 571
yangcq88517 0:8e83b9448758 572 Send();
yangcq88517 0:8e83b9448758 573
yangcq88517 9:0ce800923eda 574 while (FrameReceive())
yangcq88517 1:fd19bd683e90 575 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_CLOSE_SOCKET_REQ)
yangcq88517 1:fd19bd683e90 576 return (SNICCode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 577
yangcq88517 1:fd19bd683e90 578 return SNIC_NORESPONSE;
yangcq88517 0:8e83b9448758 579 }
yangcq88517 0:8e83b9448758 580
yangcq88517 0:8e83b9448758 581 DHCPInfoResponse * MuRata::SNIC_GetDHCPInfo(const WIFIInterface wifiInterface)
yangcq88517 0:8e83b9448758 582 {
yangcq88517 0:8e83b9448758 583 _payload.Rewind();
yangcq88517 0:8e83b9448758 584 _payload.SetSubCommandID(SNIC_GET_DHCP_INFO_REQ);
yangcq88517 0:8e83b9448758 585 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 586 _payload.SetContent(wifiInterface);
yangcq88517 0:8e83b9448758 587
yangcq88517 0:8e83b9448758 588 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 589 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 590
yangcq88517 0:8e83b9448758 591 Send();
yangcq88517 0:8e83b9448758 592
yangcq88517 9:0ce800923eda 593 while (FrameReceive())
yangcq88517 9:0ce800923eda 594 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_GET_DHCP_INFO_REQ) {
yangcq88517 9:0ce800923eda 595 _DHCPInfoResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 596 return &_DHCPInfoResponse;
yangcq88517 9:0ce800923eda 597 }
yangcq88517 1:fd19bd683e90 598
yangcq88517 1:fd19bd683e90 599 return NULL;
yangcq88517 0:8e83b9448758 600 }
yangcq88517 0:8e83b9448758 601
yangcq88517 9:0ce800923eda 602 IPAddress * MuRata::SNIC_ResolveHostName(const char * host)
yangcq88517 0:8e83b9448758 603 {
yangcq88517 1:fd19bd683e90 604 int hostLength = strlen(host);
yangcq88517 1:fd19bd683e90 605
yangcq88517 0:8e83b9448758 606 _payload.Rewind();
yangcq88517 0:8e83b9448758 607 _payload.SetSubCommandID(SNIC_RESOLVE_NAME_REQ);
yangcq88517 0:8e83b9448758 608 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 609 _payload.SetContent(STA);
yangcq88517 1:fd19bd683e90 610 _payload.SetContent(hostLength);
yangcq88517 1:fd19bd683e90 611 _payload.SetContent(host, 0, hostLength);
yangcq88517 0:8e83b9448758 612
yangcq88517 0:8e83b9448758 613 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 614 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 615
yangcq88517 0:8e83b9448758 616 Send();
yangcq88517 0:8e83b9448758 617
yangcq88517 9:0ce800923eda 618 while (FrameReceive())
yangcq88517 1:fd19bd683e90 619 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_RESOLVE_NAME_REQ)
yangcq88517 1:fd19bd683e90 620 if ((SNICCode)_payload.GetData()[2] == SNIC_SUCCESS) {
yangcq88517 9:0ce800923eda 621 ip.SetValue(_payload.GetData(), 3);
yangcq88517 9:0ce800923eda 622 return &ip;
yangcq88517 1:fd19bd683e90 623 }
yangcq88517 0:8e83b9448758 624
yangcq88517 9:0ce800923eda 625 return NULL;
yangcq88517 0:8e83b9448758 626 }
yangcq88517 0:8e83b9448758 627
yangcq88517 0:8e83b9448758 628 SNICCode MuRata::SNIC_ConfigureDHCPorStaticIP(DHCPConfig * config)
yangcq88517 0:8e83b9448758 629 {
yangcq88517 0:8e83b9448758 630 _payload.Rewind();
yangcq88517 0:8e83b9448758 631 _payload.SetSubCommandID(SNIC_IP_CONFIG_REQ);
yangcq88517 0:8e83b9448758 632 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 633 _payload.SetContent(config->GetInterface());
yangcq88517 7:a71d7c24afc0 634 _payload.SetContent(config->GetDHCPMode());
yangcq88517 0:8e83b9448758 635
yangcq88517 0:8e83b9448758 636 if (config->GetDHCPMode() != dynamic_IP) {
yangcq88517 0:8e83b9448758 637 _payload.SetContent(config->GetLocalIP()->GetValue(), 0, 4);
yangcq88517 0:8e83b9448758 638 _payload.SetContent(config->GetNetmask()->GetValue(), 0, 4);
yangcq88517 0:8e83b9448758 639 _payload.SetContent(config->GetGatewayIP()->GetValue(), 0, 4);
yangcq88517 0:8e83b9448758 640 }
yangcq88517 0:8e83b9448758 641
yangcq88517 0:8e83b9448758 642 if (config->GetDHCPMode() == soft_AP) {
yangcq88517 0:8e83b9448758 643 _payload.SetContent(config->GetIPRangeFirst()->GetValue(), 0, 4);
yangcq88517 0:8e83b9448758 644 _payload.SetContent(config->GetIPRangeLast()->GetValue(), 0, 4);
yangcq88517 0:8e83b9448758 645 }
yangcq88517 0:8e83b9448758 646
yangcq88517 0:8e83b9448758 647 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 648 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 649
yangcq88517 0:8e83b9448758 650 Send();
yangcq88517 0:8e83b9448758 651
yangcq88517 9:0ce800923eda 652 while (FrameReceive())
yangcq88517 1:fd19bd683e90 653 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_IP_CONFIG_REQ)
yangcq88517 1:fd19bd683e90 654 return (SNICCode)_payload.GetData()[2];
yangcq88517 1:fd19bd683e90 655
yangcq88517 1:fd19bd683e90 656 return SNIC_NORESPONSE;
yangcq88517 0:8e83b9448758 657 }
yangcq88517 0:8e83b9448758 658
yangcq88517 0:8e83b9448758 659 SocketStartReceiveResponse * MuRata::SNIC_ConnectTCPServer(const char SocketID, IPAddress * remoteIP, const int remotePort, const char timeout, const int receiveBufferSize)
yangcq88517 0:8e83b9448758 660 {
yangcq88517 0:8e83b9448758 661 _payload.Rewind();
yangcq88517 0:8e83b9448758 662 _payload.SetSubCommandID(SNIC_TCP_CONNECT_TO_SERVER_REQ);
yangcq88517 0:8e83b9448758 663 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 664 _payload.SetContent(SocketID);
yangcq88517 0:8e83b9448758 665 _payload.SetContent(remoteIP->GetValue(), 0, 4);
yangcq88517 7:a71d7c24afc0 666 _payload.SetContent((remotePort >> 8));
yangcq88517 7:a71d7c24afc0 667 _payload.SetContent(remotePort);
yangcq88517 7:a71d7c24afc0 668 _payload.SetContent((receiveBufferSize >> 8));
yangcq88517 7:a71d7c24afc0 669 _payload.SetContent(receiveBufferSize);
yangcq88517 0:8e83b9448758 670 _payload.SetContent(timeout);
yangcq88517 0:8e83b9448758 671
yangcq88517 0:8e83b9448758 672 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 673 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 674
yangcq88517 0:8e83b9448758 675 Send();
yangcq88517 0:8e83b9448758 676
yangcq88517 9:0ce800923eda 677 while (FrameReceive())
yangcq88517 9:0ce800923eda 678 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_TCP_CONNECT_TO_SERVER_REQ) {
yangcq88517 9:0ce800923eda 679 _SocketStartReceiveResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 680 return &_SocketStartReceiveResponse;
yangcq88517 9:0ce800923eda 681 }
yangcq88517 1:fd19bd683e90 682
yangcq88517 1:fd19bd683e90 683 return NULL;
yangcq88517 0:8e83b9448758 684 }
yangcq88517 0:8e83b9448758 685
yangcq88517 0:8e83b9448758 686 CreateSocketResponse * MuRata::SNIC_CreateTCPSocket(const bool bind, IPAddress * localIP, const int localPort)
yangcq88517 0:8e83b9448758 687 {
yangcq88517 0:8e83b9448758 688 return SNIC_CreateSocket(SNIC_TCP_CREATE_SOCKET_REQ, bind, localIP, localPort);
yangcq88517 0:8e83b9448758 689 }
yangcq88517 0:8e83b9448758 690
yangcq88517 0:8e83b9448758 691 CreateSocketResponse * MuRata::SNIC_CreateUDPSocket(const bool bind, IPAddress * localIP, const int localPort)
yangcq88517 0:8e83b9448758 692 {
yangcq88517 0:8e83b9448758 693 return SNIC_CreateSocket(SNIC_UDP_CREATE_SOCKET_REQ, bind, localIP, localPort);
yangcq88517 0:8e83b9448758 694 }
yangcq88517 0:8e83b9448758 695
yangcq88517 0:8e83b9448758 696 CreateSocketResponse * MuRata::SNIC_CreateSocket(const SubCommandID subID, const bool bind, IPAddress * localIP, const int localPort)
yangcq88517 0:8e83b9448758 697 {
yangcq88517 0:8e83b9448758 698 _payload.Rewind();
yangcq88517 0:8e83b9448758 699 _payload.SetSubCommandID(subID);
yangcq88517 0:8e83b9448758 700 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 7:a71d7c24afc0 701 _payload.SetContent(bind ? 0x01 : 0x00);
yangcq88517 0:8e83b9448758 702
yangcq88517 0:8e83b9448758 703 if (bind) {
yangcq88517 0:8e83b9448758 704 if (localIP != NULL)
yangcq88517 0:8e83b9448758 705 _payload.SetContent(localIP->GetValue(), 0, 4);
yangcq88517 0:8e83b9448758 706 else {
yangcq88517 0:8e83b9448758 707 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 708 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 709 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 710 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 711 }
yangcq88517 0:8e83b9448758 712
yangcq88517 7:a71d7c24afc0 713 _payload.SetContent(localPort >> 8);
yangcq88517 7:a71d7c24afc0 714 _payload.SetContent(localPort);
yangcq88517 0:8e83b9448758 715 }
yangcq88517 0:8e83b9448758 716
yangcq88517 0:8e83b9448758 717 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 718 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 719
yangcq88517 0:8e83b9448758 720 Send();
yangcq88517 0:8e83b9448758 721
yangcq88517 9:0ce800923eda 722 while (FrameReceive())
yangcq88517 9:0ce800923eda 723 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == subID) {
yangcq88517 9:0ce800923eda 724 _CreateSocketResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 725 return &_CreateSocketResponse;
yangcq88517 9:0ce800923eda 726 }
yangcq88517 1:fd19bd683e90 727
yangcq88517 1:fd19bd683e90 728 return NULL;
yangcq88517 0:8e83b9448758 729 }
yangcq88517 0:8e83b9448758 730
yangcq88517 0:8e83b9448758 731 SocketStartReceiveResponse * MuRata::SNIC_StartUDPReceive(const char SocketID, const int receiveBufferSize)
yangcq88517 0:8e83b9448758 732 {
yangcq88517 0:8e83b9448758 733 _payload.Rewind();
yangcq88517 0:8e83b9448758 734 _payload.SetSubCommandID(SNIC_UDP_START_RECV_REQ);
yangcq88517 0:8e83b9448758 735 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 736 _payload.SetContent(SocketID);
yangcq88517 7:a71d7c24afc0 737 _payload.SetContent(receiveBufferSize >> 8);
yangcq88517 7:a71d7c24afc0 738 _payload.SetContent(receiveBufferSize);
yangcq88517 0:8e83b9448758 739
yangcq88517 0:8e83b9448758 740 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 741 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 742
yangcq88517 0:8e83b9448758 743 Send();
yangcq88517 0:8e83b9448758 744
yangcq88517 9:0ce800923eda 745 while (FrameReceive())
yangcq88517 9:0ce800923eda 746 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_START_RECV_REQ) {
yangcq88517 9:0ce800923eda 747 _SocketStartReceiveResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 748 return &_SocketStartReceiveResponse;
yangcq88517 9:0ce800923eda 749 }
yangcq88517 1:fd19bd683e90 750
yangcq88517 1:fd19bd683e90 751 return NULL;
yangcq88517 0:8e83b9448758 752 }
yangcq88517 0:8e83b9448758 753
yangcq88517 0:8e83b9448758 754 SendFromSocketResponse * MuRata::SNIC_SendUDPPacket(IPAddress * remoteIP, const int remotePort, const char * payload, int offset, int length)
yangcq88517 0:8e83b9448758 755 {
yangcq88517 0:8e83b9448758 756 _payload.Rewind();
yangcq88517 0:8e83b9448758 757 _payload.SetSubCommandID(SNIC_UDP_SIMPLE_SEND_REQ);
yangcq88517 0:8e83b9448758 758 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 759 _payload.SetContent(remoteIP->GetValue(), 0 ,4);
yangcq88517 7:a71d7c24afc0 760 _payload.SetContent(remotePort >> 8);
yangcq88517 7:a71d7c24afc0 761 _payload.SetContent(remotePort);
yangcq88517 7:a71d7c24afc0 762 _payload.SetContent(length >> 8);
yangcq88517 7:a71d7c24afc0 763 _payload.SetContent(length);
yangcq88517 0:8e83b9448758 764 _payload.SetContent(payload, offset, length);
yangcq88517 0:8e83b9448758 765
yangcq88517 0:8e83b9448758 766 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 767 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 768
yangcq88517 0:8e83b9448758 769 Send();
yangcq88517 0:8e83b9448758 770
yangcq88517 9:0ce800923eda 771 while (FrameReceive())
yangcq88517 9:0ce800923eda 772 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SIMPLE_SEND_REQ) {
yangcq88517 9:0ce800923eda 773 _SendFromSocketResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 774 return &_SendFromSocketResponse;
yangcq88517 9:0ce800923eda 775 }
yangcq88517 1:fd19bd683e90 776
yangcq88517 1:fd19bd683e90 777 return NULL;
yangcq88517 0:8e83b9448758 778 }
yangcq88517 0:8e83b9448758 779
yangcq88517 0:8e83b9448758 780 SendFromSocketResponse * MuRata::SNIC_SendUDPFromSocket(IPAddress * remoteIP, const int remotePort, const char SocketID, const bool connectServer, const char * payload, int offset, int length)
yangcq88517 0:8e83b9448758 781 {
yangcq88517 0:8e83b9448758 782 _payload.Rewind();
yangcq88517 0:8e83b9448758 783 _payload.SetSubCommandID(SNIC_UDP_SEND_FROM_SOCKET_REQ);
yangcq88517 0:8e83b9448758 784 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 785 _payload.SetContent(remoteIP->GetValue(),0, 4);
yangcq88517 7:a71d7c24afc0 786 _payload.SetContent(remotePort >> 8);
yangcq88517 7:a71d7c24afc0 787 _payload.SetContent(remotePort);
yangcq88517 0:8e83b9448758 788 _payload.SetContent(SocketID);
yangcq88517 7:a71d7c24afc0 789 _payload.SetContent(connectServer ? 0x01 : 0x00);
yangcq88517 7:a71d7c24afc0 790 _payload.SetContent(length >> 8);
yangcq88517 7:a71d7c24afc0 791 _payload.SetContent(length);
yangcq88517 0:8e83b9448758 792 _payload.SetContent(payload, offset, length);
yangcq88517 0:8e83b9448758 793
yangcq88517 0:8e83b9448758 794 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 795 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 796
yangcq88517 0:8e83b9448758 797 Send();
yangcq88517 0:8e83b9448758 798
yangcq88517 9:0ce800923eda 799 while (FrameReceive())
yangcq88517 9:0ce800923eda 800 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SEND_FROM_SOCKET_REQ) {
yangcq88517 9:0ce800923eda 801 _SendFromSocketResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 802 return &_SendFromSocketResponse;
yangcq88517 9:0ce800923eda 803 }
yangcq88517 1:fd19bd683e90 804
yangcq88517 1:fd19bd683e90 805 return NULL;
yangcq88517 0:8e83b9448758 806 }
yangcq88517 0:8e83b9448758 807
yangcq88517 0:8e83b9448758 808 HTTPResponse * MuRata::SNIC_SendHTTPRequest(HTTPContent * content, const bool isHTTPS, const bool chunked)
yangcq88517 0:8e83b9448758 809 {
yangcq88517 2:f8e393a81c25 810 SubCommandID _id = (isHTTPS == true) ? SNIC_HTTPS_REQ: SNIC_HTTP_REQ;
yangcq88517 1:fd19bd683e90 811
yangcq88517 0:8e83b9448758 812 _payload.Rewind();
yangcq88517 1:fd19bd683e90 813 _payload.SetSubCommandID(_id);
yangcq88517 0:8e83b9448758 814 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 2:f8e393a81c25 815 _payload.SetContent(content->GetRemotePort() >> 8);
yangcq88517 2:f8e393a81c25 816 _payload.SetContent(content->GetRemotePort());
yangcq88517 7:a71d7c24afc0 817 _payload.SetContent(content->GetMethod());
yangcq88517 0:8e83b9448758 818 _payload.SetContent(content->GetTimeout());
yangcq88517 0:8e83b9448758 819
yangcq88517 2:f8e393a81c25 820 _payload.SetContent(content->GetRemoteHost(), 0, strlen(content->GetRemoteHost()));
yangcq88517 0:8e83b9448758 821 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 822
yangcq88517 2:f8e393a81c25 823 _payload.SetContent(content->GetURI(), 0, strlen(content->GetURI()));
yangcq88517 0:8e83b9448758 824 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 825
yangcq88517 2:f8e393a81c25 826 _payload.SetContent(content->GetContentType(), 0, strlen(content->GetContentType()));
yangcq88517 0:8e83b9448758 827 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 828
yangcq88517 2:f8e393a81c25 829 string _others;
yangcq88517 2:f8e393a81c25 830 content->GetOtherHeaders(&_others);
yangcq88517 2:f8e393a81c25 831 _payload.SetContent(_others.c_str(), 0, _others.length());
yangcq88517 0:8e83b9448758 832 _payload.SetContent(0x00);
yangcq88517 0:8e83b9448758 833
yangcq88517 9:0ce800923eda 834 while (content->GetMethod() == POST) {
yangcq88517 0:8e83b9448758 835 int length = content->GetContentLength();
yangcq88517 0:8e83b9448758 836
yangcq88517 3:90ea1b8b2621 837 char msb = length >> 8;
yangcq88517 0:8e83b9448758 838 if (chunked)
yangcq88517 0:8e83b9448758 839 msb |= 0x80;
yangcq88517 0:8e83b9448758 840 else msb &= 0x7F;
yangcq88517 0:8e83b9448758 841
yangcq88517 0:8e83b9448758 842 _payload.SetContent(msb);
yangcq88517 3:90ea1b8b2621 843 _payload.SetContent(length);
yangcq88517 0:8e83b9448758 844
yangcq88517 0:8e83b9448758 845 if (length > 0)
yangcq88517 0:8e83b9448758 846 _payload.SetContent(content->GetBody(), 0, length);
yangcq88517 0:8e83b9448758 847 }
yangcq88517 0:8e83b9448758 848
yangcq88517 0:8e83b9448758 849 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 850 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 851
yangcq88517 0:8e83b9448758 852 Send();
yangcq88517 0:8e83b9448758 853
yangcq88517 9:0ce800923eda 854 while (FrameReceive())
yangcq88517 9:0ce800923eda 855 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == _id) {
yangcq88517 9:0ce800923eda 856 _HTTPResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 857 return &_HTTPResponse;
yangcq88517 9:0ce800923eda 858 }
yangcq88517 1:fd19bd683e90 859
yangcq88517 1:fd19bd683e90 860 return NULL;
yangcq88517 0:8e83b9448758 861 }
yangcq88517 0:8e83b9448758 862
yangcq88517 0:8e83b9448758 863 HTTPResponse * MuRata::SNIC_SendHTTPMoreRequest(HTTPContent * content, const bool chunked)
yangcq88517 0:8e83b9448758 864 {
yangcq88517 0:8e83b9448758 865 _payload.Rewind();
yangcq88517 0:8e83b9448758 866 _payload.SetSubCommandID(SNIC_HTTP_MORE_REQ);
yangcq88517 0:8e83b9448758 867 _payload.SetFrameID(_payload.GetFrameID() + 1);
yangcq88517 0:8e83b9448758 868
yangcq88517 0:8e83b9448758 869 int length = content->GetContentLength();
yangcq88517 7:a71d7c24afc0 870 char msb = length;
yangcq88517 0:8e83b9448758 871 if (chunked)
yangcq88517 0:8e83b9448758 872 msb |= 0x80;
yangcq88517 0:8e83b9448758 873 else msb &= 0x7F;
yangcq88517 0:8e83b9448758 874
yangcq88517 0:8e83b9448758 875 _payload.SetContent(msb);
yangcq88517 7:a71d7c24afc0 876 _payload.SetContent(length);
yangcq88517 0:8e83b9448758 877
yangcq88517 0:8e83b9448758 878 if (length > 0)
yangcq88517 0:8e83b9448758 879 _payload.SetContent(content->GetBody(), 0, length);
yangcq88517 0:8e83b9448758 880
yangcq88517 0:8e83b9448758 881 _frame.SetCommandID(CMD_ID_SNIC);
yangcq88517 0:8e83b9448758 882 _frame.SetPayload(&_payload);
yangcq88517 0:8e83b9448758 883
yangcq88517 0:8e83b9448758 884 Send();
yangcq88517 0:8e83b9448758 885
yangcq88517 0:8e83b9448758 886 if (chunked)
yangcq88517 0:8e83b9448758 887 return NULL;
yangcq88517 0:8e83b9448758 888
yangcq88517 9:0ce800923eda 889 while (FrameReceive())
yangcq88517 9:0ce800923eda 890 if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_HTTP_MORE_REQ) {
yangcq88517 9:0ce800923eda 891 _HTTPResponse.SetPayload(&_payload);
yangcq88517 9:0ce800923eda 892 return &_HTTPResponse;
yangcq88517 9:0ce800923eda 893 }
yangcq88517 1:fd19bd683e90 894
yangcq88517 1:fd19bd683e90 895 return NULL;
yangcq88517 0:8e83b9448758 896 }
yangcq88517 0:8e83b9448758 897
yangcq88517 0:8e83b9448758 898 CreateSocketResponse * MuRata::SNIC_CreateAdvancedTLSTCP(const bool bind, IPAddress * localIP, const int localPort)
yangcq88517 0:8e83b9448758 899 {
yangcq88517 0:8e83b9448758 900 return SNIC_CreateSocket(SNIC_TCP_CREATE_ADV_TLS_SOCKET_REQ, bind, localIP, localPort);
yangcq88517 0:8e83b9448758 901 }
yangcq88517 0:8e83b9448758 902
yangcq88517 0:8e83b9448758 903 CreateSocketResponse * MuRata::SNIC_CreateSimpleTLSTCP(const bool bind, IPAddress * localIP, const int localPort)
yangcq88517 0:8e83b9448758 904 {
yangcq88517 0:8e83b9448758 905 return SNIC_CreateSocket(SNIC_TCP_CREAET_SIMPLE_TLS_SOCKET_REQ, bind, localIP, localPort);
yangcq88517 4:7388451219ee 906 }