Skip to content

Commit becdf23

Browse files
authored
update device twin logic at startup (#165)
* update device twin logic at startup * add hub + dps to samples search header
1 parent 99dc804 commit becdf23

File tree

12 files changed

+403
-411
lines changed

12 files changed

+403
-411
lines changed

MXChip/AZ3166/app/nx_client.c

Lines changed: 111 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -56,115 +56,6 @@ static TX_EVENT_FLAGS_GROUP azure_iot_flags;
5656

5757
static int32_t telemetry_interval = 10;
5858

59-
static void set_led_state(bool level)
60-
{
61-
if (level)
62-
{
63-
printf("LED is turned ON\r\n");
64-
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
65-
}
66-
else
67-
{
68-
printf("LED is turned OFF\r\n");
69-
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
70-
}
71-
}
72-
73-
static void direct_method_cb(AZURE_IOT_NX_CONTEXT* nx_context,
74-
const UCHAR* method,
75-
USHORT method_length,
76-
UCHAR* payload,
77-
USHORT payload_length,
78-
VOID* context,
79-
USHORT context_length)
80-
{
81-
UINT status;
82-
UINT http_status = 501;
83-
CHAR* http_response = "{}";
84-
85-
if (strncmp((CHAR*)method, SET_LED_STATE_COMMAND, method_length) == 0)
86-
{
87-
bool arg = (strncmp((CHAR*)payload, "true", payload_length) == 0);
88-
set_led_state(arg);
89-
90-
azure_iot_nx_client_publish_bool_property(&azure_iot_nx_client, LED_STATE_PROPERTY, arg);
91-
92-
http_status = 200;
93-
}
94-
95-
else if (strncmp((CHAR*)method, SET_DISPLAY_TEXT_COMMAND, method_length) == 0)
96-
{
97-
// drop the first and last character to remove the quotes
98-
screen_printn((CHAR*)payload + 1, payload_length - 2, L0);
99-
100-
http_status = 200;
101-
}
102-
103-
if ((status = nx_azure_iot_hub_client_direct_method_message_response(&nx_context->iothub_client,
104-
http_status,
105-
context,
106-
context_length,
107-
(UCHAR*)http_response,
108-
strlen(http_response),
109-
NX_WAIT_FOREVER)))
110-
{
111-
printf("Direct method response failed! (0x%08x)\r\n", status);
112-
return;
113-
}
114-
}
115-
116-
static void device_twin_desired_property_cb(UCHAR* component_name,
117-
UINT component_name_len,
118-
UCHAR* property_name,
119-
UINT property_name_len,
120-
NX_AZURE_IOT_JSON_READER property_value_reader,
121-
UINT version,
122-
VOID* userContextCallback)
123-
{
124-
UINT status;
125-
AZURE_IOT_NX_CONTEXT* nx_context = (AZURE_IOT_NX_CONTEXT*)userContextCallback;
126-
127-
if (strncmp((CHAR*)property_name, TELEMETRY_INTERVAL_PROPERTY, property_name_len) == 0)
128-
{
129-
status = nx_azure_iot_json_reader_token_int32_get(&property_value_reader, &telemetry_interval);
130-
if (status == NX_AZURE_IOT_SUCCESS)
131-
{
132-
// Set a telemetry event so we pick up the change immediately
133-
tx_event_flags_set(&azure_iot_flags, TELEMETRY_INTERVAL_EVENT, TX_OR);
134-
135-
// Confirm reception back to hub
136-
azure_nx_client_respond_int_writeable_property(
137-
nx_context, TELEMETRY_INTERVAL_PROPERTY, telemetry_interval, 200, version);
138-
}
139-
}
140-
}
141-
142-
static void device_twin_property_cb(UCHAR* component_name,
143-
UINT component_name_len,
144-
UCHAR* property_name,
145-
UINT property_name_len,
146-
NX_AZURE_IOT_JSON_READER property_value_reader,
147-
UINT version,
148-
VOID* userContextCallback)
149-
{
150-
UINT status;
151-
AZURE_IOT_NX_CONTEXT* nx_context = (AZURE_IOT_NX_CONTEXT*)userContextCallback;
152-
153-
if (strncmp((CHAR*)property_name, TELEMETRY_INTERVAL_PROPERTY, property_name_len) == 0)
154-
{
155-
status = nx_azure_iot_json_reader_token_int32_get(&property_value_reader, &telemetry_interval);
156-
if (status == NX_AZURE_IOT_SUCCESS)
157-
{
158-
// Set a telemetry event so we pick up the change immediately
159-
tx_event_flags_set(&azure_iot_flags, TELEMETRY_INTERVAL_EVENT, TX_OR);
160-
}
161-
}
162-
163-
// Confirm reception back to hub
164-
azure_nx_client_respond_int_writeable_property(
165-
nx_context, TELEMETRY_INTERVAL_PROPERTY, telemetry_interval, 200, version);
166-
}
167-
16859
static UINT append_device_info_properties(NX_AZURE_IOT_JSON_WRITER* json_writer, VOID* context)
16960
{
17061
if (nx_azure_iot_json_writer_append_property_with_string_value(json_writer,
@@ -321,6 +212,111 @@ static UINT append_device_telemetry_gyroscope(NX_AZURE_IOT_JSON_WRITER* json_wri
321212
return NX_AZURE_IOT_SUCCESS;
322213
}
323214

215+
static void set_led_state(bool level)
216+
{
217+
if (level)
218+
{
219+
printf("LED is turned ON\r\n");
220+
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
221+
}
222+
else
223+
{
224+
printf("LED is turned OFF\r\n");
225+
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
226+
}
227+
}
228+
229+
static void direct_method_cb(AZURE_IOT_NX_CONTEXT* nx_context,
230+
const UCHAR* method,
231+
USHORT method_length,
232+
UCHAR* payload,
233+
USHORT payload_length,
234+
VOID* context,
235+
USHORT context_length)
236+
{
237+
UINT status;
238+
UINT http_status = 501;
239+
CHAR* http_response = "{}";
240+
241+
if (strncmp((CHAR*)method, SET_LED_STATE_COMMAND, method_length) == 0)
242+
{
243+
bool arg = (strncmp((CHAR*)payload, "true", payload_length) == 0);
244+
set_led_state(arg);
245+
246+
azure_iot_nx_client_publish_bool_property(&azure_iot_nx_client, LED_STATE_PROPERTY, arg);
247+
248+
http_status = 200;
249+
}
250+
251+
else if (strncmp((CHAR*)method, SET_DISPLAY_TEXT_COMMAND, method_length) == 0)
252+
{
253+
// drop the first and last character to remove the quotes
254+
screen_printn((CHAR*)payload + 1, payload_length - 2, L0);
255+
256+
http_status = 200;
257+
}
258+
259+
if ((status = nx_azure_iot_hub_client_direct_method_message_response(&nx_context->iothub_client,
260+
http_status,
261+
context,
262+
context_length,
263+
(UCHAR*)http_response,
264+
strlen(http_response),
265+
NX_WAIT_FOREVER)))
266+
{
267+
printf("Direct method response failed! (0x%08x)\r\n", status);
268+
return;
269+
}
270+
}
271+
272+
static void device_twin_desired_property_cb(UCHAR* component_name,
273+
UINT component_name_len,
274+
UCHAR* property_name,
275+
UINT property_name_len,
276+
NX_AZURE_IOT_JSON_READER property_value_reader,
277+
UINT version,
278+
VOID* userContextCallback)
279+
{
280+
UINT status;
281+
AZURE_IOT_NX_CONTEXT* nx_context = (AZURE_IOT_NX_CONTEXT*)userContextCallback;
282+
283+
if (strncmp((CHAR*)property_name, TELEMETRY_INTERVAL_PROPERTY, property_name_len) == 0)
284+
{
285+
status = nx_azure_iot_json_reader_token_int32_get(&property_value_reader, &telemetry_interval);
286+
if (status == NX_AZURE_IOT_SUCCESS)
287+
{
288+
// Confirm reception back to hub
289+
azure_nx_client_respond_int_writeable_property(
290+
nx_context, TELEMETRY_INTERVAL_PROPERTY, telemetry_interval, 200, version);
291+
292+
// Set a telemetry event so we pick up the change immediately
293+
tx_event_flags_set(&azure_iot_flags, TELEMETRY_INTERVAL_EVENT, TX_OR);
294+
}
295+
}
296+
}
297+
298+
static void device_twin_property_cb(UCHAR* component_name,
299+
UINT component_name_len,
300+
UCHAR* property_name,
301+
UINT property_name_len,
302+
NX_AZURE_IOT_JSON_READER property_value_reader,
303+
UINT version,
304+
VOID* userContextCallback)
305+
{
306+
if (strncmp((CHAR*)property_name, TELEMETRY_INTERVAL_PROPERTY, property_name_len) == 0)
307+
{
308+
nx_azure_iot_json_reader_token_int32_get(&property_value_reader, &telemetry_interval);
309+
}
310+
}
311+
312+
static void device_twin_received_cb(AZURE_IOT_NX_CONTEXT* nx_context)
313+
{
314+
azure_iot_nx_client_publish_int_writeable_property(nx_context, TELEMETRY_INTERVAL_PROPERTY, telemetry_interval);
315+
azure_iot_nx_client_publish_bool_property(&azure_iot_nx_client, LED_STATE_PROPERTY, false);
316+
azure_iot_nx_client_publish_properties(
317+
&azure_iot_nx_client, DEVICE_INFO_COMPONENT_NAME, append_device_info_properties);
318+
}
319+
324320
UINT azure_iot_nx_client_entry(
325321
NX_IP* ip_ptr, NX_PACKET_POOL* pool_ptr, NX_DNS* dns_ptr, UINT (*unix_time_callback)(ULONG* unix_time))
326322
{
@@ -330,17 +326,17 @@ UINT azure_iot_nx_client_entry(
330326

331327
if ((status = tx_event_flags_create(&azure_iot_flags, "Azure IoT flags")))
332328
{
333-
printf("FAIL: Unable to create nx_client event flags (0x%04x)\r\n", status);
329+
printf("FAIL: Unable to create nx_client event flags (0x%08x)\r\n", status);
334330
return status;
335331
}
336332

337-
status = azure_iot_nx_client_create(
338-
&azure_iot_nx_client, ip_ptr, pool_ptr, dns_ptr, unix_time_callback, IOT_MODEL_ID);
333+
status =
334+
azure_iot_nx_client_create(&azure_iot_nx_client, ip_ptr, pool_ptr, dns_ptr, unix_time_callback, IOT_MODEL_ID);
339335
if (status != NX_SUCCESS)
340336
{
341337
printf("ERROR: azure_iot_nx_client_create failed (0x%08x)\r\n", status);
342338
return status;
343-
}
339+
}
344340

345341
#ifdef ENABLE_X509
346342
status = azure_iot_nx_client_cert_set(&azure_iot_nx_client,
@@ -372,6 +368,7 @@ UINT azure_iot_nx_client_entry(
372368
azure_iot_nx_client_register_direct_method(&azure_iot_nx_client, direct_method_cb);
373369
azure_iot_nx_client_register_device_twin_desired_prop(&azure_iot_nx_client, device_twin_desired_property_cb);
374370
azure_iot_nx_client_register_device_twin_prop(&azure_iot_nx_client, device_twin_property_cb);
371+
azure_iot_nx_client_register_device_twin_received(&azure_iot_nx_client, device_twin_received_cb);
375372

376373
if ((status = azure_iot_nx_client_connect(&azure_iot_nx_client)))
377374
{
@@ -387,13 +384,9 @@ UINT azure_iot_nx_client_entry(
387384
return status;
388385
}
389386

390-
// Send properties
391-
azure_iot_nx_client_publish_bool_property(&azure_iot_nx_client, LED_STATE_PROPERTY, false);
392-
azure_iot_nx_client_publish_properties(
393-
&azure_iot_nx_client, DEVICE_INFO_COMPONENT_NAME, append_device_info_properties);
394-
395387
printf("\r\nStarting Main loop\r\n");
396388
screen_print("Azure IoT", L0);
389+
397390
while (true)
398391
{
399392
tx_event_flags_get(

MXChip/AZ3166/readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ products:
77
- azure-iot
88
- azure-iot-pnp
99
- azure-rtos
10+
- azure-iot-dps
11+
- azure-iot-hub
1012
---
1113

1214
# Getting started with the MXCHIP AZ3166 IoT DevKit

0 commit comments

Comments
 (0)