如何将结构添加到 Azure IoT Central 自定义应用程序
How to add a struct to Azure IoT Central custom application
我在 Azure IoT Central 中有一个自定义应用程序。我已经创建了我的设备,并且可以使用基本数据类型(bool、float、int)发送数据。
从 C api 看来,似乎有一种机制可以声明结构、将其添加到模型并发送该数据。所以我做到了,我看到确认我的消息正在发送和接收,但没有数据显示......所以我猜要么你不能真正声明一个结构并发送它,要么我没有它在 Azure 端正确配置,但我没有找到任何可以提供帮助的文档。
BEGIN_NAMESPACE(AzureModel);
DECLARE_STRUCT(MyData,
int, num1,
float, num2,
int, num3);
DECLARE_MODEL(Azure1_t,
WITH_DATA(ascii_char_ptr, deviceId),
WITH_DATA(int, messageId),
WITH_DATA(MyData, myData),
WITH_DATA(EDM_DATE_TIME_OFFSET, ts),
/* Methods */
WITH_METHOD(Reboot),
WITH_METHOD(Quit),
WITH_METHOD(FirmwareUpdate, ascii_char_ptr, FwPackageUri),
/* Register Direct Methods with IoT Hub */
WITH_REPORTED_PROPERTY(ascii_char_ptr_no_quotes, SupportedMethods),
/* Telemetry Interval in Seconds... value from 1 to: 0xFFFF/2000 = About 30 Seconds */
WITH_REPORTED_PROPERTY(int,TelemetryInterval),
WITH_REPORTED_PROPERTY(ascii_char_ptr,AzureStatus),
WITH_REPORTED_PROPERTY(ascii_char_ptr, AzureFwVersion)
);
END_NAMESPACE(AzureModel);
Azure1_t *Azure1;
static void SendData(void)
{
EVENT_INSTANCE *messages;
unsigned char* destination;
size_t destinationSize;
time_t now;
/* Read the Time from RTC */
now = TimingSystemGetSystemTime();
/* Time Stamp */
Azure1->ts = GetDateTimeOffset(now);
messages = (EVENT_INSTANCE *) calloc(1,sizeof(EVENT_INSTANCE));
if(messages==NULL) {
AZURE_PRINTF("Err: Allocating Memory for messages to IoT Hub\r\n");
HAL_NVIC_SystemReset();
} else {
messages->this = (void *)messages;
}
SentMessagesCount++;
Azure1->messageId = messages->messageTrackingId = SentMessagesCount;
if (SERIALIZE(&destination, &destinationSize,
Azure1->deviceId,
Azure1->messageId,
Azure1->myData,
Azure1->ts) != CODEFIRST_OK){
AZURE_PRINTF("Err: Failed to serialize\r\n");
}
else
{
/* Only for Debug */
//AZURE_PRINTF("MessageToSend=%.*s\r\n",destinationSize,destination);
if ((messages->messageHandle = IoTHubMessage_CreateFromByteArray(destination, destinationSize)) == NULL) {
AZURE_PRINTF("Err: iotHubMessageHandle is NULL!\r\n");
} else {
char msgText[32];
MAP_HANDLE propMap = IoTHubMessage_Properties(messages->messageHandle);
sprintf_s(msgText, sizeof(msgText), "PropMsg_%zu", SentMessagesCount);
if (Map_AddOrUpdate(propMap, "PropName", msgText) != MAP_OK){
AZURE_PRINTF("Err: Map_AddOrUpdate Failed!\r\n");
}
if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messages->messageHandle, SendConfirmationCallback, messages) != IOTHUB_CLIENT_OK) {
AZURE_PRINTF("Err: IoTHubClient_LL_SendEventAsync..........FAILED!\r\n");
} else {
AZURE_PRINTF("IoTHubClient_LL_SendEventAsync accepted message [%d] for transmission to IoT Hub.\r\n", SentMessagesCount);
}
free(destination);
}
IoTHubMessage_Destroy(messages->messageHandle);
}
}
Azure configuration
在这种情况下,您的 IoT Central 应用程序不是 旧版应用程序 (2018),因此它是使用最新更新构建的,例如即插即用(功能模型),遥测对象可以被 IoTC 应用程序使用。
创建新版本的设备模板并向接口实例添加新功能。以下屏幕片段显示了我的示例:
点击View,我们可以看到遥测对象的Schema:
请注意,上面的架构是我的示例,基本上您可以创建具有更复杂和嵌套级别的架构。
完成设备模板更新和发布后,您需要将这个新版本的设备模板分配给真实设备。
出于测试目的(设备 <-> IoTCentral 应用程序),使用 Azure IoT Hub Tester。以下屏幕片段显示从 PnP 设备 sensor4 向 IoTC 发送遥测样本。请注意,设备 sensor4 已使用 IoT Central App 导出的设备模板功能模型进行设置。
和 IoTC 应用仪表板:
IoT Central 的新功能(仍在预览中)(例如基于即插即用功能模型创建设备模板)是一个很棒的功能,允许以双向方式逻辑连接端到端实体。
更新:
我错过了你的 Azure configuration 图片,它显示了 旧版应用程序 (2018) 的设备模板。请注意,此版本不支持您的需求(自定义复杂架构等)。
我确实建议将您的遗留应用程序迁移到具有即插即用模型功能的最新应用程序(仍在预览中)。
我在 Azure IoT Central 中有一个自定义应用程序。我已经创建了我的设备,并且可以使用基本数据类型(bool、float、int)发送数据。
从 C api 看来,似乎有一种机制可以声明结构、将其添加到模型并发送该数据。所以我做到了,我看到确认我的消息正在发送和接收,但没有数据显示......所以我猜要么你不能真正声明一个结构并发送它,要么我没有它在 Azure 端正确配置,但我没有找到任何可以提供帮助的文档。
BEGIN_NAMESPACE(AzureModel);
DECLARE_STRUCT(MyData,
int, num1,
float, num2,
int, num3);
DECLARE_MODEL(Azure1_t,
WITH_DATA(ascii_char_ptr, deviceId),
WITH_DATA(int, messageId),
WITH_DATA(MyData, myData),
WITH_DATA(EDM_DATE_TIME_OFFSET, ts),
/* Methods */
WITH_METHOD(Reboot),
WITH_METHOD(Quit),
WITH_METHOD(FirmwareUpdate, ascii_char_ptr, FwPackageUri),
/* Register Direct Methods with IoT Hub */
WITH_REPORTED_PROPERTY(ascii_char_ptr_no_quotes, SupportedMethods),
/* Telemetry Interval in Seconds... value from 1 to: 0xFFFF/2000 = About 30 Seconds */
WITH_REPORTED_PROPERTY(int,TelemetryInterval),
WITH_REPORTED_PROPERTY(ascii_char_ptr,AzureStatus),
WITH_REPORTED_PROPERTY(ascii_char_ptr, AzureFwVersion)
);
END_NAMESPACE(AzureModel);
Azure1_t *Azure1;
static void SendData(void)
{
EVENT_INSTANCE *messages;
unsigned char* destination;
size_t destinationSize;
time_t now;
/* Read the Time from RTC */
now = TimingSystemGetSystemTime();
/* Time Stamp */
Azure1->ts = GetDateTimeOffset(now);
messages = (EVENT_INSTANCE *) calloc(1,sizeof(EVENT_INSTANCE));
if(messages==NULL) {
AZURE_PRINTF("Err: Allocating Memory for messages to IoT Hub\r\n");
HAL_NVIC_SystemReset();
} else {
messages->this = (void *)messages;
}
SentMessagesCount++;
Azure1->messageId = messages->messageTrackingId = SentMessagesCount;
if (SERIALIZE(&destination, &destinationSize,
Azure1->deviceId,
Azure1->messageId,
Azure1->myData,
Azure1->ts) != CODEFIRST_OK){
AZURE_PRINTF("Err: Failed to serialize\r\n");
}
else
{
/* Only for Debug */
//AZURE_PRINTF("MessageToSend=%.*s\r\n",destinationSize,destination);
if ((messages->messageHandle = IoTHubMessage_CreateFromByteArray(destination, destinationSize)) == NULL) {
AZURE_PRINTF("Err: iotHubMessageHandle is NULL!\r\n");
} else {
char msgText[32];
MAP_HANDLE propMap = IoTHubMessage_Properties(messages->messageHandle);
sprintf_s(msgText, sizeof(msgText), "PropMsg_%zu", SentMessagesCount);
if (Map_AddOrUpdate(propMap, "PropName", msgText) != MAP_OK){
AZURE_PRINTF("Err: Map_AddOrUpdate Failed!\r\n");
}
if (IoTHubClient_LL_SendEventAsync(iotHubClientHandle, messages->messageHandle, SendConfirmationCallback, messages) != IOTHUB_CLIENT_OK) {
AZURE_PRINTF("Err: IoTHubClient_LL_SendEventAsync..........FAILED!\r\n");
} else {
AZURE_PRINTF("IoTHubClient_LL_SendEventAsync accepted message [%d] for transmission to IoT Hub.\r\n", SentMessagesCount);
}
free(destination);
}
IoTHubMessage_Destroy(messages->messageHandle);
}
}
Azure configuration
在这种情况下,您的 IoT Central 应用程序不是 旧版应用程序 (2018),因此它是使用最新更新构建的,例如即插即用(功能模型),遥测对象可以被 IoTC 应用程序使用。
创建新版本的设备模板并向接口实例添加新功能。以下屏幕片段显示了我的示例:
点击View,我们可以看到遥测对象的Schema:
请注意,上面的架构是我的示例,基本上您可以创建具有更复杂和嵌套级别的架构。
完成设备模板更新和发布后,您需要将这个新版本的设备模板分配给真实设备。
出于测试目的(设备 <-> IoTCentral 应用程序),使用 Azure IoT Hub Tester。以下屏幕片段显示从 PnP 设备 sensor4 向 IoTC 发送遥测样本。请注意,设备 sensor4 已使用 IoT Central App 导出的设备模板功能模型进行设置。
和 IoTC 应用仪表板:
IoT Central 的新功能(仍在预览中)(例如基于即插即用功能模型创建设备模板)是一个很棒的功能,允许以双向方式逻辑连接端到端实体。
更新:
我错过了你的 Azure configuration 图片,它显示了 旧版应用程序 (2018) 的设备模板。请注意,此版本不支持您的需求(自定义复杂架构等)。
我确实建议将您的遗留应用程序迁移到具有即插即用模型功能的最新应用程序(仍在预览中)。