본문 바로가기

AWS IoT/펌웨어

[AWS LED Button] ESP32 (5) : 콜백을 받기 위한 yield 함수

아래 함수들은 콜백 함수를 입력할 수 있습니다.

aws_iot_mqtt_subscribe

aws_iot_shadow_update

aws_iot_shadow_get

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_yield

aws_iot_shadow_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);
	}
}