├── README.md ├── doc ├── WisLink-Cellular-RAK2011-Product-Brief.pdf └── WisLink-Cellular-RAK2011-User-Manual.pdf ├── examples ├── AT_Debug │ └── AT_Debug.ino ├── GNSS │ └── GNSS.ino ├── HTTPS_Client │ └── HTTPS_Client.ino ├── HTTP_Client │ └── HTTP_Client.ino ├── MQTTS_Client │ └── MQTTS_Client.ino ├── MQTT_Client │ └── MQTT_Client.ino ├── SSL_Client │ └── SSL_Client.ino ├── TCP_Client │ └── TCP_Client.ino └── TCP_Sever │ └── TCP_Sever.ino ├── keywords.txt ├── library.properties └── src ├── WisLTEBG96ATCommand.h ├── WisLTEBG96Common.cpp ├── WisLTEBG96Common.h ├── WisLTEBG96FILE.cpp ├── WisLTEBG96FILE.h ├── WisLTEBG96GNSS.cpp ├── WisLTEBG96GNSS.h ├── WisLTEBG96HTTP.cpp ├── WisLTEBG96HTTP.h ├── WisLTEBG96MQTT.cpp ├── WisLTEBG96MQTT.h ├── WisLTEBG96SSL.cpp ├── WisLTEBG96SSL.h ├── WisLTEBG96Serial.cpp ├── WisLTEBG96Serial.h ├── WisLTEBG96TCPIP.cpp └── WisLTEBG96TCPIP.h /README.md: -------------------------------------------------------------------------------- 1 | # WisLTE_Arduino 2 | 3 | This library is an Arduino library written based on the BG96 module, which includes functions such as TCP, HTTP, SSL, MQTT, and GNSS. 4 | 5 | ### 1. Modify the development model 6 | This library is compatible with two development versions of WisLTE and WisCellular based on BG96 module from RAK. The user can modify the macro definition in the `/src/WisLTEBG96Common.h` file to adapt to the corresponding development version. `#define WISCELLULAR_BOARD` or `#define WISLTE_BOARD` 7 | 8 | ### 2. Turn Debug on or off 9 | If necessary, the user can open or close the Debug serial port in the `/src/WisLTEBG96Serial.h` file to check the interaction between the device and the master. `#define UART_DEBUG` 10 | 11 | ### 3. Increase RX Buffer 12 | Since RX Buffer is set to 256 in order to apply Arduino UNO, RX Buffer can be set to 1024 or higher if the user's main control space is sufficient. 13 | The user can set the value of RX_BUFFER_LENGTH in the `src/WisLTEBG96Serial.h` file. `#define RX_BUFFER_LENGTH 256` -------------------------------------------------------------------------------- /doc/WisLink-Cellular-RAK2011-Product-Brief.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RAKWireless/WisLTE_Arduino/1c4f6b41602b8efa08de428e9d9377a5dcf1ff28/doc/WisLink-Cellular-RAK2011-Product-Brief.pdf -------------------------------------------------------------------------------- /doc/WisLink-Cellular-RAK2011-User-Manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RAKWireless/WisLTE_Arduino/1c4f6b41602b8efa08de428e9d9377a5dcf1ff28/doc/WisLink-Cellular-RAK2011-User-Manual.pdf -------------------------------------------------------------------------------- /examples/AT_Debug/AT_Debug.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include "WisLTEBG96Serial.h" 4 | #include "SoftwareSerial.h" 5 | 6 | #define DSerial Serial1 7 | #define ATSerial Serial 8 | //#define AT_TX_PIN 11 9 | //#define AT_RX_PIN 10 10 | //SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 11 | 12 | WisLTEBG96Serial WisLTE(ATSerial, DSerial); 13 | 14 | void setup(){ 15 | DSerial.begin(115200); 16 | while(DSerial.read() >= 0); 17 | DSerial.println("This is the WisLTE Debug Serial!"); 18 | delay(1000); 19 | 20 | ATSerial.begin(115200); 21 | } 22 | 23 | void loop(){ 24 | WisLTE.AT_bypass(); 25 | } -------------------------------------------------------------------------------- /examples/GNSS/GNSS.ino: -------------------------------------------------------------------------------- 1 | 2 | #include "WisLTEBG96GNSS.h" 3 | #include "SoftwareSerial.h" 4 | 5 | #define DSerial Serial1 6 | #define ATSerial Serial 7 | // #define AT_TX_PIN 11 8 | // #define AT_RX_PIN 10 9 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 10 | 11 | GNSS_Work_Mode_t mode = STAND_ALONE; 12 | 13 | WisLTEBG96GNSS WisLTE(ATSerial, DSerial); 14 | 15 | void setup(){ 16 | DSerial.begin(115200); 17 | while (DSerial.read() >= 0); 18 | DSerial.println("This is the WisLTE Debug Serial!"); 19 | delay(1000); 20 | ATSerial.begin(115200); 21 | while (ATSerial.read() >= 0); 22 | delay(1000); 23 | while(!WisLTE.InitModule()); 24 | 25 | WisLTE.SetDevCommandEcho(false); 26 | 27 | const char inf[64]; 28 | if(WisLTE.GetDevInformation(inf)){ 29 | DSerial.println(inf); 30 | } 31 | 32 | while (!WisLTE.TurnOnGNSS(mode, WRITE_MODE)){ 33 | DSerial.println("\r\nOpen the GNSS Function Fali!"); 34 | if(WisLTE.TurnOnGNSS(mode, READ_MODE)){ 35 | DSerial.println("\r\nThe GNSS Function is Opened!"); 36 | WisLTE.TurnOffGNSS(); 37 | } 38 | } 39 | DSerial.println("\r\nOpen the GNSS Function Success!"); 40 | } 41 | 42 | void loop(){ 43 | const char gnss_posi[128]; 44 | while (!WisLTE.GetGNSSPositionInformation(gnss_posi)){ 45 | DSerial.println("\r\nGet the GNSS Position Fail!"); 46 | int e_code; 47 | if (WisLTE.returnErrorCode(e_code)){ 48 | DSerial.print("\r\nERROR CODE: "); 49 | DSerial.println(e_code); 50 | DSerial.println("Please check the documentation for error details."); 51 | } 52 | delay(5000); 53 | } 54 | DSerial.println("\r\nGet the GNSS Position Success!"); 55 | DSerial.println(gnss_posi); 56 | } -------------------------------------------------------------------------------- /examples/HTTPS_Client/HTTPS_Client.ino: -------------------------------------------------------------------------------- 1 | 2 | #include "WisLTEBG96HTTP.h" 3 | #include "SoftwareSerial.h" 4 | 5 | #define DSerial Serial1 6 | #define ATSerial Serial 7 | // #define AT_TX_PIN 11 8 | // #define AT_RX_PIN 10 9 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 10 | 11 | //#define USE_CERT 12 | #ifdef USE_CERT 13 | /* Fill your certificate.pem.root CA wiht LINE ENDING */ 14 | const char pem_CA[] = {"-----BEGIN CERTIFICATE-----\n\ 15 | MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n\ 16 | yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n\ 17 | ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n\ 18 | U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n\ 19 | ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n\ 20 | aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\n\ 21 | MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\n\ 22 | ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\n\ 23 | biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\n\ 24 | U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\n\ 25 | aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\n\ 26 | nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\n\ 27 | t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\n\ 28 | SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\n\ 29 | BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\n\ 30 | rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\n\ 31 | NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\n\ 32 | BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\n\ 33 | BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\n\ 34 | aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\n\ 35 | MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\n\ 36 | p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\n\ 37 | 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\n\ 38 | WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\n\ 39 | 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\n\ 40 | hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n\ 41 | -----END CERTIFICATE-----\n"}; 42 | 43 | /* Fill your certificate.pem.crt wiht LINE ENDING */ 44 | const char pem_cert[] = {"-----BEGIN CERTIFICATE-----\n\ 45 | MIIDWjCCAkKgAwIBAgIVAPO/jH+GepSZxWRtbVnZ5WEjmF1MMA0GCSqGSIb3DQEB\n\ 46 | CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t\n\ 47 | IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0xODAxMjIwNjQ2\n\ 48 | MjdaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh\n\ 49 | dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0JqFo3Dg5wUj2PBAm\n\ 50 | tvCvJLw7E1Nn/J5JrEP5g7M7YCVIv2WCmAXAR5YrPct7h0rOD7h9JG4K93koDK03\n\ 51 | 0u/WsqddSMedGObRqR7MSCdeAtBGKY9vrThCAQiOvl1LlmCZdyaEv5ukGUHYAGQf\n\ 52 | DCfjDvg6K4t9LTocyE2SHISv7zE1E/tHDmjZ7ups7ewE7h+35Ce9bL5tFKun2oEH\n\ 53 | 4COwJFrHj8RXObXPQYFEQ1x7YbshYkjs4HXT/cKmGXGz/2kAOSPejDFdxC4Larxw\n\ 54 | Eoz6xepjjiOXOZ5w7w1M/4/LnwJl/tbGLEU+azU47n4bT3GtscbX+ddisRJ65gN2\n\ 55 | 7wPHAgMBAAGjYDBeMB8GA1UdIwQYMBaAFDZV+0LrRJWxMz0PBDhwYV57/i65MB0G\n\ 56 | A1UdDgQWBBTBStT4wV7A6mkr3o6wLjyhhsmjvDAMBgNVHRMBAf8EAjAAMA4GA1Ud\n\ 57 | DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAxXJMJvQBtbgv+wKisaVXtgph\n\ 58 | cuf+jtk5/N04jq7oZDkeH4+jqHmYN+mh8xS7UbnQGRl6B5ftcXIYM/Uxjb46Jhtg\n\ 59 | HnQODB6cdbb780nxT5YOQA3EcZBndhe1hBC44qICOPCp3RejGmV43EYgLzJh/wtp\n\ 60 | 8yNvIEXi4t+rDP+JI7RgrgF2QlYsDYAQlr9a5JFzlLESzFanpN6PNu4/xVIO0LgI\n\ 61 | OnccrxQc5ZLcHKkze7OhjGFbmuXI9ljg/FDIXInveTV4OSQa14IfijLiZ9j5RV0o\n\ 62 | j0ansu6HbBIlwzq8ltWXfOqpAGm+YW2ukd5kKguvQHU24Tb1k2gXhHvv3mNRBA==\n\ 63 | -----END CERTIFICATE-----\n"}; 64 | 65 | /* Fill your private.pem.key wiht LINE ENDING */ 66 | const char pem_pkey[] = {"-----BEGIN RSA PRIVATE KEY-----\n\ 67 | MIIEpAIBAAKCAQEA9CahaNw4OcFI9jwQJrbwryS8OxNTZ/yeSaxD+YOzO2AlSL9l\n\ 68 | gpgFwEeWKz3Le4dKzg+4fSRuCvd5KAytN9Lv1rKnXUjHnRjm0akezEgnXgLQRimP\n\ 69 | b604QgEIjr5dS5ZgmXcmhL+bpBlB2ABkHwwn4w74OiuLfS06HMhNkhyEr+8xNRP7\n\ 70 | Rw5o2e7qbO3sBO4ft+QnvWy+bRSrp9qBB+AjsCRax4/EVzm1z0GBRENce2G7IWJI\n\ 71 | 7OB10/3Cphlxs/9pADkj3owxXcQuC2q8cBKM+sXqY44jlzmecO8NTP+Py58CZf7W\n\ 72 | xixFPms1OO5+G09xrbHG1/nXYrESeuYDdu8DxwIDAQABAoIBAFWjp0Js3JwFnF4i\n\ 73 | u1eZG9uTeyMNqFf1WGBnOICxHZFaLDnUSPsB8CJ9+cK5LkLqNecJxKDAwoi+PZU6\n\ 74 | vRezucUJbYNfIAWO0ogAVnk5ZfWn7v5tXY7Cp9UfH61SQM9etAugq7Ysr59j7KCj\n\ 75 | onrxfJw8h/1/gLIrxxKJgAwcTL6Y7LoN2oAv7qKCYtkYHVfCPeDLhjbBjuAKKP7Q\n\ 76 | t8zzVgc5Gvfe76A12oN//xaZlLI73OxMPtW5MfW718BqFcZLJzScfaY2//YiLN0F\n\ 77 | Iiccj+fZDcXPEvRaUludLZNPg2c7LO23Efn5HK66A8KJysOanfh+VBL/qdpFMCGY\n\ 78 | BXUwvOECgYEA+u084LcL0WX0TVKue+D0cBuJ4irLd3xxFOdEsVwRaeaFUQ5W9dDP\n\ 79 | PMCfgxE3a7gUPCKy7gnWTNvahudK0SqrbguTsYI4jNGpDRPkDI445KD85GAAsFBx\n\ 80 | 3nbEeG1EB3DAbmIJr1Pfpi+6imXom61Po0oftBBnmyi3G1c74VQF/BsCgYEA+RZS\n\ 81 | cVA9OdY722HX2AVVQJIi3mz99QEFIX/A0AJHaNIjlFYtXUG2CQ5WanWW4lUXmyU/\n\ 82 | d7rngfACp4qUeLWBn0jiW+ylLi28ZIzzyXLE9ISgeDIA5wK+8cHHDgfmZjPz9T9K\n\ 83 | o6u6Wb9H6hJwELJFdP9AgVNPzyiou69x7Zq2OcUCgYEAzoNLdCISHt9LBgxDP/7v\n\ 84 | DgkMHNBdrlQDeVGw7ks4pbCsDf7AQQT+WiCp5yPXOddBCBECs/fyoETc/+QBZk44\n\ 85 | 0pPClPf4dKTk/bdeG5s9ZaS9HXOJfZJndNDId9htgbYhGXekQuDDkzF61AZ1PxKP\n\ 86 | FXOezgImUsNal6zewl71ofsCgYAfs6SYgWLZepexqzlCaCNajX7cmjiUNyYFBnJu\n\ 87 | xut5vs0Ccxlg9h0J+AYtlHu4oKXZfBsgzOvsELT1x+BvoII32Jneoza+stl4Xqwk\n\ 88 | ZnQEvuCBi7OrsyDEOipwcbb0KQaSnxSL0i5sf7jSZLhYl6fZZSc7jnPo5L7c7E5u\n\ 89 | tDMfFQKBgQDIhY+A7xWXobtOQyaquT2IdyR3JSFfJwahLUc65nV0s582l8le+xuy\n\ 90 | ulCy291puJc1WkGr+vswMD/B2kJv61TdoxxBa2lBdwd+/RZlmuqp9iO9MHsi7oTV\n\ 91 | Y51odhXBpRYjDNieOsKEsX/xPUvUtNLJDeurI5KNr+e5dHADwvo2Jg==\n\ 92 | -----END RSA PRIVATE KEY-----\n"}; 93 | #endif 94 | const char APN[] = "UNINET"; 95 | const char http_url[] = "https://raw.githubusercontent.com/RAKWireless/RAK811_LoRaButton/master/README.md"; 96 | unsigned int comm_pdp_index = 1; // The range is 1 ~ 16 97 | unsigned int comm_ssl_index = 1; // The range if 0 ~ 5 98 | HTTP_Body_Data_Type_t http_type = APPLICATION_X_WWW_FORM_URLENCODED; 99 | 100 | WisLTEBG96HTTP WisLTE(ATSerial, DSerial); 101 | 102 | void setup(){ 103 | DSerial.begin(115200); 104 | while (DSerial.read() >= 0); 105 | DSerial.println("This is the WisLTE Debug Serial!"); 106 | delay(1000); 107 | ATSerial.begin(115200); 108 | while (ATSerial.read() >= 0); 109 | delay(1000); 110 | while(!WisLTE.InitModule()); 111 | 112 | WisLTE.SetDevCommandEcho(false); 113 | 114 | char inf[64]; 115 | if(WisLTE.GetDevInformation(inf)){ 116 | DSerial.println(inf); 117 | } 118 | 119 | char apn_error[64]; 120 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 121 | DSerial.println(apn_error); 122 | } 123 | DSerial.println(apn_error); 124 | #ifdef USE_CERT 125 | char ssl_error[128]; 126 | while(!WisLTE.InitSSL(comm_ssl_index, pem_CA, pem_cert, pem_pkey, ssl_error)){ 127 | DSerial.println(ssl_error); 128 | } 129 | DSerial.println(ssl_error); 130 | #else 131 | char ssl_error[128]; 132 | while(!WisLTE.InitSSL(comm_ssl_index, "", "", "", ssl_error)){ 133 | DSerial.println(ssl_error); 134 | } 135 | DSerial.println(ssl_error); 136 | #endif 137 | while(!WisLTE.SetHTTPConfigParameters(comm_pdp_index, false, false, http_type)){ 138 | DSerial.println("\r\nConfig the HTTP Parameter Fail!"); 139 | int e_code; 140 | if (WisLTE.returnErrorCode(e_code)){ 141 | DSerial.print("\r\nERROR CODE: "); 142 | DSerial.println(e_code); 143 | DSerial.println("Please check the documentation for error details."); 144 | while(1); 145 | } 146 | } 147 | DSerial.println("\r\nConfig the HTTP Parameter Success!"); 148 | 149 | while(!WisLTE.SetHTTPEnableSSL(comm_ssl_index)){ 150 | DSerial.println("\r\nEnable the SSL Fail!"); 151 | int e_code; 152 | if (WisLTE.returnErrorCode(e_code)){ 153 | DSerial.print("\r\nERROR CODE: "); 154 | DSerial.println(e_code); 155 | DSerial.println("Please check the documentation for error details."); 156 | while(1); 157 | } 158 | } 159 | DSerial.println("\r\nEnable the SSL Success!"); 160 | 161 | while(!WisLTE.HTTPURL(http_url, WRITE_MODE)){ 162 | DSerial.println("\r\nSet the HTTP URL Fail!"); 163 | int e_code; 164 | if (WisLTE.returnErrorCode(e_code)){ 165 | DSerial.print("\r\nERROR CODE: "); 166 | DSerial.println(e_code); 167 | DSerial.println("Please check the documentation for error details."); 168 | while(1); 169 | } 170 | } 171 | DSerial.println("\r\Set the HTTP URL Success!"); 172 | } 173 | 174 | void loop(){ 175 | //const char recv_file[] = "http_read.txt"; 176 | char recv_data[128]; 177 | if(!WisLTE.HTTPGET(80)){ 178 | DSerial.println("\r\nHTTP GET Success!"); 179 | int e_code; 180 | if (WisLTE.returnErrorCode(e_code)){ 181 | DSerial.print("\r\nERROR CODE: "); 182 | DSerial.println(e_code); 183 | DSerial.println("Please check the documentation for error details."); 184 | while(1); 185 | } 186 | } 187 | DSerial.println("\r\nHTTP GET Success!"); 188 | 189 | // if(WisLTE.HTTPReadToFile(recv_file, 80)){ 190 | // DSerial.println("\r\nHTTP Read to File Success!"); 191 | // } 192 | if(WisLTE.HTTPRead(recv_data, 80)){ 193 | DSerial.println("\r\nHTTP Read Success!"); 194 | DSerial.println(""); 195 | DSerial.println(recv_data); 196 | DSerial.println(""); 197 | } 198 | while(1); 199 | } -------------------------------------------------------------------------------- /examples/HTTP_Client/HTTP_Client.ino: -------------------------------------------------------------------------------- 1 | 2 | #include "WisLTEBG96HTTP.h" 3 | #include "SoftwareSerial.h" 4 | 5 | #define DSerial Serial1 6 | #define ATSerial Serial 7 | // #define AT_TX_PIN 11 8 | // #define AT_RX_PIN 10 9 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 10 | 11 | const char APN[] = "hologram"; 12 | const char http_url[] = "http://www.baidu.com"; //"http://app.tongxinmao.com:89/app/api/ip"; 13 | unsigned int comm_pdp_index = 1; // The range is 1 ~ 16 14 | HTTP_Body_Data_Type_t http_type = APPLICATION_X_WWW_FORM_URLENCODED; 15 | 16 | WisLTEBG96HTTP WisLTE(ATSerial, DSerial); 17 | 18 | void setup(){ 19 | DSerial.begin(115200); 20 | while (DSerial.read() >= 0); 21 | DSerial.println("This is the WisLTE Debug Serial!"); 22 | delay(1000); 23 | ATSerial.begin(115200); 24 | while (ATSerial.read() >= 0); 25 | delay(1000); 26 | while(!WisLTE.InitModule()); 27 | 28 | WisLTE.SetDevCommandEcho(false); 29 | 30 | char inf[64]; 31 | if(WisLTE.GetDevInformation(inf)){ 32 | DSerial.println(inf); 33 | } 34 | 35 | char apn_error[64]; 36 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 37 | DSerial.println(apn_error); 38 | } 39 | DSerial.println(apn_error); 40 | 41 | while(!WisLTE.SetHTTPConfigParameters(comm_pdp_index, false, false, http_type)){ 42 | DSerial.println("\r\nConfig the HTTP Parameter Fail!"); 43 | int e_code; 44 | if (WisLTE.returnErrorCode(e_code)){ 45 | DSerial.print("\r\nERROR CODE: "); 46 | DSerial.println(e_code); 47 | DSerial.println("Please check the documentation for error details."); 48 | while(1); 49 | } 50 | } 51 | DSerial.println("\r\nConfig the HTTP Parameter Success!"); 52 | 53 | while(!WisLTE.HTTPURL(http_url, WRITE_MODE)){ 54 | DSerial.println("\r\Set the HTTP URL Fail!"); 55 | int e_code; 56 | if (WisLTE.returnErrorCode(e_code)){ 57 | DSerial.print("\r\nERROR CODE: "); 58 | DSerial.println(e_code); 59 | DSerial.println("Please check the documentation for error details."); 60 | while(1); 61 | } 62 | } 63 | DSerial.println("\r\Set the HTTP URL Success!"); 64 | } 65 | 66 | void loop(){ 67 | const char recv_file[] = "http_read.txt"; 68 | // char recv_data[128]; 69 | if(!WisLTE.HTTPGET(80)){ 70 | DSerial.println("\r\nHTTP GET Success!"); 71 | int e_code; 72 | if (WisLTE.returnErrorCode(e_code)){ 73 | DSerial.print("\r\nERROR CODE: "); 74 | DSerial.println(e_code); 75 | DSerial.println("Please check the documentation for error details."); 76 | while(1); 77 | } 78 | } 79 | DSerial.println("\r\nHTTP GET Success!"); 80 | 81 | if(WisLTE.HTTPReadToFile(recv_file, 80)){ 82 | DSerial.println("\r\nHTTP Read to File Success!"); 83 | } 84 | // if(WisLTE.HTTPRead(recv_data, 80)){ 85 | // DSerial.println("\r\nHTTP Read Success!"); 86 | // DSerial.println(""); 87 | // DSerial.println(recv_data); 88 | // DSerial.println(""); 89 | // } 90 | while(1); 91 | } -------------------------------------------------------------------------------- /examples/MQTTS_Client/MQTTS_Client.ino: -------------------------------------------------------------------------------- 1 | 2 | #include "WisLTEBG96MQTT.h" 3 | #include "SoftwareSerial.h" 4 | 5 | #define DSerial Serial1 6 | #define ATSerial Serial 7 | // #define AT_TX_PIN 11 8 | // #define AT_RX_PIN 10 9 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 10 | 11 | //#define USE_CERT 12 | #ifdef USE_CERT 13 | /* Fill your certificate.pem.root CA wiht LINE ENDING */ 14 | const char pem_CA[] = {"-----BEGIN CERTIFICATE-----\n\ 15 | MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n\ 16 | yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n\ 17 | ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n\ 18 | U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n\ 19 | ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n\ 20 | aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\n\ 21 | MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\n\ 22 | ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\n\ 23 | biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\n\ 24 | U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\n\ 25 | aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\n\ 26 | nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\n\ 27 | t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\n\ 28 | SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\n\ 29 | BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\n\ 30 | rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\n\ 31 | NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\n\ 32 | BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\n\ 33 | BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\n\ 34 | aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\n\ 35 | MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\n\ 36 | p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\n\ 37 | 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\n\ 38 | WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\n\ 39 | 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\n\ 40 | hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n\ 41 | -----END CERTIFICATE-----\n"}; 42 | 43 | /* Fill your certificate.pem.crt wiht LINE ENDING */ 44 | const char pem_cert[] = {"-----BEGIN CERTIFICATE-----\n\ 45 | MIIDWjCCAkKgAwIBAgIVAPO/jH+GepSZxWRtbVnZ5WEjmF1MMA0GCSqGSIb3DQEB\n\ 46 | CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t\n\ 47 | IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0xODAxMjIwNjQ2\n\ 48 | MjdaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh\n\ 49 | dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0JqFo3Dg5wUj2PBAm\n\ 50 | tvCvJLw7E1Nn/J5JrEP5g7M7YCVIv2WCmAXAR5YrPct7h0rOD7h9JG4K93koDK03\n\ 51 | 0u/WsqddSMedGObRqR7MSCdeAtBGKY9vrThCAQiOvl1LlmCZdyaEv5ukGUHYAGQf\n\ 52 | DCfjDvg6K4t9LTocyE2SHISv7zE1E/tHDmjZ7ups7ewE7h+35Ce9bL5tFKun2oEH\n\ 53 | 4COwJFrHj8RXObXPQYFEQ1x7YbshYkjs4HXT/cKmGXGz/2kAOSPejDFdxC4Larxw\n\ 54 | Eoz6xepjjiOXOZ5w7w1M/4/LnwJl/tbGLEU+azU47n4bT3GtscbX+ddisRJ65gN2\n\ 55 | 7wPHAgMBAAGjYDBeMB8GA1UdIwQYMBaAFDZV+0LrRJWxMz0PBDhwYV57/i65MB0G\n\ 56 | A1UdDgQWBBTBStT4wV7A6mkr3o6wLjyhhsmjvDAMBgNVHRMBAf8EAjAAMA4GA1Ud\n\ 57 | DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAxXJMJvQBtbgv+wKisaVXtgph\n\ 58 | cuf+jtk5/N04jq7oZDkeH4+jqHmYN+mh8xS7UbnQGRl6B5ftcXIYM/Uxjb46Jhtg\n\ 59 | HnQODB6cdbb780nxT5YOQA3EcZBndhe1hBC44qICOPCp3RejGmV43EYgLzJh/wtp\n\ 60 | 8yNvIEXi4t+rDP+JI7RgrgF2QlYsDYAQlr9a5JFzlLESzFanpN6PNu4/xVIO0LgI\n\ 61 | OnccrxQc5ZLcHKkze7OhjGFbmuXI9ljg/FDIXInveTV4OSQa14IfijLiZ9j5RV0o\n\ 62 | j0ansu6HbBIlwzq8ltWXfOqpAGm+YW2ukd5kKguvQHU24Tb1k2gXhHvv3mNRBA==\n\ 63 | -----END CERTIFICATE-----\n"}; 64 | 65 | /* Fill your private.pem.key wiht LINE ENDING */ 66 | const char pem_pkey[] = {"-----BEGIN RSA PRIVATE KEY-----\n\ 67 | MIIEpAIBAAKCAQEA9CahaNw4OcFI9jwQJrbwryS8OxNTZ/yeSaxD+YOzO2AlSL9l\n\ 68 | gpgFwEeWKz3Le4dKzg+4fSRuCvd5KAytN9Lv1rKnXUjHnRjm0akezEgnXgLQRimP\n\ 69 | b604QgEIjr5dS5ZgmXcmhL+bpBlB2ABkHwwn4w74OiuLfS06HMhNkhyEr+8xNRP7\n\ 70 | Rw5o2e7qbO3sBO4ft+QnvWy+bRSrp9qBB+AjsCRax4/EVzm1z0GBRENce2G7IWJI\n\ 71 | 7OB10/3Cphlxs/9pADkj3owxXcQuC2q8cBKM+sXqY44jlzmecO8NTP+Py58CZf7W\n\ 72 | xixFPms1OO5+G09xrbHG1/nXYrESeuYDdu8DxwIDAQABAoIBAFWjp0Js3JwFnF4i\n\ 73 | u1eZG9uTeyMNqFf1WGBnOICxHZFaLDnUSPsB8CJ9+cK5LkLqNecJxKDAwoi+PZU6\n\ 74 | vRezucUJbYNfIAWO0ogAVnk5ZfWn7v5tXY7Cp9UfH61SQM9etAugq7Ysr59j7KCj\n\ 75 | onrxfJw8h/1/gLIrxxKJgAwcTL6Y7LoN2oAv7qKCYtkYHVfCPeDLhjbBjuAKKP7Q\n\ 76 | t8zzVgc5Gvfe76A12oN//xaZlLI73OxMPtW5MfW718BqFcZLJzScfaY2//YiLN0F\n\ 77 | Iiccj+fZDcXPEvRaUludLZNPg2c7LO23Efn5HK66A8KJysOanfh+VBL/qdpFMCGY\n\ 78 | BXUwvOECgYEA+u084LcL0WX0TVKue+D0cBuJ4irLd3xxFOdEsVwRaeaFUQ5W9dDP\n\ 79 | PMCfgxE3a7gUPCKy7gnWTNvahudK0SqrbguTsYI4jNGpDRPkDI445KD85GAAsFBx\n\ 80 | 3nbEeG1EB3DAbmIJr1Pfpi+6imXom61Po0oftBBnmyi3G1c74VQF/BsCgYEA+RZS\n\ 81 | cVA9OdY722HX2AVVQJIi3mz99QEFIX/A0AJHaNIjlFYtXUG2CQ5WanWW4lUXmyU/\n\ 82 | d7rngfACp4qUeLWBn0jiW+ylLi28ZIzzyXLE9ISgeDIA5wK+8cHHDgfmZjPz9T9K\n\ 83 | o6u6Wb9H6hJwELJFdP9AgVNPzyiou69x7Zq2OcUCgYEAzoNLdCISHt9LBgxDP/7v\n\ 84 | DgkMHNBdrlQDeVGw7ks4pbCsDf7AQQT+WiCp5yPXOddBCBECs/fyoETc/+QBZk44\n\ 85 | 0pPClPf4dKTk/bdeG5s9ZaS9HXOJfZJndNDId9htgbYhGXekQuDDkzF61AZ1PxKP\n\ 86 | FXOezgImUsNal6zewl71ofsCgYAfs6SYgWLZepexqzlCaCNajX7cmjiUNyYFBnJu\n\ 87 | xut5vs0Ccxlg9h0J+AYtlHu4oKXZfBsgzOvsELT1x+BvoII32Jneoza+stl4Xqwk\n\ 88 | ZnQEvuCBi7OrsyDEOipwcbb0KQaSnxSL0i5sf7jSZLhYl6fZZSc7jnPo5L7c7E5u\n\ 89 | tDMfFQKBgQDIhY+A7xWXobtOQyaquT2IdyR3JSFfJwahLUc65nV0s582l8le+xuy\n\ 90 | ulCy291puJc1WkGr+vswMD/B2kJv61TdoxxBa2lBdwd+/RZlmuqp9iO9MHsi7oTV\n\ 91 | Y51odhXBpRYjDNieOsKEsX/xPUvUtNLJDeurI5KNr+e5dHADwvo2Jg==\n\ 92 | -----END RSA PRIVATE KEY-----\n"}; 93 | #endif 94 | const char APN[] = "UNINET"; 95 | const char mqtt_server[] = "a2t3bs5f5xc3vy.iot.eu-central-1.amazonaws.com "; 96 | unsigned int mqtt_port = 8883; 97 | const char mqtt_client_id[] = "wiscam.000002"; 98 | unsigned int comm_pdp_index = 1; // The range is 1 ~ 16 99 | unsigned int comm_ssl_index = 1; // The range is 0 ~ 5 100 | unsigned int comm_mqtt_index = 1; // The range is 0 ~ 5 101 | Mqtt_Version_t version = MQTT_V3; 102 | Mqtt_Qos_t mqtt_qos = AT_MOST_ONCE; 103 | 104 | WisLTEBG96MQTT WisLTE(ATSerial, DSerial); 105 | 106 | void setup(){ 107 | DSerial.begin(115200); 108 | while (DSerial.read() >= 0); 109 | DSerial.println("This is the WisLTE Debug Serial!"); 110 | delay(1000); 111 | ATSerial.begin(115200); 112 | while (ATSerial.read() >= 0); 113 | delay(1000); 114 | while(!WisLTE.InitModule()); 115 | 116 | WisLTE.SetDevCommandEcho(false); 117 | 118 | char inf[64]; 119 | if(WisLTE.GetDevInformation(inf)){ 120 | DSerial.println(inf); 121 | } 122 | 123 | char apn_error[64]; 124 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 125 | DSerial.println(apn_error); 126 | } 127 | DSerial.println(apn_error); 128 | #ifdef USE_CERT 129 | char ssl_error[128]; 130 | while(!WisLTE.InitSSL(comm_ssl_index, pem_CA, pem_cert, pem_pkey, ssl_error)){ 131 | DSerial.println(ssl_error); 132 | } 133 | DSerial.println(ssl_error); 134 | #else 135 | char ssl_error[128]; 136 | while(!WisLTE.InitSSL(comm_ssl_index, "", "", "", ssl_error)){ 137 | DSerial.println(ssl_error); 138 | } 139 | DSerial.println(ssl_error); 140 | #endif 141 | while(!WisLTE.SetMQTTConfigureParameters(comm_mqtt_index, comm_pdp_index, version, 150, SERVER_STORE_SUBSCRIPTIONS)){ 142 | DSerial.println("\r\nConfig the MQTT Parameter Fail!"); 143 | int e_code; 144 | if (WisLTE.returnErrorCode(e_code)){ 145 | DSerial.print("\r\nERROR CODE: "); 146 | DSerial.println(e_code); 147 | DSerial.println("Please check the documentation for error details."); 148 | while (1); 149 | } 150 | } 151 | DSerial.println("\r\nConfig the MQTT Parameter Success!"); 152 | 153 | while(!WisLTE.SetMQTTEnableSSL(comm_mqtt_index, comm_ssl_index, true)){ 154 | DSerial.println("\r\nEnable the SSL Fail!"); 155 | int e_code; 156 | if (WisLTE.returnErrorCode(e_code)){ 157 | DSerial.print("\r\nERROR CODE: "); 158 | DSerial.println(e_code); 159 | DSerial.println("Please check the documentation for error details."); 160 | while(1); 161 | } 162 | } 163 | DSerial.println("\r\nEnable the SSL Success!"); 164 | 165 | while (WisLTE.OpenMQTTNetwork(comm_mqtt_index, mqtt_server, mqtt_port) != 0){ 166 | DSerial.println("\r\nSet the MQTT Service Address Fail!"); 167 | int e_code; 168 | if (WisLTE.returnErrorCode(e_code)){ 169 | DSerial.print("\r\nERROR CODE: "); 170 | DSerial.println(e_code); 171 | DSerial.println("Please check the documentation for error details."); 172 | while (1); 173 | } 174 | } 175 | DSerial.println("\r\nSet the MQTT Service Address Success!"); 176 | 177 | while (WisLTE.CreateMQTTClient(comm_mqtt_index, mqtt_client_id, "", "") != 0){ 178 | DSerial.println("\r\nCreate a MQTT Client Fail!"); 179 | int e_code; 180 | if (WisLTE.returnErrorCode(e_code)){ 181 | DSerial.print("\r\nERROR CODE: "); 182 | DSerial.println(e_code); 183 | DSerial.println("Please check the documentation for error details."); 184 | while (1); 185 | } 186 | } 187 | DSerial.println("\r\nCreate a MQTT Client Success!"); 188 | 189 | while (WisLTE.MQTTSubscribeTopic(comm_mqtt_index, 1, "", mqtt_qos) != 0){ 190 | DSerial.println("\r\nMQTT Subscribe Topic Fail!"); 191 | int e_code; 192 | if (WisLTE.returnErrorCode(e_code)){ 193 | DSerial.print("\r\nERROR CODE: "); 194 | DSerial.println(e_code); 195 | DSerial.println("Please check the documentation for error details."); 196 | while (1); 197 | } 198 | } 199 | DSerial.println("\r\nMQTT Subscribe Topic Success!"); 200 | } 201 | 202 | void loop(){ 203 | char mqtt_recv[128]; 204 | char *sta_buf; 205 | Mqtt_URC_Event_t ret = WisLTE.WaitCheckMQTTURCEvent(mqtt_recv, 2); 206 | switch (ret) 207 | { 208 | case MQTT_RECV_DATA_EVENT: 209 | *sta_buf = strstr(mqtt_recv, "\",\""); 210 | DSerial.println("\r\nThe MQTT Recv Data"); 211 | DSerial.println(sta_buf + 3); 212 | break; 213 | case MQTT_STATUS_EVENT: 214 | *sta_buf = strchr(mqtt_recv, ','); 215 | if (atoi(sta_buf + 1) == 1){ 216 | if (WisLTE.CloseMQTTClient(comm_mqtt_index)){ 217 | DSerial.println("\r\nClose the MQTT Client Success!"); 218 | } 219 | } else { 220 | DSerial.print("\r\nStatus cade is :"); 221 | DSerial.println(atoi(sta_buf + 1)); 222 | DSerial.println("Please check the documentation for error details."); 223 | } 224 | break; 225 | } 226 | } -------------------------------------------------------------------------------- /examples/MQTT_Client/MQTT_Client.ino: -------------------------------------------------------------------------------- 1 | 2 | #include "WisLTEBG96MQTT.h" 3 | #include "SoftwareSerial.h" 4 | 5 | #define DSerial Serial1 6 | #define ATSerial Serial 7 | // #define AT_TX_PIN 11 8 | // #define AT_RX_PIN 10 9 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 10 | 11 | const char APN[] = "hologram"; 12 | const char mqtt_server[] = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; 13 | unsigned int mqtt_port = 1883; 14 | const char mqtt_client_id[] = "mqtt_test"; 15 | unsigned int comm_pdp_index = 1; // The range is 1 ~ 16 16 | unsigned int comm_mqtt_index = 1; // The range is 0 ~ 5 17 | Mqtt_Version_t version = MQTT_V3; 18 | Mqtt_Qos_t mqtt_qos = AT_MOST_ONCE; 19 | const char produck_key[] = "a1mQBMY2HI9"; 20 | const char device_name[] = "D896E0FF00012940"; 21 | const char device_secret[] = "GVQqGv6Y3hd3q9n8EXLHW95Bpgs8HG3W"; 22 | 23 | WisLTEBG96MQTT WisLTE(ATSerial, DSerial); 24 | 25 | void setup(){ 26 | DSerial.begin(115200); 27 | while (DSerial.read() >= 0); 28 | DSerial.println("This is the WisLTE Debug Serial!"); 29 | delay(1000); 30 | ATSerial.begin(115200); 31 | while (ATSerial.read() >= 0); 32 | delay(1000); 33 | while(!WisLTE.InitModule()); 34 | 35 | WisLTE.SetDevCommandEcho(false); 36 | 37 | char inf[64]; 38 | if(WisLTE.GetDevInformation(inf)){ 39 | DSerial.println(inf); 40 | } 41 | 42 | char apn_error[64]; 43 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 44 | DSerial.println(apn_error); 45 | } 46 | DSerial.println(apn_error); 47 | 48 | while(!WisLTE.SetMQTTConfigureParameters(comm_mqtt_index, comm_pdp_index, version, 150, SERVER_STORE_SUBSCRIPTIONS)){ 49 | DSerial.println("\r\nConfig the MQTT Parameter Fail!"); 50 | int e_code; 51 | if (WisLTE.returnErrorCode(e_code)){ 52 | DSerial.print("\r\nERROR CODE: "); 53 | DSerial.println(e_code); 54 | DSerial.println("Please check the documentation for error details."); 55 | while (1); 56 | } 57 | } 58 | DSerial.println("\r\nConfig the MQTT Parameter Success!"); 59 | 60 | while(!WisLTE.SetMQTTAlibabaCloudDeviceInformation(comm_mqtt_index, produck_key, device_name, device_secret)){ 61 | DSerial.println("\r\nSet the Alibaba Cloud MQTT Fail!"); 62 | int e_code; 63 | if (WisLTE.returnErrorCode(e_code)){ 64 | DSerial.print("\r\nERROR CODE: "); 65 | DSerial.println(e_code); 66 | DSerial.println("Please check the documentation for error details."); 67 | while (1); 68 | } 69 | } 70 | DSerial.println("\r\nSet the Alibaba Cloud MQTT Success!"); 71 | 72 | while (WisLTE.OpenMQTTNetwork(comm_mqtt_index, mqtt_server, mqtt_port) != 0){ 73 | DSerial.println("\r\nSet the MQTT Service Address Fail!"); 74 | int e_code; 75 | if (WisLTE.returnErrorCode(e_code)){ 76 | DSerial.print("\r\nERROR CODE: "); 77 | DSerial.println(e_code); 78 | DSerial.println("Please check the documentation for error details."); 79 | while (1); 80 | } 81 | } 82 | DSerial.println("\r\nSet the MQTT Service Address Success!"); 83 | 84 | while (WisLTE.CreateMQTTClient(comm_mqtt_index, mqtt_client_id, "", "") != 0){ 85 | DSerial.println("\r\nCreate a MQTT Client Fail!"); 86 | int e_code; 87 | if (WisLTE.returnErrorCode(e_code)){ 88 | DSerial.print("\r\nERROR CODE: "); 89 | DSerial.println(e_code); 90 | DSerial.println("Please check the documentation for error details."); 91 | while (1); 92 | } 93 | } 94 | DSerial.println("\r\nCreate a MQTT Client Success!"); 95 | 96 | while (WisLTE.MQTTSubscribeTopic(comm_mqtt_index, 1, "/a1mQBMY2HI9/D896E0FF00012940/update", mqtt_qos) != 0){ 97 | DSerial.println("\r\nMQTT Subscribe Topic Fail!"); 98 | int e_code; 99 | if (WisLTE.returnErrorCode(e_code)){ 100 | DSerial.print("\r\nERROR CODE: "); 101 | DSerial.println(e_code); 102 | DSerial.println("Please check the documentation for error details."); 103 | while (1); 104 | } 105 | } 106 | DSerial.println("\r\nMQTT Subscribe Topic Success!"); 107 | } 108 | 109 | void loop(){ 110 | char mqtt_recv[128]; 111 | char *sta_buf; 112 | Mqtt_URC_Event_t ret = WisLTE.WaitCheckMQTTURCEvent(mqtt_recv, 2); 113 | switch (ret) 114 | { 115 | case MQTT_RECV_DATA_EVENT: 116 | *sta_buf = strstr(mqtt_recv, "\",\""); 117 | DSerial.println("\r\nThe MQTT Recv Data"); 118 | DSerial.println(sta_buf + 3); 119 | break; 120 | case MQTT_STATUS_EVENT: 121 | *sta_buf = strchr(mqtt_recv, ','); 122 | if (atoi(sta_buf + 1) == 1){ 123 | if (WisLTE.CloseMQTTClient(comm_mqtt_index)){ 124 | DSerial.println("\r\nClose the MQTT Client Success!"); 125 | } 126 | } else { 127 | DSerial.print("\r\nStatus cade is :"); 128 | DSerial.println(atoi(sta_buf + 1)); 129 | DSerial.println("Please check the documentation for error details."); 130 | } 131 | break; 132 | } 133 | // if (WisLTE.MQTTPublishMessages(comm_mqtt_index, 1, mqtt_qos, "/a1mQBMY2HI9/D896E0FF00012940/get", true, "1234") == 0){ 134 | // DSerial.println("\r\nMQTT Publish Messages Success!"); 135 | // delay(10000); 136 | // } 137 | } -------------------------------------------------------------------------------- /examples/SSL_Client/SSL_Client.ino: -------------------------------------------------------------------------------- 1 | 2 | #include "WisLTEBG96SSL.h" 3 | #include "SoftwareSerial.h" 4 | 5 | #define DSerial Serial1 6 | #define ATSerial Serial 7 | // #define AT_TX_PIN 11 8 | // #define AT_RX_PIN 10 9 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 10 | 11 | //#define USE_CERT 12 | #ifdef USE_CERT 13 | /* Fill your certificate.pem.root CA wiht LINE ENDING */ 14 | const char pem_CA[] = {"-----BEGIN CERTIFICATE-----\n\ 15 | MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n\ 16 | yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n\ 17 | ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n\ 18 | U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n\ 19 | ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n\ 20 | aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\n\ 21 | MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\n\ 22 | ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\n\ 23 | biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\n\ 24 | U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\n\ 25 | aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\n\ 26 | nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\n\ 27 | t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\n\ 28 | SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\n\ 29 | BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\n\ 30 | rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\n\ 31 | NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\n\ 32 | BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\n\ 33 | BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\n\ 34 | aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\n\ 35 | MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\n\ 36 | p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\n\ 37 | 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\n\ 38 | WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\n\ 39 | 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\n\ 40 | hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n\ 41 | -----END CERTIFICATE-----\n"}; 42 | 43 | /* Fill your certificate.pem.crt wiht LINE ENDING */ 44 | const char pem_cert[] = {"-----BEGIN CERTIFICATE-----\n\ 45 | MIIDWjCCAkKgAwIBAgIVAPO/jH+GepSZxWRtbVnZ5WEjmF1MMA0GCSqGSIb3DQEB\n\ 46 | CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t\n\ 47 | IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0xODAxMjIwNjQ2\n\ 48 | MjdaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh\n\ 49 | dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0JqFo3Dg5wUj2PBAm\n\ 50 | tvCvJLw7E1Nn/J5JrEP5g7M7YCVIv2WCmAXAR5YrPct7h0rOD7h9JG4K93koDK03\n\ 51 | 0u/WsqddSMedGObRqR7MSCdeAtBGKY9vrThCAQiOvl1LlmCZdyaEv5ukGUHYAGQf\n\ 52 | DCfjDvg6K4t9LTocyE2SHISv7zE1E/tHDmjZ7ups7ewE7h+35Ce9bL5tFKun2oEH\n\ 53 | 4COwJFrHj8RXObXPQYFEQ1x7YbshYkjs4HXT/cKmGXGz/2kAOSPejDFdxC4Larxw\n\ 54 | Eoz6xepjjiOXOZ5w7w1M/4/LnwJl/tbGLEU+azU47n4bT3GtscbX+ddisRJ65gN2\n\ 55 | 7wPHAgMBAAGjYDBeMB8GA1UdIwQYMBaAFDZV+0LrRJWxMz0PBDhwYV57/i65MB0G\n\ 56 | A1UdDgQWBBTBStT4wV7A6mkr3o6wLjyhhsmjvDAMBgNVHRMBAf8EAjAAMA4GA1Ud\n\ 57 | DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAxXJMJvQBtbgv+wKisaVXtgph\n\ 58 | cuf+jtk5/N04jq7oZDkeH4+jqHmYN+mh8xS7UbnQGRl6B5ftcXIYM/Uxjb46Jhtg\n\ 59 | HnQODB6cdbb780nxT5YOQA3EcZBndhe1hBC44qICOPCp3RejGmV43EYgLzJh/wtp\n\ 60 | 8yNvIEXi4t+rDP+JI7RgrgF2QlYsDYAQlr9a5JFzlLESzFanpN6PNu4/xVIO0LgI\n\ 61 | OnccrxQc5ZLcHKkze7OhjGFbmuXI9ljg/FDIXInveTV4OSQa14IfijLiZ9j5RV0o\n\ 62 | j0ansu6HbBIlwzq8ltWXfOqpAGm+YW2ukd5kKguvQHU24Tb1k2gXhHvv3mNRBA==\n\ 63 | -----END CERTIFICATE-----\n"}; 64 | 65 | /* Fill your private.pem.key wiht LINE ENDING */ 66 | const char pem_pkey[] = {"-----BEGIN RSA PRIVATE KEY-----\n\ 67 | MIIEpAIBAAKCAQEA9CahaNw4OcFI9jwQJrbwryS8OxNTZ/yeSaxD+YOzO2AlSL9l\n\ 68 | gpgFwEeWKz3Le4dKzg+4fSRuCvd5KAytN9Lv1rKnXUjHnRjm0akezEgnXgLQRimP\n\ 69 | b604QgEIjr5dS5ZgmXcmhL+bpBlB2ABkHwwn4w74OiuLfS06HMhNkhyEr+8xNRP7\n\ 70 | Rw5o2e7qbO3sBO4ft+QnvWy+bRSrp9qBB+AjsCRax4/EVzm1z0GBRENce2G7IWJI\n\ 71 | 7OB10/3Cphlxs/9pADkj3owxXcQuC2q8cBKM+sXqY44jlzmecO8NTP+Py58CZf7W\n\ 72 | xixFPms1OO5+G09xrbHG1/nXYrESeuYDdu8DxwIDAQABAoIBAFWjp0Js3JwFnF4i\n\ 73 | u1eZG9uTeyMNqFf1WGBnOICxHZFaLDnUSPsB8CJ9+cK5LkLqNecJxKDAwoi+PZU6\n\ 74 | vRezucUJbYNfIAWO0ogAVnk5ZfWn7v5tXY7Cp9UfH61SQM9etAugq7Ysr59j7KCj\n\ 75 | onrxfJw8h/1/gLIrxxKJgAwcTL6Y7LoN2oAv7qKCYtkYHVfCPeDLhjbBjuAKKP7Q\n\ 76 | t8zzVgc5Gvfe76A12oN//xaZlLI73OxMPtW5MfW718BqFcZLJzScfaY2//YiLN0F\n\ 77 | Iiccj+fZDcXPEvRaUludLZNPg2c7LO23Efn5HK66A8KJysOanfh+VBL/qdpFMCGY\n\ 78 | BXUwvOECgYEA+u084LcL0WX0TVKue+D0cBuJ4irLd3xxFOdEsVwRaeaFUQ5W9dDP\n\ 79 | PMCfgxE3a7gUPCKy7gnWTNvahudK0SqrbguTsYI4jNGpDRPkDI445KD85GAAsFBx\n\ 80 | 3nbEeG1EB3DAbmIJr1Pfpi+6imXom61Po0oftBBnmyi3G1c74VQF/BsCgYEA+RZS\n\ 81 | cVA9OdY722HX2AVVQJIi3mz99QEFIX/A0AJHaNIjlFYtXUG2CQ5WanWW4lUXmyU/\n\ 82 | d7rngfACp4qUeLWBn0jiW+ylLi28ZIzzyXLE9ISgeDIA5wK+8cHHDgfmZjPz9T9K\n\ 83 | o6u6Wb9H6hJwELJFdP9AgVNPzyiou69x7Zq2OcUCgYEAzoNLdCISHt9LBgxDP/7v\n\ 84 | DgkMHNBdrlQDeVGw7ks4pbCsDf7AQQT+WiCp5yPXOddBCBECs/fyoETc/+QBZk44\n\ 85 | 0pPClPf4dKTk/bdeG5s9ZaS9HXOJfZJndNDId9htgbYhGXekQuDDkzF61AZ1PxKP\n\ 86 | FXOezgImUsNal6zewl71ofsCgYAfs6SYgWLZepexqzlCaCNajX7cmjiUNyYFBnJu\n\ 87 | xut5vs0Ccxlg9h0J+AYtlHu4oKXZfBsgzOvsELT1x+BvoII32Jneoza+stl4Xqwk\n\ 88 | ZnQEvuCBi7OrsyDEOipwcbb0KQaSnxSL0i5sf7jSZLhYl6fZZSc7jnPo5L7c7E5u\n\ 89 | tDMfFQKBgQDIhY+A7xWXobtOQyaquT2IdyR3JSFfJwahLUc65nV0s582l8le+xuy\n\ 90 | ulCy291puJc1WkGr+vswMD/B2kJv61TdoxxBa2lBdwd+/RZlmuqp9iO9MHsi7oTV\n\ 91 | Y51odhXBpRYjDNieOsKEsX/xPUvUtNLJDeurI5KNr+e5dHADwvo2Jg==\n\ 92 | -----END RSA PRIVATE KEY-----\n"}; 93 | #endif 94 | const char APN[] = "hologram"; 95 | const char ssl_ip[] = "www.baidu.com"; 96 | const char ssl_cmd[] = "GET / HTTP/1.1\r\n\r\n"; 97 | const int ssl_port = 443; 98 | unsigned int comm_pdp_index = 1; // The range is 1 ~ 16 99 | unsigned int comm_socket_index = 1; // The range is 0 ~ 11 100 | unsigned int comm_ssl_index = 1; // The range if 0 ~ 5 101 | 102 | WisLTEBG96SSL WisLTE(ATSerial, DSerial); 103 | 104 | void setup(){ 105 | DSerial.begin(115200); 106 | while (DSerial.read() >= 0); 107 | DSerial.println("This is the WisLTE Debug Serial!"); 108 | delay(1000); 109 | ATSerial.begin(115200); 110 | while (ATSerial.read() >= 0); 111 | delay(1000); 112 | while(!WisLTE.InitModule()); 113 | 114 | WisLTE.SetDevCommandEcho(false); 115 | 116 | char inf[64]; 117 | if(WisLTE.GetDevInformation(inf)){ 118 | DSerial.println(inf); 119 | } 120 | 121 | char apn_error[64]; 122 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 123 | DSerial.println(apn_error); 124 | } 125 | DSerial.println(apn_error); 126 | 127 | #ifdef USE_CERT 128 | char ssl_error[128]; 129 | while(!WisLTE.InitSSL(comm_ssl_index, pem_CA, pem_cert, pem_pkey, ssl_error)){ 130 | DSerial.println(ssl_error); 131 | } 132 | DSerial.println(ssl_error); 133 | #else 134 | char ssl_error[128]; 135 | while(!WisLTE.InitSSL(comm_ssl_index, "", "", "", ssl_error)){ 136 | DSerial.println(ssl_error); 137 | } 138 | DSerial.println(ssl_error); 139 | #endif 140 | while (!WisLTE.OpenSSLSocket(comm_pdp_index, comm_ssl_index, comm_socket_index, ssl_ip, ssl_port, BUFFER_MODE)){ 141 | DSerial.println("\r\nConnect the SSL Sever Fail!"); 142 | char ssl_socket_error[64]; 143 | int e_code; 144 | if (WisLTE.returnErrorCode(e_code)){ 145 | DSerial.print("\r\nERROR CODE: "); 146 | DSerial.println(e_code); 147 | DSerial.println("Please check the documentation for error details."); 148 | while(1); 149 | }else if (WisLTE.QueryLastErrorCode(ssl_socket_error)){ 150 | DSerial.println(ssl_socket_error); 151 | } 152 | delay(5000); 153 | } 154 | DSerial.println("\r\nConnect the SSL Sever Success!"); 155 | 156 | if (WisLTE.SSLSocketSendData(comm_socket_index, ssl_cmd)){ 157 | DSerial.println("\r\nSSL Socket Send Data Success!"); 158 | } 159 | } 160 | 161 | void loop(){ 162 | char ssl_event[16]; 163 | unsigned int index; 164 | char recv_data[128]; 165 | SSL_Socket_Event_t ret = WisLTE.WaitCheckSSLSocketEvent(ssl_event, 2); 166 | switch(ret) 167 | { 168 | case SSL_SOCKET_CLOSE_EVENT: 169 | index = atoi(ssl_event); 170 | if(WisLTE.CloseSSLSocket(index)){ 171 | DSerial.println("\r\nClose SSL Socket Success!"); 172 | } 173 | break; 174 | case SSL_SOCKET_RECV_EVENT: 175 | index = atoi(ssl_event); 176 | if(WisLTE.SSLSocketRecvData(index, 128, recv_data)){ 177 | DSerial.println("\r\nSSL Socket Recv Data Success!"); 178 | DSerial.println(""); 179 | DSerial.println(recv_data); 180 | DSerial.println(""); 181 | } 182 | break; 183 | default: 184 | break; 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /examples/TCP_Client/TCP_Client.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include "WisLTEBG96TCPIP.h" 4 | #include "SoftwareSerial.h" 5 | 6 | #define DSerial Serial1 7 | #define ATSerial Serial 8 | // #define AT_TX_PIN 11 9 | // #define AT_RX_PIN 10 10 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 11 | 12 | const char APN[] = "hologram"; 13 | const char tcp_ip[] = "mbed.org"; 14 | const int tcp_port = 80; 15 | const char send_data[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n"; 16 | unsigned int comm_pdp_index = 2; // The range is 1 ~ 16 17 | unsigned int comm_socket_index = 2; // The range is 0 ~ 11 18 | Socket_Type_t socket = TCP_CLIENT; 19 | 20 | WisLTEBG96TCPIP WisLTE(ATSerial, DSerial); 21 | 22 | void setup(){ 23 | DSerial.begin(115200); 24 | while (DSerial.read() >= 0); 25 | DSerial.println("This is the WisLTE Debug Serial!"); 26 | delay(1000); 27 | ATSerial.begin(115200); 28 | while (ATSerial.read() >= 0); 29 | delay(1000); 30 | while(!WisLTE.InitModule()); 31 | 32 | WisLTE.SetDevCommandEcho(false); 33 | 34 | char inf[64]; 35 | if(WisLTE.GetDevInformation(inf)){ 36 | DSerial.println(inf); 37 | } 38 | 39 | char apn_error[64]; 40 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 41 | DSerial.println(apn_error); 42 | } 43 | DSerial.println(apn_error); 44 | 45 | while (!WisLTE.OpenSocketService(comm_pdp_index, comm_socket_index, socket, tcp_ip, tcp_port, 0, BUFFER_MODE)){ 46 | DSerial.println("\r\nOpen Socket Service Fail!"); 47 | } 48 | DSerial.println("\r\nOpen Socket Service Success!"); 49 | 50 | if(WisLTE.SocketSendData(comm_socket_index, socket, send_data, "", "")){ 51 | DSerial.println("\r\nSocket Send Data Success!"); 52 | } 53 | 54 | } 55 | 56 | void loop(){ 57 | char m_event[16]; 58 | unsigned int index; 59 | char recv_data[128]; 60 | Socket_Event_t ret = WisLTE.WaitCheckSocketEvent(m_event, 2); 61 | switch(ret) 62 | { 63 | case SOCKET_CLOSE_EVENT: 64 | index = atoi(m_event); 65 | if(WisLTE.CloseSocketService(index)){ 66 | DSerial.println("\r\nClose Socket Success!"); 67 | } 68 | break; 69 | case SOCKET_RECV_DATA_EVENT: 70 | index = atoi(m_event); 71 | if (WisLTE.SocketRecvData(index, 128, socket, recv_data)){ 72 | DSerial.println("\r\nSocket Recv Data Success!"); 73 | DSerial.println(""); 74 | DSerial.println(recv_data); 75 | DSerial.println(""); 76 | } 77 | break; 78 | case SOCKET_PDP_DEACTIVATION_EVENT: 79 | index = atoi(m_event); 80 | if(WisLTE.DeactivateDevAPN(index)){ 81 | DSerial.println("\r\nPlease reconfigure APN!"); 82 | } 83 | break; 84 | default: 85 | break; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /examples/TCP_Sever/TCP_Sever.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include "WisLTEBG96TCPIP.h" 4 | #include "SoftwareSerial.h" 5 | 6 | #define DSerial Serial1 7 | #define ATSerial Serial 8 | // #define AT_TX_PIN 11 9 | // #define AT_RX_PIN 10 10 | // SoftwareSerial DSerial(AT_RX_PIN, AT_TX_PIN); 11 | 12 | const char APN[] = "hologram"; 13 | const char tcps_ip[] = "127.0.0.1"; 14 | unsigned int tcp_port = 3030; 15 | unsigned int comm_pdp_index = 3; // The range is 1 ~ 16 16 | unsigned int comm_socket_index = 3; // The range is 0 ~ 11 17 | Socket_Type_t socket = TCP_SEVER; 18 | 19 | WisLTEBG96TCPIP WisLTE(ATSerial, DSerial); 20 | 21 | void setup() 22 | { 23 | DSerial.begin(115200); 24 | while (DSerial.read() >= 0); 25 | DSerial.println("This is the WisLTE Debug Serial!"); 26 | delay(100); 27 | ATSerial.begin(115200); 28 | while (ATSerial.read() >= 0); 29 | delay(100); 30 | while(!WisLTE.InitModule()); 31 | 32 | WisLTE.SetDevCommandEcho(false); 33 | 34 | char inf[64]; 35 | if (WisLTE.GetDevInformation(inf)){ 36 | DSerial.println(inf); 37 | } 38 | 39 | char apn_error[64]; 40 | while (!WisLTE.InitAPN(comm_pdp_index, APN, "", "", apn_error)){ 41 | DSerial.println(apn_error); 42 | } 43 | DSerial.println(apn_error); 44 | 45 | while (!WisLTE.OpenSocketService(comm_pdp_index, comm_socket_index, socket, tcps_ip, 0, tcp_port, BUFFER_MODE)){ 46 | DSerial.println("\r\nOpen Socket Service Fail!"); 47 | } 48 | DSerial.println("\r\nOpen Socket Service Success!"); 49 | } 50 | 51 | void loop() 52 | { 53 | char m_event[32]; 54 | char recv_data[128]; 55 | unsigned int index; 56 | char m_ip[16]; 57 | unsigned int m_port; 58 | char *sta_buf, *med_buf, *end_buf; 59 | Socket_Event_t ret = WisLTE.WaitCheckSocketEvent(m_event, 2); 60 | switch (ret) 61 | { 62 | case SOCKET_CLOSE_EVENT: 63 | index = atoi(m_event); 64 | if (WisLTE.CloseSocketService(index)){ 65 | DSerial.println("\r\nClose Socket Success!"); 66 | } 67 | break; 68 | case SOCKET_RECV_DATA_EVENT: 69 | index = atoi(m_event); 70 | if (WisLTE.SocketRecvData(index, 128, socket, recv_data)){ 71 | DSerial.println("\r\nSocket Recv Data Success!"); 72 | DSerial.println(""); 73 | DSerial.println(recv_data); 74 | DSerial.println(""); 75 | } 76 | break; 77 | case SOCKET_PDP_DEACTIVATION_EVENT: 78 | index = atoi(m_event); 79 | if (WisLTE.DeactivateDevAPN(index)){ 80 | DSerial.println("\r\nPlease reconfigure APN!"); 81 | } 82 | break; 83 | case SOCKET_INCOMING_CONNECTION_EVENT: 84 | DSerial.println(m_event); 85 | *sta_buf = strchr(m_event, ','); 86 | *sta_buf = '\0'; 87 | index = atoi(m_event); 88 | *med_buf = strstr(sta_buf + 1, ",\""); 89 | *end_buf = strstr(sta_buf + 1, "\","); 90 | *end_buf = '\0'; 91 | strcpy(m_ip, med_buf + 2); 92 | m_port = atoi(end_buf + 2); 93 | if(WisLTE.SocketSendData(index, socket, "Hello", m_ip, m_port)){ 94 | DSerial.println("\r\nSocket Send Data successfully"); 95 | } 96 | break; 97 | case SOCKET_CONNECTION_FULL_EVENT: 98 | if(WisLTE.CloseSocketService(comm_socket_index)){ 99 | DSerial.println("\r\nClose Socket function successfully"); 100 | } 101 | break; 102 | default: 103 | break; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map For WisLTE 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | WisLTEBG96Serial KEYWORD1 9 | WisLTEBG96Common KEYWORD1 10 | WisLTEBG96FILE KEYWORD1 11 | WisLTEBG96TCPIP KEYWORD1 12 | WisLTEBG96SSL KEYWORD1 13 | WisLTEBG96GNSS KEYWORD1 14 | WisLTEBG96HTTP KEYWORD1 15 | WisLTEBG96MQTT KEYWORD1 16 | 17 | ####################################### 18 | # Methods and Functions (KEYWORD2) 19 | ####################################### 20 | InitAPN KEYWORD2 21 | InitSSL KEYWORD2 22 | 23 | ####################################### 24 | # Instances (KEYWORD2) 25 | ####################################### 26 | 27 | ####################################### 28 | # Constants (LITERAL1) 29 | ####################################### 30 | Functionality_t LITERAL1 31 | Cmd_Status_t LITERAL1 32 | Net_Status_t LITERAL1 33 | Net_Type_t LITERAL1 34 | Protocol_Type_t LITERAL1 35 | Authentication_Methods_t LITERAL1 36 | Cmd_Response_t LITERAL1 37 | Socket_Type_t LITERAL1 38 | Access_Mode_t LITERAL1 39 | GNSS_Work_Mode_t LITERAL1 40 | GNSS_Constellation_t LITERAL1 41 | Socket_Event_t LITERAL1 42 | SSL_Version_t LITERAL1 43 | SSL_Cipher_Suites_t LITERAL1 44 | SSL_Socket_Event_t LITERAL1 45 | Open_File_Mode_t LITERAL1 46 | Pointer_Mode_t LITERAL1 47 | HTTP_Body_Data_Type_t LITERAL1 48 | Mqtt_Version_t LITERAL1 49 | Mqtt_Qos_t LITERAL1 50 | Mqtt_Session_Type_t LITERAL1 51 | Mqtt_Network_Result_t LITERAL1 52 | Mqtt_Client_Result_Status_t LITERAL1 53 | Mqtt_URC_Event_t LITERAL1 -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=WisLTE 2 | version=1.0.0 3 | author=Chace 4 | maintainer=RAK 5 | sentence=The LTE module driver for BG96. 6 | paragraph=This library contains BG96 TCP, HTTP, MQTT, SSL, GNSS and other functions. 7 | category=Communication 8 | url=https://github.com/RAKwireless/WisLTE_Arduino 9 | architectures=* 10 | includes=./src/*.h -------------------------------------------------------------------------------- /src/WisLTEBG96ATCommand.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 AT Command list 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 08/15/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96ATCOMMAND_H_ 31 | #define _WISLTEBG96ATCOMMAND_H_ 32 | 33 | // AT commands response 34 | const char RESPONSE_READY[] = "RDY"; 35 | const char RESPONSE_OK[] = "OK"; 36 | const char RESPONSE_CRLF_OK[] = "\r\n\r\nOK"; 37 | const char RESPONSE_ERROR[] = "ERROR"; 38 | const char RESPONSE_POWER_DOWN[] = "POWERED DOWN"; 39 | const char RESPONSE_CONNECT[] = "CONNECT"; 40 | const char RESPONSE_SEND_OK[] = "SEND OK"; 41 | const char RESPONSE_SEND_FAIL[] = "SEND FAIL"; 42 | 43 | // common AT commands 44 | const char DEV_AT[] = ""; 45 | const char DEV_INFORMATION[] = "I"; 46 | const char DEV_VERSION[] = "+CGMR"; 47 | const char DEV_IMEI[] = "+CGSN"; 48 | const char DEV_FUN_LEVEL[] = "+CFUN"; 49 | const char DEV_LOCAL_RATE[] = "+IPR"; 50 | const char DEV_SIM_IMSI[] = "+CIMI"; 51 | const char DEV_SIM_PIN[] = "+CPIN"; 52 | const char DEV_SIM_ICCID[] = "+QCCID"; 53 | const char DEV_NET_STATUS[] = "+CREG"; 54 | const char DEV_NET_STATUS_G[] = "+CGREG"; 55 | const char DEV_EPS_NET_STATUS[] = "+CEREG"; 56 | const char DEV_NET_RSSI[] = "+CSQ"; 57 | const char DEV_NET_OPERATOR[] = "+COPS"; 58 | const char DEV_NET_INFORMATION[] = "+QNWINFO"; 59 | const char DEV_NET_PACKET_COUNTER[] = "+QGDCNT"; 60 | const char DEV_POWER_DOWN[] = "+QPOWD"; 61 | const char DEV_CLOCK[] = "+CCLK"; 62 | 63 | // TCPIP AT Commands 64 | const char APN_PARAMETERS[] = "+QICSGP"; 65 | const char ACTIVATE_APN[] = "+QIACT"; 66 | const char DEACTIVATE_APN[] = "+QIDEACT"; 67 | const char GET_APN_IP_ADDRESS[] = "+CGPADDR"; 68 | const char OPEN_SOCKET[] = "+QIOPEN"; 69 | const char CLOSE_SOCKET[] = "+QICLOSE"; 70 | const char SOCKET_STATUS[] = "+QISTATE"; 71 | const char SOCKET_SEND_DATA[] = "+QISEND"; 72 | const char SOCKET_READ_DATA[] = "+QIRD"; 73 | const char SOCKET_SEND_HEX_DATA[] = "+QISENDEX"; 74 | const char DATA_ACCESS_MODES[] = "+QISWTMD"; 75 | const char PING_FUNCTION[] = "+QPING"; 76 | const char NTP_FUNCTION[] = "+QNTP"; 77 | const char CONFIGURE_DNS_SERVER[] = "+QIDNSCFG"; 78 | const char DNS_FUNCTION[] = "+QIDNSGIP"; 79 | const char QUERY_ERROR_CODE[] = "+QIGETERROR"; 80 | const char RECV_SOCKET_EVENT[] = "+QIURC"; 81 | 82 | // FILE AT Commands 83 | const char FILE_SPACE_INFORMATION[] = "+QFLDS"; 84 | const char FILE_LIST_FILES[] = "+QFLST"; 85 | const char FILE_DELETE_FILES[] = "+QFDEL"; 86 | const char FILE_UPLOAD_FILES[] = "+QFUPL"; 87 | const char FILE_DOWNLOAD_FILE[] = "+QFDWL"; 88 | const char FILE_OPEN_FILE[] = "+QFOPEN"; 89 | const char FILE_READ_FILE[] = "+QFREAD"; 90 | const char FILE_WRITE_FILE[] = "+QFWRITE"; 91 | const char FILE_SET_POSITION_FILE[] = "+QFSEEK"; 92 | const char FILE_GET_POSITION_FILE[] = "+QFPOSITION"; 93 | const char FILE_TRUNCATE_FILE[] = "+QFTUCAT"; 94 | const char FILE_CLOSE_FILE[] = "+QFCLOSE"; 95 | 96 | // SSL AT Commands 97 | const char SSL_CONFIG_PARAMETER[] = "+QSSLCFG"; 98 | const char SSL_OPEN_SOCKET[] = "+QSSLOPEN"; 99 | const char SSL_SEND_DATA[] = "+QSSLSEND"; 100 | const char SSL_READ_DATA[] = "+QSSLRECV"; 101 | const char SSL_CLOSE_SOCKET[] = "+QSSLCLOSE"; 102 | const char SSL_QUERY_STATUS[] = "+QSSLSTATE"; 103 | const char SSL_SOCKET_EVENT[] = "+QSSLURC"; 104 | 105 | // HTTP AT Commands 106 | const char HTTP_CONFIG_PARAMETER[] = "+QHTTPCFG"; 107 | const char HTTP_SET_URL[] = "+QHTTPURL"; 108 | const char HTTP_GET_REQUEST[] = "+QHTTPGET"; 109 | const char HTTP_POST_REQUEST[] = "+QHTTPPOST"; 110 | const char HTTP_FILE_POST_REQUEST[] = "+QHTTPPOSTFILE"; 111 | const char HTTP_READ_RESPONSE[] = "+QHTTPREAD"; 112 | const char HTTP_FILE_READ_RESPONSE[] = "+QHTTPREADFILE"; 113 | 114 | // MQTT AT Commands 115 | const char MQTT_CONFIG_PARAMETER[] = "+QMTCFG"; 116 | const char MQTT_OPEN_NETWORK[] = "+QMTOPEN"; 117 | const char MQTT_CLOSE_NETWORK[] = "+QMTCLOSE"; 118 | const char MQTT_CREATE_CLIENT[] = "+QMTCONN"; 119 | const char MQTT_CLOSE_CLIENT[] = "+QMTDISC"; 120 | const char MQTT_SUBSCRIBE_TOPICS[] = "+QMTSUB"; 121 | const char MQTT_UNSUBSCRIBE_TOPICS[] = "+QMTUNS"; 122 | const char MQTT_PUBLISH_MESSAGES[] = "+QMTPUB"; 123 | const char MQTT_STATUS[] = "+QMTSTAT"; 124 | const char MQTT_RECV_DATA[] = "+QMTRECV"; 125 | 126 | // GNSS AT Commands 127 | const char GNSS_CONFIGURATION[] = "+QGPSCFG"; 128 | const char GNSS_TURN_ON[] = "+QGPS"; 129 | const char GNSS_TURN_OFF[] = "+QGPSEND"; 130 | const char GNSS_GET_POSITION[] = "+QGPSLOC"; 131 | const char GNSS_ACQUIRE_NMEA[] = "+QGPSGNMEA"; 132 | 133 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96Common.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96Common.h" 2 | 3 | WisLTEBG96Common::WisLTEBG96Common() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96Common::~WisLTEBG96Common() 9 | { 10 | 11 | } 12 | 13 | WisLTEBG96Common::WisLTEBG96Common(Stream &atserial, Stream &dserial):WisLTEBG96Serial(atserial,dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96Common::InitModule() 19 | { 20 | #ifdef WISLTE_BOARD 21 | pinMode(POWKEY_PIN, OUTPUT); 22 | delay(100); 23 | digitalWrite(POWKEY_PIN, LOW); 24 | delay(200); 25 | digitalWrite(POWKEY_PIN, HIGH); 26 | if(readResponseToBuffer(5)){ 27 | if(searchStrBuffer(RESPONSE_READY)){ 28 | return true; 29 | } 30 | } 31 | delay(1000); 32 | digitalWrite(POWKEY_PIN, LOW); 33 | delay(2000); 34 | digitalWrite(POWKEY_PIN, HIGH); 35 | if(readResponseToBuffer(5)){ 36 | if(searchStrBuffer(RESPONSE_POWER_DOWN)){ 37 | delay(10000); 38 | } 39 | } 40 | #endif 41 | #ifdef WISCELLULAR_BOARD 42 | pinMode(RESET_PIN, OUTPUT); 43 | digitalWrite(RESET_PIN, LOW); 44 | pinMode(POWKEY_PIN, OUTPUT); 45 | delay(100); 46 | digitalWrite(POWKEY_PIN, HIGH); 47 | delay(200); 48 | digitalWrite(POWKEY_PIN, LOW); 49 | if(readResponseToBuffer(5)){ 50 | if(searchStrBuffer(RESPONSE_READY)){ 51 | return true; 52 | } 53 | } 54 | delay(1000); 55 | digitalWrite(POWKEY_PIN, HIGH); 56 | delay(2000); 57 | digitalWrite(POWKEY_PIN, LOW); 58 | if(readResponseToBuffer(5)){ 59 | if(searchStrBuffer(RESPONSE_POWER_DOWN)){ 60 | delay(10000); 61 | } 62 | } 63 | #endif 64 | return false; 65 | } 66 | 67 | bool WisLTEBG96Common::SetDevCommandEcho(bool echo) 68 | { 69 | const char *cmd; 70 | if (echo == true){ 71 | cmd = "E1"; 72 | }else{ 73 | cmd = "E0"; 74 | } 75 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 76 | return true; 77 | } 78 | return false; 79 | } 80 | 81 | bool WisLTEBG96Common::GetDevInformation(char *inf) 82 | { 83 | if (sendAndSearch(DEV_INFORMATION,RESPONSE_OK,2)){ 84 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 85 | *end_buf = '\0'; 86 | strcpy(inf,rxBuffer); 87 | return true; 88 | } 89 | return false; 90 | } 91 | 92 | bool WisLTEBG96Common::GetDevVersion(char *ver) 93 | { 94 | if (sendAndSearch(DEV_VERSION,RESPONSE_OK,2)){ 95 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 96 | *end_buf = '\0'; 97 | strcpy(ver, rxBuffer); 98 | return true; 99 | } 100 | return false; 101 | } 102 | 103 | bool WisLTEBG96Common::GetDevIMEI(char *imei) 104 | { 105 | if (sendAndSearch(DEV_IMEI,RESPONSE_OK,2)){ 106 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 107 | *end_buf = '\0'; 108 | strcpy(imei, rxBuffer); 109 | return true; 110 | } 111 | return false; 112 | } 113 | 114 | Cmd_Response_t WisLTEBG96Common::SetDevFunctionality(Functionality_t mode) 115 | { 116 | char cmd[16]; 117 | Cmd_Response_t fun_status; 118 | strcpy(cmd, DEV_FUN_LEVEL); 119 | switch(mode) 120 | { 121 | case MINIMUM_FUNCTIONALITY: 122 | strcat(cmd,"=0"); 123 | break; 124 | case FULL_FUNCTIONALITY: 125 | strcat(cmd,"=1"); 126 | break; 127 | case DISABLE_RF: 128 | strcat(cmd,"=4"); 129 | break; 130 | default: 131 | return UNKNOWN_RESPONSE; 132 | } 133 | fun_status = sendAndSearch(cmd,RESPONSE_OK,RESPONSE_ERROR,15); 134 | return fun_status; 135 | } 136 | 137 | bool WisLTEBG96Common::DevLocalRate(unsigned long &rate, Cmd_Status_t status) 138 | { 139 | char cmd[16]; 140 | strcpy(cmd, DEV_LOCAL_RATE); 141 | if (status == READ_MODE){ 142 | strcat(cmd,"?"); 143 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 144 | char *sta_buf = searchStrBuffer(": "); 145 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 146 | *end_buf = '\0'; 147 | rate = atol(sta_buf + 2); 148 | return true; 149 | } 150 | }else if (status == WRITE_MODE){ 151 | for (int i = 0; i < sizeof(Band_list)/sizeof(Band_list[0]); i++){ 152 | if (rate == Band_list[i]){ 153 | char buf[16]; 154 | sprintf(buf, "=%ld;&W", rate); 155 | strcat(cmd, buf); 156 | if (sendAndSearch(cmd,RESPONSE_OK,2)){ 157 | return true; 158 | } 159 | } 160 | } 161 | } 162 | return false; 163 | } 164 | 165 | bool WisLTEBG96Common::GetDevSimIMSI(char *imsi) 166 | { 167 | if (sendAndSearch(DEV_SIM_IMSI,RESPONSE_OK,2)){ 168 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 169 | *end_buf = '\0'; 170 | strcpy(imsi, rxBuffer); 171 | return true; 172 | } 173 | return false; 174 | } 175 | 176 | bool WisLTEBG96Common::DevSimPIN(char *pin, Cmd_Status_t status) 177 | { 178 | char cmd[16]; 179 | strcpy(cmd, DEV_SIM_PIN); 180 | if (status == READ_MODE){ 181 | strcat(cmd,"?"); 182 | if (sendAndSearch(cmd,"READY",2)){ 183 | //pin = "READY"; 184 | return true; 185 | } 186 | }else if (status == WRITE_MODE){ 187 | char buf[16]; 188 | sprintf(buf,"=\"%s\"",pin); 189 | strcat(cmd,buf); 190 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 191 | return true; 192 | } 193 | } 194 | return false; 195 | } 196 | 197 | bool WisLTEBG96Common::GetDevSimICCID(char *iccid) 198 | { 199 | if (sendAndSearch(DEV_SIM_ICCID,RESPONSE_OK,2)){ 200 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 201 | *end_buf = '\0'; 202 | char *sta_buf = searchStrBuffer(": "); 203 | strcpy(iccid, sta_buf + 2); 204 | return true; 205 | } 206 | return false; 207 | } 208 | 209 | Net_Status_t WisLTEBG96Common::DevNetRegistrationStatus() 210 | { 211 | char cmd[16]; 212 | Net_Status_t n_status = NOT_REGISTERED; 213 | strcpy(cmd, DEV_NET_STATUS_G); 214 | strcat(cmd,"?"); 215 | if (sendAndSearch(cmd, RESPONSE_OK, 2)){ 216 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 217 | *end_buf = '\0'; 218 | char *sta_buf = searchChrBuffer(','); 219 | n_status = atoi(sta_buf + 1); 220 | switch (n_status) 221 | { 222 | case REGISTERED: 223 | case REGISTERED_ROAMING: 224 | return n_status; 225 | default: 226 | break; 227 | } 228 | } 229 | 230 | strcpy(cmd, DEV_EPS_NET_STATUS); 231 | strcat(cmd, "?"); 232 | if (sendAndSearch(cmd, RESPONSE_OK, 2)){ 233 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 234 | *end_buf = '\0'; 235 | char *sta_buf = searchChrBuffer(','); 236 | n_status = atoi(sta_buf + 1); 237 | switch (n_status) 238 | { 239 | case REGISTERED: 240 | case REGISTERED_ROAMING: 241 | return n_status; 242 | default: 243 | break; 244 | } 245 | } 246 | return n_status; 247 | } 248 | 249 | bool WisLTEBG96Common::GetDevNetSignalQuality(unsigned int &rssi) 250 | { 251 | if (sendAndSearch(DEV_NET_RSSI,RESPONSE_OK,2)){ 252 | char *sta_buf = searchStrBuffer(": "); 253 | char *end_buf = searchChrBuffer(','); 254 | *end_buf = '\0'; 255 | rssi = atoi(sta_buf + 2); 256 | return true; 257 | } 258 | return false; 259 | } 260 | 261 | Cmd_Response_t WisLTEBG96Common::ScanOperatorNetwork(char *net) 262 | { 263 | char cmd[16]; 264 | Cmd_Response_t scan_status; 265 | strcpy(cmd, DEV_NET_OPERATOR); 266 | strcat(cmd,"=?"); 267 | scan_status = sendAndSearch(cmd,RESPONSE_OK,RESPONSE_ERROR,180); 268 | if (scan_status == SUCCESS_RESPONSE){ 269 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 270 | *end_buf = '\0'; 271 | char *sta_buf = searchStrBuffer(": "); 272 | strcpy(net,sta_buf + 2); 273 | }else if(scan_status == FIAL_RESPONSE){ 274 | char *sta_buf = searchStrBuffer(": "); 275 | strcpy(net,sta_buf + 2); 276 | } 277 | return scan_status; 278 | } 279 | 280 | Cmd_Response_t WisLTEBG96Common::DevOperatorNetwork(unsigned int &mode, unsigned int &format, char *oper, Net_Type_t &act, Cmd_Status_t status) 281 | { 282 | char cmd[16]; 283 | Cmd_Response_t oper_status = UNKNOWN_RESPONSE; 284 | strcpy(cmd,DEV_NET_OPERATOR); 285 | if(status == READ_MODE){ 286 | strcat(cmd,"?"); 287 | oper_status = sendAndSearch(cmd,RESPONSE_OK,RESPONSE_ERROR,5); 288 | if(oper_status == SUCCESS_RESPONSE){ 289 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 290 | *end_buf = '\0'; 291 | char *sta_buf = searchStrBuffer(": "); 292 | char message[64]; char *p[5]; int i = 0; 293 | strcpy(message,sta_buf + 2); 294 | p[0]= strtok(message,","); 295 | while(p[i] != NULL){ 296 | i++; 297 | p[i] = strtok(NULL,","); 298 | } 299 | p[i] = '\0'; 300 | mode = atoi(p[0]); 301 | format = atoi(p[1]); 302 | strcpy(oper,p[2]); 303 | act = atoi(p[3]); 304 | } 305 | }else if(status == WRITE_MODE){ 306 | char buf[32]; 307 | sprintf(buf,"=%d,%d,\"%s\",%d",mode,format,oper,act); 308 | strcat(cmd,buf); 309 | oper_status = sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 30); 310 | } 311 | return oper_status; 312 | } 313 | 314 | bool WisLTEBG96Common::GetDevNetworkInformation(char *type, char *oper, char *band, char *channel) 315 | { 316 | if (sendAndSearch(DEV_NET_INFORMATION,RESPONSE_OK,2)){ 317 | char *sta_buf = searchStrBuffer(": "); 318 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 319 | *end_buf = '\0'; 320 | char message[64]; char *p[5]; int i = 0; 321 | strcpy(message,sta_buf + 2); 322 | p[0] = strtok(message,","); 323 | while(p[i] != NULL){ 324 | i++; 325 | p[i] = strtok(NULL,","); 326 | } 327 | p[i] = '\0'; 328 | strcpy(type, p[0]); 329 | strcpy(oper, p[1]); 330 | strcpy(band, p[2]); 331 | strcpy(channel, p[3]); 332 | return true; 333 | } 334 | return false; 335 | } 336 | 337 | bool WisLTEBG96Common::DevNetPacketCounter(unsigned long &send_bytes, unsigned long &recv_bytes, bool clean) 338 | { 339 | char cmd[16]; 340 | strcpy(cmd,DEV_NET_PACKET_COUNTER); 341 | strcat(cmd,"?"); 342 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 343 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 344 | *end_buf = '\0'; 345 | char *med_buf = searchChrBuffer(','); 346 | *med_buf = '\0'; 347 | char *sta_buf = searchStrBuffer(": "); 348 | send_bytes = atol(sta_buf + 2); 349 | recv_bytes = atol(med_buf + 1); 350 | if (clean == true){ 351 | memset(cmd,'\0',16); 352 | strcpy(cmd,DEV_NET_PACKET_COUNTER); 353 | strcat(cmd,"=0"); 354 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 355 | return true; 356 | }else { 357 | return false; 358 | } 359 | } 360 | return true; 361 | } 362 | return false; 363 | } 364 | 365 | bool WisLTEBG96Common::DevPowerDown() 366 | { 367 | char cmd[16]; 368 | strcpy(cmd,DEV_POWER_DOWN); 369 | strcat(cmd,"=1"); 370 | if(sendAndSearch(cmd,RESPONSE_POWER_DOWN,2)){ 371 | return true; 372 | } 373 | return false; 374 | } 375 | 376 | bool WisLTEBG96Common::DevClock(char *d_clock, Cmd_Status_t status) 377 | { 378 | char cmd[32]; 379 | strcpy(cmd,DEV_CLOCK); 380 | if (status == READ_MODE){ 381 | strcat(cmd,"?"); 382 | if (sendAndSearch(cmd,RESPONSE_OK,2)){ 383 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 384 | *end_buf = '\0'; 385 | char *sta_buf = searchStrBuffer(": "); 386 | strcpy(d_clock,sta_buf + 2); 387 | return true; 388 | } 389 | }else if (status == WRITE_MODE){ 390 | char buf[32]; 391 | sprintf(buf,"=\"%s\"",d_clock); 392 | strcat(cmd,buf); 393 | if (sendAndSearch(cmd,RESPONSE_OK,RESPONSE_ERROR,2)){ 394 | return true; 395 | } 396 | } 397 | return false; 398 | } -------------------------------------------------------------------------------- /src/WisLTEBG96Common.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 Common function 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 08/15/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | #ifndef _WISLTEBG96COMMON_H_ 30 | #define _WISLTEBG96COMMON_H_ 31 | 32 | #include "WisLTEBG96Serial.h" 33 | 34 | #define WISCELLULAR_BOARD 35 | #ifdef WISLTE_BOARD 36 | #define POWKEY_PIN 2 37 | #endif 38 | #ifdef WISCELLULAR_BOARD 39 | #define POWKEY_PIN 6 40 | #define RESET_PIN 5 41 | #endif 42 | 43 | typedef enum functionality{ 44 | MINIMUM_FUNCTIONALITY = 0, 45 | FULL_FUNCTIONALITY = 1, 46 | DISABLE_RF = 4, 47 | }Functionality_t; 48 | 49 | typedef enum cmd_status{ 50 | READ_MODE = 0, 51 | WRITE_MODE = 1, 52 | }Cmd_Status_t; 53 | 54 | typedef enum net_status{ 55 | NOT_REGISTERED = 0, 56 | REGISTERED = 1, 57 | SEARCHING = 2, 58 | REGISTRATION_DENIED = 3, 59 | UNKNOWN = 4, 60 | REGISTERED_ROAMING = 5, 61 | }Net_Status_t; 62 | 63 | typedef enum net_type{ 64 | GSM = 0, 65 | LTE_CAT_M1 = 8, 66 | LTE_CAT_NB1 = 9, 67 | }Net_Type_t; 68 | 69 | 70 | class WisLTEBG96Common : public WisLTEBG96Serial 71 | { 72 | public: 73 | WisLTEBG96Common(); 74 | 75 | ~WisLTEBG96Common(); 76 | 77 | WisLTEBG96Common(Stream &atserial, Stream &dserial); 78 | 79 | bool InitModule(); 80 | 81 | bool SetDevCommandEcho(bool echo); 82 | 83 | bool GetDevInformation(char *inf); 84 | 85 | bool GetDevVersion(char *ver); 86 | 87 | bool GetDevIMEI(char *imei); 88 | 89 | Cmd_Response_t SetDevFunctionality(Functionality_t mode); 90 | 91 | bool DevLocalRate(unsigned long &rate, Cmd_Status_t status); 92 | 93 | bool GetDevSimIMSI(char *imsi); 94 | 95 | bool DevSimPIN(char *pin, Cmd_Status_t status); 96 | 97 | bool GetDevSimICCID(char *iccid); 98 | 99 | Net_Status_t DevNetRegistrationStatus(); 100 | 101 | bool GetDevNetSignalQuality(unsigned int &rssi); 102 | 103 | Cmd_Response_t ScanOperatorNetwork(char *net); 104 | 105 | Cmd_Response_t DevOperatorNetwork(unsigned int &mode, unsigned int &format, char *oper, Net_Type_t &act, Cmd_Status_t status); 106 | 107 | bool GetDevNetworkInformation(char *type, char *oper, char *band, char *channel); 108 | 109 | bool DevNetPacketCounter(unsigned long &send_bytes, unsigned long &recv_bytes, bool clean); 110 | 111 | bool DevPowerDown(); 112 | 113 | bool DevClock(char *d_clock, Cmd_Status_t status); 114 | 115 | private: 116 | 117 | }; 118 | 119 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96FILE.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96FILE.h" 2 | 3 | WisLTEBG96FILE::WisLTEBG96FILE() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96FILE::~WisLTEBG96FILE() 9 | { 10 | cleanBuffer(); 11 | } 12 | 13 | WisLTEBG96FILE::WisLTEBG96FILE(Stream &atserial, Stream &dserial) : WisLTEBG96TCPIP(atserial, dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96FILE::GetFliesSpace(unsigned long &free_bytes, unsigned long &total_bytes) 19 | { 20 | char cmd[16]; 21 | strcpy(cmd,FILE_SPACE_INFORMATION); 22 | strcat(cmd,"=\"UFS\""); 23 | 24 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 25 | char *sta_buf = searchStrBuffer(": "); 26 | char *med_buf = searchChrBuffer(','); 27 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 28 | *med_buf = '\0'; 29 | *end_buf = '\0'; 30 | free_bytes = atol(sta_buf + 2); 31 | total_bytes = atol(med_buf + 1); 32 | return true; 33 | } 34 | return false; 35 | } 36 | 37 | bool WisLTEBG96FILE::GetFilesList(char *list) 38 | { 39 | char cmd[16]; 40 | strcpy(cmd, FILE_LIST_FILES); 41 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 42 | char *sta_buf = searchStrBuffer(FILE_LIST_FILES); 43 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 44 | *end_buf = '\0'; 45 | strcpy(list, sta_buf); 46 | return true; 47 | } 48 | return false; 49 | } 50 | 51 | bool WisLTEBG96FILE::DeleteFiles(char *filename) 52 | { 53 | char cmd[32],buf[32]; 54 | strcpy(cmd, FILE_DELETE_FILES); 55 | sprintf(buf, "=\"%s\"", filename); 56 | strcat(cmd, buf); 57 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 58 | return true; 59 | } 60 | return false; 61 | } 62 | 63 | bool WisLTEBG96FILE::UploadFiles(char *filename, char *u_file) 64 | { 65 | char cmd[32],buf[32]; 66 | strcpy(cmd, FILE_UPLOAD_FILES); 67 | sprintf(buf, "=\"%s\",%d", filename, strlen(u_file)); 68 | strcat(cmd, buf); 69 | if(sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 5)){ 70 | if(sendDataAndCheck(u_file, RESPONSE_OK, RESPONSE_ERROR, 10)){ 71 | return true; 72 | } 73 | } 74 | return false; 75 | } 76 | 77 | bool WisLTEBG96FILE::DownloadFiles(char *filename, char *d_file) 78 | { 79 | char cmd[32],buf[32]; 80 | strcpy(cmd, FILE_DOWNLOAD_FILE); 81 | sprintf(buf, "=\"%s\"", filename); 82 | strcat(cmd, buf); 83 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 30)){ 84 | char *end_buf = searchStrBuffer(FILE_DOWNLOAD_FILE); 85 | *end_buf = '\0'; 86 | char *sta_buf = searchStrBuffer(RESPONSE_CONNECT); 87 | strcpy(d_file, sta_buf + strlen(RESPONSE_CONNECT) + 2); 88 | return true; 89 | } 90 | return false; 91 | } 92 | 93 | bool WisLTEBG96FILE::OpenFile(char *filename, Open_File_Mode_t mode, unsigned int &file_index) 94 | { 95 | char cmd[32],buf[32]; 96 | strcpy(cmd, FILE_OPEN_FILE); 97 | sprintf(buf, "=\"%s\",%d", filename, mode); 98 | strcat(cmd, buf); 99 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 100 | char *sta_buf = searchStrBuffer(": "); 101 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 102 | *end_buf = '\0'; 103 | file_index = atoi(sta_buf + 2); 104 | return true; 105 | } 106 | return false; 107 | } 108 | 109 | bool WisLTEBG96FILE::ReadFile(unsigned int file_index, char *read_data) 110 | { 111 | char cmd[16],buf[8]; 112 | strcpy(cmd, FILE_READ_FILE); 113 | sprintf(buf, "=%d", file_index); 114 | strcat(cmd, buf); 115 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 10)){ 116 | char *sta_buf = searchStrBuffer("\r\n"); 117 | char *end_buf = searchStrBuffer("\r\nOK"); 118 | *end_buf = '\0'; 119 | strcpy(read_data, sta_buf + 2); 120 | return true; 121 | } 122 | return false; 123 | } 124 | 125 | bool WisLTEBG96FILE::WriteFile(unsigned int file_index, char *write_data) 126 | { 127 | char cmd[32],buf[16]; 128 | strcpy(cmd, FILE_WRITE_FILE); 129 | sprintf(buf, "=%d,%d", file_index, strlen(write_data)); 130 | strcat(cmd, buf); 131 | if(sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 5)){ 132 | if(sendDataAndCheck(write_data, RESPONSE_OK, RESPONSE_ERROR, 10)){ 133 | return true; 134 | } 135 | } 136 | return false; 137 | } 138 | 139 | bool WisLTEBG96FILE::CloseFlie(unsigned int file_index) 140 | { 141 | char cmd[16],buf[8]; 142 | strcpy(cmd, FILE_CLOSE_FILE); 143 | sprintf(buf, "=%d", file_index); 144 | strcat(cmd, buf); 145 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 146 | return true; 147 | } 148 | return false; 149 | } 150 | 151 | bool WisLTEBG96FILE::SetFilePointer(unsigned int file_index, unsigned int offset, Pointer_Mode_t p_mode) 152 | { 153 | char cmd[32],buf[16]; 154 | strcpy(cmd, FILE_SET_POSITION_FILE); 155 | sprintf(buf, "=%d,%d,%d", file_index, offset, p_mode); 156 | strcat(cmd, buf); 157 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 158 | return true; 159 | } 160 | return false; 161 | } 162 | 163 | bool WisLTEBG96FILE::GetFilePointer(unsigned int file_index, unsigned int &offset) 164 | { 165 | char cmd[32],buf[16]; 166 | strcpy(cmd, FILE_GET_POSITION_FILE); 167 | sprintf(buf, "=%d", file_index); 168 | strcat(cmd, buf); 169 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 170 | char *sta_buf = searchStrBuffer(": "); 171 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 172 | *end_buf = '\0'; 173 | offset = atoi(sta_buf + 2); 174 | return true; 175 | } 176 | return false; 177 | } 178 | 179 | bool WisLTEBG96FILE::TruncateFile(unsigned int file_index) 180 | { 181 | char cmd[16],buf[8]; 182 | strcpy(cmd, FILE_TRUNCATE_FILE); 183 | sprintf(buf, "=%d", file_index); 184 | strcat(cmd, buf); 185 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 186 | return true; 187 | } 188 | return false; 189 | } -------------------------------------------------------------------------------- /src/WisLTEBG96FILE.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 FILE operation manual 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 08/15/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96FILE_H_ 31 | #define _WISLTEBG96FILE_H_ 32 | 33 | #include "WisLTEBG96TCPIP.h" 34 | 35 | typedef enum open_file_mode{ 36 | CREATE_OR_OPEN = 0, 37 | CREATE_OR_CLEAR = 1, 38 | ONLY_READ = 2, 39 | }Open_File_Mode_t; 40 | 41 | typedef enum pointer_mode{ 42 | FILE_BEGINNING = 0, 43 | FILE_CURRENT = 1, 44 | FILE_ENDING = 2, 45 | }Pointer_Mode_t; 46 | 47 | class WisLTEBG96FILE : public WisLTEBG96TCPIP 48 | { 49 | public: 50 | 51 | WisLTEBG96FILE(); 52 | 53 | ~WisLTEBG96FILE(); 54 | 55 | WisLTEBG96FILE(Stream &atserial, Stream &dserial); 56 | 57 | bool GetFliesSpace(unsigned long &free_bytes, unsigned long &total_bytes); 58 | 59 | bool GetFilesList(char *list); 60 | 61 | bool DeleteFiles(char *filename); 62 | 63 | bool UploadFiles(char *filename, char *u_file); 64 | 65 | bool DownloadFiles(char *filename, char *d_file); 66 | 67 | bool OpenFile(char *filename, Open_File_Mode_t mode, unsigned int &file_index); 68 | 69 | bool ReadFile(unsigned int file_index, char *read_data); 70 | 71 | bool WriteFile(unsigned int file_index, char *write_data); 72 | 73 | bool CloseFlie(unsigned int file_index); 74 | 75 | bool SetFilePointer(unsigned int file_index, unsigned int offset, Pointer_Mode_t p_mode); 76 | 77 | bool GetFilePointer(unsigned int file_index, unsigned int &offset); 78 | 79 | bool TruncateFile(unsigned int file_index); 80 | 81 | private: 82 | 83 | }; 84 | 85 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96GNSS.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96GNSS.h" 2 | 3 | WisLTEBG96GNSS::WisLTEBG96GNSS() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96GNSS::~WisLTEBG96GNSS() 9 | { 10 | 11 | } 12 | 13 | WisLTEBG96GNSS::WisLTEBG96GNSS(Stream &atserial, Stream &dserial) : WisLTEBG96Common(atserial, dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96GNSS::SetGNSSConstellation(GNSS_Constellation_t constellation) 19 | { 20 | char cmd[32], buf[32]; 21 | strcpy(cmd, GNSS_CONFIGURATION); 22 | sprintf(buf, "=\"gnssconfig\",%d", constellation); 23 | strcat(cmd, buf); 24 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 25 | return true; 26 | } 27 | return false; 28 | } 29 | 30 | bool WisLTEBG96GNSS::SetGNSSAutoRun(bool auto_run) 31 | { 32 | char cmd[32]; 33 | strcpy(cmd, GNSS_CONFIGURATION); 34 | if(auto_run){ 35 | strcat(cmd, "\"autogps\",1"); 36 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 37 | return true; 38 | } 39 | }else { 40 | strcat(cmd, "\"autogps\",0"); 41 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 42 | return true; 43 | } 44 | } 45 | return false; 46 | } 47 | 48 | bool WisLTEBG96GNSS::SetGNSSEnableNMEASentences(bool enable) 49 | { 50 | char cmd[32]; 51 | strcpy(cmd, GNSS_CONFIGURATION); 52 | if (enable){ 53 | strcat(cmd, "=\"nmeasrc\",1"); 54 | }else { 55 | strcat(cmd, "=\"nmeasrc\",0"); 56 | } 57 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 58 | return true; 59 | } 60 | return false; 61 | } 62 | 63 | bool WisLTEBG96GNSS::TurnOnGNSS(GNSS_Work_Mode_t mode, Cmd_Status_t status) 64 | { 65 | char cmd[16],buf[8]; 66 | strcpy(cmd, GNSS_TURN_ON); 67 | if (status == READ_MODE){ 68 | strcat(cmd, "?"); 69 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 70 | char *sta_buf = searchStrBuffer(": "); 71 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 72 | *end_buf = '\0'; 73 | if(atoi(sta_buf + 2) == 1){ 74 | return true; 75 | } 76 | } 77 | }else if (status == WRITE_MODE){ 78 | sprintf(buf, "=%d", mode); 79 | strcat(cmd, buf); 80 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 10)){ 81 | return true; 82 | } 83 | } 84 | return false; 85 | } 86 | 87 | bool WisLTEBG96GNSS::TurnOffGNSS() 88 | { 89 | char cmd[16]; 90 | strcpy(cmd, GNSS_TURN_OFF); 91 | if (sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 10)){ 92 | return true; 93 | } 94 | return false; 95 | } 96 | 97 | bool WisLTEBG96GNSS::GetGNSSPositionInformation(char *position) 98 | { 99 | char cmd[16]; 100 | strcpy(cmd, GNSS_GET_POSITION); 101 | strcat(cmd, "=2"); 102 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 10)){ 103 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 104 | *end_buf = '\0'; 105 | char *sta_buf = searchStrBuffer(": "); 106 | strcpy(position, sta_buf + 2); 107 | return true; 108 | } 109 | return false; 110 | } 111 | 112 | bool WisLTEBG96GNSS::GetGNSSNMEASentences(NMEA_Type_t type, char *sentences) 113 | { 114 | char cmd[32]; 115 | strcpy(cmd, GNSS_ACQUIRE_NMEA); 116 | switch(type) 117 | { 118 | case GPGGA: 119 | strcat(cmd, "=\"GCA\""); 120 | break; 121 | case GPRMC: 122 | strcat(cmd, "=\"RMC\""); 123 | break; 124 | case GPGSV: 125 | strcat(cmd, "=\"GSV\""); 126 | break; 127 | case GPGSA: 128 | strcat(cmd, "=\"GSA\""); 129 | break; 130 | case GPVTG: 131 | strcat(cmd, "=\"VTG\""); 132 | break; 133 | default: 134 | return false; 135 | } 136 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 10)){ 137 | char *sta_buf = searchStrBuffer(": "); 138 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 139 | *end_buf = '\0'; 140 | strcpy(sentences, sta_buf + 2); 141 | return true; 142 | } 143 | return false; 144 | } -------------------------------------------------------------------------------- /src/WisLTEBG96GNSS.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 GNSS function 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 09/01/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96GNSS_H_ 31 | #define _WISLTEBG96GNSS_H_ 32 | 33 | #include "WisLTEBG96Common.h" 34 | 35 | typedef enum gnss_work_mode{ 36 | STAND_ALONE = 1, 37 | MS_BASED = 2, 38 | MS_ASSISTED = 3, 39 | SPEED_OPTIMAL = 4, 40 | }GNSS_Work_Mode_t; 41 | 42 | typedef enum gnss_constellation{ 43 | GPS_ONLY = 0, 44 | GPS_GLONASS_BEIDOU_GALILEO = 1, 45 | GPS_GLONASS_BEIDOU = 2, 46 | GPS_GLONASS_GALILEO = 3, 47 | GPS_GLONASS = 4, 48 | GPS_BEIDOU_GALILEO = 5, 49 | GPS_GALILEO = 6, 50 | }GNSS_Constellation_t; 51 | 52 | typedef enum nmea_sentences_type{ 53 | GPGGA = 1, 54 | GPRMC = 2, 55 | GPGSV = 4, 56 | GPGSA = 8, 57 | GPVTG = 16, 58 | }NMEA_Type_t; 59 | 60 | class WisLTEBG96GNSS : public WisLTEBG96Common 61 | { 62 | public: 63 | WisLTEBG96GNSS(); 64 | 65 | ~WisLTEBG96GNSS(); 66 | 67 | WisLTEBG96GNSS(Stream &atserial, Stream &dserial); 68 | 69 | bool SetGNSSConstellation(GNSS_Constellation_t constellation); 70 | 71 | bool SetGNSSEnableNMEASentences(bool enable); 72 | 73 | bool SetGNSSAutoRun(bool auto_run); 74 | 75 | bool TurnOnGNSS(GNSS_Work_Mode_t mode, Cmd_Status_t status); 76 | 77 | bool GetGNSSPositionInformation(char *position); 78 | 79 | bool TurnOffGNSS(); 80 | 81 | bool GetGNSSNMEASentences(NMEA_Type_t type, char *sentences); 82 | 83 | private: 84 | 85 | }; 86 | 87 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96HTTP.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96HTTP.h" 2 | 3 | WisLTEBG96HTTP::WisLTEBG96HTTP() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96HTTP::~WisLTEBG96HTTP() 9 | { 10 | 11 | } 12 | 13 | WisLTEBG96HTTP::WisLTEBG96HTTP(Stream &atserial, Stream &dserial) : WisLTEBG96SSL(atserial, dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96HTTP::SetHTTPConfigParameters(unsigned int pdp_index, bool request_header, bool response_header, HTTP_Body_Data_Type_t type) 19 | { 20 | char cmd[64], buf[32]; 21 | strcpy(cmd, HTTP_CONFIG_PARAMETER); 22 | sprintf(buf, "=\"contextid\",%d", pdp_index); 23 | strcat(cmd, buf); 24 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 25 | return false; 26 | } 27 | memset(cmd, '\0', 64); 28 | strcpy(cmd, HTTP_CONFIG_PARAMETER); 29 | if (request_header){ 30 | strcat(cmd, "=\"requestheader\",1"); 31 | }else { 32 | strcat(cmd, "=\"requestheader\",0"); 33 | } 34 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 35 | return false; 36 | } 37 | memset(cmd, '\0', 64); 38 | strcpy(cmd, HTTP_CONFIG_PARAMETER); 39 | if (response_header){ 40 | strcat(cmd, "=\"responseheader\",1"); 41 | }else { 42 | strcat(cmd, "=\"responseheader\",0"); 43 | } 44 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 45 | return false; 46 | } 47 | memset(cmd, '\0', 64); 48 | memset(buf, '\0', 32); 49 | strcpy(cmd, HTTP_CONFIG_PARAMETER); 50 | sprintf(buf, "=\"contenttype\",%d", type); 51 | strcat(cmd, buf); 52 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 53 | return false; 54 | } 55 | return true; 56 | } 57 | 58 | bool WisLTEBG96HTTP::SetHTTPEnableSSL(unsigned int ssl_index) 59 | { 60 | char cmd[64], buf[32]; 61 | strcpy(cmd, HTTP_CONFIG_PARAMETER); 62 | sprintf(buf, "=\"sslctxid\",%d", ssl_index); 63 | strcat(cmd, buf); 64 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 65 | return true; 66 | } 67 | return false; 68 | } 69 | 70 | bool WisLTEBG96HTTP::HTTPURL(char *url, Cmd_Status_t status) 71 | { 72 | char cmd[32],buf[16]; 73 | strcpy(cmd, HTTP_SET_URL); 74 | if(status == READ_MODE){ 75 | strcat(cmd, "?"); 76 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 77 | char *sta_buf = searchStrBuffer(": "); 78 | if(sta_buf == NULL){ 79 | url = ""; 80 | }else { 81 | char *end_buf = searchStrBuffer("\r\nOK"); 82 | *end_buf = '\0'; 83 | strcpy(url, sta_buf + 2); 84 | } 85 | return true; 86 | } 87 | }else if (status == WRITE_MODE){ 88 | sprintf(buf, "=%d", strlen(url)); 89 | strcat(cmd, buf); 90 | if(sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 10)){ 91 | if(sendDataAndCheck(url, RESPONSE_OK, RESPONSE_ERROR, 60)){ 92 | return true; 93 | } 94 | } 95 | } 96 | return false; 97 | } 98 | 99 | bool WisLTEBG96HTTP::HTTPGET(unsigned int timeout) 100 | { 101 | char cmd[32], buf[16]; 102 | strcpy(cmd, HTTP_GET_REQUEST); 103 | sprintf(buf, "=%d", timeout); 104 | strcat(cmd, buf); 105 | if(sendAndSearch(cmd, HTTP_GET_REQUEST, RESPONSE_ERROR, timeout)){ 106 | unsigned long start_time = millis(); 107 | errorCode = -1; 108 | while(millis() - start_time < 200UL){ 109 | if(serialAvailable()){ 110 | readResponseByteToBuffer(); 111 | } 112 | } 113 | char *sta_buf = searchStrBuffer(": "); 114 | char *end_buf = searchChrBuffer(','); 115 | *end_buf = '\0'; 116 | if (atoi(sta_buf + 2) == 0) { 117 | return true; 118 | }else { 119 | errorCode = atoi(sta_buf + 2); 120 | } 121 | } 122 | return false; 123 | } 124 | 125 | bool WisLTEBG96HTTP::HTTPPOST(char *post_data, unsigned int timeout) 126 | { 127 | char cmd[32], buf[16]; 128 | strcpy(cmd, HTTP_POST_REQUEST); 129 | sprintf(buf, "=%d,%d,%d", strlen(post_data), timeout, timeout); 130 | strcat(cmd, buf); 131 | if(sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 10)){ 132 | if(sendDataAndCheck(post_data, HTTP_POST_REQUEST, RESPONSE_ERROR, timeout)){ 133 | unsigned long start_time = millis(); 134 | errorCode = -1; 135 | while(millis() - start_time < 200UL){ 136 | if(serialAvailable()){ 137 | readResponseByteToBuffer(); 138 | } 139 | } 140 | char *sta_buf = searchStrBuffer(": "); 141 | char *end_buf = searchChrBuffer(','); 142 | *end_buf = '\0'; 143 | if (atoi(sta_buf + 2) == 0) { 144 | return true; 145 | }else { 146 | errorCode = atoi(sta_buf + 2); 147 | } 148 | } 149 | } 150 | return false; 151 | } 152 | 153 | bool WisLTEBG96HTTP::HTTTPPOSTFile(char *filename, unsigned int timeout) 154 | { 155 | char cmd[64], buf[32]; 156 | strcpy(cmd, HTTP_FILE_POST_REQUEST); 157 | sprintf(buf, "=\"%s\",%d", filename, timeout); 158 | strcat(cmd, buf); 159 | if(sendAndSearch(cmd, HTTP_FILE_POST_REQUEST, RESPONSE_ERROR, timeout)){ 160 | unsigned long start_time = millis(); 161 | errorCode = -1; 162 | while(millis() - start_time < 200UL){ 163 | if(serialAvailable()){ 164 | readResponseByteToBuffer(); 165 | } 166 | } 167 | char *sta_buf = searchStrBuffer(": "); 168 | char *end_buf = searchChrBuffer(','); 169 | *end_buf = '\0'; 170 | if (atoi(sta_buf + 2) == 0) { 171 | return true; 172 | }else { 173 | errorCode = atoi(sta_buf + 2); 174 | } 175 | } 176 | return false; 177 | } 178 | 179 | bool WisLTEBG96HTTP::HTTPRead(char *read_data, unsigned int timeout) 180 | { 181 | char cmd[32], buf[16]; 182 | strcpy(cmd, HTTP_READ_RESPONSE); 183 | sprintf(buf, "=%d", timeout); 184 | strcat(cmd, buf); 185 | if(sendAndSearch(cmd, HTTP_READ_RESPONSE, RESPONSE_ERROR, timeout)){ 186 | unsigned long start_time = millis(); 187 | errorCode = -1; 188 | while(millis() - start_time < 200UL){ 189 | if(serialAvailable()){ 190 | readResponseByteToBuffer(); 191 | } 192 | } 193 | char *sta_buf = searchStrBuffer(RESPONSE_CONNECT); 194 | char *end_buf = searchStrBuffer("OK\r\n\r\n"); 195 | *end_buf = '\0'; 196 | strcpy(read_data, sta_buf + strlen(RESPONSE_CONNECT) + 2); 197 | return true; 198 | } 199 | return false; 200 | } 201 | 202 | bool WisLTEBG96HTTP::HTTPReadToFile(char *filename, unsigned int timeout) 203 | { 204 | char cmd[64], buf[32]; 205 | strcpy(cmd, HTTP_FILE_READ_RESPONSE); 206 | sprintf(buf, "=\"%s\",%d", filename, timeout); 207 | strcat(cmd, buf); 208 | if(sendAndSearch(cmd, HTTP_FILE_READ_RESPONSE, RESPONSE_ERROR, timeout)){ 209 | unsigned long start_time = millis(); 210 | errorCode = -1; 211 | while(millis() - start_time < 200UL){ 212 | if(serialAvailable()){ 213 | readResponseByteToBuffer(); 214 | } 215 | } 216 | char *sta_buf = searchStrBuffer(": "); 217 | if(atoi(sta_buf + 2) == 0){ 218 | return true; 219 | }else { 220 | errorCode = atoi(sta_buf + 2); 221 | } 222 | } 223 | return false; 224 | } -------------------------------------------------------------------------------- /src/WisLTEBG96HTTP.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 HTTP function 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 09/06/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96HTTP_H_ 31 | #define _WISLTEBG96HTTP_H_ 32 | 33 | #include "WisLTEBG96SSL.h" 34 | 35 | typedef enum http_body_data_type{ 36 | APPLICATION_X_WWW_FORM_URLENCODED = 0, 37 | TEXT_PLAIN = 1, 38 | APPLICATION_OCTET_STREAM = 2, 39 | MULTIPART_FORM_DATA = 3, 40 | }HTTP_Body_Data_Type_t; 41 | 42 | class WisLTEBG96HTTP : public WisLTEBG96SSL 43 | { 44 | public: 45 | WisLTEBG96HTTP(); 46 | 47 | ~WisLTEBG96HTTP(); 48 | 49 | WisLTEBG96HTTP(Stream &atserial, Stream &dserial); 50 | 51 | bool SetHTTPConfigParameters(unsigned int pdp_index, bool request_header, bool response_header, HTTP_Body_Data_Type_t type); 52 | 53 | bool SetHTTPEnableSSL(unsigned int ssl_index); 54 | 55 | bool HTTPURL(char *url, Cmd_Status_t status); 56 | 57 | bool HTTPGET(unsigned int timeout); 58 | 59 | bool HTTPPOST(char *post_data, unsigned int timeout); 60 | 61 | bool HTTTPPOSTFile(char *filename, unsigned int timeout); 62 | 63 | bool HTTPRead(char *read_data, unsigned int timeout); 64 | 65 | bool HTTPReadToFile(char *filename, unsigned int timeout); 66 | 67 | private: 68 | 69 | }; 70 | 71 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96MQTT.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96MQTT.h" 2 | 3 | WisLTEBG96MQTT::WisLTEBG96MQTT() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96MQTT::~WisLTEBG96MQTT() 9 | { 10 | 11 | } 12 | 13 | WisLTEBG96MQTT::WisLTEBG96MQTT(Stream &atserial, Stream &dserial) : WisLTEBG96SSL(atserial, dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96MQTT::SetMQTTConfigureParameters(unsigned int mqtt_index, unsigned int pdp_index, Mqtt_Version_t version, unsigned int keep_alive_time, Mqtt_Session_Type_t type) 19 | { 20 | char cmd[32], buf[32]; 21 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 22 | sprintf(buf, "=\"version\",%d,%d", mqtt_index, version); 23 | strcat(cmd, buf); 24 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 25 | return false; 26 | } 27 | memset(cmd, '\0', 32); 28 | memset(buf, '\0', 32); 29 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 30 | sprintf(buf, "=\"pdpcid\",%d,%d", mqtt_index, pdp_index); 31 | strcat(cmd, buf); 32 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 33 | return false; 34 | } 35 | memset(cmd, '\0', 32); 36 | memset(buf, '\0', 32); 37 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 38 | sprintf(buf, "=\"keepalive\",%d,%d", mqtt_index, keep_alive_time); 39 | strcat(cmd, buf); 40 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 41 | return false; 42 | } 43 | memset(cmd, '\0', 32); 44 | memset(buf, '\0', 32); 45 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 46 | sprintf(buf, "=\"session\",%d,%d", mqtt_index, type); 47 | strcat(cmd, buf); 48 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 49 | return false; 50 | } 51 | return true; 52 | } 53 | 54 | bool WisLTEBG96MQTT::SetMQTTEnableSSL(unsigned int mqtt_index, unsigned int ssl_index, bool enable) 55 | { 56 | char cmd[32], buf[16]; 57 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 58 | if(enable){ 59 | sprintf(buf, "=\"ssl\",%d,1,%d", mqtt_index, ssl_index); 60 | }else { 61 | sprintf(buf, "=\"ssl\",%d,0,%d", mqtt_index, ssl_index); 62 | } 63 | strcat(cmd, buf); 64 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 65 | return true; 66 | } 67 | return false; 68 | } 69 | 70 | bool WisLTEBG96MQTT::SetMQTTMessageTimeout(unsigned int mqtt_index, unsigned int pkt_timeout, unsigned int retry_num, bool timeout_notice) 71 | { 72 | char cmd[32], buf[32]; 73 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 74 | if(timeout_notice){ 75 | sprintf(buf, "=\"timeout\",%d,%d,%d,1", mqtt_index, pkt_timeout, retry_num); 76 | }else { 77 | sprintf(buf, "=\"timeout\",%d,%d,%d,0", mqtt_index, pkt_timeout, retry_num); 78 | } 79 | strcat(cmd, buf); 80 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 81 | return true; 82 | } 83 | return false; 84 | } 85 | 86 | bool WisLTEBG96MQTT::SetMQTTAlibabaCloudDeviceInformation(unsigned int mqtt_index, char *product_key, char *device_name, char *device_secret) 87 | { 88 | char cmd[128], buf[128]; 89 | strcpy(cmd, MQTT_CONFIG_PARAMETER); 90 | sprintf(buf, "=\"aliauth\",%d,\"%s\",\"%s\",\"%s\"", mqtt_index, product_key, device_name, device_secret); 91 | strcat(cmd, buf); 92 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 93 | return true; 94 | } 95 | return false; 96 | } 97 | 98 | Mqtt_Network_Result_t WisLTEBG96MQTT::OpenMQTTNetwork(unsigned int mqtt_index, char *host_name, unsigned int port) 99 | { 100 | char cmd[80], buf[64]; 101 | strcpy(cmd, MQTT_OPEN_NETWORK); 102 | sprintf(buf, "=%d,\"%s\",%d", mqtt_index, host_name, port); 103 | strcat(cmd, buf); 104 | if(sendAndSearch(cmd, MQTT_OPEN_NETWORK, RESPONSE_ERROR, 150)){ 105 | unsigned long start_time = millis(); 106 | while(millis() - start_time < 200UL){ 107 | if(serialAvailable()){ 108 | readResponseByteToBuffer(); 109 | } 110 | } 111 | char *sta_buf = searchChrBuffer(','); 112 | return atoi(sta_buf + 1); 113 | } 114 | return -2; 115 | } 116 | 117 | bool WisLTEBG96MQTT::CloseMQTTNetwork(unsigned int mqtt_index) 118 | { 119 | char cmd[16], buf[8]; 120 | strcpy(cmd, MQTT_CLOSE_NETWORK); 121 | sprintf(buf, "=%d", mqtt_index); 122 | strcat(cmd, buf); 123 | if(sendAndSearch(cmd, MQTT_CLOSE_NETWORK, RESPONSE_ERROR, 2)){ 124 | unsigned long start_time = millis(); 125 | while(millis() - start_time < 200UL){ 126 | if(serialAvailable()){ 127 | readResponseByteToBuffer(); 128 | } 129 | } 130 | char *sta_buf = searchChrBuffer(','); 131 | if(atoi(sta_buf + 1) == 0){ 132 | return true; 133 | } 134 | } 135 | return false; 136 | } 137 | 138 | Mqtt_Client_Result_Status_t WisLTEBG96MQTT::CreateMQTTClient(unsigned int mqtt_index, char *client_id, char *username, char *password) 139 | { 140 | char cmd[128], buf[128]; 141 | strcpy(cmd, MQTT_CREATE_CLIENT); 142 | if (username != "" && password != ""){ 143 | sprintf(buf, "=%d,\"%s\",\"%s\",\"%s\"", mqtt_index, client_id, username, password); 144 | } else { 145 | sprintf(buf, "=%d,\"%s\"", mqtt_index, client_id); 146 | } 147 | strcat(cmd, buf); 148 | if (sendAndSearch(cmd, MQTT_CREATE_CLIENT, RESPONSE_ERROR, 150)){ 149 | unsigned long start_time = millis(); 150 | while(millis() - start_time < 200UL){ 151 | if(serialAvailable()){ 152 | readResponseByteToBuffer(); 153 | } 154 | } 155 | char temp[16]; 156 | char *sta_buf = searchChrBuffer(','); 157 | strcpy(temp, sta_buf + 1); 158 | sta_buf = strchr(temp, ','); 159 | *sta_buf = '\0'; 160 | return atoi(temp); 161 | } 162 | return -1; 163 | } 164 | 165 | bool WisLTEBG96MQTT::CloseMQTTClient(unsigned int mqtt_index) 166 | { 167 | char cmd[16], buf[8]; 168 | strcpy(cmd, MQTT_CLOSE_CLIENT); 169 | sprintf(buf, "=%d", mqtt_index); 170 | strcat(cmd, buf); 171 | if(sendAndSearch(cmd, MQTT_CLOSE_CLIENT, RESPONSE_OK, 2)){ 172 | unsigned long start_time = millis(); 173 | while(millis() - start_time < 200UL){ 174 | if(serialAvailable()){ 175 | readResponseByteToBuffer(); 176 | } 177 | } 178 | char *sta_buf = searchChrBuffer(','); 179 | if(atoi(sta_buf + 1) == 0){ 180 | return true; 181 | } 182 | } 183 | return false; 184 | } 185 | 186 | Mqtt_Client_Result_Status_t WisLTEBG96MQTT::MQTTSubscribeTopic(unsigned int mqtt_index, unsigned int msg_id, char *topic, Mqtt_Qos_t qos) 187 | { 188 | char cmd[64], buf[64]; 189 | strcpy(cmd, MQTT_SUBSCRIBE_TOPICS); 190 | sprintf(buf, "=%d,%d,\"%s\",%d", mqtt_index, msg_id, topic, qos); 191 | strcat(cmd, buf); 192 | if (sendAndSearch(cmd, MQTT_SUBSCRIBE_TOPICS, RESPONSE_ERROR, 150)){ 193 | unsigned long start_time = millis(); 194 | while(millis() - start_time < 200UL){ 195 | if(serialAvailable()){ 196 | readResponseByteToBuffer(); 197 | } 198 | } 199 | int i = 0; 200 | char temp[16], *p[4]; 201 | char *sta_buf = searchChrBuffer(','); 202 | strcpy(temp, sta_buf + 1); 203 | p[0] = strtok(temp, ","); 204 | while(p[i] != NULL){ 205 | i++; 206 | p[i] = strtok(NULL,","); 207 | } 208 | p[i] = '\0'; 209 | return atoi(p[1]); 210 | } 211 | return -1; 212 | } 213 | 214 | Mqtt_Client_Result_Status_t WisLTEBG96MQTT::MQTTUnsubscribeTopic(unsigned int mqtt_index, unsigned int msg_id, char *topic) 215 | { 216 | char cmd[40], buf[32]; 217 | strcpy(cmd, MQTT_UNSUBSCRIBE_TOPICS); 218 | sprintf(buf, "=%d,%d,\"%s\"", mqtt_index, msg_id, topic); 219 | strcat(cmd, buf); 220 | if(sendAndSearch(cmd, MQTT_UNSUBSCRIBE_TOPICS, RESPONSE_ERROR, 150)){ 221 | unsigned long start_time = millis(); 222 | while(millis() - start_time < 200UL){ 223 | if(serialAvailable()){ 224 | readResponseByteToBuffer(); 225 | } 226 | } 227 | char temp[16]; 228 | char *sta_buf = searchChrBuffer(','); 229 | strcpy(temp, sta_buf + 1); 230 | sta_buf = strchr(temp, ','); 231 | *sta_buf = '\0'; 232 | return atoi(temp); 233 | } 234 | return -1; 235 | } 236 | 237 | Mqtt_Client_Result_Status_t WisLTEBG96MQTT::MQTTPublishMessages(unsigned int mqtt_index, unsigned int msg_id, Mqtt_Qos_t qos, char *topic, bool retain, char *publish_data) 238 | { 239 | char cmd[64], buf[64]; 240 | strcpy(cmd, MQTT_PUBLISH_MESSAGES); 241 | if(retain){ 242 | sprintf(buf, "=%d,%d,%d,1,\"%s\"", mqtt_index, msg_id, qos, topic); 243 | } else { 244 | sprintf(buf, "=%d,%d,%d,0,\"%s\"", mqtt_index, msg_id, qos, topic); 245 | } 246 | strcat(cmd, buf); 247 | if (sendAndSearchChr(cmd, '>', 2)){ 248 | char ctrl_z = 0x1A; 249 | strcat(publish_data, ctrl_z); 250 | if (sendDataAndCheck(publish_data, MQTT_PUBLISH_MESSAGES, RESPONSE_ERROR, 150)){ 251 | unsigned long start_time = millis(); 252 | while(millis() - start_time < 500UL){ 253 | if(serialAvailable()){ 254 | readResponseByteToBuffer(); 255 | } 256 | } 257 | memset(publish_data, '\0', strlen(publish_data)); 258 | char temp[16]; 259 | char *sta_buf = searchChrBuffer(','); 260 | strcpy(temp, sta_buf + 1); 261 | sta_buf = strchr(temp, ','); 262 | *sta_buf = '\0'; 263 | return atoi(temp); 264 | } 265 | } 266 | return -1; 267 | } 268 | 269 | Mqtt_URC_Event_t WisLTEBG96MQTT::WaitCheckMQTTURCEvent(char *event, unsigned int timeout) 270 | { 271 | Cmd_Response_t ret = readResponseAndSearch(MQTT_RECV_DATA, MQTT_STATUS, timeout); 272 | unsigned long start_time = millis(); 273 | while (millis() - start_time < 200UL){ 274 | if (serialAvailable()){ 275 | readResponseByteToBuffer(); 276 | } 277 | } 278 | if (ret == SUCCESS_RESPONSE){ 279 | char *sta_buf = searchStrBuffer(": "); 280 | strcpy(event, sta_buf + 2); 281 | return MQTT_RECV_DATA_EVENT; 282 | } else if (ret == FIAL_RESPONSE){ 283 | char *sta_buf = searchStrBuffer(": "); 284 | strcpy(event, sta_buf + 2); 285 | return MQTT_STATUS_EVENT; 286 | } 287 | return -1; 288 | } -------------------------------------------------------------------------------- /src/WisLTEBG96MQTT.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 HTTP function 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 09/07/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96MQTT_H_ 31 | #define _WISLTEBG96MQTT_H_ 32 | 33 | #include "WisLTEBG96SSL.h" 34 | 35 | typedef enum mqtt_version{ 36 | MQTT_V4 = 4, 37 | MQTT_V3 = 3, 38 | }Mqtt_Version_t; 39 | 40 | typedef enum mqtt_qos{ 41 | AT_MOST_ONCE = 0, 42 | AT_LEAST_ONCE = 1, 43 | EXACTLY_ONCE = 2, 44 | }Mqtt_Qos_t; 45 | 46 | typedef enum mqtt_session_type{ 47 | SERVER_STORE_SUBSCRIPTIONS = 0, 48 | SERVER_DISCARD_INFORMATION = 1, 49 | }Mqtt_Session_Type_t; 50 | 51 | typedef enum mqtt_network_result_event{ 52 | MQTT_NETWORK_OPEN_FAIL = -1, 53 | MQTT_NETWORK_OPEN_SUCCESS = 0, 54 | MQTT_NETWORK_WRONG_PARAMETER = 1, 55 | MQTT_NETWORK_INDEX_OCCUPIED = 2, 56 | MQTT_NETWORK_ACTIVATE_PDP_FAIL = 3, 57 | MQTT_NETWORK_PARSE_DOMAIN_FAIL = 4, 58 | MQTT_NETWORK_DISCONNECTION_ERROR = 5, 59 | }Mqtt_Network_Result_t; 60 | 61 | typedef enum mqtt_client_result_status{ 62 | PACKET_SEND_SUCCESS_AND_RECV_ACK = 0, 63 | PACKET_RETRANSMISSION = 1, 64 | PACKET_SEND_FAIL = 2, 65 | }Mqtt_Client_Result_Status_t; 66 | 67 | typedef enum mqtt_urc_event{ 68 | MQTT_STATUS_EVENT = 0, 69 | MQTT_RECV_DATA_EVENT = 1, 70 | }Mqtt_URC_Event_t; 71 | 72 | class WisLTEBG96MQTT : public WisLTEBG96SSL 73 | { 74 | public: 75 | WisLTEBG96MQTT(); 76 | 77 | ~WisLTEBG96MQTT(); 78 | 79 | WisLTEBG96MQTT(Stream &atserial, Stream &dserial); 80 | 81 | bool SetMQTTConfigureParameters(unsigned int mqtt_index, unsigned int pdp_index, Mqtt_Version_t version, unsigned int keep_alive_time, Mqtt_Session_Type_t type); 82 | 83 | bool SetMQTTEnableSSL(unsigned int mqtt_index, unsigned int ssl_index, bool enable); 84 | 85 | bool SetMQTTMessageTimeout(unsigned int mqtt_index, unsigned int pkt_timeout, unsigned int retry_num, bool timeout_notice); 86 | 87 | bool SetMQTTAlibabaCloudDeviceInformation(unsigned int mqtt_index, char *product_key, char *device_name, char *device_secret); 88 | 89 | Mqtt_Network_Result_t OpenMQTTNetwork(unsigned int mqtt_index, char *host_name, unsigned int port); 90 | 91 | bool CloseMQTTNetwork(unsigned int mqtt_index); 92 | 93 | Mqtt_Client_Result_Status_t CreateMQTTClient(unsigned int mqtt_index, char *client_id, char *username, char *password); 94 | 95 | bool CloseMQTTClient(unsigned int mqtt_index); 96 | 97 | Mqtt_Client_Result_Status_t MQTTSubscribeTopic(unsigned int mqtt_index, unsigned int msg_id, char *topic, Mqtt_Qos_t qos); 98 | 99 | Mqtt_Client_Result_Status_t MQTTUnsubscribeTopic(unsigned int mqtt_index, unsigned int msg_id, char *topic); 100 | 101 | Mqtt_Client_Result_Status_t MQTTPublishMessages(unsigned int mqtt_index, unsigned int msg_id, Mqtt_Qos_t qos, char *topic, bool retain, char *publish_data); 102 | 103 | Mqtt_URC_Event_t WaitCheckMQTTURCEvent(char *event, unsigned int timeout); 104 | 105 | private: 106 | 107 | }; 108 | 109 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96SSL.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96SSL.h" 2 | 3 | WisLTEBG96SSL::WisLTEBG96SSL() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96SSL::~WisLTEBG96SSL() 9 | { 10 | cleanBuffer(); 11 | } 12 | 13 | WisLTEBG96SSL::WisLTEBG96SSL(Stream &atserial, Stream &dserial) : WisLTEBG96FILE(atserial, dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96SSL::SetSSLParameters(unsigned int ssl_index, SSL_Version_t s_version, SSL_Cipher_Suites_t s_ciper, unsigned int negotiation_time) 19 | { 20 | char cmd[64],buf[32]; 21 | strcpy(cmd, SSL_CONFIG_PARAMETER); 22 | sprintf(buf, "=\"sslversion\",%d,%d", ssl_index, s_version); 23 | strcat(cmd, buf); 24 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 25 | memset(cmd, '\0', 64); 26 | memset(buf, '\0', 32); 27 | strcpy(cmd, SSL_CONFIG_PARAMETER); 28 | switch (s_ciper) 29 | { 30 | case TLS_RSA_WITH_AES_256_CBC_SHA: 31 | sprintf(buf, "=\"ciphersuite\",%d,0X0035", ssl_index); 32 | break; 33 | case TLS_RSA_WITH_AES_128_CBC_SHA: 34 | sprintf(buf, "=\"ciphersuite\",%d,0X002F", ssl_index); 35 | break; 36 | case TLS_RSA_WITH_RC4_128_SHA: 37 | sprintf(buf, "=\"ciphersuite\",%d,0X0005", ssl_index); 38 | break; 39 | case TLS_RSA_WITH_RC4_128_MD5: 40 | sprintf(buf, "=\"ciphersuite\",%d,0X0004", ssl_index); 41 | break; 42 | case TLS_RSA_WITH_3DES_EDE_CBC_SHA: 43 | sprintf(buf, "=\"ciphersuite\",%d,0X000A", ssl_index); 44 | break; 45 | case TLS_RSA_WITH_AES_256_CBC_SHA256: 46 | sprintf(buf, "=\"ciphersuite\",%d,0X003D", ssl_index); 47 | break; 48 | case TLS_ECDHE_RSA_WITH_RC4_128_SHA: 49 | sprintf(buf, "=\"ciphersuite\",%d,0XC011", ssl_index); 50 | break; 51 | case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA: 52 | sprintf(buf, "=\"ciphersuite\",%d,0XC012", ssl_index); 53 | break; 54 | case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA: 55 | sprintf(buf, "=\"ciphersuite\",%d,0XC013", ssl_index); 56 | break; 57 | case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: 58 | sprintf(buf, "=\"ciphersuite\",%d,0XC014", ssl_index); 59 | break; 60 | case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: 61 | sprintf(buf, "=\"ciphersuite\",%d,0C027", ssl_index); 62 | break; 63 | case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384: 64 | sprintf(buf, "=\"ciphersuite\",%d,0XC028", ssl_index); 65 | break; 66 | case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: 67 | sprintf(buf, "=\"ciphersuite\",%d,0XC02F", ssl_index); 68 | break; 69 | default: 70 | sprintf(buf, "=\"ciphersuite\",%d,0XFFFF", ssl_index); 71 | break; 72 | } 73 | strcat(cmd, buf); 74 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 75 | memset(cmd, '\0', 64); 76 | memset(buf, '\0', 32); 77 | strcpy(cmd, SSL_CONFIG_PARAMETER); 78 | sprintf(buf, "=\"negotiatetime\",%d,%d", ssl_index, negotiation_time); 79 | strcat(cmd, buf); 80 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 81 | return true; 82 | } 83 | } 84 | } 85 | return false; 86 | } 87 | 88 | bool WisLTEBG96SSL::SetSSLCertificate(unsigned int ssl_index, char *ca_cert_path, char *client_cert_path, char *client_key_path, bool validity_check) 89 | { 90 | char cmd[64],buf[32]; 91 | strcpy(cmd, SSL_CONFIG_PARAMETER); 92 | if(ca_cert_path == "" && client_cert_path == "" && client_key_path == ""){ 93 | sprintf(buf, "=\"seclevel\",%d,0", ssl_index); 94 | strcat(cmd, buf); 95 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 96 | return true; 97 | } 98 | }else if(ca_cert_path != "" && client_cert_path == "" && client_key_path == ""){ 99 | sprintf(buf, "=\"seclevel\",%d,1", ssl_index); 100 | strcat(cmd, buf); 101 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 102 | return false; 103 | } 104 | memset(cmd, '\0', 64); 105 | memset(buf, '\0', 32); 106 | strcpy(cmd, SSL_CONFIG_PARAMETER); 107 | sprintf(buf, "=\"cacert\",%d,\"%s\"", ssl_index, ca_cert_path); 108 | strcat(cmd, buf); 109 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 110 | return false; 111 | } 112 | memset(cmd, '\0', 64); 113 | memset(buf, '\0', 32); 114 | strcpy(cmd, SSL_CONFIG_PARAMETER); 115 | if(validity_check){ 116 | sprintf(buf, "=\"ignorelocaltime\",%d,1", ssl_index); 117 | strcat(cmd, buf); 118 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 119 | return true; 120 | } 121 | }else{ 122 | sprintf(buf, "=\"ignorelocaltime\",%d,0", ssl_index); 123 | strcat(cmd, buf); 124 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 125 | return true; 126 | } 127 | } 128 | 129 | }else if(ca_cert_path != "" && client_cert_path != "" && client_key_path != ""){ 130 | sprintf(buf, "=\"seclevel\",%d,2", ssl_index); 131 | strcat(cmd, buf); 132 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 133 | return false; 134 | } 135 | memset(cmd, '\0', 64); 136 | memset(buf, '\0', 32); 137 | strcpy(cmd, SSL_CONFIG_PARAMETER); 138 | sprintf(buf, "=\"cacert\",%d,\"%s\"", ssl_index, ca_cert_path); 139 | strcat(cmd, buf); 140 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 141 | return false; 142 | } 143 | memset(cmd, '\0', 64); 144 | memset(buf, '\0', 32); 145 | strcpy(cmd, SSL_CONFIG_PARAMETER); 146 | sprintf(buf, "=\"clientcert\",%d,\"%s\"", ssl_index, client_cert_path); 147 | strcat(cmd, buf); 148 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 149 | return false; 150 | } 151 | memset(cmd, '\0', 64); 152 | memset(buf, '\0', 32); 153 | strcpy(cmd, SSL_CONFIG_PARAMETER); 154 | sprintf(buf, "=\"clientkey\",%d,\"%s\"", ssl_index, client_key_path); 155 | strcat(cmd, buf); 156 | if(!sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 157 | return false; 158 | } 159 | memset(cmd, '\0', 64); 160 | memset(buf, '\0', 32); 161 | strcpy(cmd, SSL_CONFIG_PARAMETER); 162 | if(validity_check){ 163 | sprintf(buf, "=\"ignorelocaltime\",%d,1", ssl_index); 164 | strcat(cmd, buf); 165 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 166 | return true; 167 | } 168 | }else{ 169 | sprintf(buf, "=\"ignorelocaltime\",%d,0", ssl_index); 170 | strcat(cmd, buf); 171 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 5)){ 172 | return true; 173 | } 174 | } 175 | } 176 | return false; 177 | } 178 | 179 | bool WisLTEBG96SSL::InitSSL(unsigned int ssl_index, char *ca_cert, char *client_cert, char *client_key, char *err_code) 180 | { 181 | unsigned long start_time = millis(); 182 | const char *e_str; 183 | int f_err_code; 184 | if (!SetSSLParameters(ssl_index, ALL_VERSION, SUPPORT_ALL_ABOVE, 300)){ 185 | e_str = "\r\nSSL ERROR: An error occurred while setting the ssl parameter.\r\n"; 186 | strcpy(err_code, e_str); 187 | return false; 188 | } 189 | 190 | if (ca_cert == "" && client_cert == "" && client_key == ""){ 191 | if (SetSSLCertificate(ssl_index, "", "", "", false)){ 192 | e_str = "\r\nSSL OK: The ssl were successfully initialized.\r\n"; 193 | strcpy(err_code, e_str); 194 | return true; 195 | } 196 | e_str = "\r\nSSL ERROR: An error occurred while setting the ssl certificate.\r\n"; 197 | strcpy(err_code, e_str); 198 | }else if (ca_cert != "" && client_cert == "" && client_key == ""){ 199 | while (!UploadFiles(ssl_ca_cert_name, ca_cert)){ 200 | if(returnErrorCode(f_err_code)){ 201 | if (f_err_code == 407){ 202 | start_time = millis(); 203 | while (!DeleteFiles(ssl_ca_cert_name)){ 204 | if(millis() - start_time >= 10*1000UL){ 205 | e_str = "\r\nSSL ERROR: The ssl ca cert file exists. An error occurred while deleting the original file during the re-upload process.\r\n"; 206 | strcpy(err_code, e_str); 207 | return false; 208 | } 209 | } 210 | } 211 | }else if(millis() - start_time >= 30*1000UL){ 212 | sprintf(e_str, "\r\nSSL ERROR: Error uploading file, error code: %d ,Please check the corresponding documentation for details.\r\n", f_err_code); 213 | strcpy(err_code, e_str); 214 | return false; 215 | } 216 | } 217 | start_time = millis(); 218 | while (!SetSSLCertificate(ssl_index, ssl_ca_cert_name, "", "", false)){ 219 | if (millis() - start_time >= 30 * 1000UL){ 220 | e_str = "\r\nSSL ERROR: An error occurred while setting the ssl certificate.\r\n"; 221 | strcpy(err_code, e_str); 222 | return false; 223 | } 224 | } 225 | e_str = "\r\nSSL OK: The ssl were successfully initialized.\r\n"; 226 | strcpy(err_code, e_str); 227 | return true; 228 | }else if (ca_cert != "" && client_cert != "" && client_key != ""){ 229 | while (!UploadFiles(ssl_ca_cert_name, ca_cert)){ 230 | if(returnErrorCode(f_err_code)){ 231 | if (f_err_code == 407){ 232 | start_time = millis(); 233 | while (!DeleteFiles(ssl_ca_cert_name)){ 234 | if(millis() - start_time >= 10*1000UL){ 235 | e_str = "\r\nSSL ERROR: The ssl ca cert file exists. An error occurred while deleting the original file during the re-upload process.\r\n"; 236 | strcpy(err_code, e_str); 237 | return false; 238 | } 239 | } 240 | } 241 | }else if(millis() - start_time >= 30*1000UL){ 242 | sprintf(e_str, "\r\nSSL ERROR: Error uploading file, error code: %d ,Please check the corresponding documentation for details.\r\n", f_err_code); 243 | strcpy(err_code, e_str); 244 | return false; 245 | } 246 | } 247 | start_time = millis(); 248 | while (!UploadFiles(ssl_client_cert_name, client_cert)){ 249 | if(returnErrorCode(f_err_code)){ 250 | if (f_err_code == 407){ 251 | start_time = millis(); 252 | while (!DeleteFiles(ssl_client_cert_name)){ 253 | if(millis() - start_time >= 10*1000UL){ 254 | e_str = "\r\nSSL ERROR: The ssl ca cert file exists. An error occurred while deleting the original file during the re-upload process.\r\n"; 255 | strcpy(err_code, e_str); 256 | return false; 257 | } 258 | } 259 | } 260 | }else if(millis() - start_time >= 30*1000UL){ 261 | sprintf(e_str, "\r\nSSL ERROR: Error uploading file, error code: %d ,Please check the corresponding documentation for details.\r\n", f_err_code); 262 | strcpy(err_code, e_str); 263 | return false; 264 | } 265 | } 266 | start_time = millis(); 267 | while (!UploadFiles(ssl_client_key_name, client_key)){ 268 | if(returnErrorCode(f_err_code)){ 269 | if (f_err_code == 407){ 270 | start_time = millis(); 271 | while (!DeleteFiles(ssl_client_key_name)){ 272 | if(millis() - start_time >= 10*1000UL){ 273 | e_str = "\r\nSSL ERROR: The ssl ca cert file exists. An error occurred while deleting the original file during the re-upload process.\r\n"; 274 | strcpy(err_code, e_str); 275 | return false; 276 | } 277 | } 278 | } 279 | }else if(millis() - start_time >= 30*1000UL){ 280 | sprintf(e_str, "\r\nSSL ERROR: Error uploading file, error code: %d ,Please check the corresponding documentation for details.\r\n", f_err_code); 281 | strcpy(err_code, e_str); 282 | return false; 283 | } 284 | } 285 | start_time = millis(); 286 | while (!SetSSLCertificate(ssl_index, ssl_ca_cert_name, ssl_client_cert_name, ssl_client_key_name, false)){ 287 | if (millis() - start_time >= 30 * 1000UL){ 288 | e_str = "\r\nSSL ERROR: An error occurred while setting the ssl certificate.\r\n"; 289 | strcpy(err_code, e_str); 290 | return false; 291 | } 292 | } 293 | e_str = "\r\nSSL OK: The ssl were successfully initialized.\r\n"; 294 | strcpy(err_code, e_str); 295 | return true; 296 | } 297 | return false; 298 | } 299 | 300 | bool WisLTEBG96SSL::OpenSSLSocket(unsigned int pdp_index, unsigned int ssl_index, unsigned int socket_index, char *ip, unsigned int port, Access_Mode_t mode) 301 | { 302 | char cmd[64],buf[64]; 303 | strcpy(cmd, SSL_OPEN_SOCKET); 304 | sprintf(buf, "=%d,%d,%d,\"%s\",%d,%d", pdp_index, ssl_index, socket_index, ip, port, mode); 305 | strcat(cmd, buf); 306 | switch(mode) 307 | { 308 | case BUFFER_MODE: 309 | case DIRECT_PUSH_MODE: 310 | if (sendAndSearch(cmd, SSL_OPEN_SOCKET, RESPONSE_ERROR, 150) > 0){ 311 | unsigned long start_time = millis(); 312 | while(millis() - start_time < 200UL){ 313 | if (serialAvailable()){ 314 | readResponseByteToBuffer(); 315 | } 316 | } 317 | char *sta_buf = searchChrBuffer(','); 318 | errorCode = -1; 319 | if(atoi(sta_buf + 1) == 0){ 320 | return true; 321 | }else{ 322 | errorCode = atoi(sta_buf + 1); 323 | } 324 | } 325 | break; 326 | case TRANSPARENT_MODE: 327 | if (sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 150) > 0){ 328 | return true; 329 | } 330 | break; 331 | default: 332 | break; 333 | } 334 | return false; 335 | } 336 | 337 | bool WisLTEBG96SSL::SSLSocketSendData(unsigned int socket_index, char *ssl_send_data) 338 | { 339 | char cmd[16], buf[8]; 340 | strcpy(cmd, SSL_SEND_DATA); 341 | sprintf(buf, "=%d,%d", socket_index, strlen(ssl_send_data)); 342 | strcat(cmd, buf); 343 | if(sendAndSearchChr(cmd, '>', 2)){ 344 | if(sendDataAndCheck(ssl_send_data, RESPONSE_SEND_OK, RESPONSE_SEND_FAIL, 30)){ 345 | return true; 346 | } 347 | } 348 | return false; 349 | } 350 | 351 | bool WisLTEBG96SSL::SSLSocketRecvData(unsigned int socket_index, unsigned int ssl_recv_len, char *ssl_recv_data) 352 | { 353 | char cmd[16],buf[16]; 354 | strcpy(cmd, SSL_READ_DATA); 355 | sprintf(buf, "=%d,%d", socket_index, ssl_recv_len); 356 | strcat(cmd, buf); 357 | if(sendAndSearch(cmd, RESPONSE_CRLF_OK, RESPONSE_ERROR, 30)){ 358 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 359 | *end_buf = '\0'; 360 | char *sta_buf = searchStrBuffer(": "); 361 | strcpy(ssl_recv_data, sta_buf + 2); 362 | return true; 363 | } 364 | return false; 365 | } 366 | 367 | bool WisLTEBG96SSL::CloseSSLSocket(unsigned int socket_index) 368 | { 369 | char cmd[16],buf[16]; 370 | strcpy(cmd, SSL_CLOSE_SOCKET); 371 | sprintf(buf, "=%d", socket_index); 372 | strcat(cmd, buf); 373 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 150)){ 374 | return true; 375 | } 376 | return false; 377 | } 378 | 379 | bool WisLTEBG96SSL::QuerySSLSocketStatus(unsigned int socket_index, char *ssl_status) 380 | { 381 | char cmd[16],buf[16]; 382 | strcpy(cmd, SSL_QUERY_STATUS); 383 | sprintf(buf, "=%d", socket_index); 384 | strcat(cmd, buf); 385 | if(sendAndSearch(cmd, RESPONSE_OK, 10)){ 386 | char *sta_buf = searchStrBuffer(": "); 387 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 388 | *end_buf = '\0'; 389 | strcpy(ssl_status, sta_buf + 2); 390 | return true; 391 | } 392 | return false; 393 | } 394 | 395 | SSL_Socket_Event_t WisLTEBG96SSL::WaitCheckSSLSocketEvent(char *event, unsigned int timeout) 396 | { 397 | if(readResponseAndSearch(SSL_SOCKET_EVENT, timeout)){ 398 | unsigned long start_time = millis(); 399 | while(millis() - start_time < 200UL){ 400 | if (serialAvailable()){ 401 | readResponseByteToBuffer(); 402 | } 403 | } 404 | char *sta_buf = searchChrBuffer(','); 405 | strcpy(event, sta_buf + 1); 406 | if(searchStrBuffer("closed")){ 407 | return SSL_SOCKET_CLOSE_EVENT; 408 | }else if (searchStrBuffer("recv")){ 409 | return SSL_SOCKET_RECV_EVENT; 410 | } 411 | } 412 | return 0; 413 | } -------------------------------------------------------------------------------- /src/WisLTEBG96SSL.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 SSL function 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 08/16/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | #ifndef _WISLTEBG96SSL_H_ 30 | #define _WISLTEBG96SSL_H_ 31 | 32 | #include "WisLTEBG96FILE.h" 33 | 34 | typedef enum ssl_version{ 35 | SSL_3_0 = 0, 36 | TLS_1_0 = 1, 37 | TLS_1_1 = 2, 38 | TLS_1_2 = 3, 39 | ALL_VERSION = 4, 40 | }SSL_Version_t; 41 | 42 | typedef enum ssl_cipher_suites{ 43 | TLS_RSA_WITH_AES_256_CBC_SHA = 0, 44 | TLS_RSA_WITH_AES_128_CBC_SHA = 1, 45 | TLS_RSA_WITH_RC4_128_SHA = 2, 46 | TLS_RSA_WITH_RC4_128_MD5 = 3, 47 | TLS_RSA_WITH_3DES_EDE_CBC_SHA = 4, 48 | TLS_RSA_WITH_AES_256_CBC_SHA256 = 5, 49 | TLS_ECDHE_RSA_WITH_RC4_128_SHA = 6, 50 | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 7, 51 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 8, 52 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 9, 53 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 10, 54 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 11, 55 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 12, 56 | SUPPORT_ALL_ABOVE = 13, 57 | }SSL_Cipher_Suites_t; 58 | 59 | typedef enum ssl_socket_event{ 60 | SSL_SOCKET_RECV_EVENT = 1, 61 | SSL_SOCKET_CLOSE_EVENT = 2, 62 | }SSL_Socket_Event_t; 63 | 64 | const char ssl_ca_cert_name[] = "ca_cert.pem"; 65 | const char ssl_client_cert_name[] = "client_cert.pem"; 66 | const char ssl_client_key_name[] = "client_key.pem"; 67 | 68 | class WisLTEBG96SSL : public WisLTEBG96FILE 69 | { 70 | public: 71 | WisLTEBG96SSL(); 72 | 73 | ~WisLTEBG96SSL(); 74 | 75 | WisLTEBG96SSL(Stream &atserial, Stream &dserial); 76 | 77 | bool SetSSLParameters(unsigned int ssl_index, SSL_Version_t s_version, SSL_Cipher_Suites_t s_ciper, unsigned int negotiation_time); 78 | 79 | bool SetSSLCertificate(unsigned int ssl_index, char *ca_cert_path, char *client_cert_path, char *client_key_path, bool validity_check); 80 | 81 | bool InitSSL(unsigned int ssl_index, char *ca_cert, char *client_cert, char *client_key, char *err_code); 82 | 83 | bool OpenSSLSocket(unsigned int pdp_index, unsigned int ssl_index, unsigned int socket_index, char *ip, unsigned int port, Access_Mode_t mode); 84 | 85 | bool SSLSocketSendData(unsigned int socket_index, char *ssl_send_data); 86 | 87 | bool SSLSocketRecvData(unsigned int socket_index, unsigned int ssl_recv_len, char *ssl_recv_data); 88 | 89 | bool CloseSSLSocket(unsigned int socket_index); 90 | 91 | bool QuerySSLSocketStatus(unsigned int socket_index, char *ssl_status); 92 | 93 | SSL_Socket_Event_t WaitCheckSSLSocketEvent(char *event, unsigned int timeout); 94 | 95 | private: 96 | 97 | }; 98 | 99 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96Serial.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96Serial.h" 2 | 3 | WisLTEBG96Serial::WisLTEBG96Serial() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96Serial::~WisLTEBG96Serial() 9 | { 10 | cleanBuffer(); 11 | } 12 | 13 | WisLTEBG96Serial::WisLTEBG96Serial(Stream &atserial, Stream &dserial) : _atserial(atserial), _dserial(dserial) 14 | { 15 | _atserial.setTimeout(2000); 16 | _dserial.setTimeout(2000); 17 | cleanBuffer(); 18 | } 19 | 20 | void WisLTEBG96Serial::AT_bypass() 21 | { 22 | while(_atserial.available()){ 23 | _dserial.write(_atserial.read()); 24 | } 25 | while(_dserial.available()){ 26 | _atserial.write(_dserial.read()); 27 | } 28 | } 29 | 30 | template 31 | bool WisLTEBG96Serial::AutoATSerialBand(T &_atserial) 32 | { 33 | _atserial.begin(115200); 34 | if(sendAndSearch(DEV_AT, RESPONSE_OK, 2)){ 35 | return true; 36 | } 37 | 38 | for(int i = 0; i < sizeof(Band_list)/sizeof(Band_list[0]); i++){ 39 | _atserial.end(); 40 | _atserial.begin(Band_list[i]); 41 | for (int j = 0; j < 3; j++){ 42 | if(sendAndSearch(DEV_AT, RESPONSE_OK, 2)){ 43 | return true; 44 | } 45 | } 46 | } 47 | _atserial.end(); 48 | return false; 49 | } 50 | 51 | bool WisLTEBG96Serial::sendDataAndCheck(const char *data_buf, const char *ok_str, const char *err_str, unsigned int timeout) 52 | { 53 | delay(100); 54 | while(_atserial.read()>=0); 55 | int data_len = strlen(data_buf); 56 | int send_bytes = _atserial.write(data_buf); 57 | #ifdef UART_DEBUG 58 | _dserial.print("\r\n"); 59 | _dserial.print(data_buf); 60 | _dserial.print("\r\n"); 61 | _dserial.print("Send Data len :"); 62 | _dserial.print(send_bytes); 63 | _dserial.print("\r\n"); 64 | #endif 65 | if(send_bytes == data_len){ 66 | if(readResponseAndSearch(ok_str, err_str, timeout)){ 67 | return true; 68 | } 69 | } 70 | return false; 71 | } 72 | 73 | 74 | bool WisLTEBG96Serial::sendATcommand(const char *command) 75 | { 76 | delay(100); 77 | while(_atserial.read()>=0); 78 | _atserial.write("AT"); 79 | int cmd_len = strlen(command); 80 | int send_bytes = _atserial.write(command); 81 | #if defined UART_DEBUG 82 | _dserial.print("\r\n"); 83 | _dserial.print("-> "); 84 | _dserial.print("AT"); 85 | _dserial.print(command); 86 | _dserial.print("\r\n"); 87 | #endif 88 | if (send_bytes != cmd_len){ 89 | return false; 90 | } 91 | _atserial.write("\r\n"); 92 | return true; 93 | } 94 | 95 | 96 | unsigned int WisLTEBG96Serial::readResponseByteToBuffer() 97 | { 98 | char c = _atserial.read(); 99 | rxBuffer[bufferHead] = c; 100 | bufferHead = (bufferHead + 1) % RX_BUFFER_LENGTH; 101 | #if defined UART_DEBUG 102 | if (c == '\n'){ 103 | _dserial.print(c); 104 | _dserial.print("<- "); 105 | }else { 106 | _dserial.print(c); 107 | } 108 | #endif 109 | return 1; 110 | } 111 | 112 | unsigned int WisLTEBG96Serial::readResponseToBuffer(unsigned int timeout) 113 | { 114 | unsigned long start_time = millis(); 115 | unsigned int recv_len = 0; 116 | cleanBuffer(); 117 | while(millis() - start_time < timeout * 1000UL){ 118 | if(serialAvailable()){ 119 | recv_len += readResponseByteToBuffer(); 120 | } 121 | } 122 | return recv_len; 123 | } 124 | 125 | Cmd_Response_t WisLTEBG96Serial::readResponseAndSearchChr(const char test_chr, unsigned int timeout) 126 | { 127 | unsigned long start_time = millis(); 128 | unsigned int recv_len = 0; 129 | cleanBuffer(); 130 | while(millis() - start_time < timeout * 1000UL){ 131 | if (serialAvailable()){ 132 | recv_len += readResponseByteToBuffer(); 133 | if (searchChrBuffer(test_chr)){ 134 | return SUCCESS_RESPONSE; 135 | } 136 | } 137 | } 138 | if (recv_len > 0){ 139 | return UNKNOWN_RESPONSE; 140 | } else { 141 | return TIMEOUT_RESPONSE; 142 | } 143 | } 144 | 145 | Cmd_Response_t WisLTEBG96Serial::readResponseAndSearch(const char *test_str, unsigned int timeout) 146 | { 147 | unsigned long start_time = millis(); 148 | unsigned int recv_len = 0; 149 | cleanBuffer(); 150 | while(millis() - start_time < timeout * 1000UL){ 151 | if (serialAvailable()){ 152 | recv_len += readResponseByteToBuffer(); 153 | if (searchStrBuffer(test_str)){ 154 | return SUCCESS_RESPONSE; 155 | } 156 | } 157 | } 158 | if (recv_len > 0){ 159 | return UNKNOWN_RESPONSE; 160 | } else { 161 | return TIMEOUT_RESPONSE; 162 | } 163 | } 164 | 165 | Cmd_Response_t WisLTEBG96Serial::readResponseAndSearch(const char *test_str, const char *e_test_str, unsigned int timeout) 166 | { 167 | unsigned long start_time = millis(); 168 | unsigned int recv_len = 0; 169 | errorCode = -1; 170 | cleanBuffer(); 171 | while(millis() - start_time < timeout * 1000UL){ 172 | if (serialAvailable()){ 173 | recv_len += readResponseByteToBuffer(); 174 | if (searchStrBuffer(test_str)){ 175 | return SUCCESS_RESPONSE; 176 | }else if (searchStrBuffer(e_test_str)){ 177 | start_time = millis(); 178 | while(millis() - start_time < 100UL){ 179 | if(serialAvailable()){ 180 | recv_len += readResponseByteToBuffer(); 181 | } 182 | } 183 | char *str_buf = searchStrBuffer(": "); 184 | if (str_buf != NULL){ 185 | char err_code[8]; 186 | strcpy(err_code, str_buf + 2); 187 | char *end_buf = strstr(err_code, "\r\n"); 188 | *end_buf = '\0'; 189 | errorCode = atoi(err_code); 190 | } 191 | return FIAL_RESPONSE; 192 | } 193 | } 194 | } 195 | if (recv_len > 0){ 196 | return UNKNOWN_RESPONSE; 197 | } else { 198 | return TIMEOUT_RESPONSE; 199 | } 200 | } 201 | 202 | Cmd_Response_t WisLTEBG96Serial::sendAndSearchChr(const char *command, const char test_chr, unsigned int timeout) 203 | { 204 | for (int i = 0; i < 3; i++){ 205 | if(sendATcommand(command)){ 206 | if (readResponseAndSearchChr(test_chr, timeout) == SUCCESS_RESPONSE){ 207 | return SUCCESS_RESPONSE; 208 | } 209 | } 210 | } 211 | return TIMEOUT_RESPONSE; 212 | } 213 | 214 | Cmd_Response_t WisLTEBG96Serial::sendAndSearch(const char *command, const char *test_str, unsigned int timeout) 215 | { 216 | for (int i = 0; i < 3; i++){ 217 | if(sendATcommand(command)){ 218 | if (readResponseAndSearch(test_str, timeout) == SUCCESS_RESPONSE){ 219 | return SUCCESS_RESPONSE; 220 | } 221 | } 222 | } 223 | return TIMEOUT_RESPONSE; 224 | } 225 | 226 | Cmd_Response_t WisLTEBG96Serial::sendAndSearch(const char *command, const char *test_str, const char *e_test_str, unsigned int timeout) 227 | { 228 | Cmd_Response_t resp_status = UNKNOWN_RESPONSE; 229 | for (int i = 0; i < 3; i++){ 230 | if(sendATcommand(command)){ 231 | resp_status = readResponseAndSearch(test_str, e_test_str, timeout); 232 | return resp_status; 233 | } 234 | } 235 | return resp_status; 236 | } 237 | 238 | char *WisLTEBG96Serial::searchStrBuffer(const char *test_str) 239 | { 240 | int buf_len = strlen((const char *)rxBuffer); 241 | if (buf_len < RX_BUFFER_LENGTH){ 242 | return strstr((const char *)rxBuffer,test_str); 243 | }else { 244 | return NULL; 245 | } 246 | } 247 | 248 | char *WisLTEBG96Serial::searchChrBuffer(const char test_chr) 249 | { 250 | int buf_len = strlen((const char *)rxBuffer); 251 | if (buf_len < RX_BUFFER_LENGTH){ 252 | return strchr((const char *)rxBuffer, test_chr); 253 | }else { 254 | return NULL; 255 | } 256 | } 257 | 258 | bool WisLTEBG96Serial::returnErrorCode(int &s_err_code) 259 | { 260 | s_err_code = -1; 261 | if(errorCode != -1){ 262 | s_err_code = errorCode; 263 | return true; 264 | } 265 | return false; 266 | } 267 | 268 | void WisLTEBG96Serial::cleanBuffer() 269 | { 270 | memset(rxBuffer,'\0',RX_BUFFER_LENGTH); 271 | bufferHead = 0; 272 | } 273 | 274 | int WisLTEBG96Serial::serialAvailable() 275 | { 276 | unsigned int ret; 277 | ret = _atserial.available(); 278 | return ret; 279 | } 280 | -------------------------------------------------------------------------------- /src/WisLTEBG96Serial.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the serial defined 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 08/15/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96SERIAL_H_ 31 | #define _WISLTEBG96SERIAL_H_ 32 | 33 | #include "string.h" 34 | #include "stdlib.h" 35 | #include "Arduino.h" 36 | #include "WisLTEBG96ATCommand.h" 37 | 38 | #define RX_BUFFER_LENGTH 256 39 | #define UART_DEBUG 40 | 41 | const unsigned long Band_list[] = { 42 | 9600, 43 | 19200, 44 | 38400, 45 | 57600, 46 | 115200, 47 | 230400, 48 | 460800, 49 | 921600 50 | }; 51 | 52 | typedef enum cmd_response{ 53 | UNKNOWN_RESPONSE = -2, 54 | TIMEOUT_RESPONSE = -1, 55 | FIAL_RESPONSE = 0, 56 | SUCCESS_RESPONSE = 1, 57 | }Cmd_Response_t; 58 | 59 | class WisLTEBG96Serial 60 | { 61 | public: 62 | WisLTEBG96Serial(); 63 | 64 | ~WisLTEBG96Serial(); 65 | 66 | WisLTEBG96Serial(Stream &atserial,Stream &dserial); 67 | 68 | void AT_bypass(); 69 | 70 | template 71 | bool AutoATSerialBand(T &_atserial); 72 | 73 | bool sendDataAndCheck(const char *data_buf, const char *ok_str, const char *err_str, unsigned int timeout); 74 | 75 | bool sendATcommand(const char *command); 76 | 77 | unsigned int readResponseByteToBuffer(); 78 | 79 | unsigned int readResponseToBuffer(unsigned int timeout); 80 | 81 | Cmd_Response_t readResponseAndSearch(const char *test_str, unsigned int timeout); 82 | 83 | Cmd_Response_t readResponseAndSearchChr(const char test_chr, unsigned int timeout); 84 | 85 | Cmd_Response_t readResponseAndSearch(const char *test_str, const char *e_test_str, unsigned int timeout); 86 | 87 | Cmd_Response_t sendAndSearch(const char *command, const char *test_str, unsigned int timeout); 88 | 89 | Cmd_Response_t sendAndSearchChr(const char *command, const char test_chr, unsigned int timeout); 90 | 91 | Cmd_Response_t sendAndSearch(const char *command, const char *test_str, const char *e_test_str, unsigned int timeout); 92 | 93 | bool returnErrorCode(int &s_err_code); 94 | 95 | void cleanBuffer(); 96 | 97 | int serialAvailable(); 98 | 99 | char *searchStrBuffer(const char *test_str); 100 | 101 | char *searchChrBuffer(const char test_chr); 102 | 103 | unsigned int bufferHead; 104 | char rxBuffer[RX_BUFFER_LENGTH]; 105 | int errorCode = -1; 106 | 107 | private: 108 | Stream& _atserial; 109 | Stream& _dserial; 110 | 111 | 112 | }; 113 | 114 | #endif -------------------------------------------------------------------------------- /src/WisLTEBG96TCPIP.cpp: -------------------------------------------------------------------------------- 1 | #include "WisLTEBG96TCPIP.h" 2 | 3 | WisLTEBG96TCPIP::WisLTEBG96TCPIP() 4 | { 5 | 6 | } 7 | 8 | WisLTEBG96TCPIP::~WisLTEBG96TCPIP() 9 | { 10 | 11 | } 12 | 13 | WisLTEBG96TCPIP::WisLTEBG96TCPIP(Stream &atserial, Stream &dserial):WisLTEBG96Common(atserial,dserial) 14 | { 15 | 16 | } 17 | 18 | bool WisLTEBG96TCPIP::SetDevAPNParameters(unsigned int pdp_index, Protocol_Type_t type, char *apn, char *usr, char *pwd, Authentication_Methods_t met) 19 | { 20 | char cmd[64], buf[64]; 21 | strcpy(cmd,APN_PARAMETERS); 22 | sprintf(buf, "=%d,%d,\"%s\",\"%s\",\"%s\",%d", pdp_index, type, apn, usr, pwd, met); 23 | strcat(cmd,buf); 24 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 25 | return true; 26 | } 27 | return false; 28 | } 29 | 30 | Cmd_Response_t WisLTEBG96TCPIP::ActivateDevAPN(unsigned int pdp_index) 31 | { 32 | char cmd[16],buf[8]; 33 | strcpy(cmd,ACTIVATE_APN); 34 | sprintf(buf, "=%d", pdp_index); 35 | strcat(cmd,buf); 36 | return sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 150); 37 | } 38 | 39 | bool WisLTEBG96TCPIP::DeactivateDevAPN(unsigned int pdp_index) 40 | { 41 | char cmd[16],buf[8]; 42 | strcpy(cmd,DEACTIVATE_APN); 43 | sprintf(buf, "=%d", pdp_index); 44 | strcat(cmd,buf); 45 | if(sendAndSearch(cmd,RESPONSE_OK,RESPONSE_ERROR,40)>0){ 46 | return true; 47 | } 48 | return false; 49 | } 50 | 51 | bool WisLTEBG96TCPIP::GetDevAPNIPAddress(unsigned int pdp_index, char *ip) 52 | { 53 | char cmd[16],buf[8]; 54 | strcpy(cmd, GET_APN_IP_ADDRESS); 55 | sprintf(buf, "=%d", pdp_index); 56 | strcat(cmd,buf); 57 | if(sendAndSearch(cmd,RESPONSE_OK,2)){ 58 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 59 | *end_buf = '\0'; 60 | char *sta_buf = searchChrBuffer(','); 61 | if(strcmp(sta_buf + 1, "0.0.0.0") <= 0){ 62 | return false; 63 | } 64 | strcpy(ip, sta_buf + 1); 65 | return true; 66 | } 67 | return false; 68 | } 69 | 70 | bool WisLTEBG96TCPIP::InitAPN(unsigned int pdp_index, char *apn, char *usr, char *pwd, char *err_code) 71 | { 72 | Net_Status_t i_status; 73 | Cmd_Response_t init_status; 74 | const char *e_str; 75 | unsigned long start_time = millis(); 76 | while(!DevSimPIN("",READ_MODE)){ 77 | if (millis() - start_time >= 10*1000UL){ 78 | e_str = "\r\nAPN ERROR: No SIM card detected!\r\n"; 79 | strcpy(err_code, e_str); 80 | return false; 81 | } 82 | } 83 | start_time = millis(); 84 | while (i_status != REGISTERED && i_status != REGISTERED_ROAMING){ 85 | i_status = DevNetRegistrationStatus(); 86 | if (millis() - start_time >= 120*1000UL){ 87 | e_str = "\r\nAPN ERROR: Can't registered to the Operator network!\r\n"; 88 | strcpy(err_code, e_str); 89 | return false; 90 | } 91 | } 92 | start_time = millis(); 93 | while(millis() - start_time <= 300*1000UL){ 94 | if (SetDevAPNParameters(pdp_index, IPV4, apn, usr, pwd, PAP_OR_CHAP)) 95 | { 96 | char i_ip[16]; 97 | if(GetDevAPNIPAddress(pdp_index, i_ip)){ 98 | sprintf(err_code, "\r\nAPN OK: The IP address is %s\r\n", i_ip); 99 | return true; 100 | }else{ 101 | init_status = ActivateDevAPN(pdp_index); 102 | if (init_status == TIMEOUT_RESPONSE){ 103 | e_str = "\r\nAPN ERROR: Please reset your device!\r\n"; 104 | strcpy(err_code, e_str); 105 | return false; 106 | } 107 | } 108 | } 109 | e_str = "\r\nAPN ERROR: Activate APN file!\r\n"; 110 | strcpy(err_code, e_str); 111 | } 112 | return false; 113 | } 114 | 115 | bool WisLTEBG96TCPIP::OpenSocketService(unsigned int pdp_index, unsigned int socket_index, Socket_Type_t socket, char *ip, unsigned int port, unsigned int local_port, Access_Mode_t mode) 116 | { 117 | char cmd[128],buf[128]; 118 | strcpy(cmd,OPEN_SOCKET); 119 | switch(socket) 120 | { 121 | case TCP_CLIENT: 122 | sprintf(buf, "=%d,%d,\"TCP\",\"%s\",%d,%d,%d", pdp_index, socket_index, ip, port, local_port, mode); 123 | break; 124 | case TCP_SEVER: 125 | sprintf(buf, "=%d,%d,\"TCP LISTENER\",\"%s\",%d,%d,%d", pdp_index, socket_index, ip, port, local_port, mode); 126 | break; 127 | case UDP_CLIENT: 128 | sprintf(buf, "=%d,%d,\"UDP\",\"%s\",%d,%d,%d", pdp_index, socket_index, ip, port, local_port, mode); 129 | break; 130 | case UDP_SEVER: 131 | sprintf(buf, "=%d,%d,\"UDP SERVICE\",\"%s\",%d,%d,%d", pdp_index, socket_index, ip, port, local_port, mode); 132 | break; 133 | default: 134 | return false; 135 | } 136 | strcat(cmd,buf); 137 | switch(mode) 138 | { 139 | case BUFFER_MODE: 140 | case DIRECT_PUSH_MODE: 141 | if (sendAndSearch(cmd, OPEN_SOCKET, RESPONSE_ERROR, 150) > 0){ 142 | unsigned long start_time = millis(); 143 | while(millis() - start_time < 200UL){ 144 | if (serialAvailable()){ 145 | readResponseByteToBuffer(); 146 | } 147 | } 148 | errorCode = -1; 149 | char *sta_buf = searchChrBuffer(','); 150 | if(atoi(sta_buf + 1) == 0){ 151 | return true; 152 | }else { 153 | errorCode = atoi(sta_buf + 1); 154 | } 155 | } 156 | break; 157 | case TRANSPARENT_MODE: 158 | if (sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 150) > 0){; 159 | return true; 160 | } 161 | break; 162 | default: 163 | break; 164 | } 165 | return false; 166 | } 167 | 168 | bool WisLTEBG96TCPIP::CloseSocketService(unsigned int socket_index) 169 | { 170 | char cmd[16],buf[8]; 171 | strcpy(cmd,CLOSE_SOCKET); 172 | sprintf(buf,"=%d",socket_index); 173 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 150)){ 174 | return true; 175 | } 176 | return false; 177 | } 178 | 179 | bool WisLTEBG96TCPIP::SocketSendData(unsigned int socket_index, Socket_Type_t socket, char *data_buf, char *ip, unsigned int port) 180 | { 181 | char cmd[64],buf[64]; 182 | strcpy(cmd, SOCKET_SEND_DATA); 183 | switch(socket) 184 | { 185 | case TCP_CLIENT: 186 | case TCP_SEVER: 187 | case UDP_CLIENT: 188 | sprintf(buf,"=%d,%d",socket_index,strlen(data_buf)); 189 | break; 190 | case UDP_SEVER: 191 | sprintf(buf,"=%d,%d,\"%s\",%d",socket_index,strlen(data_buf),ip,port); 192 | break; 193 | default: 194 | return false; 195 | } 196 | strcat(cmd,buf); 197 | if(sendAndSearchChr(cmd, '>', 2)){ 198 | if(sendDataAndCheck(data_buf, RESPONSE_SEND_OK, RESPONSE_SEND_FAIL, 10)){ 199 | return true; 200 | } 201 | } 202 | return false; 203 | } 204 | 205 | bool WisLTEBG96TCPIP::SocketRecvData(unsigned int socket_index, unsigned int recv_len, Socket_Type_t socket, char *recv_buf) 206 | { 207 | char cmd[16],buf[16]; 208 | strcpy(cmd, SOCKET_READ_DATA); 209 | switch(socket) 210 | { 211 | case TCP_CLIENT: 212 | case TCP_SEVER: 213 | case UDP_CLIENT: 214 | sprintf(buf,"=%d,%d",socket_index,recv_len); 215 | break; 216 | case UDP_SEVER: 217 | sprintf(buf,"=%d",socket_index); 218 | break; 219 | default: 220 | return false; 221 | } 222 | strcat(cmd,buf); 223 | if(sendAndSearch(cmd, RESPONSE_CRLF_OK, RESPONSE_ERROR, 10)){ 224 | char *sta_buf = searchStrBuffer(": "); 225 | char *end_buf = searchStrBuffer(RESPONSE_CRLF_OK); 226 | *end_buf = '\0'; 227 | strcpy(recv_buf, sta_buf + 2); 228 | return true; 229 | } 230 | return false; 231 | } 232 | 233 | bool WisLTEBG96TCPIP::SocketSendHEXData(unsigned int socket_index, char *hex_buf) 234 | { 235 | char cmd[256],buf[256]; 236 | strcpy(cmd, SOCKET_SEND_HEX_DATA); 237 | sprintf(buf, "=%d,\"%s\"", socket_index, hex_buf); 238 | strcat(cmd,buf); 239 | if(sendAndSearch(cmd, RESPONSE_SEND_OK, RESPONSE_SEND_FAIL, 2)){ 240 | return true; 241 | } 242 | return false; 243 | } 244 | 245 | bool WisLTEBG96TCPIP::SwitchAccessModes(unsigned int socket_index, Access_Mode_t mode) 246 | { 247 | char cmd[16],buf[16]; 248 | strcpy(cmd, DATA_ACCESS_MODES); 249 | sprintf(buf, "=%d,%d", socket_index, mode); 250 | strcat(cmd,buf); 251 | if (mode == TRANSPARENT_MODE){ 252 | if(sendAndSearch(cmd, RESPONSE_CONNECT, RESPONSE_ERROR, 2)){ 253 | return true; 254 | } 255 | }else { 256 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 257 | return true; 258 | } 259 | } 260 | return false; 261 | } 262 | 263 | bool WisLTEBG96TCPIP::DevPingFunction(unsigned int socket_index, char *host) 264 | { 265 | char cmd[128],buf[64]; 266 | strcpy(cmd, PING_FUNCTION); 267 | sprintf(buf, "=%d,\"%s\"", socket_index, host); 268 | strcat(cmd,buf); 269 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 270 | if(readResponseToBuffer(20)){ 271 | char *sta_buf = searchStrBuffer(PING_FUNCTION); 272 | char ping_data[256]; 273 | strcpy(ping_data, sta_buf); 274 | char *p[6]; int i = 0; 275 | p[0] = strtok(ping_data, "\r\n\r\n"); 276 | while(p[i] != NULL){ 277 | i++; 278 | p[i] = strtok(NULL,"\r\n\r\n"); 279 | } 280 | p[i] = '\0'; 281 | for (int j = 0; j <= 4; j++) 282 | { 283 | char *cs_buf = strstr(p[j],": "); 284 | char *ce_buf = strchr(p[j],','); 285 | if(ce_buf == NULL){ 286 | errorCode = atoi(cs_buf + 2); 287 | }else{ 288 | *ce_buf = '\0'; 289 | int code = atoi(cs_buf + 2); 290 | if (code == 0){ 291 | return true; 292 | } 293 | } 294 | } 295 | } 296 | } 297 | return false; 298 | } 299 | 300 | bool WisLTEBG96TCPIP::DevNTPFunction(unsigned int socket_index, char *ntp_ip, unsigned int port, char *time) 301 | { 302 | char cmd[64],buf[64]; 303 | strcpy(cmd, NTP_FUNCTION); 304 | sprintf(buf, "=%d,\"%s\",%d", socket_index, ntp_ip, port); 305 | strcat(cmd, buf); 306 | if (sendAndSearch(cmd, NTP_FUNCTION, RESPONSE_ERROR, 125)){ 307 | unsigned long start_time = millis(); 308 | while(millis() - start_time < 200UL){ 309 | if (serialAvailable()){ 310 | readResponseByteToBuffer(); 311 | } 312 | } 313 | char *sta_buf = searchStrBuffer(": "); 314 | strcpy(time, sta_buf + 2); 315 | return true; 316 | } 317 | return false; 318 | } 319 | 320 | bool WisLTEBG96TCPIP::ConfigDNSServer(unsigned int socket_index, char *primary_addr, char *secondary_addr) 321 | { 322 | char cmd[128],buf[128]; 323 | strcpy(cmd, CONFIGURE_DNS_SERVER); 324 | sprintf(buf, "=%d,\"%s\",\"%s\"", socket_index, primary_addr, secondary_addr); 325 | strcat(cmd, buf); 326 | if(sendAndSearch(cmd, RESPONSE_OK, RESPONSE_ERROR, 2)){ 327 | return true; 328 | } 329 | return false; 330 | } 331 | 332 | bool WisLTEBG96TCPIP::DevDNSFunction(unsigned int socket_index, char *domain_name, char *ip) 333 | { 334 | char cmd[128],buf[128]; 335 | strcpy(cmd, DNS_FUNCTION); 336 | sprintf(buf, "=%d,\"%s\"", socket_index, domain_name); 337 | strcat(cmd, buf); 338 | if(sendAndSearch(cmd, "+QIURC", RESPONSE_ERROR, 60)){ 339 | unsigned long start_time = millis(); 340 | while(millis() - start_time < 200UL){ 341 | if (serialAvailable()){ 342 | readResponseByteToBuffer(); 343 | } 344 | } 345 | char *sta_buf = searchStrBuffer(": "); 346 | strcpy(ip, sta_buf + 2); 347 | return true; 348 | } 349 | return false; 350 | } 351 | 352 | bool WisLTEBG96TCPIP::QueryLastErrorCode(char *err_code) 353 | { 354 | char cmd[16]; 355 | strcpy(cmd, QUERY_ERROR_CODE); 356 | if(sendAndSearch(cmd, RESPONSE_OK, 2)){ 357 | char *sta_buf = searchStrBuffer(": "); 358 | strcpy(err_code, sta_buf + 2); 359 | return true; 360 | } 361 | return false; 362 | } 363 | 364 | Socket_Event_t WisLTEBG96TCPIP::WaitCheckSocketEvent(char *event, unsigned int timeout) 365 | { 366 | if(readResponseAndSearch(RECV_SOCKET_EVENT, timeout)){ 367 | unsigned long start_time = millis(); 368 | while(millis() - start_time < 200UL){ 369 | if (serialAvailable()){ 370 | readResponseByteToBuffer(); 371 | } 372 | } 373 | char *sta_buf = searchChrBuffer(','); 374 | strcpy(event, sta_buf + 1); 375 | if(searchStrBuffer("closed")){ 376 | return SOCKET_CLOSE_EVENT; 377 | }else if (searchStrBuffer("recv")){ 378 | return SOCKET_RECV_DATA_EVENT; 379 | }else if (searchStrBuffer("incoming full")){ 380 | return SOCKET_CONNECTION_FULL_EVENT; 381 | }else if (searchStrBuffer("incoming")){ 382 | return SOCKET_INCOMING_CONNECTION_EVENT; 383 | }else if (searchStrBuffer("pdpdeact")){ 384 | return SOCKET_PDP_DEACTIVATION_EVENT; 385 | } 386 | } 387 | return 0; 388 | } -------------------------------------------------------------------------------- /src/WisLTEBG96TCPIP.h: -------------------------------------------------------------------------------- 1 | /* 2 | * A library for RAK WisLTE BG96 Development board 3 | * This file is about the BG96 TCP(IP) function 4 | * 5 | * Copyright (c) 2018 RAKWireless technology inc. 6 | * @Author : Chace 7 | * @Create time : 08/19/2018 8 | * 9 | * The MIT License (MIT) 10 | * 11 | * Permission is hereby granted, free of charge, to any person obtaining a copy 12 | * of this software and associated documentation files (the "Software"), to deal 13 | * in the Software without restriction, including without limitation the rights 14 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | * copies of the Software, and to permit persons to whom the Software is 16 | * furnished to do so, subject to the following conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be included in 19 | * all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | * THE SOFTWARE. 28 | */ 29 | 30 | #ifndef _WISLTEBG96TCPIP_H_ 31 | #define _WISLTEBG96TCPIP_H_ 32 | 33 | #include "WisLTEBG96Common.h" 34 | 35 | typedef enum protocol_type{ 36 | IPV4 = 1, 37 | IPV4V6 = 2, 38 | }Protocol_Type_t; 39 | 40 | typedef enum authentication_methods{ 41 | NONE = 0, 42 | PAP = 1, 43 | CHAP = 2, 44 | PAP_OR_CHAP = 3, 45 | }Authentication_Methods_t; 46 | 47 | typedef enum socket_type{ 48 | TCP_CLIENT = 0, 49 | TCP_SEVER = 1, 50 | UDP_CLIENT = 2, 51 | UDP_SEVER = 3, 52 | }Socket_Type_t; 53 | 54 | typedef enum access_mode{ 55 | BUFFER_MODE = 0, 56 | DIRECT_PUSH_MODE = 1, 57 | TRANSPARENT_MODE = 2, 58 | }Access_Mode_t; 59 | 60 | typedef enum socket_event{ 61 | SOCKET_RECV_DATA_EVENT = 1, 62 | SOCKET_CLOSE_EVENT = 2, 63 | SOCKET_PDP_DEACTIVATION_EVENT = 3, 64 | SOCKET_INCOMING_CONNECTION_EVENT = 4, 65 | SOCKET_CONNECTION_FULL_EVENT = 5, 66 | }Socket_Event_t; 67 | 68 | class WisLTEBG96TCPIP : public WisLTEBG96Common 69 | { 70 | public: 71 | WisLTEBG96TCPIP(); 72 | 73 | ~WisLTEBG96TCPIP(); 74 | 75 | WisLTEBG96TCPIP(Stream &atserial, Stream &dserial); 76 | 77 | bool SetDevAPNParameters(unsigned int pdp_index, Protocol_Type_t type, char *apn, char *usr, char *pwd, Authentication_Methods_t met); 78 | 79 | Cmd_Response_t ActivateDevAPN(unsigned int pdp_index); 80 | 81 | bool DeactivateDevAPN(unsigned int pdp_index); 82 | 83 | bool GetDevAPNIPAddress(unsigned int pdp_index, char *ip); 84 | 85 | bool InitAPN(unsigned int pdp_index, char *apn, char *usr, char *pwd, char *err_code); 86 | 87 | bool OpenSocketService(unsigned int pdp_index, unsigned int socket_index, Socket_Type_t socket, char *ip, unsigned int port, unsigned int local_port, Access_Mode_t mode); 88 | 89 | bool CloseSocketService(unsigned int socket_index); 90 | 91 | bool SocketSendData(unsigned int socket_index, Socket_Type_t socket, char *data_buf, char *ip, unsigned int port); 92 | 93 | bool SocketRecvData(unsigned int socket_index, unsigned int recv_len, Socket_Type_t socket, char *recv_buf); 94 | 95 | bool SocketSendHEXData(unsigned int socket_index, char *hex_buf); 96 | 97 | bool SwitchAccessModes(unsigned int socket_index, Access_Mode_t mode); 98 | 99 | bool DevPingFunction(unsigned int socket_index, char *host); 100 | 101 | bool DevNTPFunction(unsigned int socket_index, char *ntp_ip, unsigned int port, char *time); 102 | 103 | bool ConfigDNSServer(unsigned int socket_index, char *primary_addr, char *secondary_addr); 104 | 105 | bool DevDNSFunction(unsigned int socket_index, char *domain_name, char *ip); 106 | 107 | bool QueryLastErrorCode(char *err_code); 108 | 109 | Socket_Event_t WaitCheckSocketEvent(char *event, unsigned int timeout); 110 | 111 | private: 112 | 113 | }; 114 | 115 | #endif --------------------------------------------------------------------------------