CUSTOMIZED FOR WATER MONITOR
RecordWifiConf.cpp@0:51d7bdf88981, 2017-12-07 (annotated)
- Committer:
- DuyLionTran
- Date:
- Thu Dec 07 17:07:22 2017 +0000
- Revision:
- 0:51d7bdf88981
CUSTOMIZED FOR WATER MONITOR
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DuyLionTran | 0:51d7bdf88981 | 1 | /** |
DuyLionTran | 0:51d7bdf88981 | 2 | ****************************************************************************** |
DuyLionTran | 0:51d7bdf88981 | 3 | * @file RecordWifiConf.h |
DuyLionTran | 0:51d7bdf88981 | 4 | * @author ST / Central Labs |
DuyLionTran | 0:51d7bdf88981 | 5 | * @version V2.0.0 |
DuyLionTran | 0:51d7bdf88981 | 6 | * @date 28 Apr 2017 |
DuyLionTran | 0:51d7bdf88981 | 7 | * @brief {@link RecordMimeType} that contains a Wifi configuration data |
DuyLionTran | 0:51d7bdf88981 | 8 | ****************************************************************************** |
DuyLionTran | 0:51d7bdf88981 | 9 | * @attention |
DuyLionTran | 0:51d7bdf88981 | 10 | * |
DuyLionTran | 0:51d7bdf88981 | 11 | * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> |
DuyLionTran | 0:51d7bdf88981 | 12 | * |
DuyLionTran | 0:51d7bdf88981 | 13 | * Redistribution and use in source and binary forms, with or without modification, |
DuyLionTran | 0:51d7bdf88981 | 14 | * are permitted provided that the following conditions are met: |
DuyLionTran | 0:51d7bdf88981 | 15 | * 1. Redistributions of source code must retain the above copyright notice, |
DuyLionTran | 0:51d7bdf88981 | 16 | * this list of conditions and the following disclaimer. |
DuyLionTran | 0:51d7bdf88981 | 17 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
DuyLionTran | 0:51d7bdf88981 | 18 | * this list of conditions and the following disclaimer in the documentation |
DuyLionTran | 0:51d7bdf88981 | 19 | * and/or other materials provided with the distribution. |
DuyLionTran | 0:51d7bdf88981 | 20 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
DuyLionTran | 0:51d7bdf88981 | 21 | * may be used to endorse or promote products derived from this software |
DuyLionTran | 0:51d7bdf88981 | 22 | * without specific prior written permission. |
DuyLionTran | 0:51d7bdf88981 | 23 | * |
DuyLionTran | 0:51d7bdf88981 | 24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
DuyLionTran | 0:51d7bdf88981 | 25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
DuyLionTran | 0:51d7bdf88981 | 26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
DuyLionTran | 0:51d7bdf88981 | 27 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
DuyLionTran | 0:51d7bdf88981 | 28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
DuyLionTran | 0:51d7bdf88981 | 29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
DuyLionTran | 0:51d7bdf88981 | 30 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
DuyLionTran | 0:51d7bdf88981 | 31 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
DuyLionTran | 0:51d7bdf88981 | 32 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
DuyLionTran | 0:51d7bdf88981 | 33 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
DuyLionTran | 0:51d7bdf88981 | 34 | * |
DuyLionTran | 0:51d7bdf88981 | 35 | ****************************************************************************** |
DuyLionTran | 0:51d7bdf88981 | 36 | */ |
DuyLionTran | 0:51d7bdf88981 | 37 | #include <algorithm> |
DuyLionTran | 0:51d7bdf88981 | 38 | |
DuyLionTran | 0:51d7bdf88981 | 39 | #include <RecordWifiConf.h> |
DuyLionTran | 0:51d7bdf88981 | 40 | namespace NDefLib { |
DuyLionTran | 0:51d7bdf88981 | 41 | const std::string RecordWifiConf::sWifiConfMimeType("application/vnd.wfa.wsc"); |
DuyLionTran | 0:51d7bdf88981 | 42 | |
DuyLionTran | 0:51d7bdf88981 | 43 | const RecordWifiConf::fieldType_t RecordWifiConf::sCredentialField_id = 0x100E; |
DuyLionTran | 0:51d7bdf88981 | 44 | const RecordWifiConf::fieldType_t RecordWifiConf::sNetworkIdField_id = 0x1026; |
DuyLionTran | 0:51d7bdf88981 | 45 | const uint8_t RecordWifiConf::sDefaultNetworkId=0x01; |
DuyLionTran | 0:51d7bdf88981 | 46 | const RecordWifiConf::fieldType_t RecordWifiConf::sSsidField_id = 0x1045; |
DuyLionTran | 0:51d7bdf88981 | 47 | const RecordWifiConf::fieldType_t RecordWifiConf::sNetworkKeyField_id = 0x1027; |
DuyLionTran | 0:51d7bdf88981 | 48 | const RecordWifiConf::fieldType_t RecordWifiConf::sAuthTypeField_id = 0x1003; |
DuyLionTran | 0:51d7bdf88981 | 49 | const RecordWifiConf::fieldType_t RecordWifiConf::sEncTypeField_id = 0x100F; |
DuyLionTran | 0:51d7bdf88981 | 50 | |
DuyLionTran | 0:51d7bdf88981 | 51 | RecordWifiConf::RecordWifiConf(const std::string &ssid,const std::string &pass, authType_t authType,encryptionType_t encType): |
DuyLionTran | 0:51d7bdf88981 | 52 | RecordMimeType(sWifiConfMimeType), |
DuyLionTran | 0:51d7bdf88981 | 53 | mSsid(ssid), |
DuyLionTran | 0:51d7bdf88981 | 54 | mPasskey(pass), |
DuyLionTran | 0:51d7bdf88981 | 55 | mAuthType(authType), |
DuyLionTran | 0:51d7bdf88981 | 56 | mEncType(encType), |
DuyLionTran | 0:51d7bdf88981 | 57 | mContentIsChange(true), |
DuyLionTran | 0:51d7bdf88981 | 58 | mMimeData(NULL), |
DuyLionTran | 0:51d7bdf88981 | 59 | mMimeDataLenght(0) { |
DuyLionTran | 0:51d7bdf88981 | 60 | } |
DuyLionTran | 0:51d7bdf88981 | 61 | |
DuyLionTran | 0:51d7bdf88981 | 62 | /** |
DuyLionTran | 0:51d7bdf88981 | 63 | * move the data into the buffer swapping the byte order |
DuyLionTran | 0:51d7bdf88981 | 64 | * @param data data to write into the buffer |
DuyLionTran | 0:51d7bdf88981 | 65 | * @param outBuffer buffer where write the data |
DuyLionTran | 0:51d7bdf88981 | 66 | */ |
DuyLionTran | 0:51d7bdf88981 | 67 | template<typename T> |
DuyLionTran | 0:51d7bdf88981 | 68 | void writeBEFromLE(const T& data,uint8_t *outBuffer) { |
DuyLionTran | 0:51d7bdf88981 | 69 | uint8_t *buffer = (uint8_t*)&data; |
DuyLionTran | 0:51d7bdf88981 | 70 | std::reverse_copy(buffer,buffer+sizeof(T),outBuffer); |
DuyLionTran | 0:51d7bdf88981 | 71 | } |
DuyLionTran | 0:51d7bdf88981 | 72 | |
DuyLionTran | 0:51d7bdf88981 | 73 | template<typename T> |
DuyLionTran | 0:51d7bdf88981 | 74 | uint32_t RecordWifiConf::write_data_field(const fieldType_t& dataType,const T& data,uint8_t *buffer){ |
DuyLionTran | 0:51d7bdf88981 | 75 | uint32_t offset=0; |
DuyLionTran | 0:51d7bdf88981 | 76 | writeBEFromLE(dataType,buffer+offset); |
DuyLionTran | 0:51d7bdf88981 | 77 | offset+=sizeof(dataType); |
DuyLionTran | 0:51d7bdf88981 | 78 | const fieldLenght_t dataSize = sizeof(T); |
DuyLionTran | 0:51d7bdf88981 | 79 | writeBEFromLE(dataSize,buffer+offset); |
DuyLionTran | 0:51d7bdf88981 | 80 | offset+=sizeof(dataSize); |
DuyLionTran | 0:51d7bdf88981 | 81 | writeBEFromLE(data,buffer+offset); |
DuyLionTran | 0:51d7bdf88981 | 82 | return offset+dataSize; |
DuyLionTran | 0:51d7bdf88981 | 83 | } |
DuyLionTran | 0:51d7bdf88981 | 84 | |
DuyLionTran | 0:51d7bdf88981 | 85 | uint32_t RecordWifiConf::write_data_field(const fieldType_t& dataType, |
DuyLionTran | 0:51d7bdf88981 | 86 | const char *data,const fieldLenght_t& size, uint8_t *buffer){ |
DuyLionTran | 0:51d7bdf88981 | 87 | uint32_t offset=0; |
DuyLionTran | 0:51d7bdf88981 | 88 | writeBEFromLE(dataType,buffer+offset); |
DuyLionTran | 0:51d7bdf88981 | 89 | offset+=sizeof(dataType);; |
DuyLionTran | 0:51d7bdf88981 | 90 | writeBEFromLE(size,buffer+offset); |
DuyLionTran | 0:51d7bdf88981 | 91 | offset+=sizeof(size); |
DuyLionTran | 0:51d7bdf88981 | 92 | if (data!=NULL || size!=0) { |
DuyLionTran | 0:51d7bdf88981 | 93 | std::memcpy(buffer+offset,data,size); |
DuyLionTran | 0:51d7bdf88981 | 94 | } |
DuyLionTran | 0:51d7bdf88981 | 95 | return offset+size; |
DuyLionTran | 0:51d7bdf88981 | 96 | } |
DuyLionTran | 0:51d7bdf88981 | 97 | |
DuyLionTran | 0:51d7bdf88981 | 98 | void RecordWifiConf::update_mime_data(){ |
DuyLionTran | 0:51d7bdf88981 | 99 | if (!mContentIsChange) { |
DuyLionTran | 0:51d7bdf88981 | 100 | return; |
DuyLionTran | 0:51d7bdf88981 | 101 | } |
DuyLionTran | 0:51d7bdf88981 | 102 | |
DuyLionTran | 0:51d7bdf88981 | 103 | mMimeDataLenght = sizeof(sCredentialField_id)+sizeof(fieldLenght_t)+ |
DuyLionTran | 0:51d7bdf88981 | 104 | sizeof(sNetworkIdField_id)+sizeof(fieldLenght_t)+sizeof(sDefaultNetworkId)+ |
DuyLionTran | 0:51d7bdf88981 | 105 | sizeof(sSsidField_id)+sizeof(fieldLenght_t)+mSsid.length()+ |
DuyLionTran | 0:51d7bdf88981 | 106 | sizeof(sNetworkKeyField_id)+sizeof(fieldLenght_t)+mPasskey.length()+ |
DuyLionTran | 0:51d7bdf88981 | 107 | sizeof(sAuthTypeField_id)+sizeof(fieldLenght_t)+2+ |
DuyLionTran | 0:51d7bdf88981 | 108 | sizeof(sEncTypeField_id)+sizeof(fieldLenght_t)+2; |
DuyLionTran | 0:51d7bdf88981 | 109 | |
DuyLionTran | 0:51d7bdf88981 | 110 | if (mMimeData!=NULL) { |
DuyLionTran | 0:51d7bdf88981 | 111 | delete [] mMimeData; |
DuyLionTran | 0:51d7bdf88981 | 112 | } |
DuyLionTran | 0:51d7bdf88981 | 113 | |
DuyLionTran | 0:51d7bdf88981 | 114 | mMimeData = new uint8_t[mMimeDataLenght]; |
DuyLionTran | 0:51d7bdf88981 | 115 | |
DuyLionTran | 0:51d7bdf88981 | 116 | uint32_t writeOffset=0; |
DuyLionTran | 0:51d7bdf88981 | 117 | writeBEFromLE(sCredentialField_id,mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 118 | writeOffset+=sizeof(sCredentialField_id); |
DuyLionTran | 0:51d7bdf88981 | 119 | writeBEFromLE((fieldLenght_t)(mMimeDataLenght-4),mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 120 | writeOffset+=sizeof(fieldLenght_t); |
DuyLionTran | 0:51d7bdf88981 | 121 | |
DuyLionTran | 0:51d7bdf88981 | 122 | writeOffset += write_data_field(sNetworkIdField_id,sDefaultNetworkId,mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 123 | fieldLenght_t tempLength = (fieldLenght_t)sizeof(std::string::value_type)*mSsid.length(); |
DuyLionTran | 0:51d7bdf88981 | 124 | writeOffset += write_data_field(sSsidField_id,mSsid.data(),tempLength,mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 125 | writeOffset += write_data_field(sAuthTypeField_id,(int16_t)mAuthType,mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 126 | writeOffset += write_data_field(sEncTypeField_id,(int16_t)mEncType,mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 127 | tempLength = (fieldLenght_t)sizeof(std::string::value_type)*mPasskey.length(); |
DuyLionTran | 0:51d7bdf88981 | 128 | writeOffset += write_data_field(sNetworkKeyField_id,mPasskey.data(),tempLength,mMimeData+writeOffset); |
DuyLionTran | 0:51d7bdf88981 | 129 | |
DuyLionTran | 0:51d7bdf88981 | 130 | set_mime_data_pointer(mMimeData,mMimeDataLenght); |
DuyLionTran | 0:51d7bdf88981 | 131 | mContentIsChange=false; |
DuyLionTran | 0:51d7bdf88981 | 132 | } |
DuyLionTran | 0:51d7bdf88981 | 133 | |
DuyLionTran | 0:51d7bdf88981 | 134 | /** |
DuyLionTran | 0:51d7bdf88981 | 135 | * Read a data from a buffer, where the buffer is in little endian and we are in |
DuyLionTran | 0:51d7bdf88981 | 136 | * a big endian system |
DuyLionTran | 0:51d7bdf88981 | 137 | * @param buffer buffer where read the data |
DuyLionTran | 0:51d7bdf88981 | 138 | * @param out pointer to the variable where store the read data |
DuyLionTran | 0:51d7bdf88981 | 139 | */ |
DuyLionTran | 0:51d7bdf88981 | 140 | template<typename T> |
DuyLionTran | 0:51d7bdf88981 | 141 | void readLEFromBE(const uint8_t *const buffer,T* out){ |
DuyLionTran | 0:51d7bdf88981 | 142 | const uint32_t typeSize = sizeof(T); |
DuyLionTran | 0:51d7bdf88981 | 143 | uint8_t *outBuffer = (uint8_t*)out; |
DuyLionTran | 0:51d7bdf88981 | 144 | std::reverse_copy(buffer,buffer+typeSize,outBuffer); |
DuyLionTran | 0:51d7bdf88981 | 145 | } |
DuyLionTran | 0:51d7bdf88981 | 146 | |
DuyLionTran | 0:51d7bdf88981 | 147 | /** |
DuyLionTran | 0:51d7bdf88981 | 148 | * Create a RecordWifiConf reading the data from the buffer. |
DuyLionTran | 0:51d7bdf88981 | 149 | * @param header Record header. |
DuyLionTran | 0:51d7bdf88981 | 150 | * @param buffer Buffer to read the data from. |
DuyLionTran | 0:51d7bdf88981 | 151 | * @return an object of type RecordVCard or NULL |
DuyLionTran | 0:51d7bdf88981 | 152 | * @par User is in charge of freeing the pointer returned by this function. |
DuyLionTran | 0:51d7bdf88981 | 153 | */ |
DuyLionTran | 0:51d7bdf88981 | 154 | RecordWifiConf* RecordWifiConf::parse(const RecordHeader &header, const uint8_t* buffer){ |
DuyLionTran | 0:51d7bdf88981 | 155 | if (header.get_FNT() != RecordHeader::Mime_media_type || header.get_type_length() != sWifiConfMimeType.size()) { |
DuyLionTran | 0:51d7bdf88981 | 156 | return NULL; |
DuyLionTran | 0:51d7bdf88981 | 157 | } |
DuyLionTran | 0:51d7bdf88981 | 158 | |
DuyLionTran | 0:51d7bdf88981 | 159 | if (sWifiConfMimeType.compare(0, sWifiConfMimeType.size(), (const char*) buffer, sWifiConfMimeType.size()) != 0) { |
DuyLionTran | 0:51d7bdf88981 | 160 | return NULL; |
DuyLionTran | 0:51d7bdf88981 | 161 | } |
DuyLionTran | 0:51d7bdf88981 | 162 | |
DuyLionTran | 0:51d7bdf88981 | 163 | buffer += header.get_type_length(); |
DuyLionTran | 0:51d7bdf88981 | 164 | buffer += header.get_id_length(); |
DuyLionTran | 0:51d7bdf88981 | 165 | |
DuyLionTran | 0:51d7bdf88981 | 166 | fieldType_t type; |
DuyLionTran | 0:51d7bdf88981 | 167 | fieldLenght_t dataLength; |
DuyLionTran | 0:51d7bdf88981 | 168 | |
DuyLionTran | 0:51d7bdf88981 | 169 | readLEFromBE(buffer,&type); |
DuyLionTran | 0:51d7bdf88981 | 170 | buffer+=sizeof(fieldType_t); |
DuyLionTran | 0:51d7bdf88981 | 171 | readLEFromBE(buffer,&dataLength); |
DuyLionTran | 0:51d7bdf88981 | 172 | buffer+=sizeof(fieldLenght_t); |
DuyLionTran | 0:51d7bdf88981 | 173 | |
DuyLionTran | 0:51d7bdf88981 | 174 | if(type!=sCredentialField_id) { |
DuyLionTran | 0:51d7bdf88981 | 175 | return NULL; |
DuyLionTran | 0:51d7bdf88981 | 176 | } |
DuyLionTran | 0:51d7bdf88981 | 177 | |
DuyLionTran | 0:51d7bdf88981 | 178 | std::string ssid; |
DuyLionTran | 0:51d7bdf88981 | 179 | std::string pass; |
DuyLionTran | 0:51d7bdf88981 | 180 | authType_t authType=AUTH_OPEN; |
DuyLionTran | 0:51d7bdf88981 | 181 | encryptionType_t encType=ENC_TYPE_NONE; |
DuyLionTran | 0:51d7bdf88981 | 182 | uint16_t enumValue; |
DuyLionTran | 0:51d7bdf88981 | 183 | fieldLenght_t readData=0; |
DuyLionTran | 0:51d7bdf88981 | 184 | while (readData!=dataLength) { |
DuyLionTran | 0:51d7bdf88981 | 185 | readLEFromBE(buffer+readData,&type); |
DuyLionTran | 0:51d7bdf88981 | 186 | readData+=sizeof(fieldType_t); |
DuyLionTran | 0:51d7bdf88981 | 187 | fieldLenght_t length; |
DuyLionTran | 0:51d7bdf88981 | 188 | readLEFromBE(buffer+readData,&length); |
DuyLionTran | 0:51d7bdf88981 | 189 | readData+=sizeof(fieldLenght_t); |
DuyLionTran | 0:51d7bdf88981 | 190 | |
DuyLionTran | 0:51d7bdf88981 | 191 | switch(type) { |
DuyLionTran | 0:51d7bdf88981 | 192 | case sSsidField_id: { |
DuyLionTran | 0:51d7bdf88981 | 193 | ssid.insert(0,(const char*)buffer+readData,length); |
DuyLionTran | 0:51d7bdf88981 | 194 | break; |
DuyLionTran | 0:51d7bdf88981 | 195 | } |
DuyLionTran | 0:51d7bdf88981 | 196 | case sNetworkKeyField_id: { |
DuyLionTran | 0:51d7bdf88981 | 197 | pass.insert(0,(const char*)buffer+readData,length); |
DuyLionTran | 0:51d7bdf88981 | 198 | break; |
DuyLionTran | 0:51d7bdf88981 | 199 | } |
DuyLionTran | 0:51d7bdf88981 | 200 | case sAuthTypeField_id: { |
DuyLionTran | 0:51d7bdf88981 | 201 | readLEFromBE(buffer+readData,&enumValue); |
DuyLionTran | 0:51d7bdf88981 | 202 | authType = (authType_t)enumValue; |
DuyLionTran | 0:51d7bdf88981 | 203 | break; |
DuyLionTran | 0:51d7bdf88981 | 204 | } |
DuyLionTran | 0:51d7bdf88981 | 205 | case sEncTypeField_id: { |
DuyLionTran | 0:51d7bdf88981 | 206 | readLEFromBE(buffer+readData,&enumValue); |
DuyLionTran | 0:51d7bdf88981 | 207 | encType = (encryptionType_t)enumValue; |
DuyLionTran | 0:51d7bdf88981 | 208 | break; |
DuyLionTran | 0:51d7bdf88981 | 209 | } |
DuyLionTran | 0:51d7bdf88981 | 210 | } |
DuyLionTran | 0:51d7bdf88981 | 211 | |
DuyLionTran | 0:51d7bdf88981 | 212 | readData+=length; |
DuyLionTran | 0:51d7bdf88981 | 213 | } |
DuyLionTran | 0:51d7bdf88981 | 214 | |
DuyLionTran | 0:51d7bdf88981 | 215 | return new RecordWifiConf(ssid,pass,authType,encType); |
DuyLionTran | 0:51d7bdf88981 | 216 | }//parse |
DuyLionTran | 0:51d7bdf88981 | 217 | |
DuyLionTran | 0:51d7bdf88981 | 218 | } |
DuyLionTran | 0:51d7bdf88981 | 219 | |
DuyLionTran | 0:51d7bdf88981 | 220 | |
DuyLionTran | 0:51d7bdf88981 | 221 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |