Advertisement
Guest User

pppos_esp

a guest
May 16th, 2019
719
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.25 KB | None | 0 0
  1. #include <string.h>
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/event_groups.h"
  4. #include "tcpip_adapter.h"
  5. #include "mqtt_client.h"
  6. #include "esp_log.h"
  7. #include "sim800.h"
  8. #include "bg96.h"
  9. #include "esp_modem.h"
  10.  
  11. #if CONFIG_BROKER_CERTIFICATE_OVERRIDDEN == 1
  12. static const uint8_t letsencrypt_pem_start[]  = "-----BEGIN CERTIFICATE-----\n" CONFIG_BROKER_CERTIFICATE_OVERRIDE "\n-----END CERTIFICATE-----";
  13. #else
  14. extern const uint8_t letsencrypt_pem_start[]   asm("_binary_letsencrypt_pem_start");
  15. #endif
  16. extern const uint8_t letsencrypt_pem_end[] asm("_binary_letsencrypt_pem_end");
  17.  
  18. static const char *TAG = "pppos_example";
  19. static EventGroupHandle_t event_group = NULL;
  20. static const int CONNECT_BIT = BIT0;
  21. static const int STOP_BIT = BIT1;
  22. static const int GOT_DATA_BIT = BIT2;
  23. esp_mqtt_client_handle_t mqtt_client;
  24. TaskHandle_t xSpamHandle = NULL;
  25. modem_dte_t *dte = NULL;
  26. modem_dce_t *dce = NULL;
  27.  
  28.  
  29. void spam(void *);
  30. void gsm_start(int);
  31.  
  32. uint64_t get_time_millis(){
  33.   struct timeval tv;
  34.   gettimeofday(&tv, NULL);
  35.   return (uint64_t) tv.tv_sec * 1000ULL + ((uint64_t) tv.tv_usec / 1000ULL);
  36. }
  37.  
  38. static void modem_event_handler(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
  39. {
  40.     switch (event_id) {
  41.     case MODEM_EVENT_PPP_START:
  42.         ESP_LOGI(TAG, "Modem PPP Started");
  43.         break;
  44.     case MODEM_EVENT_PPP_CONNECT:
  45.         ESP_LOGI(TAG, "Modem Connect to PPP Server");
  46.         ppp_client_ip_info_t *ipinfo = (ppp_client_ip_info_t *)(event_data);
  47.         ESP_LOGI(TAG, "~~~~~~~~~~~~~~");
  48.         ESP_LOGI(TAG, "IP          : " IPSTR, IP2STR(&ipinfo->ip));
  49.         ESP_LOGI(TAG, "Netmask     : " IPSTR, IP2STR(&ipinfo->netmask));
  50.         ESP_LOGI(TAG, "Gateway     : " IPSTR, IP2STR(&ipinfo->gw));
  51.         ESP_LOGI(TAG, "Name Server1: " IPSTR, IP2STR(&ipinfo->ns1));
  52.         ESP_LOGI(TAG, "Name Server2: " IPSTR, IP2STR(&ipinfo->ns2));
  53.         ESP_LOGI(TAG, "~~~~~~~~~~~~~~");
  54.         xEventGroupSetBits(event_group, CONNECT_BIT);
  55.         break;
  56.     case MODEM_EVENT_PPP_DISCONNECT:
  57.         ESP_LOGI(TAG, "Modem Disconnect from PPP Server");
  58.         break;
  59.     case MODEM_EVENT_PPP_STOP:
  60.         ESP_LOGI(TAG, "Modem PPP Stopped");
  61.         xEventGroupSetBits(event_group, STOP_BIT);
  62.         break;
  63.     case MODEM_EVENT_UNKNOWN:
  64.         ESP_LOGW(TAG, "Unknow line received: %s", (char *)event_data);
  65.         break;
  66.     default:
  67.       ESP_LOGW("MODEM:", "Unknown event_id: %d", event_id);
  68.         break;
  69.     }
  70. }
  71.  
  72. static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
  73. {
  74.     esp_mqtt_client_handle_t client = event->client;
  75.     int msg_id;
  76.     switch (event->event_id) {
  77.     case MQTT_EVENT_CONNECTED://
  78.         ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
  79.         msg_id = esp_mqtt_client_subscribe(client, "/topic/esp-pppos", 0);
  80.         ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
  81.         xTaskCreate(spam, "SPAM_MQTT", 10000, NULL, 10, &xSpamHandle);
  82.         break;
  83.     case MQTT_EVENT_DISCONNECTED:
  84.       //restart PPPoS
  85.         ESP_LOGI("SPAM", "setup ppp, DCE: %x, DTE: %x", (int ) dce, (int)dte);
  86.         gsm_start(1);
  87.         /* gsm_start(); */
  88.         /* esp_modem_exit_ppp(dte); */
  89.         ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
  90.         break;
  91.     case MQTT_EVENT_SUBSCRIBED:
  92.         ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
  93.         uint64_t asd = get_time_millis();
  94.         char msg[20];
  95.         sprintf(msg, "%lld", asd);
  96.         msg_id = esp_mqtt_client_publish(client, "/topic/esp-pppos", msg , 0, 0, 0);
  97.         ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
  98.         break;
  99.     case MQTT_EVENT_UNSUBSCRIBED:
  100.         ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
  101.         break;
  102.     case MQTT_EVENT_PUBLISHED:
  103.         ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
  104.         break;
  105.     case MQTT_EVENT_DATA:
  106.         ESP_LOGI(TAG, "MQTT_EVENT_DATA");
  107.         printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
  108.         printf("DATA=%.*s\r\n", event->data_len, event->data);
  109.         /* xEventGroupSetBits(event_group, GOT_DATA_BIT); */
  110.         break;
  111.     case MQTT_EVENT_ERROR:
  112.         ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
  113.         break;
  114.     default://before conencted
  115.       /* esp_modem_setup_ppp(dte); */
  116.         ESP_LOGI(TAG, "MQTT other event id: %d", event->event_id);
  117.         break;
  118.     }
  119.     return ESP_OK;
  120. }
  121.  
  122. void spam(void * params){
  123.   int counter = 0;
  124.   while(1){
  125.     vTaskDelay(500);
  126.     if(dce != NULL){
  127.       ESP_LOGI("SPAM", "STATE_ENUM: %d", dce->state);
  128.     }else{
  129.       ESP_LOGI("SPAM", "IS NULL.. new init");
  130.       gsm_start(1);
  131.     }
  132.     counter++;
  133.     char buff[20];
  134.     sprintf(buff, "nr: %d", counter);
  135.     esp_mqtt_client_publish(mqtt_client, "/topic/test", buff, 0, 1, 0);
  136.   }
  137. }
  138.  
  139. void gsm_start(int restart){
  140.   /* create dte object */
  141.   if(dte==NULL){
  142.     esp_modem_dte_config_t config = ESP_MODEM_DTE_DEFAULT_CONFIG();
  143.     config.flow_control = MODEM_FLOW_CONTROL_SW;
  144.     dte = esp_modem_dte_init(&config);
  145.     /* Register event handler */
  146.     ESP_ERROR_CHECK(esp_modem_add_event_handler(dte, modem_event_handler, NULL));
  147.   }
  148.   /* create dce object */
  149.   dce = sim800_init(dte);
  150.   if(dce==NULL) return;
  151.   ESP_LOGI(TAG, "Module: %s", dce->name);
  152.   ESP_LOGI(TAG, "Operator: %s", dce->oper);
  153.   ESP_LOGI(TAG, "IMEI: %s", dce->imei);
  154.   ESP_LOGI(TAG, "IMSI: %s", dce->imsi);
  155.   uint32_t rssi = 0, ber = 0;
  156.   ESP_ERROR_CHECK(dce->get_signal_quality(dce, &rssi, &ber));
  157.   ESP_LOGI(TAG, "rssi: %d, ber: %d", rssi, ber);
  158.   /* Get battery voltage */
  159.   uint32_t voltage = 0, bcs = 0, bcl = 0;
  160.   ESP_ERROR_CHECK(dce->get_battery_status(dce, &bcs, &bcl, &voltage));
  161.   ESP_LOGI(TAG, "Battery voltage: %d mV", voltage);
  162.  
  163.   esp_modem_setup_ppp(dte);
  164.   /* Wait for IP address */
  165.   xEventGroupWaitBits(event_group, CONNECT_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
  166. }
  167.  
  168. void app_main()
  169. {
  170.     tcpip_adapter_init();
  171.     event_group = xEventGroupCreate();
  172.  
  173.     /* /\* create dte object *\/ */
  174.     gsm_start(1);
  175.  
  176.     /* Config MQTT */
  177.     esp_mqtt_client_config_t mqtt_config = {
  178.                                             .uri = CONFIG_BROKER_URL,
  179.                                             .event_handle = mqtt_event_handler,
  180.                                             .cert_pem = (const char *)letsencrypt_pem_start,
  181.                                             .disable_clean_session = true,
  182.                                             .keepalive = 5,
  183.     };
  184.     mqtt_client = esp_mqtt_client_init(&mqtt_config);
  185.     esp_mqtt_client_start(mqtt_client);
  186.  
  187.  
  188.     xEventGroupWaitBits(event_group, GOT_DATA_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
  189.     esp_mqtt_client_destroy(mqtt_client);
  190.     /* Exit PPP mode */
  191.     ESP_ERROR_CHECK(esp_modem_exit_ppp(dte));
  192.     xEventGroupWaitBits(event_group, STOP_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
  193. #if CONFIG_SEND_MSG
  194.     const char *message = "Welcome to ESP32!";
  195.     ESP_ERROR_CHECK(example_send_message_text(dce, CONFIG_SEND_MSG_PEER_PHONE_NUMBER, message));
  196.     ESP_LOGI(TAG, "Send send message [%s] ok", message);
  197. #endif
  198.     /* Power down module */
  199.     ESP_ERROR_CHECK(dce->power_down(dce));
  200.     ESP_LOGI(TAG, "Power down");
  201.     ESP_ERROR_CHECK(dce->deinit(dce));
  202.     ESP_ERROR_CHECK(dte->deinit(dte));
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement