i2c통신으로 젯슨나노와 서로 값을 주고 받는 것은 해보았다.
이제 제목대로 서버에 값을 올릴려면 여러 단계를 거쳐야한다.
그 단계를 천천히 밟아 나가보겠다.
첫번째 단계인 Jetson Nano에서 값을 올리는 것이다.
일단 http.h와 http.cpp를 만들어 준다.
잠시 먼저 라이브러리를 설치해주자
json과 curl을 사용하기 때문에 둘다 설치해준다.
sudo apt update
sudo apt install libcurl4-openssl-dev libjsoncpp-dev
* 주의사항
만약 json.h를 찾지 못할 경우 json.h의 위치를 알아야한다.
sudo apt install mlocate
locate json.h
확인해보니 include 안에 jsoncpp안에 json안에 json.h가 있다.
따라서 include 할 때 유의해서 해주자
ex) #include <jsoncpp/json/json.h>
코드는 다음과 같다.
http.h
#ifndef HTTP_H
#define HTTP_H
#include <string>
//post data to server
void send_value_to_server(const std::string& url, const std::string& data);
// get data to server
std::string get_value_from_server(const std::string& url);
#endif //HTTP_H
http.cpp
#include "http.h"
#include <iostream>
#include <curl/curl.h>
#include <jsoncpp/json/json.h>
#include <string>
#include <thread> // std::this_thread::sleep_for
#include <sstream>
// CURL 응답을 처리할 콜백 함수
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
// 서버에 값 보내는 함수 (POST 요청)
void send_value_to_server(const std::string& url, const std::string& data) {
CURL* curl;
CURLcode res;
// 헤더 설정
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "X-M2M-RI: 12345");
headers = curl_slist_append(headers, "X-M2M-Origin: your Origin");
headers = curl_slist_append(headers, "Content-Type: application/vnd.onem2m-res+json; ty=4");
// JSON 데이터 설정
Json::Value jsonData;
jsonData["m2m:cin"]["con"] = data;
Json::StreamWriterBuilder writer;
std::string requestData = Json::writeString(writer, jsonData);
// libcurl 초기화
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
// URL과 헤더 설정
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestData.c_str());
// POST 요청 보내기
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << "Data sent successfully." << std::endl;
}
// 리소스 해제
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
}
std::string get_value_from_server(const std::string& url) {
CURL* curl;
CURLcode res;
// 헤더 설정
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "X-M2M-RI: 12345");
headers = curl_slist_append(headers, "X-M2M-Origin: your Origin");
headers = curl_slist_append(headers, "Content-Type: application/vnd.onem2m-res+json; ty=4");
// libcurl 초기화
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
std::string response_data; // 응답을 저장할 변수
if (curl) {
// 응답을 저장할 버퍼 설정
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_data);
// GET 요청 보내기
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
}
// 리소스 해제
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
curl_global_cleanup();
// JSON 응답 처리
Json::CharReaderBuilder readerBuilder;
Json::Value jsonData;
std::string errs;
std::istringstream sstream(response_data); // 응답을 스트림으로 변환
if (Json::parseFromStream(readerBuilder, sstream, &jsonData, &errs)) {
// JSON에서 'm2m:cin'의 'con' 값 반환
if (jsonData.isMember("m2m:cin") && jsonData["m2m:cin"].isMember("con")) {
return jsonData["m2m:cin"]["con"].asString();
} else {
std::cerr << "Error: 'm2m:cin' or 'con' not found in the response." << std::endl;
return ""; // 빈 문자열을 반환
}
} else {
std::cerr << "Error parsing JSON: " << errs << std::endl;
return ""; // 파싱 실패 시 빈 문자열 반환
}
}
main.cpp
#include <iostream>
#include "http.h"
#include <thread> // std::this_thread::sleep_for
#include <string>
int main() {
std::string url = "your url";
// 서버에 1 값 보내기
send_value_to_server(url, "1");
// 1초 대기
std::this_thread::sleep_for(std::chrono::seconds(1));
// 서버에서 값 받기
// std::string getUrl = url + std::string("/la");
std::string received_data = get_value_from_server(url+="/la");
std::cout << "Received data: " << received_data << std::endl;
return 0;
}
* 빌드 방법
g++ main.cpp http.cpp -o main -lcurl -ljsoncpp -std=c++11
그럼 서버의 모니터에서 다음과 같이 값이 올라간 것을 확인할 수 있다.
( 받는 것도 구현되있어서 터미널에 받은 데이터 값이 출력된다.)
나는 Mobius라는 OneM2M기반 플랫폼을 사용하였음을 알아두자
이렇게 서버에 값 올리고 받는 것을 해보았다.
다음으론 젯슨나노에서 아두이노에게 i2c통신으로 값을 요청하면 아두이노가 값을 뱉어내고,
그 값을 서버에 올리는 것을 해보겠다.
'i2cProject_with_Jetson' 카테고리의 다른 글
i2c로 받은 데이터 server에 post - sensor data post (0) | 2024.11.13 |
---|---|
i2c로 받은 데이터 server에 post - Jetson Nano requests a value from Arduino via i2c, then uploads it to a server. (2) | 2024.11.11 |
제품 변경 (아두이노 Due) (2) | 2024.11.07 |
Jetson Nano and Arduino Due (0) | 2024.11.05 |
Jetson Nano와 아두이노 간의 I2C 통신 3) (0) | 2024.11.05 |