아두이노 GSM 쉴드를 셀룰러 네트워크에 연결하기
Published: 2024-01-12 10:31:50

**자료실에 있는 이 블로그에서 설명하는 원칙은 오늘날에도 여전히 유효하지만, 이 글에서 사용하는 구체적인 예는 일부 국가에서 사용할 수 없는 GPRS를 대상으로 합니다. 이 튜토리얼의 단계를 따르는 경우 이 점을 염두에 두시기 바랍니다.**

과거에 우리는 CES 및 기타 컨퍼런스에서 PubNub 아두이노로 제어되는 스마트 홈을 선보였는데, 자주 묻는 질문이 PubNub이 GSM/GPRS 네트워크에서 작동하는지에 대한 것이었습니다. 아두이노 GSM/GPRS 쉴드를 인터넷에 연결하여 [양방향으로 데이터를 스트리밍할](https://www.pubnub.com/solutions/data-streaming/) 수 있나요? 작동한다는 것은 알고 있었지만 실제로 구현해 본 적은 없었습니다.

지금까지는...

이 블로그 게시물에서는 GSM/GPRS를 이용한 PubNub의 간단한 데모를 살펴보겠습니다. 즉, 아두이노를 모바일 셀 네트워크에 쉽게 연결해 보겠습니다. 이는 매우 흥미로운 일이며, 커넥티드 카나 드론과 같은 모바일 [IoT 애플리케이션](https://www.pubnub.com/solutions/iot-device-control/) 또는 기상 관측소나 스프링클러 시스템과 같이 WiFi 신호에 액세스할 수 없는 앱에 대한 가능성을 열어줍니다.

그럼 시작해 보겠습니다!

[![GRPS SLD_04](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpg/748bdd937c0bc4de3db714a44c5d7c84/GRPS-SLD_04.jpg "GRPS SLD_04")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpg/748bdd937c0bc4de3db714a44c5d7c84/GRPS-SLD_04.jpg)

### 아두이노 GSM/GPRS 부품 목록

제가 사용한 부품은 다음과 같습니다:

-   아두이노 UNO Rev3
-   씨드 스튜디오 GPRS 쉴드 V2.0
-   SIM 카드(독립형)
-   C 사이즈 배터리(5개)
-   C 사이즈 배터리 홀더(5개)
-   실제 SIM을 사용할 수 있는 스마트폰
-   노트북

저는 아마존에서 GPRS 쉴드와 AT&T SIM 카드를 구입했는데, 아마존에는 범용 SIM 섹션이 있습니다. 다른 소매점에서는 독립형 SIM 카드를 찾기 어려울 수 있습니다.

### SIM 카드 설정하기

먼저 SIM 카드의 잠금을 해제하고 데이터 요금제를 연결해야 합니다. 이것이 바로 부품 목록에 스마트폰이 있는 이유입니다.

SIM 카드를 휴대폰에 넣고 패키지에 포함된 설명서를 읽으세요. 제가 구입한 AT&T SIM의 경우, 휴대폰에서 일련의 번호로 전화를 걸어 카드를 활성화한 다음 온라인으로 요금제를 구성했습니다. 모바일 요금제가 통화와 문자뿐만 아니라 데이터 전송도 지원하는지 확인하세요.

SIM 카드를 활성화한 후 휴대폰으로 웹사이트에 연결해 보세요. 연결에 성공하면 데이터가 확보된 것이며 아두이노 내에서 작동합니다.

### 아두이노 GPRS 설정

아두이노 GPRS 쉴드를 가져와서 SIM 카드를 연결합니다. Seeed Studio에 [이 방법에 대한 훌륭한 튜토리얼이](https://wiki.seeedstudio.com/GPRS_Shield_V2.0/) 있습니다. 해당 튜토리얼을 따르되 '테스트 설정'에서 코드를 업로드하기 전에 중단하고 여기로 돌아오세요.

[![Arduino GPRS GSM](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hph/9cb2b3cc0d462bd0ccce25f4696c360c/Arduino-GPRS-GSM.png "Arduino GPRS GSM")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hph/9cb2b3cc0d462bd0ccce25f4696c360c/Arduino-GPRS-GSM.png)

### 아두이노 라이브러리

아두이노에서 이 기능을 설정하려면 많은 라이브러리가 필요하지만, 이 라이브러리를 사용하면 훨씬 쉬워집니다. 제가 직접 작성해 보았습니다!

[씨드 스튜디오 GPRS 쉴드 V2에 필요한 특정 라이브러리는 여기에서](https://github.com/Seeed-Studio/GPRS_Shield_Suli) 찾을 수 있습니다. 이 아기를 작동시키려면 3개의 라이브러리가 필요합니다:

-   [GPRS\_Shield\_Suli](https://github.com/Seeed-Studio/GPRS_Shield_Suli) - GPRS 모듈 라이브러리,
-   SoftwareSerial - 소프트웨어 직렬을 사용하여 GPRS 모듈과 통신합니다.
-   [술리\_아두이노](https://github.com/Seeed-Studio/Suli) - 시드 통합 라이브러리 인터페이스

이 세 가지 라이브러리를 모두 아두이노 설정으로 가져옵니다.

### 소프트웨어 시리얼

이제 재미있는 부분입니다. 쉴드와 아두이노 환경이 모두 설정되었습니다. 이제 셀 네트워크를 이용해 봅시다.

먼저 아두이노의 SIM900 칩과 통신할 방법이 필요합니다. 하드웨어 시리얼을 사용하여 직접 대화할 수도 있지만 이는 어렵기 때문에 Arduino의 소프트웨어 시리얼을 사용하겠습니다.

아두이노 예제 폴더에서 'SIM\_900\_Serial\_Debug' 예제를 엽니다.

[![
Connect Arduino GSM/GPRS](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpi/0b0470d16b584924954410e4fe312d6e/687474703a2f2f692e696d6775722e636f6d2f3658483531466f2e706e67.png "
Connect Arduino GSM/GPRS")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpi/0b0470d16b584924954410e4fe312d6e/687474703a2f2f692e696d6775722e636f6d2f3658483531466f2e706e67.png)

이 예제는 간단합니다. 아두이노의 직렬 포트에서 SIM900으로 직렬 데이터를 프록시하기만 하면 됩니다. 이를 통해 내장된 아두이노 시리얼 디버그 도구를 사용하여 SIM900과 상호 작용할 수 있습니다.

```js
void loop(){
  if(gprs.available()){
    Serial.write(gprs.read());
  }
  if(Serial.available()){     
    gprs.write(Serial.read()); 
  }
}
```

### 자신에게 전화하기

모든 것을 테스트하기 위해 아두이노 GSM 쉴드로 스스로에게 전화를 걸어 보겠습니다. 소프트웨어 시리얼 예제를 아두이노에 로드하고 시리얼 디버거를 엽니다. 측면에 있는 버튼을 사용하여 아두이노 GPRS 실드의 SIM 카드의 전원을 켰는지 확인합니다.

_전원 버튼을 약 2초간 눌러 SIM900의 전원을 켭니다. 빨간색 LED가 켜집니다. 그 옆에 있는 녹색 LED가 깜박입니다. 실드가 네트워크에 성공적으로 연결되면 녹색 LED가 3초마다 깜박입니다._

아두이노 SIM을 테스트한 후에는 기존 SMS 카드를 휴대폰에 다시 넣어야 합니다!

이제 아두이노 시리얼 창에 다음을 입력합니다:

```js
AT
```

직렬 출력에 다음과 같은 내용이 표시되어야 합니다:

```js
RDY
+CFUN: 1
+CPIN: READY
+PACSP: 0
Call Ready
```

직렬 모니터에 메시지가 표시되지 않으면 "새로 보내기" 옵션을 클릭하여 AT 명령 끝에 캐리지 리턴을 추가한 다음 "AT+IPR=19200" AT 명령을 전송하여 SIM900의 전송 속도를 설정해야 합니다.

이제 직접 전화를 걸어보세요. '1\*\*\*8675309'를 자신의 번호로 바꾸어 다음 명령을 입력합니다.

```js
ATD1***8675309;
```

성공하면 아래 그림과 같이 'ATH OK'라는 메시지가 표시됩니다. 그렇지 않으면 '이동 통신사 없음'이 대신 표시됩니다. 전화번호가 존재하지 않거나 명령 형식이 잘못되었기 때문일 수 있습니다.

### 인터넷에 연결하기

GSM을 통해 작동하도록 아두이노 프로젝트를 성공적으로 구성했습니다. 이제 인터넷에 연결해 보겠습니다.

_SIM900의 전송 속도가 9600인지 확인하세요! AT 명령어(AT+IPR=9600)를 사용하여 SerialDebug를 통해 설정할 수 있습니다._

GPRS\_Shield\_Suli에서 GPRS\_TCPConnection 예제를 불러옵니다. 이 예제는 'mbed.org/media/uploads/mbed\_official/hello.txt HTTP/1.0'에 대한 간단한 요청을 수행합니다.  
  

그러나 아두이노에 로드하면 실행되지 않을 수 있습니다. 특정 셀룰러 네트워크에서 작동하도록 구성되지 않았기 때문입니다.

제 경우에는 AT&T를 사용하고 있으므로 다음 줄을 변경하여 gprs 연결을 구성해야 했습니다:

```js
GPRS gprs(PIN_TX, PIN_RX, BAUDRATE,"cmnet");
```

대부분의 경우 이 회선으로는 충분하지 않습니다. 또한 APN, 사용자 아이디, 비밀번호를 제공해야 합니다. 이러한 매개 변수는 예제에서 생략되었지만 직접 입력할 수 있습니다. 관련 코드는 [여기에서](https://github.com/Seeed-Studio/GPRS_Shield_Suli/blob/master/GPRS_Shield_Arduino.h) 찾을 수 있습니다.

```js
GPRS(int tx, int rx, uint32_t baudRate = 9600, const char* apn = NULL, const char* userName = NULL, const char *passWord = NULL);
```

AT&T에 연결하려면 다음 구성을 사용합니다:

```js
GPRS gprs(PIN_TX, PIN_RX, BAUDRATE, "wap.cingular", "WAP@CINGULARGPRS.COM", "CINGULAR1");
```

이제 코드를 실행합니다. IP를 획득하고 요청을 발행할 수 있어야 합니다. 그러나 요청이 발행되면 앱이 충돌(SIM이 꺼짐)할 수 있습니다. 혼란스러울 수 있지만 쉽게 해결할 수 있습니다.

### 배터리

시드 스튜디오와 다른 다양한 실드는 아두이노와 "플러그 앤 플레이"가 가능하다고 광고하지만, 항상 그런 것은 아닙니다. 특히 이 실드는 단일 5V USB 공급 장치로는 TCP 요청을 성공적으로 완료하기에 충분한 전력이 공급되지 않습니다.

하지만 이 문제는 쉽게 해결할 수 있습니다. 전원을 더 공급하기만 하면 됩니다! 온라인 포럼에서는 GSM 칩에 전원을 공급하기 위해 5개의 C셀 배터리를 추가할 것을 제안하는데, 저도 그렇게 했습니다.

[![Connect Arduino GSM/GPRS](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpk/229a1ccaccf1df92b657be3c095b068f/687474703a2f2f692e696d6775722e636f6d2f45486a7942684b2e6a7067-1024x681.jpg "Connect Arduino GSM/GPRS")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpj/523b7d13b8c3b81ff0c49733d501b432/687474703a2f2f692e696d6775722e636f6d2f45486a7942684b2e6a7067.jpg)

배터리는 직렬로 연결해야 하며, 양극 끝은 VIN 입력에 연결하고 음극 끝은 GND에 연결해야 합니다.

배터리를 추가한 후 예제를 다시 시도합니다. 성공적으로 연결될 것입니다.

잘됐네요! 이제 PubNub에 신호를 보낼 준비가 되었습니다.

### PubNub을 신호로 구현하기

이제 모든 것이 준비되었으니 이제 재미있는 부분으로 넘어가 보겠습니다. 다음 예제를 보드에 로드하고 앞서 언급한 대로 'GPRS gprs()' 구성을 변경합니다.

```js
#include <GPRS_Shield_Arduino.h>
  #include <SoftwareSerial.h>
  #include <Wire.h>
  #include <Suli.h>
  #define PIN_TX    7
  #define PIN_RX    8
  //make sure that the baud rate of SIM900 is 9600!
  //you can use the AT Command(AT+IPR=9600) to set it through SerialDebug
  #define BAUDRATE  9600
  GPRS gprs(PIN_TX, PIN_RX, BAUDRATE, "wap.cingular", "WAP@CINGULARGPRS.COM", "CINGULAR1");
  void publishData(String data) {
    Serial.println("attempting to publish");
    while (false == gprs.join()) {
      Serial.println("gprs join network error");
      delay(2000);
    }
    String str = "GET /publish/demo/demo/0/pubnub_gprs/0/\"" + data + "\" HTTP/1.0\r\n\r\n";
    // Length (with one extra character for the null terminator)
    int str_len = str.length() + 1; 
    // Prepare the character array (the buffer) 
    char http_cmd[str_len];
    // Copy it over 
    str.toCharArray(http_cmd, str_len);
    char buffer[512];
    if (false == gprs.connect(TCP, "pubsub.pubnub.com", 80)) {
      Serial.println("connect error");
    } else {
      Serial.println("publish success");
      Serial.println(data);
    }
    gprs.send(http_cmd, sizeof(http_cmd) - 1);
    gprs.close();
  }
  int counter = 0;
  void setup() {
    Serial.println("starting");
    Serial.begin(9600);
    // use DHCP
    gprs.init();
    // attempt DHCP
    while(true){
      publishData(String(counter));
      counter++;
      delay(1000);
    }
    gprs.disconnect();
  }
  void loop() {
  }
```

[](https://www.pubnub.com/docs/general/basics/initialize-pubnub)

[처음에는 혼란스러울 수 있지만 자세히 살펴보겠습니다. URL은](https://www.pubnub.com/docs/general/basics/initialize-pubnub) [PubNub REST 푸시 API에](https://pubnub.com/docs/rest-api)[따라 형식이](https://www.pubnub.com/docs/general/basics/initialize-pubnub) 지정됩니다.

```js
http://pubsub.pubnub.com
/publish
/pub-key
/sub-key
/signature
/channel
/callback
/message
```

도메인 'pubsub.pubnub.com'은 함수 뒷부분에서 정의됩니다. 'publish' 키가 가리키는 것은 pubnub 명령입니다(구독할 수도 있음). 'pub-key'와 'sub-key'는 자신의 [PubNub 계정에서](https://www.pubnub.com/docs/general/basics/set-up-your-account) 제공되지만 지금은 '데모' 키를 사용할 수 있습니다. 서명은 걱정하지 마세요.

'채널'이 정말 중요합니다. 이것은 PubNub 기기들이 서로 대화할 수 있는 IRC 채널과 같습니다.

### 데이터 표시

아두이노의 메시지를 수신하는 다른 장치가 없으므로 [PubNub 콘솔을](https://www.pubnub.com/docs/console/) 사용하여 채널 활동을 관찰해 보겠습니다.

데모가 실행 중이라면 '메시지' 창에 1, 2, 3, 4와 같은 숫자가 표시되어야 합니다.

[![Connect Arduino GSM/GPRS](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpm/f98dab6173290ad076b29dc1c0b1ad48/687474703a2f2f692e696d6775722e636f6d2f77474c463865652e706e67-1024x468.png "Connect Arduino GSM/GPRS")](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1hpl/938e26e4848e88a0f3e2aaeb114f7589/687474703a2f2f692e696d6775722e636f6d2f77474c463865652e706e67.png)

아두이노에서 나오는 데이터를 볼 수 있는 이유는 아두이노에 연결한 것과 동일한 게시 및 구독 키를 PubNub 콘솔에 연결했기 때문입니다. '데모' 키를 사용하고 있기 때문에 채널이 공개적으로 공유되지만, 직접 계정을 만들면 데이터가 비공개로 전환됩니다.

펍넙이 어떻게 도움이 될까요?
================

이 문서는 원래 [PubNub.com에](https://www.pubnub.com/blog/connect-arduino-gsm-shield-with-cellular-networks/) 게시되었습니다.

저희 플랫폼은 개발자가 웹 앱, 모바일 앱 및 IoT 디바이스를 위한 실시간 인터랙티브를 구축, 제공 및 관리할 수 있도록 지원합니다.

저희 플랫폼의 기반은 업계에서 가장 크고 확장성이 뛰어난 실시간 에지 메시징 네트워크입니다. 전 세계 15개 이상의 PoP가 8억 명의 월간 활성 사용자를 지원하고 99.999%의 안정성을 제공하므로 중단, 동시 접속자 수 제한, 트래픽 급증으로 인한 지연 시간 문제를 걱정할 필요가 없습니다.

PubNub 체험하기
-----------

[라이브 투어를](https://www.pubnub.com/tour/introduction/) 통해 5분 이내에 모든 PubNub 기반 앱의 필수 개념을 이해하세요.

설정하기
----

PubNub [계정에](https://admin.pubnub.com/signup/) 가입하여 PubNub 키에 무료로 즉시 액세스하세요.

시작하기
----

사용 사례나 [SDK에](https://www.pubnub.com/docs) 관계없이 [PubNub 문서를](https://www.pubnub.com/docs) 통해 바로 시작하고 실행할 수 있습니다.