IT

CAT.M1 모뎀으로 이미지 보낼 때 참고사항

변화의 물결1 2024. 8. 21. 00:05

 

 

안녕하세요. 

 

CAT.M1 모뎀으로 이미지를 보내려고 하다 보니 쉽지가 않네요. ftp를 사용하는 방법도 있는데, 그럼 ftp 서버를 별도로 운영해야 하기 때문에 간단하게 이미지를 인코딩하여 보내는 방법을 선택하였습니다.

 

모뎀에서 사용하는 칩회사(Quectel) BG96 제품인 경우 제가 경험한 것을 참조하시면 될 것 같습니다.

아래의 상황은 테스트한 것을 전제로 한 것이라고 보시면 됩니다.

 


 

1. 보내고자 하는 이미지를 base64 형식으로 인코딩합니다. 

 

   (프로그램으로 만들어도 되겠지만, 현재는 이미지를 보내는 것이 메인이므로 사이트를 이용합니다.)

https://www.base64-image.de/

 

 320*240를 만들면 한 4,000 바이트 이상 나오네요.

 

 

2. POST 타입으로 보내는 방법을 알아봅니다.

 

 4,000 바이트 이상 GET 타입으로 보내면 글자수 제한 때문에 POST 방식으로 보내는 것을 선택합니다.

 그리고 POST 방식으로 보내려고 하니, 제가 사용하는 모뎀은 웹서버를 운영할 수 있는 모듈이라  HTML FORM을 만들어 Sumit 할 수가 없었습니다. 그래서  다른 분들이 한 내용을 찾아보니, json으로 보내고 있더라고요.

 그리고 HTTP를 지원하는 모뎀이라면, POST 방식을 지원하는 명령어도 있을 것이라 생각됩니다.

www.base64-image.de/

 

아래의 링크처럼 명령어를 보내어 봅니다.

https://forums.quectel.com/t/uc20-post-customize-http-request-header/4399

 

 

그런데 생각대로 잘 되지 않고 json 문법도 잘 몰라 검색해서 찾아 보아고 해더를 간략하게 만들었습니다.

링크의 내용은 조금 길고 틀린 부분이 있으니 잘 보시고 사용하셔야 합니다.

 

접속하고 하는 부분은 동일하다고 보고 아래의 전달하는 내용을 보게 되면 아래와 같습니다.

 

AT+QHTTPPOST=125,80,80\r

POST /img.php HTTP/1.1\r\n

Content-Type: application/json\r\n

Host: 192.168.0.52\r\nContent-Length: 24\r\n

\r\n

{"id":"happy","age":"5"}\r\n\r\n\r\n

 

특히 QHTTPPOST에 125 보낼 데이터 개수로 1024000까지 보낼 수 있다고 합니다. 80, 80 은 대기, 응답시간으로 보시면 될 듯합니다. 그리고 시리얼 프로그램으로 보낼 때 한 줄로 만들어서 보내시고, \r\n 개수와 Length 잘 확인하셔야 합니다.

 

그럼 이미지 보낸 때는 어떻게 하느냐? 

위의 소스를 기준으로 

AT+QHTTPCFG="requestheader",1\r
AT+QHTTPCFG="responseheader",1\r

....

AT+QHTTPPOST=5181,80,80\r

POST /img.php HTTP/1.1\r\nContent-Type: application/json\r\nHost: 192.168.0.52\r\nContent-Length: 4978\r\n\r\n{"id":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAO  ... 생략...

2Q==","age":"5"}\r\n\r\n\r\n

 

으로 만들어서 보내었습니다.

 

만약 +QHTTPPSOT 7xx 에러가 발생할 경우 문자 수를 잘못하거나 접속이 잘 못된 경우 그렇게 나왔습니다.

그리고 400번 에러가 났다면 잘 전달되었고, json 쿼리 오류가  있을 가능성이 높습니다.

 

그리고 최종적으로 정상이라면 

+QHTTPPOST: 0,200로 나옵니다.

 

아참, 보낼 때  제가 가진 모뎀은 한 번에 1024 바이트 정도 보내어져서 보낼 바이트수 5181을 보내고 나머지는 연이어서 개수 맞추어 쭉 이어서 보내었습니다. 그러면 마지막에 OK 메시지가 나타났습니다.

 

 

3. 서버 쪽 처리해 주기

 

위의 내용을 보기 위해서는 본인의 PC에 웹서버를 설치하든지 아니면 호스팅업체에 서버 쪽 프로그래밍이 되어야 되겠죠. 그래서 개인적으로 테스트하기 위해서 개인 PC에 간단하게 Autoset10.x 버전을 설치해서 php를 설치했습니다. 추가적으로 모뎀이 내부망으로 들어오기 위해서 라우터에 포트포워딩도 해주었습니다.

 

php 소스는 진짜 json 확인만 할 수 있도록 만들었다. (PHP 설명은 검색을 통해서 ;;; ) 아참, 보낼 때  제가 가진 모뎀은 한 번에 1024바이트 정도 보내어져서 보낼 바이트 수 5181을 보내고 나머지는 연이어서 개수 맞추어 쭉 이어서 보내었습니다. 그러면 마지막에 OK 메시지가 나타났습니다.

PHP 소스는 JSON 확인만 할 수 있도록 만들었다. (PHP 설명은 검색을 통해서 ;;; )

 

   

<html>
<head></head>
<body>
        <?php
            $data = json_decode(file_get_contents('php://input'), true);
             print_r($data);
             echo "<BR>==========<BR>";
             echo $data["age"];
         ?>
         <p><img src="<?php echo $data["id"]; ?>"></p>

</body>
</html>

 

 

위와 같이 해놓으면 2번에서 작업했던 200번 결과를 볼 수 있었습니다.

참고로 외부에서 값이 제대로 들어오는지 확인이 안 돼서 wireshark를 통해서 보내고 있는 해더가 정상인지를 확인하였습니다.

 

참고로 웹서버에 post로 보냈을 경우 문자열이 잘리는 경우가 생길 수도 있는데, php.ini의 max_input_vars  제한도 한번 확인해 보시기 바랍니다.

 

위의 내용은 동일한 모뎀사용하시는 분이 아니면 적용되지 않을 것 같으나 하시는 업무에 조금이나마 참고되었으면 하는 마음에 남겨놓습니다.

 

즐거운 코딩되세요. ^^

 

 

반응형