아래 함수들은 콜백 함수를 입력할 수 있습니다.
aws_iot_shadow_regitster_delta(구조체 매개 변수의 맴버 변수에 콜백 함수 입력)
하지만 위 함수들에 콜백 함수를 입력했다고, AWS IoT에서 메세지가 도착했을 때 콜백 함수가 실행되는 것은 아닙니다.
아래 함수들로 MQTT 모듈(aws_iot_mqtt 또는 aws_iot_shadow 모듈)에 스래드를 넘겨주어야 합니다. 스래드를 전달 받은 MQTT 모듈은 매개변수로 입력된 timeout 시간 동안 TCP 상태를 모니터하기 위해 MQTT 핑을 관리하고, AWS IoT에 대한 수신 소켓을 점검합니다. 스래드를 넘겨주기 때문에 아래 함수들을 실행한 테스크는 매개변수로 입력된 timeout 시간동안 블로킹되며, timeout이 되기 전에 다음 코드를 실행할 수 없습니다. yield의 사전적 의미인 "넘겨주다, 양보하다"와 일치하는 동작입니다.
이 프로젝트에서는 aws_iot_mqtt_subscribe, aws_iot_shadow_updqte, aws_iot_shadow_get이 비동기적으로 사용되기 때문에 아예 아래와 같이 주기적으로 yield 함수만 수행하는 테스크를 따로 만들었습니다. 이전 포스트에서 버튼을 누르면 AWS IoT의 섀도우를 업데이트한다고 했습니다. 하지만 이 테스크로 인해 버튼을 누르지 않아도 1초마다 75 밀리초씩 수신 소켓을 점검하게 됩니다. 낭비인 것처럼 보이지만 어차피 안드로이드 앱 클라이언트로 부터 명령을 수신하기 위해 주기적인 수신 소켓 점검은 반드시 필요한 동작입니다.
static void aws_yield_task(void* arg) { ulTaskNotifyTake(pdTRUE, portMAX_DELAY); ESP_LOGW(TAG_YIELD, "aws_yield_task start !!"); while(1) { aws_iot_shadow_yield(&shadowClient, 75); vTaskDelay(1000 / portTICK_RATE_MS); } }
'AWS IoT > 펌웨어' 카테고리의 다른 글
[AWS LED Button] ESP32 (6) : 소스 코드 및 기타 기능 (0) | 2018.02.05 |
---|---|
[AWS LED Button] ESP32 (4) : AWS_IoT_Client 객체 (0) | 2018.02.05 |
[AWS LED Button] ESP32 (3) : C언어에서 JSON 문서 분석하기 (0) | 2018.02.05 |
[AWS LED Button] ESP32 (2) : MQTT 프로토콜과 정책, JSON 포맷 (0) | 2018.02.05 |
[AWS LED Button] ESP32 (1) : 시스템 흐름 (0) | 2018.02.05 |