デバイス認証には2つの方法があります。
デバイスごとに一意の証明書: 一意の証明書 (ProductKey、DeviceName、DeviceSecret) を各デバイスに書き込みます。
製品ごとに一意の証明書: 同じ証明書 (ProductKey、product Secret) を製品のすべてのデバイスに書き込むと、この方法では、生産ラインへの変更が少なくなります。 各デバイスは独自の一意の識別子を持ち、それをAlibaba Cloud IoT Platformに事前にアップロードする必要があります。プラットフォームは、その識別子に基づいてデバイスからの接続を受け入れることができるかどうかを決定します。
IOT_Ioctl() を呼び出して認証方法を設定します。
/* ログイン方法の選択 * /
int dynamic_register = 1; /* 0: プロダクトごとにunique-certificateを使用しない、1: プロダクトごとにunique-certificateを使用する * /
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER、(void *)&dynamic_register); デバイスごとに一意の証明書認証を実装する
IOT_Ioctlを呼び出して認証モードを設定する必要があります。
// デモのみ
/* 認証モードを設定する * /
int dynamic_register = 0;
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER、(void *)&dynamic_register); プロダクトごとに一意の証明書認証を実装する
unique-certificate-per-productは、製品のデバイスに書き込まれたコンテンツ (ProductKey、ProductSecret) が同じであることを意味します。動的登録と呼ばれるプロセスを使用して、デバイスの一意識別子を使用してIoTプラットフォームからDeviceSecretを取得します。
SDKがIoTプラットフォームからデバイスのDeviceSecretを取得した後、HAL_SetDeviceSecret() を呼び出してDeviceSecretを保存します。デバイスはこの値をFlashに保持する必要があります。 デバイスがDeviceSecretを取得した場合、IoTプラットフォームはDeviceSeretの提供を拒否するため、デバイスが動的登録プロセスを経た後にDeviceSecretを消去することはできません。
unique-certificate-per-productを使用する場合は、次のインターフェイスを呼び出して動的登録機能を有効にします。
/* 動的登録機能をオンにする * /
int dynamic_register = 1; /* 1: プロダクトごとに固有の証明書を使用する * /
IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER、(void *)&dynamic_register); Basic-Editionプロダクトのプロダクトごとに固有の証明書認証の例
Alibaba Clout IoT Platformにアクセスし、製品を選択して「動的登録」を有効にします。

この製品の下に新しいデバイスを作成します。

Link Kit SDKを開き、次のようにコードを置き換えます。
#include "iot_import.h"
# 「iot_export.h」を含める
# 「app_entry.h」を含める
// PRODUCT_KEY、PRODUCT_SECRET、DEVICE_NAMEの値を置き換えるには
# define PRODUCT_KEY "a1MZxOdcBnO"
# define PRODUCT_SECRET "h4I4dneEFp7EImTv"
# DEVICE_NAME "Example_dyn1" を定義する
// DEVICE_SECRETにコメントする
//# 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);
// IoTプラットフォームから動的に取得するため、設定をDeviceSecretにコメントする
/* HAL_SetDeviceSecret(DEVICE_SECRET); * /
/* ログインサーバーを選択 * /
int domain_type = IOTX_CLOUD_DOMAIN_SH;
IOT_Ioctl(IOTX_IOCTL_SET_DOMAIN, (void *)&domain_type);
/* ダイナミック登録を有効にする * /
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!") ;
0を返します。} コードをコンパイルした後、サンプルプログラムを実行すると、出力は次のようになります。
$./output/release/bin/mqtt-例
[inf] IOT_SetupConnInfo(114): DeviceSecret KVは存在しません。動的レジスタが必要です...
[inf] _calc_dynreg_sign(61): ランダムキー: 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ペイロード: {"code":200、"data":{"deviceName":"Example_dyn1" 、"deviceSecret":"KGQQFFlGinIipW9Xn7xQ5U6d6MokPZD4" 、"productKey":"a1ExpAkj9Hi"} 、"message":"success"}
[inf] _fetch_dynreg_http_resp(127): ダイナミックレジスタコード: 200
[inf] _fetch_dynreg_http_resp(148): Dynamic Register Device Secret: KGQQFFlGinIipW9Xn7xQ5U6d6MokPZD4
[inf] iotx_device_info_init(39): device_infoが正常に作成されました!
...
[dbg] iotx_device_info_set(49): デバイス情報の設定を開始!
[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.de mo.partner-id
[inf] guider_print_dev_guider_info(286): ModuleID Buf : ,module_id=example.demo.mo dule-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! 前の実行出力は、デバイスが動的登録を使用してDeviceSecretを取得したことを示します。
(デバイスの秘密): "KGQQFFlGinIipW9Xn7xQ5U6d6MokPZD4"SDKは自動的にHAL_Kv_Setを呼び出して永続化し、デバイスが次回IoT Platformに接続されたときに、SDKはFlashからそれを取得します。 ユーザーが同じデバイスでプロダクトごとに固有の証明書機能を2回使用しようとすると、クラウドは次のエラーを返します。
[inf] _fetch_dynreg_http_resp(110): Http応答ペイロード: {"code":6289,"message":"device is already active"}スマートリビング向けAlibaba Cloudリンクプラットフォームをサポート
Alibaba Cloud Link Platform for Smart Livingで海外のデバイスのネットワークがアクティブ化されると、シンガポールのアクティベーションセンターに一律に接続されます。 プラットフォームは、デバイスを最も近いデータノードに自動的に割り当てます。 たとえば、米国で起動されたデバイスは、米国内のサーバーに自動的に接続します。
SDKは、次の2つの設定を実行することで、Alibaba Cloud Link Platform for Smart Livingモードをサポートできます。
make.settingのFEATURE_MQTT_DIRECTをnに変更すると、https認証モードが有効になります。- シンガポールのサイトを接続サイトとして設定します。
/* ログインサーバーを選択 * /
int domain_type = IOTX_CLOUD_REGION_SINGAPORE;
IOT_Ioctl(IOTX_IOCTL_SET_REGION、(void *)&domain_type);