-
CZ-ME310G1모뎀 HTTP, HTTPS 통신 마스터 하기HTTP 통신 2026. 5. 29. 15:52
서버에 데이터를 보내거나 받아오기 위해 사용하는 HTTP프로토콜을 CZ-ME310G1 모뎀에서 손쉽게 사용하기 위한 라이브러리와 example 작업이 마무리되었습니다.
이미 AT커맨드로 사용하고 계신 개발자 분들도 있으시겠지만 처음 사용하시거나 기존에 사용하셨던 분들도 이번에 정리한 내용을 기반으로 좀 더 다양하게 HTTP GET, POST를 쓰실 수 있도록 AT커맨드 위주로 정리한 내용을 설명합니다. 그리고 여기에 Secure Layer를 추가한 HTTPS GET, POST 사용방법도 함께 살펴보겠습니다.
먼저 HTTP GET입니다.
GET은 #HTTPQRY 명령으로 사용할 수 있습니다.
필수 파라미터의 요청방식을 0으로 지정하고 자원경로, 추가헤더 옵션을 넣어서 웹서버에 요청하면
서버로부터 모뎀이 응답을 받아서 HTTPRING으로 사용자에게 알려 줍니다.
사용자는 #HTTPRCV 명령으로 모뎀에서 받아놓은 서버 응답데이터를 가져옵니다.
다음은 HTTP POST입니다.
POST는 #HTTPSND 명령으로 사용할 수 있습니다.
POST로 여러 가지 데이터를 보낼 수 있기 때문에 자세하게 설명하겠습니다.
명령어 구조 및 필수 파라미터는 아래와 같습니다. 일단 구조를 잘 익혀 둡니다.
여기서 중요한 내용은 postParam에 들어가는 내용인데 좀 더 자세하게 살펴보겠습니다.
0, 1, 2, 3, other 각각 의미를 가지고 있으니 내용을 꼭 확인하시기 바랍니다.
서버개발자와 관련 내용에 대해 잘 협의하시고 해당 형태로 데이터를 잘 주고받는지 서버에서 받은 메시지도 함께 확인해야 합니다.
HTTP, HTTPS example를 사용하려면 ME310G1 라이브러리를 최신버전(0.1.5)으로 업데이트해야 합니다. 이번 작업을 마치고 아두이노 라이브러리 매니저에서 다운로드할 수 있게 업데이트해 두었습니다.
아래와 같이 업데이트 했습니다.
Examples --> ME310G1 --> UNO_R4 --> ME310_HTTP_GET_MultiRequest를 실행합니다.
postman-echo.com 서버에 접속해서 HTTP GET 프로토콜을 두가지 타입으로 각각 테스트하는 예제 입니다.주의사항 추가(26-06-09)
AT#HTTPCFG=0,"postman-echo.com",80,0,,,0,120,1
postman-echo.com은 HTTP서버 주소 입니다. HTTPCFG 명령어로 접속할 수 있는 주소길이는 63바이트(영문 63글자)로 제한되어 있습니다. 구글 파이어베이스와 같이 생성 URL 주소를 사용하실경우 63글자내에서 주소 지정할 수 있도록 주의하시기 바랍니다.rc = myME310.send_http_query(0, 0, "/get", ME310::TOUT_5SEC);
이 코드는 http://postman-echo.com/get 에 접속해서 GET 프로토콜을 보내서 서버의 응답을 가져옵니다.
결과를 확인해 보겠습니다. 아래는 시리얼모니터에 출력된 로그 입니다.
// Bundle of custom headers (Separated by >> symbol)const char* extraHeaders = "Content-Type: application/json>>Authorization: Bearer Token123";// Profile: 0, Command: 0 (GET), Resource: "/get", Apply extra headersrc = myME310.send_http_query(0, 0, "/get", extraHeaders, ME310::TOUT_5SEC);
이 코드는 http://postman-echo.com/get 에 접속해서 extraHeaders를 포함한 GET 프로토콜을 보내서 서버의 응답을 가져옵니다.AT
AT
AT
AT$GPSP=1
AT$GPSP=0
======================================
ME310G1 HTTP Multi-Request Test
======================================
--- Network & Time Verification ---
[TX] AT+CMEE=2
OK
[INFO] Checking LTE network registration status (CEREG)...
[TX] AT+CEREG?
AT+CEREG?
+CEREG: 0,5
OK
[SUCCESS] LTE Network Attach successful! Proceeding to data session stage.
[INFO] Checking Network IP allocation status (PDP Context)...
[TX] AT#SGACT?
AT#SGACT?
#SGACT: 1,0
#SGACT: 2,0
#SGACT: 3,0
#SGACT: 4,0
#SGACT: 5,0
#SGACT: 6,0
OK
[INFO] Network IP allocation required. Requesting activation.
[TX] AT#SGACT=1,1
AT#SGACT=1,1
#SGACT: 10.31.150.22
OK
[HTTP] 1. Configuring HTTP Parameters...
AT#HTTPCFG=0,"postman-echo.com",80,0,,,0,120,1
-> HTTP Configuration Setup OK.
[HTTP] 2. Sending 1st GET Request (Basic)...
AT#HTTPQRY=0,0,"/get"
-> 1st QRY Command Accepted. Waiting for Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json; charset=utf-8",139
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 139 Bytes
-------------------------------------
[INFO] Fetching 139 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{"args":{},"headers":{"host":"postman-echo.com","accept-encoding":"gzip","x-forwarded-proto":"https"},"url":"https://postman-echo.com/get"}
OK
>
==============================================
[HTTP] 3. Sending 2nd GET Request (With Custom Headers)...
-> 2nd QRY Command Accepted. Waiting for Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json; charset=utf-8",207
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 207 Bytes
-------------------------------------
[INFO] Fetching 207 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{"args":{},"headers":{"host":"postman-echo.com","accept-encoding":"gzip","authorization":"Bearer Token123","content-type":"application/json","x-forwarded-proto":"https"},"url":"https://postman-echo.com/get"}
OK
>
==============================================
=== All HTTP Procedures Done ===
ME310G1 Modem Power Off실제 서버에서 가져온 Payload 데이터는 아래와 같습니다.1. HTTP GET으로 서버에서 가져온 응답값
{"args":{},"headers":{"host":"postman-echo.com","accept-encoding":"gzip","x-forwarded-proto":"https"},"url":"https://postman-echo.com/get"}
2. extraHeaders를 포함한 HTTP GET으로 서버에서 가져온 응답값
{"args":{},"headers":{"host":"postman-echo.com","accept-encoding":"gzip","authorization":"Bearer Token123","content-type":"application/json","x-forwarded-proto":"https"},"url":"https://postman-echo.com/get"}두가지 타입의 응답값을 CZ-ME310G1 모뎀과 연결한 디바이스에서 용도에 맞게 사용하시기 바랍니다.이번에는 HTTP POST를 테스트 해보겠습니다.ME310_HTTP_POST_MultiRequest를 선택합니다.
postman-echo.com 서버에 접속해서 HTTP POST 프로토콜을 두 가지 타입으로 각각 테스트하는 예제입니다.
const char* rawPayload = "temp=25.3";int rawPayloadLen = strlen(rawPayload);rc = myME310.send_http_send_without_params(0, 0, "/post", rawPayloadLen, (char*)rawPayload, ME310::TOUT_5SEC);
이 코드는 http://postman-echo.com/post 에 온도데이터 temp=25.3을 0번 sendParam 형태로 전송 합니다.const char* jsonPayload = "{\"temp\":25.3}";int jsonPayloadLen = strlen(jsonPayload);rc = myME310.send_http_send(0, 0, "/post", jsonPayloadLen, (char*)jsonPayload,"application/json", "Connection: keep-alive", ME310::TOUT_5SEC);
이 코드는 http://postman-echo.com/post 에 온도데이터 temp=25.3을 other sendParam 형태로 전송 합니다. "application/json"과 "Connection: keep-alive"를 사용자가 직접 넣었습니다. 실제 라이브러리를 사용하실때 첫번째 파라미터는 커스텀 데이터타입, 두번째 파라미터는 extraHeader를 넣으시면 됩니다. extraHeader를 비우면 에러가 나기 때문에 따로 쓰실 내용이 없으면 예제에 들어간 값을 그대로 사용하시기 바랍니다.
결과를 확인해 보겠습니다. 아래는 시리얼모니터에 출력된 로그입니다.AT
AT
AT
AT
AT$GPSP=1
AT$GPSP=0
======================================
ME310G1 HTTP POST Request Test
======================================
--- Network & Time Verification ---
[TX] AT+CMEE=2
OK
[INFO] Checking LTE network registration status (CEREG)...
[TX] AT+CEREG?
AT+CEREG?
+CEREG: 0,5
OK
[SUCCESS] LTE Network Attach successful! Proceeding to data session stage.
[INFO] Checking Network IP allocation status (PDP Context)...
[TX] AT#SGACT?
AT#SGACT?
#SGACT: 1,0
#SGACT: 2,0
#SGACT: 3,0
#SGACT: 4,0
#SGACT: 5,0
#SGACT: 6,0
OK
[INFO] Network IP allocation required. Requesting activation.
[TX] AT#SGACT=1,1
AT#SGACT=1,1
#SGACT: 10.35.49.76
OK
[HTTP] 1. Configuring HTTP Parameters...
AT#HTTPCFG=0,"postman-echo.com",80,0,,,0,120,1
-> HTTP Configuration Setup OK.
[HTTP] 2. Sending 1st POST Request (Raw String)...
AT#HTTPSND=0,0,"/post",9
temp=25.3
-> 1st SND Command Accepted & Data Sent. Waiting for Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json; charset=utf-8",279
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 279 Bytes
-------------------------------------
[INFO] Fetching 279 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{"args":{},"data":"","files":{},"form":{"temp":"25.3"},"headers":{"host":"postman-echo.com","content-length":"9","content-type":"application/x-www-form-urlencoded","accept-encoding":"gzip","x-forwarded-proto":"https"},"json":{"temp":"25.3"},"url":"https://postman-echo.com/post"}
OK
>
==============================================
[HTTP] 3. Sending 2nd POST Request (JSON Payload)...
-> 2nd SND Command Accepted & JSON Sent. Waiting for Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json; charset=utf-8",259
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 259 Bytes
-------------------------------------
[INFO] Fetching 259 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{"args":{},"data":{"temp":25.3},"files":{},"form":{},"headers":{"host":"postman-echo.com","content-length":"13","content-type":"application/json","accept-encoding":"gzip","x-forwarded-proto":"https"},"json":{"temp":25.3},"url":"https://postman-echo.com/post"}
OK
>
==============================================
=== All HTTP Procedures Done ===
ME310G1 Modem Power Off
서버에 데이터를 POST 하고 가져온 결과는 아래와 같습니다.{"args":{},"data":"","files":{},"form":{"temp":"25.3"},"headers":{"host":"postman-echo.com","content-length":"9","content-type":"application/x-www-form-urlencoded","accept-encoding":"gzip","x-forwarded-proto":"https"},"json":{"temp":"25.3"},"url":"https://postman-echo.com/post"}
첫번째 전송은 content-type:application/x-www-form-urlencoded로 전송되었고 서버에서 post 받은 데이터는 "temp":"25.3" 모두 문자열로 입력 되었습니다.
{"args":{},"data":{"temp":25.3},"files":{},"form":{},"headers":{"host":"postman-echo.com","content-length":"13","content-type":"application/json","accept-encoding":"gzip","x-forwarded-proto":"https"},"json":{"temp":25.3},"url":"https://postman-echo.com/post"}
두번째 전송은 content-type:application/json로 전송되었고 서버에서 post 받은 데이터는 "temp":25.3 로 온도데이터가 실수형 데이터로 입력 된 것을 확인할 수 있습니다.
이제 HTTPS통신 테스트를 해보겠습니다. Secure가 추가되었다고 해서 어렵지 않습니다.
먼저 인증서를 다운로드하여서 모뎀에 설치해야 합니다. 이번에는 httpbin.org의 HTTPS서버를 사용합니다. 인증서 다운로드하는 방법은 아래 내용을 참고하세요.
https://codezoo.tistory.com/68TLS Socket을 이용한 HTTPS GET, POST 통신
서버와 디바이스 통신에서 현재 가장 많이 사용되는 HTTP프로토콜은 아래와 같은 이유로 HTTP 대신 HTTPS를 주로 사용합니다. - 전송 중인데 데이터는 암호화되지 않으므로 스니핑 공격에 노출됩니
codezoo.tistory.com
httpbin.org의 인증서는 테스트를 위해 예제파일에 미리 입력해 두었습니다.
아래 https_cert_Write를 선택합니다.
예제를 사용하기 위해 먼저 수정해야 하는 부분이 있습니다.#include <Arduino.h>#include <ME310.h>
#define ON_OFF 2 /*Select the GPIO to control ON_OFF*/#define HTTP_CERT 0 /* 0: GMail SMTPS Cert Write, 1: HTTPS Cert Write */
지메일 인증서를 Default로 해놓았기 때문에 #define HTTP_CERT 1 로 수정해야 httpbin.org 인증서를 사용할 수 있습니다.
아래와 같이 0을 1로 수정하면 됩니다.
#include <Arduino.h>#include <ME310.h>
#define ON_OFF 2 /*Select the GPIO to control ON_OFF*/#define HTTP_CERT 1 /* 0: GMail SMTPS Cert Write, 1: HTTPS Cert Write */
빌드 후 동작시킨 시리얼모니터 로그입니다.AT
AT
AT
AT$GPSP=1
AT$GPSP=0
=== ME310G1 SSL Provisioning Start ===
[STEP 0] Disable Modem Echo...
[SEND] ATE0
OK
[STEP 1] Enabling SSL...
[SEND] AT#SSLEN=1,1
AT#SSLEN=1,1
OK
[STEP 2] Deleting existing Root CA in Slot 1...
[SEND] AT#SSLSECDATA=1,0,1
AT#SSLSECDATA=1,0,1
OK
[SEND] AT#SSLSECDATA=1,0,0
AT#SSLSECDATA=1,0,0
OK
[SEND] AT#SSLSECDATA=1,0,2
AT#SSLSECDATA=1,0,2
OK
[STEP 3] Preparing to save new Root CA...
[SEND] AT#SSLSECDATA=1,1,1,1187
AT#SSLSECDATA=1,1,1,1187
>
[INFO] Prompt '>' received. Uploading certificate data...
[INFO] Ctrl+Z (0x1A) sent. Waiting for save confirmation...
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKH
OK
[SUCCESS] Root CA Certificate saved successfully!
[STEP 4] Verifying stored certificate data...
[SEND] AT#SSLSECDATA=1,2,1
AT#SSLSECDATA=1,2,1
#SSLSECDATA: 1,1
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
OK
=== Provisioning Done ===
ME310G1 Modem Power Off
여기서는 마지막에 인증서 읽기만 확인하시면 되는데 아래 내용이 코드에 있는 httpbin.org 인증서 내용과 동일한지 확인하시면 됩니다. 모뎀에 인증서가 잘 write 될 수 있게 쓰기 타이밍을 최적화해 두었습니다.AT#SSLSECDATA=1,2,1
#SSLSECDATA: 1,1
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
나오는 값과 소스코드에 있는 아래 인증서 값이 같은지 다시 한번 체크해 보세요.
-----BEGIN CERTIFICATE----- 부터 -----END CERTIFICATE----- 까지 내용 입니다.
#if HTTP_CERTconst char* rootCA = R"EOF(-----BEGIN CERTIFICATE-----MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5-----END CERTIFICATE-----)EOF";
인증서가 Write가 잘 되었다면 이제 HTTPS example을 실행합니다.
아래 ME310_HTTPS_GET_MultiRequest, ME310_HTTPS_POST_MultiRequest입니다.
GET, POST의 내용은 다르지 않아서 Secure Layer 설정하는 코드만 따로 설명하겠습니다.// 1. Disable standalone SSL configuration for SSID 1 to prevent conflict with the internal HTTP SSL enginemyME310.ssl_enable(1, 0, ME310::TOUT_5SEC);// 2. Configure HTTP Server Parameters (Profile: 0, Host: httpbin.org, Port: 443, SSL Enabled: 1)rc = myME310.configure_http_parameters(0, "httpbin.org", 443, 0, 1, 120, 1, ME310::TOUT_5SEC);
먼저 모뎀의 SSL 기능을 끕니다. 모뎀의 SSL 기능을 Seucr Socket, FTP, HTTP, MQTT가 모두 함께 사용하기 때문에 특정한 프로토콜이 SSL 기능을 점유하고 있으면 다른 프로토콜이 사용할 수 없습니다. 그래서 일단 Secure Socket이 사용하는 #SSLEN=1,0을 적용해서 기능을 꺼줍니다. 라이브러리 ssl_enable 함수에 매핑해 두었습니다.
http 설정할때 443, 0, 1(SSL Enable)해서 HTTP의 SSL 기능을 켜줍니다. 이전의 HTTP 테스트 할때는 80, 0, 0 이었습니다.
// 3. Configure SSL Security Parameters (SSID: 1, CipherSuite: 0, AuthMode: 1)myME310.ssl_configure_security_param(1, 0, 1, ME310::TOUT_5SEC);
CipherSuite: 0은 암호화 기능을 사용하지 않는다는 의미가 아니라 Auto 기능을 활성화 해서 모뎀에서 암호화 기능을 서버에 맞춰서 자동설정 해준다는 의미로 생각하시면 됩니다. AuthMode는 1은 서버를 통한 보안통신 입니다. 서버&디바이스 인증을 함께 할때는 2로 바꿔야 합니다. 참고로 AWS-IoT통신 프로비저닝은 2로 해야 합니다.
// 4. Configure Additional SSL Parameters (SSID: 1, Version: 4, SNI: 1, PreloadedCA: 1, CustomCA: 1)myME310.ssl_additional_parameters(1, 4, 1, 1, 1, ME310::TOUT_5SEC);
4는 TLS1.3을 사용하겠다는 의미 입니다. SNI 기능은 클라우드호스팅과 연결할 때 필수로 사용해야 합니다. CustomCA는 사용자가 슬롯1에 설치한 인증서를 사용하겠다는 의미 입니다.
아래 링크에 있는 모뎀 유저매뉴얼들을 아래와 같이 다시 한번 정리했습니다.
https://github.com/codezoo-ltd/ME310G1-W3/tree/main/User%20GuidesME310G1-W3/User Guides at main · codezoo-ltd/ME310G1-W3
ME310G1-W3 Hardware Resource. Contribute to codezoo-ltd/ME310G1-W3 development by creating an account on GitHub.
github.com
<핵심정리>
테스트 종료 후 HTTP 설정상태 Secure Disable로 만드는 코드를 추가했습니다.
설정이 적용되어 있는지 기억하지 못하고 있다고 다른 프로토콜에서 SSL 기능을 사용하려고 하면 실패하는 실수가 반복되어
개발자분들이 같은 실수를 하지 않으셨으면 하는 의도입니다. 참고하시기 바랍니다.DEBUG_SERIAL.println("\n=== All HTTPS Procedures Done ===");
//Reset and initialize the HTTP profile's SSL configuration to prevent conflicts in other testsrc = myME310.configure_http_parameters(0, "httpbin.org", 443, 0, 0, 120, 1, ME310::TOUT_5SEC);
원래 443, 0, 0을 적용해서 SSL 기능을 Disable 했습니다.
https://httpbin.org에 연결해서 HTTP GET 동작시킨 시리얼터미널 로그입니다.AT
AT
AT
AT$GPSP=1
AT$GPSP=0
======================================
ME310G1 HTTPS Multi-Request Test
======================================
--- Network & Time Verification ---
[TX] AT+CMEE=2
OK
[INFO] Checking LTE network registration status (CEREG)...
[TX] AT+CEREG?
AT+CEREG?
+CEREG: 0,5
OK
[SUCCESS] LTE Network Attach successful! Proceeding to data session stage.
[INFO] Checking Network IP allocation status (PDP Context)...
[TX] AT#SGACT?
AT#SGACT?
#SGACT: 1,0
#SGACT: 2,0
#SGACT: 3,0
#SGACT: 4,0
#SGACT: 5,0
#SGACT: 6,0
OK
[INFO] Network IP allocation required. Requesting activation.
[TX] AT#SGACT=1,1
AT#SGACT=1,1
#SGACT: 10.43.89.223
OK
[HTTPS] 1. Configuring SSL and HTTP Parameters...
AT#SSLEN=1,0
AT#HTTPCFG=0,"httpbin.org",443,0,,,1,120,1
-> HTTP Server Configuration Setup OK.
AT#SSLSECCFG=1,0,1
AT#SSLSECCFG2=1,4,1,1,1
-> All SSL/TLS Parameters Applied.
[HTTPS] 2. Sending 1st HTTPS GET Request (Basic)...
AT#HTTPQRY=0,0,"/get"
-> 1st QRY Command Accepted. Waiting for Secure Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json",199
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 199 Bytes
-------------------------------------
[INFO] Fetching 199 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{
"args": {},
"headers": {
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-6a206abb-5df1ca767994aec42ffa3459"
},
"origin": "176.95.107.40",
"url": "https://httpbin.org/get"
}
OK
>
==============================================
[HTTPS] 3. Sending 2nd HTTPS GET Request (With Custom Headers)...
-> 2nd QRY Command Accepted. Waiting for Secure Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json",281
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 281 Bytes
-------------------------------------
[INFO] Fetching 281 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{
"args": {},
"headers": {
"Authorization": "Bearer Token123",
"Content-Type": "application/json",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-6a206ac4-1adf87cf002c52607f246bdc"
},
"origin": "176.95.107.40",
"url": "https://httpbin.org/get"
}
OK
>
==============================================
=== All HTTPS Procedures Done ===
-> HTTP Server Configuration Reset OK.
ME310G1 Modem Power Off
https://httpbin.org에 연결해서 HTTP POST 동작시킨 시리얼터미널 로그입니다.AT
AT
AT
AT$GPSP=1
AT$GPSP=0
======================================
ME310G1 HTTPS POST Request Test
======================================
--- Network & Time Verification ---
[TX] AT+CMEE=2
OK
[INFO] Checking LTE network registration status (CEREG)...
[TX] AT+CEREG?
AT+CEREG?
+CEREG: 0,5
OK
[SUCCESS] LTE Network Attach successful! Proceeding to data session stage.
[INFO] Checking Network IP allocation status (PDP Context)...
[TX] AT#SGACT?
AT#SGACT?
#SGACT: 1,0
#SGACT: 2,0
#SGACT: 3,0
#SGACT: 4,0
#SGACT: 5,0
#SGACT: 6,0
OK
[INFO] Network IP allocation required. Requesting activation.
[TX] AT#SGACT=1,1
AT#SGACT=1,1
#SGACT: 10.44.249.9
OK
[HTTPS] 1. Configuring SSL and HTTP Parameters...
AT#SSLEN=1,0
AT#HTTPCFG=0,"httpbin.org",443,0,,,1,120,1
-> HTTP Server Configuration Setup OK.
AT#SSLSECCFG=1,0,1
AT#SSLSECCFG2=1,4,1,1,1
-> All SSL/TLS Parameters Applied.
[HTTPS] 2. Sending 1st HTTPS POST Request (Raw String)...
AT#HTTPSND=0,0,"/post",9
temp=25.3
-> 1st SND Command Accepted & Data Sent. Waiting for Secure Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json",371
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 371 Bytes
-------------------------------------
[INFO] Fetching 371 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{
"args": {},
"data": "",
"files": {},
"form": {
"temp": "25.3"
},
"headers": {
"Content-Length": "9",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-6a206c6e-1b6e89d658ff52565ace2c2b"
},
"json": null,
"origin": "151.189.24.43",
"url": "https://httpbin.org/post"
}
OK
>
==============================================
[HTTPS] 3. Sending 2nd HTTPS POST Request (JSON Payload)...
-> 2nd SND Command Accepted & JSON Sent. Waiting for Secure Server...
-------------------------------------
[URC DETECTED] #HTTPRING: 0,200,"application/json",366
[INFO] HTTP Status Code : 200
[INFO] Payload Data Size: 366 Bytes
-------------------------------------
[INFO] Fetching 366 Bytes Payload via Library...
[SUCCESS] HTTP Data fully received!
================ HTTP PAYLOAD ================
Payload: <
<<<{
"args": {},
"data": "{\"temp\":25.3}",
"files": {},
"form": {},
"headers": {
"Content-Length": "13",
"Content-Type": "application/json",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-6a206c78-0600510a0b7b86a3170466d0"
},
"json": {
"temp": 25.3
},
"origin": "151.189.24.43",
"url": "https://httpbin.org/post"
}
OK
>
==============================================
=== All HTTPS Procedures Done ===
-> HTTP Server Configuration Reset OK.
ME310G1 Modem Power Off
데이터를 전송하다가 가끔 에러가 발생하기도 합니다. 그때는 결괏값을 확인 후 재전송 하면 됩니다.
가끔 개발자분들 중에서 통신 에러가 발생했다고 말씀하시는 경우도 있는데, 무선통신은 특성상 전송오류가 발생하는 경우가 있습니다. 그래서 재전송을 언제 해야 할지와 주변 무선감도측정, 디바이스망관리와 같은 내용들에 대해서도 알고 있어야 합니다. 필요하시면 언제든 질문해 주세요.새로운 코드 추가 (26-06-05)
모뎀이 기지국에 접속하면 기지국으로부터 시간정보를 받아와서 모뎀 내부 RTC를 초기화합니다. 가끔 시간정보가 제대로 갱신되지 않는 경우가 있습니다. 이 시간정보는 Secure 통신을 위해 꼭 필요합니다. 안전한 SSL 동작을 확보하기 위해 아래와 같이 NTC서버에 접속해서 시간정보를 가져오는 코드를 기지국 아이피 할당 코드 뒤에 추가했습니다.
if (sgactResp.indexOf("#SGACT: 1,1") >= 0) {DEBUG_SERIAL.println("\n[CHECK] Already connected to the network and IP allocated. (Skipping SGACT=1,1)");} else {DEBUG_SERIAL.println("\n[INFO] Network IP allocation required. Requesting activation.");if (!sendATCommand("AT#SGACT=1,1", "OK", 15000)) {DEBUG_SERIAL.println("\n[ERROR] Network activation failed.");return false;}}
//NTP Server setup (require of ssl sequence)rc = myME310.configure_ntp_parameters(1,0,0,"",ME310::TOUT_5SEC);if (rc == ME310::RETURN_VALID) {DEBUG_SERIAL.println("-> NTP Configuration OK.");} else {DEBUG_SERIAL.println("-> [ERROR] NTP Configuration Failed. Halting.");while (true);}
//+36 ( +9(hour) x 4(15min) )rc = myME310.ntp("216.239.35.0",123,1,5,36,ME310::TOUT_10SEC);if (rc == ME310::RETURN_VALID) {DEBUG_SERIAL.println("-> NTP Configuration OK.");} else {DEBUG_SERIAL.println("-> [ERROR] NTP Configuration Failed. Halting.");while (true);}
LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의, vodafone IoT유심 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr
코드주 LTE-CatM1 내장형 모뎀 CZ-ME310G1 / GNSS(GPS) 지원 / 외장 LTE 안테나 포함 / Zephyr 및 Arduino 지원
메카솔루션 공식 쇼핑몰
www.mechasolution.com
iot유심 : codezoo
[codezoo] IoT Global SIM, IoT Connectivity, IoT Device
smartstore.naver.com
CodeZoo LTE-CatM1 전용 아두이노 브레이크아웃 쉴드
메카솔루션 공식 쇼핑몰
mechasolution.com
'HTTP 통신' 카테고리의 다른 글
TLS Socket을 이용한 HTTPS GET, POST 통신 (2) 2023.10.26 모뎀에 사전 설치된 인증서로 https 통신하기 (0) 2023.08.15 버튼 인터럽트, 온습도센서 그리고 HTTP통신 (0) 2023.08.11 https 서버와 통신하기 두번째 이야기 (1) (2) 2023.02.04 https 서버와 통신하기 (2) 2022.12.06