Há duas formas de autenticação de dispositivos:
Certificado único por dispositivo: gravação de um certificado exclusivo (ProductKey, DeviceName e DeviceSecret) em cada dispositivo.
Certificado único por produto: gravação do mesmo certificado (ProductKey e ProductSecret) em todos os dispositivos de um produto. Esse método exige menos modificações na linha de produção. Cada dispositivo deve ter um identificador exclusivo e enviá-lo previamente à Alibaba Cloud IoT Platform. A plataforma decide se aceita a conexão com base nesse identificador.
Chame IOT_Ioctl() para configurar o método de autenticação:
/* Choose Login Method */
int dynamic_register = 1; /* 0: Do not use unique-certificate-per-product, 1: use unique-certificate-per-product */
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);
Implementar autenticação com certificado único por dispositivo
Chame IOT_Ioctl para definir o modo de autenticação:
// for demo only
/* Set the authentication mode */
int dynamic_register = 0;
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);
Implementar autenticação com certificado único por produto
No modelo de certificado único por produto, o conteúdo gravado nos dispositivos de um produto (ProductKey e ProductSecret) é idêntico. O sistema usa um processo chamado registro dinâmico para obter o DeviceSecret da IoT Platform com base no identificador exclusivo do dispositivo. Esse identificador pode ser o número de série (SN) ou o endereço MAC e será tratado como DeviceName.
Depois que o SDK obtém o DeviceSecret de um dispositivo na IoT Platform, ele chama HAL_SetDeviceSecret() para salvar o valor. O dispositivo deve manter esse dado na memória Flash. Não apague o DeviceSecret após o dispositivo obtê-lo pelo processo de registro dinâmico, pois a IoT Platform recusará fornecer o DeviceSecret novamente se o dispositivo já o tiver recebido.
Para usar o certificado único por produto, chame as interfaces abaixo para ativar a função de registro dinâmico.
/* Turn on the dynamic registration function */
int dynamic_register = 1; /* 1: Use unique-certificate-per-product */
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);
Exemplo de autenticação com certificado único por produto para produtos da Basic Edition
Acesse a Alibaba Cloud IoT Platform, selecione o produto e ative "Dynamic-Registration":

Em seguida, crie um novo dispositivo neste produto:

Abra o Link Kit SDK e substitua o código conforme o exemplo:
#include "iot_import.h"
#include "iot_export.h"
#include "app_entry.h"
// To replace the values of PRODUCT_KEY, PRODUCT_SECRET, DEVICE_NAME
#define PRODUCT_KEY "a1MZxOdcBnO"
#define PRODUCT_SECRET "h4I4dneEFp7EImTv"
#define DEVICE_NAME "Example_dyn1"
//And comment the DEVICE_SECRET
//#define DEVICE_SECRET "t9GmMf2jb3LgWfXBaZD2r3aJrfVWBv56"
...
...
int main(int argc, char **argv)
{
IOT_OpenLog("mqtt");
IOT_SetLogLevel(IOT_LOG_DEBUG);
user_argc = argc;
user_argv = argv;
HAL_SetProductKey(PRODUCT_KEY);
HAL_SetProductSecret(PRODUCT_SECRET);
HAL_SetDeviceName(DEVICE_NAME);
// Comment the setting to DeviceSecret, because we will get it from the IoT platform dynamically
/* HAL_SetDeviceSecret(DEVICE_SECRET); */
/* Choose Login Server */
int domain_type = IOTX_CLOUD_DOMAIN_SH;
IOT_Ioctl(IOTX_IOCTL_SET_DOMAIN, (void *)&domain_type);
/* Enable Dynamic registration */
int dynamic_register = 1;
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);
mqtt_client();
IOT_DumpMemoryStats(IOT_LOG_DEBUG);
IOT_CloseLog();
EXAMPLE_TRACE("out of sample!") ;
return 0;
}
Após compilar o código e executar o programa de exemplo, a saída será semelhante a esta:
$./output/release/bin/mqtt-example
[inf] IOT_SetupConnInfo(114): DeviceSecret KV does not exist, Now We Need Dynamic Register...
[inf] _calc_dynreg_sign(61): Random Key: 7y4Jg5xdKCy9W2i
[inf] _calc_dynreg_sign(75): Sign: d3b560d5be0c9c19749470e85d912b65685fa4b20edcbd179ccfe98fcca23d5e
[inf] httpclient_common(794): host: 'iot-auth.cn-shanghai.aliyuncs.com', port: 443
...
...
...
[inf] _fetch_dynreg_http_resp(110): Http Response Payload: {"code":200,"data":{"deviceName":"Example_dyn1","deviceSecret":"KGQQFFlGinIipW9Xn7xQ5U6d6MokPZD4","productKey":"a1ExpAkj9Hi"},"message":"success"}
[inf] _fetch_dynreg_http_resp(127): Dynamic Register Code: 200
[inf] _fetch_dynreg_http_resp(148): Dynamic Register Device Secret: KGQQFFlGinIipW9Xn7xQ5U6d6MokPZD4
[inf] iotx_device_info_init(39): device_info created successfully!
...
[dbg] iotx_device_info_set(49): start to set device info!
[dbg] iotx_device_info_set(63): device_info set successfully!
[inf] guider_print_dev_guider_info(279): ....................................................
[inf] guider_print_dev_guider_info(280): ProductKey : a1ExpAkj9Hi
[inf] guider_print_dev_guider_info(281): DeviceName : Example_dyn1
[inf] guider_print_dev_guider_info(282): DeviceID : a1ExpAkj9Hi.Example_dyn1
[inf] guider_print_dev_guider_info(284): ....................................................
[inf] guider_print_dev_guider_info(285): PartnerID Buf : ,partner_id=example.demo.partner-id
[inf] guider_print_dev_guider_info(286): ModuleID Buf : ,module_id=example.demo.module-id
[inf] guider_print_dev_guider_info(287): Guider URL :
[inf] guider_print_dev_guider_info(289): Guider SecMode : 2 (TLS + Direct)
[inf] guider_print_dev_guider_info(291): Guider Timestamp : 2524608000000
[inf] guider_print_dev_guider_info(292): ....................................................
[inf] guider_print_dev_guider_info(298): ....................................................
[inf] guider_print_conn_info(256): -----------------------------------------
...
...
[inf] iotx_mc_connect(2502): mqtt connect success!
A saída anterior indica que o dispositivo obteve o DeviceSecret por meio do registro dinâmico.
(Device Secret): "KGQQFFlGinIipW9Xn7xQ5U6d6MokPZD4"
O SDK chama automaticamente HAL_Kv_Set para persistir o dado. Assim, o SDK o recupera da memória Flash na próxima conexão do dispositivo à IoT Platform. Se o usuário tentar usar a função de certificado único por produto no mesmo dispositivo uma segunda vez, a nuvem retornará o seguinte erro:
[inf] _fetch_dynreg_http_resp(110): Http Response Payload: {"code":6289,"message":"device is already active"}
Suporte à Alibaba Cloud Link Platform for Smart Living
Quando a conexão de rede é ativada para dispositivos no exterior na Alibaba Cloud Link Platform for Smart Living, eles se conectam uniformemente ao centro de ativação em Singapura. A plataforma atribui automaticamente os dispositivos aos nós de dados mais próximos. Por exemplo, dispositivos ativados nos Estados Unidos conectam-se automaticamente aos servidores naquele país.
O SDK oferece suporte ao modo da Alibaba Cloud Link Platform for Smart Living mediante as duas configurações a seguir:
Altere
FEATURE_MQTT_DIRECTemmake.settingparanpara ativar o modo de autenticação HTTPS.Configure o site de Singapura como local de conexão:
/* Choose Login Server */
int domain_type = IOTX_CLOUD_REGION_SINGAPORE;
IOT_Ioctl(IOTX_IOCTL_SET_REGION, (void *)&domain_type);