-
https 서버와 통신하기HTTP 통신 2022. 12. 6. 15:48
LTE CATM1 내장형 모뎀의 AT커맨드를 이용해서 https 서버와 통신하길 원하시는
개발자분의 요구사항으로 테스트를 진행 했습니다.
먼저 https 테스트에 괜찮은 서버를 StackOverFlow (https://stackoverflow.com/)에서 검색해 보았는데,
아래와 같은 httpbin.org가 괜찮다는 추천 의견이 있어서 해당 사이트를 서버로 선정 했습니다.
CATM1 모뎀에 서버에서 제공하는 인증서를 설치해야 하는데 먼저 웹브라우저에서 아래와 같은 방법으로 인증서를 다운로드 받습니다.
1. 자물쇠 모양 아이콘을 클릭 합니다.
2. '이 사이트는 보안 연결(HTTPS)이 사용되었습니다.' 를 클릭 합니다.
3. '인증서가 유효함'을 클릭 합니다.
4. '세부정보' 탭을 누르고 아래 '내보내기' 버튼을 클릭 합니다.
5. 원하는 위치로 이동해서 아래 저장 버튼을 누릅니다.
6. 해당 파일을 TEXT 에디터로 가져와서 오픈 후 아래와 같이 명령어를 추가 합니다. (Notepad++ 사용)
7. 윈도우에서 작업시 공백문자 문제가 발생할 수 있으므로 아래와 같은 설정을 해주셔야 합니다. (Notepad++)
편집 --> 줄의 끝문자(EOL) 변환 --> Unix (LF) 클릭
인증서 내용과 AT커맨드 명령을 함께 편집한 내용은 LTE CATM1 내장형 모뎀에 인증서 설치할 때 사용합니다.
LTE CATM1 내장형 모뎀 AT커맨드는 아래와 같은 순서로 진행 했습니다. QCOM 프로그램을 사용해서 진행 했습니다.
QCOM 다운로드 ( https://github.com/codezoo-ltd/CodeZoo_CATM1_Arduino/tree/master/Tool )
/* 1. 망 연결 체크(기지국에 연결되어 있어야 합니다!) */
AT
OK
AT+CEREG?
+CEREG: 0,5
OK
AT+COPS?
+COPS: 0,0,"DATA ONLY",7
OK
/* 2. httpbin.org 테스트 서버 인증서 CATM1 모뎀에 설치 */
AT%CERTCMD="WRITE","httpbin.org.crt",0,"-----BEGIN CERTIFICATE-----
MIIF3TCCBMWgAwIBAgIQBe4XpUyT/vhaGA6vdWMC+jANBgkqhkiG9w0BAQsFADBG
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg
Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0yMjEwMjEwMDAwMDBaFw0yMzExMTky
MzU5NTlaMBYxFDASBgNVBAMTC2h0dHBiaW4ub3JnMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAyoiVyRRffvWcc/kQJj4htRPZeafPYAZzCgd9tQfQmtCJ
XWDAynL3slPfhAAuO0vWxyNHTTELbCHxD43nPgST7HUwG/ZjsrY03+M4IaEiBvN5
3OsnJ5UekmH2G04HTZdsApoc9OSb+4aBGlkISsNxn8SCRF3a8kn95tD27IToBozN
XosKbyzKli/9g0rqmeQHqGHtLuuEsMZcWn9dXbKuMB7n1c1e4XiBNgowQZGNWCU0
9fH56X/fN8QZ+OeP/1Fy5maOqjMReAAexkboS6yLZwOHzCPBGoxsay40cdI3pjz8
UT8squMowlmZvhLNkOI1GkxucUXhFaaZoqmLrgh9pwIDAQABo4IC9TCCAvEwHwYD
VR0jBBgwFoAUWaRmBlKge5WSPKOUByeWdFv5PdAwHQYDVR0OBBYEFPJiPqhWrciC
zNqbNPqmhJPYlZ8bMCUGA1UdEQQeMByCC2h0dHBiaW4ub3Jngg0qLmh0dHBiaW4u
b3JnMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
AwIwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2NybC5zY2ExYi5hbWF6b250cnVz
dC5jb20vc2NhMWItMS5jcmwwEwYDVR0gBAwwCjAIBgZngQwBAgEwdQYIKwYBBQUH
AQEEaTBnMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5zY2ExYi5hbWF6b250cnVz
dC5jb20wNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQuc2NhMWIuYW1hem9udHJ1c3Qu
Y29tL3NjYTFiLmNydDAMBgNVHRMBAf8EAjAAMIIBfgYKKwYBBAHWeQIEAgSCAW4E
ggFqAWgAdgDoPtDaPvUGNTLnVyi8iWvJA9PL0RFr7Otp4Xd9bQa9bgAAAYP4H6VF
AAAEAwBHMEUCIEq2V8hRuy9prk8YM3F75d3yWlFWxjtRLGZ8LalH7eEFAiEAg568
zaooPnyU//j8IbESNUX06/vSfxMjNHbkQp8WB04AdwCzc3cH4YRQ+GOG1gWp3BEJ
SnktsWcMC4fc8AMOeTalmgAAAYP4H6YYAAAEAwBIMEYCIQDcqYOM4QgB6WEuSM6i
7Z9+AGnyYPlOCrHsn0RYesbUjgIhAJBM7+56ckkL3Po1XqvmjZSzy0Z/0CM5toc2
XW0vQ23VAHUAtz77JN+cTbp18jnFulj0bF38Qs96nzXEnh0JgSXttJkAAAGD+B+l
egAABAMARjBEAiBuuudZIYUden04N/t88T53d4P3icmfPDg0Cb1LfVbSRAIgf2vT
Vj51gdKK3tNPncgtPHpdmKhUGpr0sLfqOUXiAo4wDQYJKoZIhvcNAQELBQADggEB
AJ1Ykh6Qblt65jVHdcUlV5aNW45gUAtL1xhv8aLjy97qfZ89sa6j/+O9Kgke3kTT
xUZ9/fq/c4pEgK5bI1BYQ/RseA/Vief5KCp+LXKiSYSNvQmYhEMcm0ljpQIcxaEJ
46z3TtLz+ylUGQZYr0nPvRKg4TNa37bY/+nlzDXN2zWvNoe7xKlD3r3a27E5rDs2
1cjtEqsqDsWjGTG0cMYErkWDm4kSb3wVJmaUemOO7LBWTY1ZmUK2pcAb+Cw1Siy8
Rja9Q6M+Yp+aGU7waW0Xte49aNieJ4L8C6IQfYoZRH9Q29CZ0hzp/lKtjmjXf11y
X8WDMt3yQCm5MfBlIJLOy+E=
-----END CERTIFICATE-----"
OK
AT%CERTCFG="ADD",3,"httpbin.org.crt",,, //TLS slot 3 save
OK
/* 3. HTTPS 접속 서버 설정 */
AT%HTTPCFG="NODES",3,"https://httpbin.org/"
OK
/* 4. HTTP Allow all events */
AT%HTTPEV="ALL",1
OK
/* 5. TLS Setup, 2: authenticate server side only, 3: TLS save slot */
AT%HTTPCFG="TLS",3,2,3
OK
/* 6. Trigger HTTPS GET */
AT%HTTPCMD="GET",3
OK
// HTTS Server Response (unsolicited response received),
// 받을 데이터는 Header 239, 컨텐츠 9593, 총 9832를 가져와야 함.
%HTTPEVU:"GETRCV",3,0,239,9593
/* 7. HTTPS GET Data Read (in modem buffer) */
// 한번에 AT커맨드로 받을 수 있는 최대값 3000바이트 입력
AT%HTTPREAD=3,3000
%HTTPREAD: 3000,8191
HTTP/1.1 200 OK
Date: Tue, 06 Dec 2022 08:21:48 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 9593
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>httpbin.org</title>
rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/flasgger_static/swagger-ui.css">
<link rel="icon" type="image/png" href="/static/favicon.ico" sizes="64x64 32x32 16x16" />
<style>
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 0;
background: #fafafa;
}
</style>
</head>
<body>
<a href="https://github.com/requests/httpbin" class="github-corner" aria-label="View source on Github">
<svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;"
aria-hidden="true">
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>
<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>
<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
fill="currentColor" class="octo-body"></path>
</svg>
</a>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
<defs>
<symbol viewBox="0 0 20 20" id="unlocked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
</symbol>
<symbol viewBox="0 0 20 20" id="locked">
<path d="M15.8 8H14V5.6C14 2.7
OK
// 한번에 AT커맨드로 받을 수 있는 최대값 3000바이트 입력
AT%HTTPREAD=3,3000
%HTTPREAD: 3000,6832
03 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"
/>
</symbol>
<symbol viewBox="0 0 20 20" id="close">
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"
/>
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow">
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"
/>
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow-down">
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"
/>
</symbol>
<symbol viewBox="0 0 24 24" id="jump-to">
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z" />
</symbol>
<symbol viewBox="0 0 24 24" id="expand">
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z" />
</symbol>
</defs>
</svg>
<div id="swagger-ui">
<div data-reactroot="" class="swagger-ui">
<div>
<div class="information-container wrapper">
<section class="block col-12">
<div class="info">
<hgroup class="main">
<h2 class="title">httpbin.org
<small>
<pre class="version">0.9.2</pre>
</small>
</h2>
<pre class="base-url">[ Base URL: httpbin.org/ ]</pre>
</hgroup>
<div class="description">
<div class="markdown">
<p>A simple HTTP Request & Response Service.
<br>
<br>
<b>Run locally: </b>
<code>$ docker run -p 80:80 kennethreitz/httpbin</code>
</p>
</div>
</div>
OK
// 한번에 AT커맨드로 받을 수 있는 최대값 3000바이트 입력
AT%HTTPREAD=3,3000
%HTTPREAD: 3000,3832
<div>
<div>
<a href="https://kennethreitz.org" target="_blank">the developer - Website</a>
</div>
<a href="mailto:me@kennethreitz.org">Send email to the developer</a>
</div>
</div>
<!-- ADDS THE LOADER SPINNER -->
<div class="loading-container">
<div class="loading"></div>
</div>
</section>
</div>
</div>
</div>
</div>
<div class='swagger-ui'>
<div class="wrapper">
<section class="clear">
<span style="float: right;">
[Powered by
<a target="_blank" href="https://github.com/rochacbruno/flasgger">Flasgger]
<br>
</span>
</section>
</div>
</div>
<script src="/flasgger_static/swagger-ui-bundle.js"> </script>
<script src="/flasgger_static/swagger-ui-standalone-preset.js"> </script>
<script src='/flasgger_static/lib/jquery.min.js' type='text/javascript'></script>
<script>
window.onload = function () {
fetch("/spec.json")
.then(function (response) {
response.json()
.then(function (json) {
var current_protocol = window.location.protocol.slice(0, -1);
if (json.schemes[0] != current_protocol) {
// Switches scheme to the current in use
var other_protocol = json.schemes[0];
json.schemes[0] = current_protocol;
json.schemes[1] = other_protocol;
}
json.host = window.location.host; // sets the current host
const ui = SwaggerUIBundle({
spec: json,
validatorUrl: null,
dom_id: '#swagger-ui',
deepLinking: true,
jsonEditor: true,
docExpansion: "none",
apisSorter: "alpha",
//operationsSorter: "alpha",
presets: [
SwaggerUIBundle.presets.apis,
// yay ES6 modules ?? Array.isArray(SwaggerUIStandalonePreset) ? SwaggerUIStandalonePreset : SwaggerUIStandalonePreset.default
],
plugins: [
SwaggerUIBundle.plug
OK
// 한번에 AT커맨드로 받을 수 있는 최대값 3000바이트 입력
AT%HTTPREAD=3,3000
%HTTPREAD: 832,832
ins.DownloadUrl
],
// layout: "StandaloneLayout" // uncomment to enable the green top header
})
window.ui = ui
// uncomment to rename the top brand if layout is enabled
// $(".topbar-wrapper .link span").replaceWith("<span>httpbin</span>");
})
})
}
</script> <div class='swagger-ui'>
<div class="wrapper">
<section class="block col-12 block-desktop col-12-desktop">
<div>
<h2>Other Utilities</h2>
<ul>
<li>
<a href="/forms/post">HTML form</a> that posts to /post /forms/post</li>
</ul>
<br />
<br />
</div>
</section>
</div>
</div>
</body>
</html>
OK
Murata Type1SC 모듈 구매, 자료 관련 문의
(주)아성코리아
전지만 이사 010-5418-8812 mlcc@asung.com
박상인 수석 010-6556-5405 sipark@asung.com
LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.krhttps://www.devicemart.co.kr/goods/view?no=14077527
https://smartstore.naver.com/codezoo/products/7153689192
'HTTP 통신' 카테고리의 다른 글
모뎀에 사전 설치된 인증서로 https 통신하기 (0) 2023.08.15 버튼 인터럽트, 온습도센서 그리고 HTTP통신 (0) 2023.08.11 https 서버와 통신하기 두번째 이야기 (1) (2) 2023.02.04 스마트팜, 센서 그리고 LTE CATM1 모뎀 (0) 2022.05.03 LTE-CATM1 내장형 모뎀 사용자와 함께 HTTP 테스트 진행 (0) 2021.12.08