{"id":20186645,"url":"https://github.com/zimbora/esp32-bg95","last_synced_at":"2025-04-10T06:27:08.950Z","repository":{"id":63414836,"uuid":"563882366","full_name":"zimbora/esp32-BG95","owner":"zimbora","description":"package to communicate with BG95 modem","archived":false,"fork":false,"pushed_at":"2023-11-04T21:22:25.000Z","size":74,"stargazers_count":3,"open_issues_count":1,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-04-29T22:42:02.427Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/zimbora.png","metadata":{"files":{"readme":"Readme.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"License.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-11-09T14:36:24.000Z","updated_at":"2024-02-16T20:00:19.000Z","dependencies_parsed_at":"2023-11-03T19:45:07.284Z","dependency_job_id":null,"html_url":"https://github.com/zimbora/esp32-BG95","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbora%2Fesp32-BG95","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbora%2Fesp32-BG95/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbora%2Fesp32-BG95/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zimbora%2Fesp32-BG95/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zimbora","download_url":"https://codeload.github.com/zimbora/esp32-BG95/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224557174,"owners_count":17331142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-11-14T03:18:04.415Z","updated_at":"2024-11-14T03:18:04.981Z","avatar_url":"https://github.com/zimbora.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# esp32-BG95\n\n## Description\npackage to communicate with BG95 modem\n\n## Functionalities\n\n- Radio (GSM/GPRS/NB-IoT/CATM1) - operator selection\n- APN (multi connection)\n- NTP (clock sync at each hour)\n- GNSS\n- SMS\n- MQTT (multi connection + SSL)\n- TCP (multi connection + SSL)\n- HTTP (GET requests)\n- HTTPS (GET and Post requests (supporting json also))\n- COAP (not implemented for now)\n- LwM2M (not implemented for now)\n- DFOTA (to develop..)\n- PSM (not implemented for now)\n\n## Implementation\nLibrary to interact with BGxx enabling functionalities listed above\n\n## Public Methods\n\n- [MODEMBGXX()](#Constructor-1)\n- [MODEMBGXX(HardwareSerial *serial_modem)](#Constructor-2)\n- [MODEMBGXX(HardwareSerial *serial_modem, HardwareSerial *serial_log)](#Constructor-3)\n- [bool init(uint8_t radio, uint16_t cops, uint8_t pwkey)](#Init)\n- [void init_port(uint32_t baudrate, uint32_t config)](#Init-port)\n- [void disable_port()](#Disable-port)\n- [bool powerCycle()](#PowerCycle)\n- [bool setup(uint8_t cid, String apn, String username, String password)](#Setup)\n- [bool loop(uint32_t loop = 10)](#Loop)\n\n### Info\n\n- [String get_imei(uint32_t wait = 5000)](#Info-get-imei)\n- [String get_ccid(uint32_t wait = 5000)](#Info-get-ccid)\n- [String get_imsi(uint32_t wait = 5000)](#Info-get-imsi)\n- [String get_subscriber_number(uint16_t wait = 3000)](#Info-get-subscribe-number)\n\n### Radio\n\n- add rssi\n- technology in use\n- operator in use\n\n### APN\n\n- [String get_ip(uint8_t cid = 1, uint32_t wait = 5000)](#APN-get-ip)\n- [bool apn_connected(uint8_t cid = 1)](#APN-connected)\n- [bool has_context(uint8_t cid = 1)](#APN-has-context)\n- [bool open_pdp_context(uint8_t cid = 1)](#APN-open-PDP-context)\n- [bool close_pdp_context(uint8_t cid = 1)](#APN-close-PDP-context)\n- [String check_context_state(uint8_t contextID)](#APN-check-context-state)\n- [String check_connection_state(uint8_t connectionID)](#APN-check-connection-state)\n\n### SMS\n\n- [bool sms_check_handler()](#SMS-check-handler)\n- [bool sms_handler(void(*handler)(uint8_t, String, String))](#SMS-handler)\n- [bool sms_send(String origin, String message)](#SMS-send)\n- [bool sms_remove(uint8_t index)](#SMS-remove)\n\n### TCP\n\n- [bool tcp_connect(uint8_t clientID, String proto, String host, uint16_t port, uint16_t wait = 80000)](#TCP-connect-1)\n- [bool tcp_connect(uint8_t contextID, uint8_t clientID, String proto, String host, uint16_t port, uint16_t wait = 80000)](#TCP-connect-2)\n- [bool tcp_connect_ssl(uint8_t contextID, uint8_t sslClientID, uint8_t clientID, String host, uint16_t port, uint16_t wait = 10000)](#TCP-connect-3)\n- [bool tcp_connected(uint8_t cid)](#TCP-connected)\n- [bool tcp_close(uint8_t cid)](#TCP-close)\n- [bool tcp_send(uint8_t cid, uint8_t *data, uint16_t size)](#TCP-send)\n- [uint16_t tcp_recv(uint8_t cid, uint8_t *data, uint16_t size)](#TCP-recv)\n- [uint16_t tcp_has_data(uint8_t cid)](#TCP-has-data)\n\n### MQTT\n\n- [void MQTT_init(bool(*callback)(String topic,String payload))](#MQTT-init)\n- [bool MQTT_setup(uint8_t clientID, uint8_t contextID, String will_topic, String payload)](#MQTT-setup)\n- [bool MQTT_connect(uint8_t clientID, const char* uid, const char* user, const char* pass, const char* host, uint16_t port = 1883)](#MQTT-connect)\n- [bool MQTT_connected(uint8_t clientID)](#MQTT-connected)\n- [int8_t MQTT_disconnect(uint8_t clientID)](#MQTT-disconnect)\n- [bool MQTT_subscribeTopic(uint8_t clientID, uint16_t msg_id, String topic,uint8_t qos)](#MQTT-subscribeTopic)\n- [bool MQTT_subscribeTopics(uint8_t clientID, uint16_t msg_id, String topic- [],uint8_t qos- [], uint8_t len)](#MQTT-subscribeTopics)\n- [int8_t MQTT_unSubscribeTopic(uint8_t clientID, uint16_t msg_id, String topic- [], uint8_t len)](#MQTT-unSubscribeTopic)\n- [int8_t MQTT_publish(uint8_t clientID, uint16_t msg_id,uint8_t qos, uint8_t retain, String topic, String msg)](#MQTT-publish)\n- [void MQTT_readAllBuffers(uint8_t clientID)](#MQTT-readAllBuffers)\n\n### HTTP\n- [bool http_get(String host, String path, String token, uint8_t clientID, uint8_t contextID)](#HTTP-request)\n- [bool https_get(String host, String path, uint8_t clientID, String token, uint8_t sslClientID, uint8_t contextID)](#HTTPS-request)\n- [bool https_post(String host, String path, String body, String token, uint8_t clientID, uint8_t sslClientID, uint8_t contextID)](#HTTPS-post)\n- [bool https_post_json(String host, String path, String body, String token, uint8_t clientID, uint8_t sslClientID, uint8_t contextID)](#HTTPS-post-json)\n- [bool http_wait_response(uint8_t clientID)](#HTTP-wait-response)\n- [uint16_t http_get_header_length(uint8_t clientID)](#HTTP-get-header-length)\n- [void http_parse_header(char* data, uint16_t len)](#HTTP-parse-header)\n- [String http_response_status()](#HTTP-response-status)\n- [uint16_t http_get_body_size()](#HTTP-body-size)\n- [uint16_t http_get_body(uint8_t clientID, char* data, uint16_t len, uint16_t wait = 10000)](#HTTP-body)\n- [bool http_check_md5(char* data, uint16_t len)](#HTTP-check-mm5)\n\n## Examples\n  Run programs inside examples folder to check how it works\n\n### demo mqtt\n  Establish connection to one or multiple broker, subscribes topics and receive messages (add publish messages to the example)\n  Multiples contexts can also be tested\n\n### demo tcp\n  Establish connection to one or multiple hosts, make a request, receive response\n  Multiples contexts can also be tested\n\n### demo radio\n  Use it to test different radio technologies\n\n## Unit Test with Arduino\n  Not available for now\n### unitTest\n  Not available for now\n\n## Public Methods - Extension\n\n#### Constructor 1\n```\nMODEMBGXX()]\n```\n\n#### Constructor 2\n* @serial_modem - Serial port for modem connection\n```\nMODEMBGXX(HardwareSerial *serial_modem)]\n```\n\n#### Constructor 3\n* @serial_modem - Serial port for modem connection\n* @serial_log - Serial port for logs\n```\nMODEMBGXX(HardwareSerial *serial_modem, HardwareSerial *serial_log)]\n```\n\n#### Init\n* call it to initialize state machine\n```\nbool init(uint8_t radio, uint16_t cops, uint8_t pwkey)]\n```\n\n#### Init port\n* call it to initialize serial port\n```\nvoid init_port(uint32_t baudrate, uint32_t config)]\n```\n\n#### Disable port\n* call it to disable serial port\n```\nvoid disable_port()]\n```\n\n#### PowerCycle\n* switch off and on\n```\nbool powerCycle()]\n```\n\n#### Setup\n* setup APN configuration\n*\n* @cid - 0-16, limited to MAX_CONNECTIONS\n*\n* returns true if succeed\n```\nbool setup(uint8_t cid, String apn, String username, String password)]\n```\n\n#### Loop\n* check for pending commands, received data and updates state machine\n*\n* returns true if something has changed on state machine\n```\nbool loop(uint32_t loop = 10)]\n```\n\n### Info\n\n#### Info get imei\n```\nString get_imei(uint32_t wait = 5000)](\n```\n\n#### Info get ccid\n```\nString get_ccid(uint32_t wait = 5000)](\n```\n\n#### Info get imsi\n```\nString get_imsi(uint32_t wait = 5000)](\n```\n\n#### Info get subscribe number\n```\nString get_subscriber_number(uint16_t wait = 3000)](\n```\n\n### Radio\n\n\n### APN\n\n#### APN get ip\n* get IP of a context\n```\nString get_ip(uint8_t cid = 1, uint32_t wait = 5000)\n```\n\n#### APN connected\n* check if modem is connected to apn\n```\nbool apn_connected(uint8_t cid = 1)\n```\n\n#### APN has context\n* check if modem has IP\n```\nbool has_context(uint8_t cid = 1)\n```\n\n#### APN open PDP context\n* open context\n```\nbool open_pdp_context(uint8_t cid = 1)\n```\n\n#### APN close PDP context\n* close context\n```\nbool close_pdp_context(uint8_t cid = 1)\n```\n\n#### APN check context state\n* returns the state of context id\n```\nString check_context_state(uint8_t contextID)\n```\n\n#### APN check connection state\n* returns the state of connection id\n```\nString check_connection_state(uint8_t connectionID)\n```\n\n### SMS\n\n#### SMS check handler\n* check if there is some function to deal with sms\n```\nbool sms_check_handler()\n```\n\n#### SMS handler\npass callback for sms\n```\nbool sms_handler(void(*handler)(uint8_t, String, String))\n```\n\n#### SMS send\n* send sms\n```\nbool sms_send(String origin, String message)\n```\n\n#### SMS remove\n* remove sms\n```\nbool sms_remove(uint8_t index)\n```\n\n### TCP\n#### TCP connect 1\n* connect to a host:port\n*\n* @clientID - connection id 0-11, yet it is limited to MAX_TCP_CONNECTIONS\n* @proto - \"UDP\" or \"TCP\"\n* @host - can be IP or DNS\n* @wait - maximum time to wait for at command response in ms\n*\n* return true if connection was established\n```\nbool MODEMBGXX::tcp_connect(uint8_t clientID, String proto, String host, uint16_t port, uint16_t wait)\n```\n\n#### TCP connect 2\n* connect to a host:port\n*\n* @ccontextID - context id 1-16, yet it is limited to MAX_CONNECTIONS\n* @clientID - connection id 0-11, yet it is limited to MAX_TCP_CONNECTIONS\n* @proto - \"UDP\" or \"TCP\"\n* @host - can be IP or DNS\n* @wait - maximum time to wait for at command response in ms\n*\n* return true if connection was established\n```\nbool MODEMBGXX::tcp_connect(uint8_t contextID, uint8_t clientID, String proto, String host, uint16_t port, uint16_t wait)\n```\n\n#### TCP connect 3\n* connect to a host:port\n*\n* @ccontextID - context id 1-16, yet it is limited to MAX_CONNECTIONS\n* @sslClientID - connection id 0-5, yet it is limited to MAX_TCP_CONNECTIONS\n* @clientID - connection id 0-11, yet it is limited to MAX_TCP_CONNECTIONS\n* @host - can be IP or DNS\n* @wait - maximum time to wait for at command response in ms\n*\n* return true if connection was established\n```\nbool MODEMBGXX::tcp_connect_ssl(uint8_t contextID, uint8_t sslClientID, uint8_t clientID, String host, uint16_t port, uint16_t wait)\n```\n\n\n#### TCP connected\n* return tcp connection status\n```\nbool MODEMBGXX::tcp_connected(uint8_t clientID)\n```\n\n#### TCP close\n* close tcp connection\n*\n* return tcp connection status\n```\nbool MODEMBGXX::tcp_close(uint8_t clientID)\n```\n\n#### TCP send\n* send data through open channel\n*\n* returns true if succeed\n```\nbool MODEMBGXX::tcp_send(uint8_t clientID, uint8_t *data, uint16_t size)\n```\n\n#### TCP recv\n* copies data to pointer if available\n*\n* returns len of data copied\n```\nuint16_t MODEMBGXX::tcp_recv(uint8_t clientID, uint8_t *data, uint16_t size)\n```\n\n#### TCP has data\n* returns len of data available for clientID\n```\nuint16_t MODEMBGXX::tcp_has_data(uint8_t clientID)\n```\n\n### MQTT\n#### MQTT init\n* init mqtt\n*\n* @callback - register callback to parse mqtt messages\n```\nvoid MODEMBGXX::MQTT_init(bool(*callback)(String,String))\n```\n\n#### MQTT setup\n* setup mqtt\n*\n* @clientID - supports 5 clients, yet is limited to MAX_MQTT_CONNECTIONS\n* @contextID - index of TCP tcp[] - choose 1 connection\n* @will_topic - topic to be sent if mqtt loses connection\n* @payload - payload to be sent with will topic\n*\n* returns true if configuration was succeed\n```\nbool MODEMBGXX::MQTT_setup(uint8_t clientID, uint8_t contextID, String will_topic, String payload)\n```\n\n#### MQTT connect\n* Connects to a mqtt broker\n*\n* @clientID: 0-5, limited to MAX_CONNECTIONS\n* @uid: id to register device on broker\n* @uid: uid to register device on broker\n* @user: credential\n* @pass: credential\n* @host: DNS or IP\n* @port: default 1883\n*\n* return true if connection is open\n```\nbool MODEMBGXX::MQTT_connect(uint8_t clientID, const char* uid, const char* user, const char* pass, const char* host, uint16_t port)\n```\n\n#### MQTT connected\n* return true if connection is open\n```\nbool MODEMBGXX::MQTT_connected(uint8_t clientID)\n```\n\n#### MQTT disconnect\n* 0 Failed to close connection\n*\t1 Connection closed successfully\n```\nint8_t MODEMBGXX::MQTT_disconnect(uint8_t clientID)\n```\n\n#### MQTT subscribeTopic\n* return true if has succeed\n```\nbool MODEMBGXX::MQTT_subscribeTopic(uint8_t clientID, uint16_t msg_id, String topic,uint8_t qos)\n```\n\n#### MQTT subscribeTopics\n* return true if has succeed\n```\nbool MODEMBGXX::MQTT_subscribeTopics(uint8_t clientID, uint16_t msg_id, String topic[],uint8_t qos[], uint8_t len)\n```\n\n#### MQTT unSubscribeTopic\n* return true if has succeed\n```\nint8_t MODEMBGXX::MQTT_unSubscribeTopic(uint8_t clientID, uint16_t msg_id, String topic[], uint8_t len)\n```\n\n#### MQTT publish\n*\treturn\n*\t-1 error\n*\t0 Packet sent successfully and ACK received from server (message that published when \u003cqos\u003e=0 does not require ACK)\n*\t1 Packet retransmission\n*\t2 Failed to send packet\n```\nint8_t MODEMBGXX::MQTT_publish(uint8_t clientID, uint16_t msg_id,uint8_t qos, uint8_t retain, String topic, String msg)\n```\n\n#### MQTT readAllBuffers\n* Forces reading data from mqtt modem buffers\n* call it only if unsolicited messages are not being processed\n```\nvoid MODEMBGXX::MQTT_readAllBuffers(uint8_t clientID)\n```\n\n### HTTP\n\n# HTTP request\n* sends request\n*\n* @host - domain\n* @path - start path with '/'\n* clientID - socket id\n* contextID - context to be used\n*\n* returns true if request has been correctly sent\n```\nbool http_do_request(String host, String path, uint8_t clientID, uint8_t contextID)\n```\n\n# HTTPS request\n* sends https request\n*\n* @host - domain\n* @path - start path with '/'\n* @clientID - socket id\n* @sslClientID - socket ssl id\n* @contextID - context to be used\n*\n* returns true if request has been correctly sent\n```\nbool https_do_request(String host, String path, uint8_t clientID, uint8_t sslClientID, uint8_t contextID)\n```\n\n# HTTPS post\n* sends https post\n*\n* @host - domain\n* @path - start path with '/'\n* @body -\n* @token - pair of key words to be added to header\n* @clientID - socket id\n* @sslClientID - socket ssl id\n* @contextID - context to be used\n*\n* returns true if request has been correctly sent\n```\nbool https_post(String host, String path, String body, String token, uint8_t clientID, uint8_t sslClientID, uint8_t contextID)\n```\n\n# HTTPS post json\n* sends https post in json format\n*\n* @host - domain\n* @path - start path with '/'\n* @body -\n* @token - pair of key words to be added to header\n* @clientID - socket id\n* @sslClientID - socket ssl id\n* @contextID - context to be used\n*\n* returns true if request has been correctly sent\n```\nbool https_post_json(String host, String path, String body, String token, uint8_t clientID, uint8_t sslClientID, uint8_t contextID)\n```\n\n# HTTP wait response\n* After request has been sent, it waits for response and parse header\n*\n* returns true if header was detected and parsed thereafter\n```\nbool http_wait_response(uint8_t clientID)\n```\n\n# HTTP get header length\n\n```\nuint16_t http_get_header_length(uint8_t clientID)\n```\n\n# HTTP parse header\n\n```\nvoid http_parse_header(char* data, uint16_t len)\n```\n\n# HTTP response status\n* return http response result\n```\nString http_response_status()\n```\n\n# HTTP body size\n* returns body size to be read\n```\nuint16_t http_get_body_size()\n```\n\n# HTTP body\n* gets body data\n```\nuint16_t http_get_body(uint8_t clientID, char* data, uint16_t len, uint16_t wait = 10000)\n```\n\n# HTTP check md5\n* check md5 file (Content-MD5: has to be received on header),\n* otherwise it will returns false\n```\nbool http_check_md5(char* data, uint16_t len)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzimbora%2Fesp32-bg95","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzimbora%2Fesp32-bg95","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzimbora%2Fesp32-bg95/lists"}