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