Para configurar sombras de dispositivo com , use o arquivo de código de exemplo ./demos/shadow_basic_demo.c.
Informações básicas
Para obter mais informações sobre sombras de dispositivo, consulte Visão geral.
O usa conexões MQTT. Para exemplos de código relacionados, consulte Conexão MQTT.
no heading
Etapa 1: Inicialização
-
Adicione os arquivos de cabeçalho.
... ... #include "aiot_shadow_api.h" -
Configure as dependências subjacentes e a saída de log.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb); -
Chame a operação aiot_shadow_init para crie uma instância
shadow.shadow_handle = aiot_shadow_init(); if (shadow_handle == NULL) { printf("aiot_shadow_init failed\n"); return -1; }
no heading
Etapa 2: Configurar recursos
Chame a operação aiot_shadow_setopt para configure os itens a seguir.
-
Associe um identificador de conexão MQTT.
ImportanteAntes de defina parâmetros específicos da sombra do dispositivo,
-
aiot_shadow_setopt(shadow_handle, AIOT_SHADOWOPT_MQTT_HANDLE, mqtt_handle); -
Parâmetro
Exemplo
Descrição
AIOT_SHADOWOPT_MQTT_HANDLE
mqtt_handle
As solicitações TSL usam esta conexão.
-
-
Configure um callback de mensagem
-
aiot_shadow_setopt(shadow_handle, AIOT_SHADOWOPT_RECV_HANDLER, (void *)demo_shadow_recv_handler); -
Parâmetro
Exemplo
Descrição
AIOT_SHADOWOPT_RECV_HANDLER
demo_shadow_recv_handler
Esta função é chamada quando a mensagem da sombra do dispositivo é recebida.
-
Etapa 3: Envie o status do dispositivo
-
O dispositivo chama a operação aiot_shadow_send para envie o status mais recente à sombra do dispositivo no IoT Platform.
Ao enviar o status, observe os seguintes itens:
aiot_shadow_msg_t indica o formato dos dados. Este é um parâmetro de entrada do callback
aiot_shadow_send().AIOT_SHADOWMSG_UPDATE indica o tipo de mensagem.
int32_t demo_update_shadow(void *shadow_handle, char *reported_data, int64_t version) { aiot_shadow_msg_t message; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_UPDATE; message.data.update.reported = reported_data; message.data.update.version = version; return aiot_shadow_send(shadow_handle, &message); } -
Especifique o conteúdo da mensagem.
-
res = demo_update_shadow(shadow_handle, "{\"LightSwitch\":1}", 0); if (res < 0) { printf("demo_delete_shadow_report failed, res = -0x%04x\r\n", -res); } -
Mensagem de exemplo:
Mensagem de exemplo Formato Alink Descrição { "LightSwitch": 1 }{ "method": "update", "state": { "reported": { "LightSwitch": 1 } }, "version": 0 }O conteúdo da mensagem está no formato JSON e é indicado pelo parâmetro state nos dados Alink. Para obter mais informações, consulte Um dispositivo relata seu status. Os itens a seguir descrevem o conteúdo da mensagem neste exemplo:
- Defina a propriedade
LightSwitchcomo1. - Defina o número da versão como
0.Nota- Os números de versão das operações subsequentes devem ser incrementados. Caso contrário, o IoT Platform retornará um erro.
- Se você definir o número da versão como
-1, o IoT Platform limpará os dados da sombra do dispositivo e atualizará o número da versão para0.
- Defina a propriedade
-
Após receber a mensagem, o IoT Platform atualize o arquivo de sombra e retorna uma resposta ao dispositivo.
-
Quando o dispositivo recebe a resposta, o callback
demo_shadow_recv_handleré chamado.Ao defina a lógica do callback, observe os seguintes itens:
aiot_shadow_recv_t indica o formato dos dados. Este é um parâmetro de entrada do callback.
AIOT_SHADOWRECV_GENERIC_REPLY indica o tipo de mensagem.
-
A tabela a seguir descreve uma resposta de exemplo e o formato Alink correspondente.
Exemplo Formato Alink Descrição { "status":"success", "version":0 }{ "method": "reply", "payload": { "status": "success", "version": 0 }, "timestamp": 1626317187 }A resposta é indicada pelo parâmetro payload nos dados Alink. Esta resposta de exemplo indica que o status foi enviado.
Neste exemplo, a mensagem é impressa.
void demo_shadow_recv_handler(void *handle, const aiot_shadow_recv_t *recv, void *userdata) { printf("demo_shadow_recv_handler, type = %d, productKey = %s, deviceName = %s\r\n", recv->type, recv->product_key, recv->device_name); switch (recv->type) { case AIOT_SHADOWRECV_GENERIC_REPLY: { const aiot_shadow_recv_generic_reply_t *generic_reply = &recv->data.generic_reply; printf("payload = \"%.*s\", status = %s, timestamp = %ld\r\n", generic_reply->payload_len, generic_reply->payload, generic_reply->status, (unsigned long)generic_reply->timestamp); } …… ... default: break; } }
Etapa 4: Alterar o status do dispositivo usando propriedades desejadas
Para alterar o status do dispositivo, use um aplicativo para envie propriedades desejadas à sombra do dispositivo. Você também pode fazer login no console do IoT Platform e modifique as propriedades desejadas na sombra do dispositivo.
-
Atualize as propriedades desejadas na sombra do dispositivo. Os métodos a seguir estão disponíveis:
Desenvolva um aplicativo em nuvem e chame a operação de API para envie propriedades desejadas à sombra do dispositivo. Para obter mais informações, consulte UpdateDeviceShadow.
Na página Device Details do IoT Platform, modifique as propriedades desejadas na sombra do dispositivo. Para obter mais informações, consulte Visualize e atualize uma sombra de dispositivo.
O IoT Platform atualize o arquivo de sombra e o envia ao dispositivo.
-
Após o dispositivo receber o arquivo de sombra, o callback
demo_shadow_recv_handleré chamado.ImportanteSe o dispositivo estiver offline, solicite a sombra do dispositivo após ele ficar online. Para obter mais informações, consulte
Etapa 5: Solicitar a sombra do dispositivo
.
Ao defina a lógica do callback, observe os seguintes itens:
aiot_shadow_recv_t indica o formato dos dados. Este é um parâmetro de entrada do callback.
AIOT_SHADOWRECV_CONTROL indica o tipo de mensagem.
-
A tabela a seguir descreve uma mensagem de exemplo e o formato Alink correspondente.
Exemplo Formato Alink Descrição { "state": { "desired": { "LightSwitch": 0 } }, "metadata": { "desired": { "LightSwitch": { "timestamp": 1626319658 } } } }{ "method": "control", "payload": { "state": { "desired": { "LightSwitch": 0 } }, "metadata": { "desired": { "LightSwitch": { "timestamp": 1626319658 } } } }, "version": 2, "timestamp": 1469564576 }A resposta é indicada pelo parâmetro payload nos dados Alink. Neste exemplo, a propriedade desejada
LightSwitché definida como0. Neste exemplo, a mensagem é impressa.
void demo_shadow_recv_handler(void *handle, const aiot_shadow_recv_t *recv, void *userdata) { printf("demo_shadow_recv_handler, type = %d, productKey = %s, deviceName = %s\r\n", recv->type, recv->product_key, recv->device_name); switch (recv->type) { ... ... case AIOT_SHADOWRECV_CONTROL: { const aiot_shadow_recv_control_t *control = &recv->data.control; printf("payload = \"%.*s\", version = %ld\r\n", control->payload_len, control->payload, (unsigned long)control->version); } …… ... default: break; } } -
Após atualize o status local, o dispositivo envia o status mais recente para a sombra do dispositivo e processa a resposta.
-
O dispositivo chama a operação aiot_shadow_send para exclua as propriedades desejadas.
Ao excluir propriedades desejadas, observe os seguintes itens:
aiot_shadow_msg_t indica o formato dos dados. Este é um parâmetro de entrada do callback
aiot_shadow_send().AIOT_SHADOWMSG_CLEAN_DESIRED indica o tipo de mensagem.
Neste exemplo, todas as propriedades desejadas são excluídas e o número da versão é definido como
1.
int32_t demo_clean_shadow_desired(void *shadow_handle, int64_t version) { aiot_shadow_msg_t message; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_CLEAN_DESIRED; message.data.clean_desired.version = version; return aiot_shadow_send(shadow_handle, &message); } …… ... res = demo_clean_shadow_desired(shadow_handle, 1); if (res < 0) { printf("demo_clean_shadow_desired failed, res = -0x%04x\r\n", -res); } -
Após o IoT Platform receber a solicitação para exclua propriedades desejadas, ele retorna uma resposta. Nesse caso, o callback
demo_shadow_recv_handleré chamado.
Etapa 5: Solicitar a sombra do dispositivo
-
O dispositivo chama a operação aiot_shadow_send para solicitar o conteúdo da sombra do dispositivo ao IoT Platform.
AIOT_SHADOWMSG_GET
indica o tipo de mensagem.
int32_t demo_get_shadow(void *shadow_handle) { aiot_shadow_msg_t message; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_GET; return aiot_shadow_send(shadow_handle, &message); } …… ... res = demo_get_shadow(shadow_handle); if (res < 0) { printf("demo_get_shadow failed, res = -0x%04x\r\n", -res); } -
Após o IoT Platform receber a solicitação, ele retorna uma resposta. Quando o dispositivo recebe a resposta, o callback
demo_shadow_recv_handleré chamado.Ao defina a lógica do callback, observe os seguintes itens:
aiot_shadow_recv_t indica o formato dos dados. Este é um parâmetro de entrada do callback.
AIOT_SHADOWRECV_GET_REPLY indica o tipo de mensagem.
-
A tabela a seguir descreve uma resposta de exemplo e o formato Alink correspondente.
Exemplo Formato Alink Descrição { "status": "success", "state": { "reported": { } }, "metadata": { "reported": { } } }{ "method": "reply", "payload": { "status": "success", "state": { "reported": { } }, "metadata": { "reported": { } } }, "version": 5, "timestamp": 1626320690 }A resposta é indicada pelo parâmetro payload nos dados Alink. Esta resposta de exemplo indica que a solicitação foi bem-sucedida. O parâmetro reported não contém dados, o que indica que nenhuma propriedade foi enviada.
Neste exemplo, a mensagem é impressa.
void demo_shadow_recv_handler(void *handle, const aiot_shadow_recv_t *recv, void *userdata) { printf("demo_shadow_recv_handler, type = %d, productKey = %s, deviceName = %s\r\n", recv->type, recv->product_key, recv->device_name); switch (recv->type) { ... ... case AIOT_SHADOWRECV_GET_REPLY: { const aiot_shadow_recv_get_reply_t *get_reply = &recv->data.get_reply; printf("payload = \"%.*s\", version = %ld\r\n", get_reply->payload_len, get_reply->payload, (unsigned long)get_reply->version); } default: break; } }
Etapa 6: Exclua propriedades na sombra do dispositivo
-
O dispositivo chama a operação aiot_shadow_send para exclua propriedades especificadas na sombra do dispositivo.
Ao enviar uma solicitação, observe os seguintes itens:
aiot_shadow_msg_t indica o formato dos dados. Este é um parâmetro de entrada do callback
aiot_shadow_send().AIOT_SHADOWMSG_DELETE_REPORTED indica o tipo de mensagem.
int32_t demo_delete_shadow_report(void *shadow_handle, char *reported, int64_t version) { aiot_shadow_msg_t message; memset(&message, 0, sizeof(aiot_shadow_msg_t)); message.type = AIOT_SHADOWMSG_DELETE_REPORTED; message.data.delete_reporte.reported = reported; message.data.delete_reporte.version = version; return aiot_shadow_send(shadow_handle, &message); } -
Especifique as propriedades a serem excluídas.
-
res = demo_delete_shadow_report(shadow_handle, "{\"LightSwitch\":\"null\"}", 2); if (res < 0) { printf("demo_delete_shadow_report failed, res = -0x%04x\r\n", -res); } -
Mensagem de exemplo:
Exemplo Formato Alink Descrição "{\"LightSwitch\":\"null\"}", 2{ "method": "delete", "state": { "reported": { "LightSwitch": "null", } }, "version": 2 }O conteúdo da mensagem está no formato JSON e é indicado pelo parâmetro state nos dados Alink. Para obter mais informações, consulte Um dispositivo exclui propriedades da sombra. Os itens a seguir descrevem o conteúdo da mensagem neste exemplo:
- Defina a propriedade
LightSwitchcomonull. Este valor indica que todos os dados na sombra do dispositivo foram limpos. - Defina o número da versão como
2.
- Defina a propriedade
-
-
Após o IoT Platform receber a solicitação, ele retorna uma resposta. Quando o dispositivo recebe a resposta, o callback
demo_shadow_recv_handleré chamado.
Etapa 7: Sair do programa
Chame a operação aiot_shadow_deinit para destruir a instância shadow.
res = aiot_shadow_deinit(&shadow_handle);
if (res < STATE_SUCCESS) {
printf("aiot_shadow_deinit failed: -0x%04X\n", -res);
return -1;
}
Próximos passos
-
Neste exemplo, o arquivo executável ./demos/shadow-basic-demo é gerado.
Para obter mais informações, consulte Compilar e execute.
ImportanteAo configure o arquivo de código de exemplo, remova os símbolos de comentário (
/*e*/) em ambos os lados do código e altere os números de versão conforme os cenários reais.-
Ao alterar números de versão, observe os seguintes itens:
Os números de versão das operações subsequentes devem ser incrementados. Caso contrário, o IoT Platform retornará um erro.
Se você defina o número da versão como
-1, o IoT Platform limpará os dados da sombra do dispositivo e atualize o número da versão para0.