{"id":33571926,"url":"https://github.com/misternegative21/quectelec200u","last_synced_at":"2026-04-02T15:31:14.267Z","repository":{"id":315543981,"uuid":"1059909336","full_name":"MISTERNEGATIVE21/QuectelEC200U","owner":"MISTERNEGATIVE21","description":"Universal QuectelEC200UCN Wrapper for Arduino supported boards","archived":false,"fork":false,"pushed_at":"2025-11-29T08:02:54.000Z","size":5000,"stargazers_count":2,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-29T21:54:12.359Z","etag":null,"topics":["ec200u","ec200ucn","quectel","quectel-ec200","quectelec200u"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MISTERNEGATIVE21.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-19T05:55:54.000Z","updated_at":"2025-11-29T08:02:57.000Z","dependencies_parsed_at":"2025-09-25T06:20:54.496Z","dependency_job_id":null,"html_url":"https://github.com/MISTERNEGATIVE21/QuectelEC200U","commit_stats":null,"previous_names":["misternegative21/quectelec200u_cn","misternegative21/quectelec200u"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/MISTERNEGATIVE21/QuectelEC200U","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MISTERNEGATIVE21%2FQuectelEC200U","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MISTERNEGATIVE21%2FQuectelEC200U/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MISTERNEGATIVE21%2FQuectelEC200U/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MISTERNEGATIVE21%2FQuectelEC200U/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MISTERNEGATIVE21","download_url":"https://codeload.github.com/MISTERNEGATIVE21/QuectelEC200U/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MISTERNEGATIVE21%2FQuectelEC200U/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28747308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T05:12:38.112Z","status":"ssl_error","status_checked_at":"2026-01-25T05:04:50.338Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ec200u","ec200ucn","quectel","quectel-ec200","quectelec200u"],"created_at":"2025-11-28T10:08:10.233Z","updated_at":"2026-02-28T07:02:02.700Z","avatar_url":"https://github.com/MISTERNEGATIVE21.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# QuectelEC200U Module\n\n![EC200U circuit overview](./assets/circuit_image.png)\n\nArduino library for Quectel EC200U (CN-AA firmware) providing a robust AT-command wrapper and advanced examples for easier integration of cellular connectivity into your projects.\n\nRepository: [https://github.com/MISTERNEGATIVE21/QuectelEC200U](https://github.com/MISTERNEGATIVE21/QuectelEC200U)\n\n## Where to Buy\n\n- **Sharvi Electronics ESP32-S3 with EC200U**: [Buy Here](https://sharvielectronics.com/product/esp32-s3-with-ec200u-4g-lte-cat-1-wifi-bluetooth-gnss-iot-smart-modem/)\n\n![Sharvi ESP32-S3 with EC200U](./assets/sharvi-ec200ucn.png)\n\nMore information on Custom ESP32-S3 with EC200U: [Sharvi Electronics ESP32-S3 with EC200U](https://github.com/SharviElectronics/ESP32-S3-with-EC200U/tree/main)\n\n- **Capuf EC200U-CN Module**: [Buy Here](https://capuf.in/products/ec200u-cn-4g-lte-modem)\n\n![Capuf EC200U-CN Module](./assets/capuf.png)\n\nMore information on Capuf Module: [Capuf Module](https://capuf.in/products/ec200u-cn-4g-lte-modem)\n\n## Features\n- **Core \u0026 State Management:** Initialization, AT command interface, state tracking.\n- **Network:** SIM/registration, PDP attach/activation, signal strength, operator info.\n- **TCP/IP:** TCP sockets (QIOPEN/QISEND/QIRD).\n- **SSL/TLS:** Secure sockets (QSSLCFG/QSSLOPEN), CA certificate management.\n- **HTTP/HTTPS:** GET and POST requests.\n- **MQTT:** Connect, publish, subscribe, disconnect (with TLS support).\n- **SMS:** Send, read, delete, and count SMS messages.\n- **Voice Calls:** Dial, answer, hang up, list calls, and manage caller ID.\n- **USSD:** Send and receive USSD messages.\n- **GNSS:** Start/stop, get location (NMEA or parsed), and configure GNSS.\n- **NTP \u0026 Time:** Synchronize time with an NTP server, get/set the module's clock.\n- **Filesystem:** List, upload, read, and delete files on the module's filesystem.\n- **TTS (Text-to-Speech):** Play text as speech.\n- **FTP:** Login, download files, and logout.\n- **Audio:** Control speaker volume, microphone gain, sidetone, and audio routing.\n- **Power Management:** Power save mode (PSM), power off, and reboot.\n- **Debugging:** Debug output stream for easier troubleshooting.\n\n## Installation\n1.  Download the latest release from the [GitHub repository](https://github.com/MISTERNEGATIVE21/QuectelEC200U/releases).\n2.  In the Arduino IDE, go to `Sketch \u003e Include Library \u003e Add .ZIP Library...` and select the downloaded file.\n3.  The library will be available in `Sketch \u003e Include Library \u003e QuectelEC200U`.\n\n## Getting Started\n\nHere is a simple example of how to initialize the modem, connect to the network, and make an HTTP GET request.\n\n```cpp\n#include \u003cQuectelEC200U.h\u003e\n\n// Define pins for your board\n#define EC200U_RX_PIN 16\n#define EC200U_TX_PIN 17\n\n#if defined(ARDUINO_ARCH_ESP32)\n  HardwareSerial SerialAT(1);\n  QuectelEC200U modem(SerialAT, 115200, EC200U_RX_PIN, EC200U_TX_PIN);\n#elif defined(ARDUINO_ARCH_ZEPHYR)\n  HardwareSerial\u0026 SerialAT = Serial1;\n  QuectelEC200U modem(SerialAT, 115200, EC200U_RX_PIN, EC200U_TX_PIN);\n#else\n  #include \u003cSoftwareSerial.h\u003e\n  SoftwareSerial SerialAT(7, 8); // RX, TX\n  QuectelEC200U modem(SerialAT);\n#endif\n\nvoid setup() {\n  Serial.begin(115200);\n  \n  #if defined(ARDUINO_ARCH_ZEPHYR)\n    SerialAT.begin(115200);\n  #elif !defined(ARDUINO_ARCH_ESP32)\n    SerialAT.begin(9600); // SoftwareSerial default\n  #endif\n\n  Serial.println(\"Initializing modem...\");\n  if (modem.begin()) {\n    Serial.println(\"Modem initialized.\");\n  } else {\n    Serial.print(\"Failed to initialize modem. Error: \");\n    Serial.println(modem.getLastErrorString());\n    while (1);\n  }\n\n  Serial.println(\"Waiting for network...\");\n  if (modem.waitForNetwork()) {\n    Serial.println(\"Network connected.\");\n  } else {\n    Serial.print(\"Failed to connect to network. Error: \");\n    Serial.println(modem.getLastErrorString());\n    while (1);\n  }\n\n  Serial.println(\"Attaching to data network...\");\n  modem.attachData(\"your.apn\"); // Replace with your APN\n\n  String response;\n  Serial.println(\"Performing HTTP GET...\");\n  if (modem.httpGet(\"http://example.com\", response)) {\n    Serial.println(\"Response:\");\n    Serial.println(response);\n  } else {\n    Serial.print(\"HTTP GET failed. Error: \");\n    Serial.println(modem.getLastErrorString());\n  }\n}\n\nvoid loop() {\n  // Your code here\n}\n```\n\n## Default Pin Definitions\n\nMost ESP32 examples share the same wiring so you can copy/paste between sketches:\n\n| Signal | ESP32 Pin | Description |\n| --- | --- | --- |\n| `EC200U_RX_PIN` | 16 | Connects to the modem TX (ESP32 receives data) |\n| `EC200U_TX_PIN` | 17 | Connects to the modem RX (ESP32 transmits data) |\n| `EC200U_PWRKEY_PIN` | 10 | Drive LOW for ~2 s to toggle modem power |\n| `EC200U_STATUS_PIN` | 2 | Optional status feedback (HIGH when modem is on) |\n\nUpdate the macros at the top of each sketch if your carrier board routes the modem elsewhere. Non‑ESP32 boards still use the same macro names so the documentation stays consistent.\n\n## Indian APN Settings\n\nFor users in India, you may need to set the APN (Access Point Name) for your mobile carrier. Here is a list of common APNs:\n\n- **Jio:** `jionet`\n- **Airtel:** `airtelgprs.com`\n- **Vodafone Idea (Vi):** `www`\n- **BSNL:** `bsnlnet`\n\nYou can use the `getOperator()` function to identify the network and then set the APN accordingly. For a detailed example, see `examples/Indian_APN_Demo/Indian_APN_Demo.ino`.\n\n## PPPoS (Point-to-Point Protocol over Serial)\n\nThis library can be used with the `PPPOSClient` library to establish a PPP connection with the EC200U modem. This allows you to use standard networking libraries like `WiFiClient` and `HTTPClient` over the cellular connection.\n\nFor a detailed example, see `examples/PPPOS_Demo/PPPOS_Demo.ino`.\n\n  ### TCP Socket Example\n\n  For raw sockets (e.g. pushing bytes to a custom server), the pattern is the same: bring up data, open a socket with `tcpOpen`, send with `tcpSend`, and read with `tcpRecv`. The new `examples/TCP_Client_Quickstart/TCP_Client_Quickstart.ino` sketch contains a full walk-through; the core loop looks like this:\n\n  ```cpp\n  const char HOST[] = \"postman-echo.com\";\n  int socketId = modem.tcpOpen(HOST, 80, 1, 0);\n  if (socketId \u003e= 0) {\n    modem.tcpSend(socketId, \"GET /get HTTP/1.1\\r\\nHost: postman-echo.com\\r\\n\\r\\n\");\n    String response;\n    if (modem.tcpRecv(socketId, response, 1024, 8000)) {\n      Serial.println(response);\n    }\n    modem.tcpClose(socketId);\n  }\n  ```\n\n  ### HTTPS Example\n\n  To talk to HTTPS endpoints you must provision a CA certificate once, configure an SSL context, and then call `httpsGet`/`httpsPost`. See `examples/HTTPS_Client_Quickstart/HTTPS_Client_Quickstart.ino` for a ready-to-run sketch. The critical steps are:\n\n  ```cpp\n  modem.sslUploadCert(cloudflare_ca_cert, \"cloudflare.pem\");\n  modem.sslConfigure(1, \"cloudflare.pem\");\n\n  String response;\n  if (modem.httpsGet(\"https://www.cloudflare.com/\", response)) {\n    Serial.println(response);\n  } else {\n    Serial.println(modem.getLastErrorString());\n  }\n  ```\n\n  ### Experimental Examples\n\n  Under the `examples/experimental/` folder, you will find more complex demos that rely on third-party integrations or external libraries:\n\n  #### 1. Consentium IoT Telemetry (`Consentium_IoT_Demo`)\n  Uploads JSON telemetry data over a secure socket. It loads the Consentium IoT TLS cert, configures SSL (`sslConfigure`), and posts metrics to `https://api.consentiumiot.com`. It can optionally set a `receiveKey` to fetch recent updates immediately after sending.\n\n  #### 2. Telegram Bot (`Telegram_Bot_Demo`)\n  Demonstrates using the new `QuectelTelegramBot` helper class to natively interact with the Telegram API. Instead of relying on unwieldy external Wi-Fi libraries or PPPoS, this lightweight class hooks directly into the modem's built-in `httpsGet` and `httpsPost` commands. It easily processes incoming JSON updates and handles sending messages effortlessly.\n\n\n  ### WebUI Hotspot API\n\n  The WebUI Hotspot example has grown into a full control panel with REST endpoints you can also script against:\n\n  | Endpoint | Purpose |\n  | --- | --- |\n  | `GET /api/status` | Adds RSRP/RAT details, APN origin, and MQTT summary fields. |\n  | `GET /api/device/sensors` | Battery status (`+CBC` percent/voltage) plus on-board ADC sample. |\n  | `GET/POST /api/pdp/*` | Inspect PDP selection, activate/deactivate a context, or clear a saved APN. |\n  | `GET/POST /api/mqtt/*` | Track broker state, connect with APN overrides, publish payloads, and subscribe to topics. |\n  | `GET /api/call/status`, `POST /api/call/answer`, `POST /api/call/volume` | Surface active calls, answer incoming rings, and bump speaker volume from the UI.\n\n  The corresponding frontend now shows a Power \u0026 Sensors card, PDP controls, MQTT client section, and a richer Phone tab (answer button, live log, and speaker volume slider). These APIs are ideal for integrating the modem with external dashboards without touching the AT layer.\n\n\n## API Reference\n\n### Core\n- `begin(bool forceReinit = false)`: Initializes the modem.\n- `sendAT(const String \u0026cmd, const String \u0026expect = \"OK\", uint32_t timeout = 3000)`: Sends an AT command.\n- `readResponse(char* buffer, size_t length, uint32_t timeout)`: Reads the response from the modem into the provided buffer.\n- `getIMEI()`: Gets the modem's IMEI.\n- `getModemInfo()`: Gets information about the modem.\n- `factoryReset()`: Resets the modem to factory defaults.\n- `powerOff()`: Powers off the modem.\n- `reboot()`: Reboots the modem.\n\n### Error Handling\n- `getLastError()`: Returns the last error code as an `ErrorCode` enum.\n- `getLastErrorString()`: Returns a string description of the last error.\n\n### State Management\n- `getState()`: Returns the current modem state (`ModemState` enum).\n- `isInitialized()`: Returns `true` if the modem is initialized.\n- `isNetworkReady()`: Returns `true` if the modem is registered on the network.\n- `setState(ModemState state)`: Sets the modem state.\n\n### Debugging\n- `enableDebug(Stream \u0026debugStream)`: Enables debug output to the specified stream.\n\n### Network\n- `waitForNetwork(uint32_t timeoutMs = 60000)`: Waits for the modem to register on the network.\n- `attachData(const String \u0026apn, const String \u0026user = \"\", const String \u0026pass = \"\", int auth = 0)`: Attaches to the data network.\n- `activatePDP(int ctxId = 1)`: Activates the Packet Data Protocol context.\n- `deactivatePDP(int ctxId = 1)`: Deactivates the PDP context.\n- `getRegistrationStatus(bool eps = true)`: Gets the network registration status.\n- `isSimReady()`: Returns `true` if the SIM card is ready.\n- `getOperator()`: Gets the name of the network operator.\n- `getSignalStrength()`: Gets the signal strength (RSSI).\n- `setAPN(const String \u0026apn)`: Sets the Access Point Name (APN).\n\n### HTTP/HTTPS\n- `httpGet(const String \u0026url, String \u0026response)`: Performs an HTTP GET request.\n- `httpPost(const String \u0026url, const String \u0026data, String \u0026response)`: Performs an HTTP POST request.\n- `httpsGet(const String \u0026url, String \u0026response)`: Performs an HTTPS GET request. **Note:** You must call `sslConfigure()` before using this function.\n- `httpsPost(const String \u0026url, const String \u0026data, String \u0026response)`: Performs an HTTPS POST request. **Note:** You must call `sslConfigure()` before using this function.\n\n### MQTT\n- `mqttConnect(const String \u0026server, int port)`: Connects to an MQTT broker.\n- `mqttPublish(const String \u0026topic, const String \u0026message)`: Publishes a message to an MQTT topic.\n- `mqttSubscribe(const String \u0026topic)`: Subscribes to an MQTT topic.\n- `mqttDisconnect()`: Disconnects from the MQTT broker.\n\n### TCP Sockets\n- `tcpOpen(const String \u0026host, int port, int ctxId = 1, int socketId = 0)`: Opens a TCP socket.\n- `tcpSend(int socketId, const String \u0026data)`: Sends data over a TCP socket.\n- `tcpRecv(int socketId, String \u0026out, size_t bytes = 512, uint32_t timeout = 5000)`: Receives data from a TCP socket.\n- `tcpClose(int socketId)`: Closes a TCP socket.\n\n### USSD\n- `sendUSSD(const String \u0026code, String \u0026response)`: Sends a USSD code.\n\n### NTP \u0026 Time\n- `ntpSync(const String \u0026server = \"pool.ntp.org\", int timezone = 0)`: Synchronizes the time with an NTP server.\n- `getClock()`: Gets the current time from the modem.\n- `setClock(const String \u0026datetime)`: Sets the time on the modem.\n\n### GNSS\n- `startGNSS()`: Starts the GNSS receiver.\n- `stopGNSS()`: Stops the GNSS receiver.\n- `isGNSSOn()`: Returns `true` if the GNSS receiver is on.\n- `setGNSSConfig(const String \u0026item, const String \u0026value)`: Configures a GNSS parameter.\n- `getNMEASentence(const String \u0026type = \"RMC\")`: Gets a raw NMEA sentence.\n- `getGNSSLocation()`: Gets the parsed GNSS location.\n- `getGNSSLocation(uint32_t fixWaitMs)`: Gets the parsed GNSS location, waiting for a fix.\n\n### Text-to-Speech (TTS)\n- `playTTS(const String \u0026text)`: Plays the given text as speech.\n\n### FTP\n- `ftpLogin(const String \u0026server, const String \u0026user, const String \u0026pass)`: Logs in to an FTP server.\n- `ftpDownload(const String \u0026filename, String \u0026data)`: Downloads a file from the FTP server.\n- `ftpLogout()`: Logs out from the FTP server.\n\n### Filesystem\n- `fsList(String \u0026out)`: Lists the files on the modem's filesystem.\n- `fsUpload(const String \u0026path, const String \u0026content)`: Uploads content to a file.\n- `fsRead(const String \u0026path, String \u0026out, size_t length = 0)`: Reads a file.\n- `fsDelete(const String \u0026path)`: Deletes a file.\n- `fsExists(const String \u0026path)`: Checks if a file exists.\n\n### SSL/TLS\n- `sslConfigure(int ctxId, const String \u0026caPath, bool verify = true)`: Configures SSL/TLS for a context.\n\n### Power Management\n- `enablePSM(bool enable)`: Enables or disables Power Save Mode (PSM).\n\n### Audio\n- `setSpeakerVolume(int level)`: Sets the speaker volume.\n- `setRingerVolume(int level)`: Sets the ringer volume.\n- `setMicMute(bool mute)`: Mutes or unmutes the microphone.\n- `setMicGain(int channel, int level)`: Sets the microphone gain.\n- `setSidetone(bool enable, int level)`: Enables or disables sidetone.\n- `setAudioChannel(int channel)`: Sets the audio channel.\n- `setAudioInterface(const String \u0026params)`: Configures the audio interface.\n- `audioLoopback(bool enable)`: Enables or disables audio loopback.\n\n## Constructors\n\nThe library provides two constructors to accommodate different hardware setups:\n\n### HardwareSerial\nFor boards like ESP32, you can use a `HardwareSerial` port. You can also specify the RX and TX pins.\n\n```cpp\n#include \u003cQuectelEC200U.h\u003e\n\nHardwareSerial\u0026 SerialAT = Serial1;\nQuectelEC200U modem(SerialAT, 115200, /* RX */ 16, /* TX */ 17);\n```\n\n### Stream\nFor other boards or configurations (e.g., `SoftwareSerial`), you can use any `Stream` object.\n\n```cpp\n#include \u003cSoftwareSerial.h\u003e\n#include \u003cQuectelEC200U.h\u003e\n\nSoftwareSerial SerialAT(7, 8); // RX, TX\nQuectelEC200U modem(SerialAT);\n```\n\n## State Management\n\nThe library uses a state machine to track the modem's status. You can get the current state using `modem.getState()`. The possible states are:\n\n- `MODEM_UNINITIALIZED`: The modem has not been initialized.\n- `MODEM_INITIALIZING`: The modem is currently initializing.\n- `MODEM_READY`: The modem is initialized and ready to receive commands.\n- `MODEM_ERROR`: An error occurred during initialization. Use `getLastError()` or `getLastErrorString()` to get more information.\n- `MODEM_NETWORK_CONNECTED`: The modem is registered on the network.\n- `MODEM_DATA_READY`: The modem has an active data connection.\n\n## Debugging\n\nYou can enable debug messages to a `Stream` object (e.g., `Serial`) to get more insight into the library's operation.\n\n```cpp\nvoid setup() {\n  Serial.begin(115200);\n  modem.enableDebug(Serial);\n  // ...\n}\n```\n\n## Contributing\nContributions are welcome! Please open an issue or submit a pull request on the [GitHub repository](https://github.com/MISTERNEGATIVE21/QuectelEC200U).\n\n## Maintainer\nMisterNegative21 \u003cmisternegative21@gmail.com\u003e\n\n## License\nThis library is released under the MIT License. See the [LICENSE](./LICENSE) file for details.\n\n## Trademarks \u0026 Attribution\nQuectel, EC200U, and related marks are trademarks or registered trademarks of Quectel Wireless Solutions Co., Ltd. This library is unofficial and not affiliated with Quectel.\n\n## Changelog\n\n### v2.7.0\n- **GPS Optimization:** Added `GNSSData` struct and robust `getGNSSData` method to parse NMEA sentences directly into simple properties.\n- **WebUI Hotspot Refactor:** Improved `WebUI_Hotspot.ino` to use struct-based GPS parsing, added automatic data connectivity on startup with stored APNs.\n- **Example Cleanup:** Removed redundant legacy examples to reduce clutter, favoring unified examples (like `HTTP_HTTPS_Unified_Demo`).\n\n### v2.6.0\n- **New Platform Support:** Added support for **Arduino Q Uno** (Zephyr-based) using `ARDUINO_ARCH_ZEPHYR`.\n- **Optimization:** Converted library to use `const char*` for string parameters, significantly reducing memory usage and overhead.\n- **Compatibility:** Added `String` overloads to maintain backward compatibility and fix `F()` macro usage issues.\n- **Examples:** Updated all 35+ examples to support ESP32, Zephyr, and SoftwareSerial platforms automatically.\n- **Fixes:** Resolved duplicate code blocks in advanced examples.\n\n### v2.5.0\n- Initial major release with advanced features (SSL, MQTT, GNSS, etc.).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmisternegative21%2Fquectelec200u","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmisternegative21%2Fquectelec200u","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmisternegative21%2Fquectelec200u/lists"}