Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GSMExamplesTestGPRS

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Тест GPRS при помощи GPS Shield[1]

Этот скетч тестирует GPRS-связь на модуле GSM Shield. Он пытается подключиться к странице arduino.cc.

Чтобы использовать GPRS на GPS Shield, вам нужно знать APN (Access Point Name, т.е. имя точки доступа), логин и пароль. Информацию об этом (включая самые последние обновления) можно узнать у своего оператора связи. На этой странице можно найти настройки для различных операторов, но учтите, что она может быть устаревшей.

Необходимое оборудование

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • SIM-карта с возможностью передачи данных;

Цепь

GSMShield ArduinoUno.png

Модуль Arduino GSM Shield, установленный поверх Arduino Uno

Код

Для начала импортируем библиотеку GSM.

  1. #include <GSM.h>

Функционал SIM-карты может быть заблокирован PIN-кодом. В этом случае его нужно определить в качестве константы, для чего мы воспользуемся директивой #define. Если у вашей SIM-карты PIN-кода нет, значит оставляем это место пустым.

  1. #define PINNUMBER ""

Создаем экземпляры классов GSM, GPRS и GSMClient.

  1. GSMClient client;
  2. GPRS gprsAccess;
  3. GSM gsmAccess;

Создаем пару статусных сообщений, которые в случае необходимости будем отправлять на Serial Monitor.

  1. String oktext = "OK";
  2. String errortext = "ERROR";

Создаем несколько переменных, которые будут содержать информацию о сервере, пути и прокси, к которому вы собираетесь подключиться.

  1. char url[] = "arduino.cc";
  2. char path[] = "/";
  3. char urlproxy[] = "http://arduino.cc";

Создаем переменную, в которой будет храниться ответ от сервера, а также еще одну переменную, информирующую о том, будете ли вы использовать прокси или нет.

  1. String response = "";
  2. boolean use_proxy = false;

В секции setup() инициализируем последовательную передачу данных.

  1. void setup(){
  2.   Serial.begin(9600);
  3. }

Теперь создадим пользовательскую функцию, которая будет обрабатывать входящие данные, идущие через последовательный порт. Аргументом у этой функции будет массив типа char.

  1. int readSerial(char result[])
  2. {

Создаем переменную, которая будет работать счетчиком. Если через последовательный порт будет прибывать информация, мы будем считывать ее в char-массив. Если среди входящих данных попадется символ новой строки, удаляем этот массив и возвращаемся к главному циклу программы.

  1. int i = 0;
  2.   while(1)
  3.   {
  4.     while (Serial.available() > 0)
  5.     {
  6.       char inChar = Serial.read();
  7.       if (inChar == '\n')
  8.       {
  9.         result[i] = '\0';
  10.         return 0;
  11.       }
  12.       if(inChar!='\r')
  13.       {
  14.         result[i] = inChar;
  15.         i++;
  16.       }
  17.     }
  18.   }
  19. }

В секции loop() устанавливаем «флаг» для прокси в положение false.

  1. void loop()
  2. {
  3.   use_proxy = false;

Запускаем соединение с сетью GSM, «скармливая» функции gsmAccess.begin() аргумент в виде PIN-кода SIM-карты.

  1. Serial.print("Connecting GSM network...");
  2.   if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
  3.   {
  4.     Serial.println(errortext);
  5.     while(true);
  6.   }
  7.   Serial.println(oktext);

Создаем массив типа char, в котором будем держать APN. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.

  1. char apn[50];
  2.   Serial.print("Enter your APN: ");
  3.   readSerial(apn);
  4.   Serial.println(apn);

Создаем массив типа char, в котором будем держать логин к APN. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.

  1. char login[50];
  2.   Serial.print("Now, enter your login: ");
  3.   readSerial(login);
  4.   Serial.println(login);

Создаем массив типа char, в котором будем держать пароль к APN. Затем используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.

  1. char password[20];
  2.   Serial.print("Finally, enter your password: ");
  3.   readSerial(password);

Подключаемся к GPRS при помощи функции gprs.attachGPRS(). В качестве аргументов ей требуются как раз введенные вами ранее APN, логин и пароль. Когда модем подключит себя к GPRS, функция gsmAccess() вернет значение GSM_READY.

  1. Serial.println("Attaching to GPRS with your APN...");
  2.   if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
  3.   {
  4.     Serial.println(errortext);
  5.   }
  6.   else{
  7.  
  8.     Serial.println(oktext);

Создаем массив типа char, где будет храниться любая необходимая нам информация о прокси. Далее используем созданную нами функцию readSerial() для считывания байтов, входящих через последовательный порт.

  1. char proxy[100];
  2.     Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");
  3.     readSerial(proxy);
  4.     Serial.println(proxy);

Если прокси определился, запрашиваем номер порта и выставляем «флаг» прокси на true.

  1. int pport;
  2.     if(proxy[0] != '\0'){
  3.       // read proxy port introduced by user
  4.       char proxyport[10];
  5.       Serial.print("Enter the proxy port: ");
  6.       readSerial(proxyport);
  7.       // cast proxy port introduced to integer
  8.       pport = (int) proxyport;
  9.       use_proxy = true;
  10.       Serial.println(proxyport);
  11.     }

Создаем переменную, которая будет указывать, подключились вы к серверу или нет. Подключаемся к серверу при помощи функции client.connect(). То, каким образом вы создаете соединение, будет зависеть от того, используете вы прокси или нет.

  1. Serial.print("Connecting and sending GET request to arduino.cc...");
  2.     int res_connect;
  3.  
  4.     if(use_proxy)
  5.       res_connect = client.connect(proxy, pport);
  6.     else
  7.       res_connect = client.connect(url, 80);

Если подключились, делаем запрос HTTP GET при помощи функции client.print().

  1. if (res_connect)
  2.     {
  3.       client.print("GET ");
  4.  
  5.       if(use_proxy)
  6.         client.print(urlproxy);
  7.       else
  8.         client.print(path);
  9.  
  10.       client.println(" HTTP/1.0");
  11.       client.println();
  12.       Serial.println(oktext);
  13.     }

Если подключиться не получилось, сообщаем об ошибке.

  1. else
  2.     {
  3.       Serial.println(errortext);
  4.     }

При помощи функции client.available() проверяем, пришли от сервера какие-нибудь байты или нет. Если да, считываем их в строку response, а затем «заливаем» в char-массив. Проверяем массив подстрокой «200 OK», которая указывает на корректный ответ от arduino.cc.

  1. Serial.print("Receiving response...");
  2.  
  3.     boolean test = true;
  4.     while(test)
  5.     {
  6.       if (client.available())
  7.       {
  8.         char c = client.read();
  9.         response += c;
  10.  
  11.         char responsechar[response.length()+1];
  12.         response.toCharArray(responsechar, response.length()+1);
  13.  
  14.         if(strstr(responsechar, "200 OK") != NULL){
  15.           Serial.println(oktext);
  16.           Serial.println("TEST COMPLETE!");
  17.           test = false;
  18.         }
  19.       }

Если сервер отключился, останавливаем работу клиента и закрываем блок loop().

  1. if (!client.connected())
  2.       {
  3.         Serial.println();
  4.         Serial.println("disconnecting.");
  5.         client.stop();
  6.         test = false;
  7.       }
  8.     }
  9.   }
  10. }

Итак, чтобы увидеть статус соединения, загрузите код и откройте Serial Monitor.

  1. /*
  2.  
  3. Этот тест запрашивает данные об APN, а затем при помощи GPRS
  4. пытается подключиться к arduino.cc.
  5.  
  6. Цепь:
  7. * GSM Shield, подключенный к Arduino
  8.  
  9. Создан 18 июня 2012 Дэвидом дель Пералем (David del Peral).
  10. */
  11.  
  12. // Библиотеки:
  13. #include <GSM.h>
  14.  
  15. // PIN-код:
  16. #define PINNUMBER ""
  17.  
  18. // Создаем экземпляры классов:
  19. GSM gsmAccess;        // доступ к GSM (включая параметр «true» для активации отладки)
  20. GPRS gprsAccess;  // доступ к GPRS
  21. GSMClient client;  // клиентский сервис для соединения по TCP
  22.  
  23. // Сообщения для ответа через Serial Monitor:
  24. String oktext = "OK";  
  25. String errortext = "ERROR";  //  "Ошибка"
  26.  
  27. // URL и путь (например, arduino.cc)
  28. char url[] = "arduino.cc";
  29. char urlproxy[] = "http://arduino.cc";
  30. char path[] = "/";
  31.  
  32. // Переменная для хранения принятого ответа:
  33. String response = "";
  34.  
  35. // Используем прокси:
  36. boolean use_proxy = false;
  37.  
  38. void setup()
  39. {
  40.     // Инициализируем последовательную передачу данных:
  41.   Serial.begin(9600);
  42. }
  43.  
  44. void loop()
  45. {
  46.   use_proxy = false;
  47.  
  48.   // Запускаем GSM Shield.
  49.   // Если у вашей SIM-карты есть PIN-код, указываем его параметром в функции begin():
  50.   Serial.print("Connecting GSM network...");  //  "Подключение к сети GSM..."
  51.   if(gsmAccess.begin(PINNUMBER)!=GSM_READY)
  52.   {
  53.     Serial.println(errortext);
  54.     while(true);
  55.   }
  56.   Serial.println(oktext);
  57.  
  58.   // Считываем APN, введенный пользователем:
  59.   char apn[50];
  60.   Serial.print("Enter your APN: ");  //  "Введите ваш APN: "
  61.   readSerial(apn);
  62.   Serial.println(apn);
  63.  
  64.   // Считываем логин к APN, введенный пользователем:
  65.   char login[50];
  66.   Serial.print("Now, enter your login: ");  //  "Теперь введите логин: "
  67.   readSerial(login);
  68.   Serial.println(login);
  69.  
  70.   // Считываем пароль к APN, введенный пользователем:
  71.   char password[20];
  72.   Serial.print("Finally, enter your password: ");  //  "Наконец, введите пароль: "
  73.   readSerial(password);
  74.  
  75.   // Подключаемся к GPRS:
  76.   Serial.println("Attaching to GPRS with your APN...");  //  "Подключаемся к GPRS с помощью ваших данных об APN..."
  77.   if(gprsAccess.attachGPRS(apn, login, password)!=GPRS_READY)
  78.   {
  79.     Serial.println(errortext);
  80.   }
  81.   else{
  82.  
  83.     Serial.println(oktext);
  84.  
  85.     // Считываем данные о прокси, введенные пользователем:
  86.     char proxy[100];
  87.     Serial.print("If your carrier uses a proxy, enter it, if not press enter: ");  //  "Если ваш оператор использует прокси, введите его, если нет – нажмите Enter"
  88.     readSerial(proxy);
  89.     Serial.println(proxy);
  90.  
  91.     // Если пользователь указал прокси, запрашиваем у него прокси-порт:
  92.     int pport;
  93.     if(proxy[0] != '\0'){
  94.       // Считываем прокси-порт, введенный пользователем:
  95.       char proxyport[10];
  96.       Serial.print("Enter the proxy port: ");  //  "Введите прокси-порт: "
  97.       readSerial(proxyport);
  98.       // «Заливаем» этот прокси-порт в переменную pport:
  99.       pport = (int) proxyport;
  100.       use_proxy = true;
  101.       Serial.println(proxyport);
  102.     }
  103.  
  104.     // Подключаемся к arduino.cc и выполняем HTTP-запрос:
  105.     Serial.print("Connecting and sending GET request to arduino.cc...");  //  "Подключение и отправка GET-запроса на arduino.cc..."
  106.     int res_connect;
  107.  
  108.     // Если используется прокси, подключаемся с его помощью:
  109.     if(use_proxy)
  110.       res_connect = client.connect(proxy, pport);
  111.     else
  112.       res_connect = client.connect(url, 80);
  113.  
  114.     if (res_connect)
  115.     {
  116.       // Далем запрос типа HTTP 1.0 GET («клиент отправляет запрос»)
  117.       client.print("GET ");
  118.  
  119.       // Если используется прокси, то путь – URL-ссылка arduino.cc:
  120.       if(use_proxy)
  121.         client.print(urlproxy);
  122.       else
  123.         client.print(path);
  124.  
  125.       client.println(" HTTP/1.0");
  126.       client.println();
  127.       Serial.println(oktext);
  128.     }
  129.     else
  130. {
  131.       // Если подключиться к серверу не получилось:
  132.       Serial.println(errortext);
  133.     }
  134.     Serial.print("Receiving response...");  //  "Отправка ответа..."
  135.  
  136.     boolean test = true;
  137.     while(test)
  138.     {
  139.       // Если от сервера есть входящие байты, считываем их и проверяем:
  140.       if (client.available())
  141.       {
  142.         char c = client.read();
  143.         response += c;
  144.  
  145.         // «Выливаем» полученный ответ из строки в char-массив:
  146.         char responsechar[response.length()+1];
  147.         response.toCharArray(responsechar, response.length()+1);
  148.  
  149.         // Если ответ включает подстроку «200 ОК»:
  150.         if(strstr(responsechar, "200 OK") != NULL){
  151.           Serial.println(oktext);
  152.           Serial.println("TEST COMPLETE!");  //  "Тест завершен!"
  153.           test = false;
  154.         }
  155.       }
  156.  
  157.       // Если сервер отключился, останавливаем работу клиента:
  158.       if (!client.connected())
  159.       {
  160.         Serial.println();
  161.         Serial.println("disconnecting.");  //  "Отключение."
  162.         client.stop();
  163.         test = false;
  164.       }
  165.     }
  166.   }
  167. }
  168.  
  169. /*
  170. Пользовательская функция для считывания входящих данных
  171.  */
  172. int readSerial(char result[])
  173. {
  174.   int i = 0;
  175.   while(1)
  176.   {
  177.     while (Serial.available() > 0)
  178.     {
  179.       char inChar = Serial.read();
  180.       if (inChar == '\n')
  181.       {
  182.         result[i] = '\0';
  183.         return 0;
  184.       }
  185.       if(inChar!='\r')
  186.       {
  187.         result[i] = inChar;
  188.         i++;
  189.       }
  190.     }
  191.   }
  192. }

См.также

  1. GPRS Constructor
  2. GSMClient Constructor
  3. attachGPRS()

Внешние ссылки

  1. Arduino - GSM Test GPRS