| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- /*
- * Copyright (C) 2015-2018 Alibaba Group Holding Limited
- *
- * Again edit by rt-thread group
- * Change Logs:
- * Date Author Notes
- * 2019-07-21 MurphyZhao first edit
- */
- #include "rtthread.h"
- #include "infra_config.h"
- extern void HAL_Printf(const char *fmt, ...);
- extern int HAL_Snprintf(char *str, const int len, const char *fmt, ...);
- #ifdef DEPRECATED_LINKKIT
- #include "solo.c"
- #else
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "infra_types.h"
- #include "infra_defs.h"
- #include "infra_compat.h"
- #include "infra_compat.h"
- #ifdef INFRA_MEM_STATS
- #include "infra_mem_stats.h"
- #endif
- #include "dev_model_api.h"
- #include "dm_wrapper.h"
- #include "cJSON.h"
- #ifdef ATM_ENABLED
- #include "at_api.h"
- #endif
- #define EXAMPLE_TRACE(...) \
- do { \
- HAL_Printf("\033[1;32;40m%s.%d: ", __func__, __LINE__); \
- HAL_Printf(__VA_ARGS__); \
- HAL_Printf("\033[0m\r\n"); \
- } while (0)
- #define EXAMPLE_MASTER_DEVID (0)
- #define EXAMPLE_YIELD_TIMEOUT_MS (200)
- typedef struct {
- int master_devid;
- int cloud_connected;
- int master_initialized;
- } user_example_ctx_t;
- /**
- * These PRODUCT_KEY|PRODUCT_SECRET|DEVICE_NAME|DEVICE_SECRET are listed for demo only
- *
- * When you created your own devices on iot.console.com, you SHOULD replace them with what you got from console
- *
- */
- char PRODUCT_KEY[IOTX_PRODUCT_KEY_LEN + 1] = {0};
- char PRODUCT_SECRET[IOTX_PRODUCT_SECRET_LEN + 1] = {0};
- char DEVICE_NAME[IOTX_DEVICE_NAME_LEN + 1] = {0};
- char DEVICE_SECRET[IOTX_DEVICE_SECRET_LEN + 1] = {0};
- static user_example_ctx_t g_user_example_ctx;
- /** cloud connected event callback */
- static int user_connected_event_handler(void)
- {
- EXAMPLE_TRACE("Cloud Connected");
- g_user_example_ctx.cloud_connected = 1;
- return 0;
- }
- /** cloud disconnected event callback */
- static int user_disconnected_event_handler(void)
- {
- EXAMPLE_TRACE("Cloud Disconnected");
- g_user_example_ctx.cloud_connected = 0;
- return 0;
- }
- /* device initialized event callback */
- static int user_initialized(const int devid)
- {
- EXAMPLE_TRACE("Device Initialized");
- g_user_example_ctx.master_initialized = 1;
- return 0;
- }
- /** recv property post response message from cloud **/
- static int user_report_reply_event_handler(const int devid, const int msgid, const int code, const char *reply,
- const int reply_len)
- {
- EXAMPLE_TRACE("Message Post Reply Received, Message ID: %d, Code: %d, Reply: %.*s", msgid, code,
- reply_len,
- (reply == NULL)? ("NULL") : (reply));
- return 0;
- }
- /** recv event post response message from cloud **/
- static int user_trigger_event_reply_event_handler(const int devid, const int msgid, const int code, const char *eventid,
- const int eventid_len, const char *message, const int message_len)
- {
- EXAMPLE_TRACE("Trigger Event Reply Received, Message ID: %d, Code: %d, EventID: %.*s, Message: %.*s",
- msgid, code,
- eventid_len,
- eventid, message_len, message);
- return 0;
- }
- /** recv event post response message from cloud **/
- static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
- {
- int res = 0;
- EXAMPLE_TRACE("Property Set Received, Request: %s", request);
- res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
- (unsigned char *)request, request_len);
- EXAMPLE_TRACE("Post Property Message ID: %d", res);
- return 0;
- }
- static int user_service_request_event_handler(const int devid, const char *serviceid, const int serviceid_len,
- const char *request, const int request_len,
- char **response, int *response_len)
- {
- int add_result = 0;
- cJSON *root = NULL, *item_number_a = NULL, *item_number_b = NULL;
- const char *response_fmt = "{\"Result\": %d}";
- EXAMPLE_TRACE("Service Request Received, Service ID: %.*s, Payload: %s", serviceid_len, serviceid, request);
- /* Parse Root */
- root = cJSON_Parse(request);
- if (root == NULL) {
- EXAMPLE_TRACE("JSON Parse Error");
- return -1;
- }
- if (strlen("Operation_Service") == serviceid_len && memcmp("Operation_Service", serviceid, serviceid_len) == 0) {
- /* Parse NumberA */
- item_number_a = cJSON_GetObjectItem(root, "NumberA");
- if (item_number_a == NULL) {
- cJSON_Delete(root);
- return -1;
- }
- EXAMPLE_TRACE("NumberA = %d", item_number_a->valueint);
- /* Parse NumberB */
- item_number_b = cJSON_GetObjectItem(root, "NumberB");
- if (item_number_b == NULL) {
- cJSON_Delete(root);
- return -1;
- }
- EXAMPLE_TRACE("NumberB = %d", item_number_b->valueint);
- add_result = item_number_a->valueint + item_number_b->valueint;
- /* Send Service Response To Cloud */
- *response_len = strlen(response_fmt) + 10 + 1;
- *response = (char *)HAL_Malloc(*response_len);
- if (*response == NULL) {
- EXAMPLE_TRACE("Memory Not Enough");
- return -1;
- }
- memset(*response, 0, *response_len);
- HAL_Snprintf(*response, *response_len, response_fmt, add_result);
- *response_len = strlen(*response);
- }
- cJSON_Delete(root);
- return 0;
- }
- static int user_timestamp_reply_event_handler(const char *timestamp)
- {
- EXAMPLE_TRACE("Current Timestamp: %s", timestamp);
- return 0;
- }
- /** fota event handler **/
- static int user_fota_event_handler(int type, const char *version)
- {
- char buffer[128] = {0};
- int buffer_length = 128;
- /* 0 - new firmware exist, query the new firmware */
- if (type == 0) {
- EXAMPLE_TRACE("New Firmware Version: %s", version);
- IOT_Linkkit_Query(EXAMPLE_MASTER_DEVID, ITM_MSG_QUERY_FOTA_DATA, (unsigned char *)buffer, buffer_length);
- }
- return 0;
- }
- /* cota event handler */
- static int user_cota_event_handler(int type, const char *config_id, int config_size, const char *get_type,
- const char *sign, const char *sign_method, const char *url)
- {
- char buffer[128] = {0};
- int buffer_length = 128;
- /* type = 0, new config exist, query the new config */
- if (type == 0) {
- EXAMPLE_TRACE("New Config ID: %s", config_id);
- EXAMPLE_TRACE("New Config Size: %d", config_size);
- EXAMPLE_TRACE("New Config Type: %s", get_type);
- EXAMPLE_TRACE("New Config Sign: %s", sign);
- EXAMPLE_TRACE("New Config Sign Method: %s", sign_method);
- EXAMPLE_TRACE("New Config URL: %s", url);
- IOT_Linkkit_Query(EXAMPLE_MASTER_DEVID, ITM_MSG_QUERY_COTA_DATA, (unsigned char *)buffer, buffer_length);
- }
- return 0;
- }
- void user_post_property(void)
- {
- static int cnt = 0;
- int res = 0;
- char property_payload[30] = {0};
- HAL_Snprintf(property_payload, sizeof(property_payload), "{\"Counter\": %d}", cnt++);
- res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
- (unsigned char *)property_payload, strlen(property_payload));
- EXAMPLE_TRACE("Post Property Message ID: %d", res);
- }
- void user_post_event(void)
- {
- int res = 0;
- char *event_id = "HardwareError";
- char *event_payload = "{\"ErrorCode\": 0}";
- res = IOT_Linkkit_TriggerEvent(EXAMPLE_MASTER_DEVID, event_id, strlen(event_id),
- event_payload, strlen(event_payload));
- EXAMPLE_TRACE("Post Event Message ID: %d", res);
- }
- void user_deviceinfo_update(void)
- {
- int res = 0;
- char *device_info_update = "[{\"attrKey\":\"abc\",\"attrValue\":\"hello,world\"}]";
- res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_DEVICEINFO_UPDATE,
- (unsigned char *)device_info_update, strlen(device_info_update));
- EXAMPLE_TRACE("Device Info Update Message ID: %d", res);
- }
- void user_deviceinfo_delete(void)
- {
- int res = 0;
- char *device_info_delete = "[{\"attrKey\":\"abc\"}]";
- res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_DEVICEINFO_DELETE,
- (unsigned char *)device_info_delete, strlen(device_info_delete));
- EXAMPLE_TRACE("Device Info Delete Message ID: %d", res);
- }
- int linkkit_solo_main(void)
- {
- int res = 0;
- int cnt = 0;
- iotx_linkkit_dev_meta_info_t master_meta_info;
- int domain_type = 0, dynamic_register = 0, post_reply_need = 0;
- #ifdef ATM_ENABLED
- if (IOT_ATM_Init() < 0) {
- EXAMPLE_TRACE("IOT ATM init failed!\n");
- return -1;
- }
- #endif
- memset(&g_user_example_ctx, 0, sizeof(user_example_ctx_t));
- HAL_GetProductKey(PRODUCT_KEY);
- HAL_GetProductSecret(PRODUCT_SECRET);
- HAL_GetDeviceName(DEVICE_NAME);
- HAL_GetDeviceSecret(DEVICE_SECRET);
- memset(&master_meta_info, 0, sizeof(iotx_linkkit_dev_meta_info_t));
- memcpy(master_meta_info.product_key, PRODUCT_KEY, strlen(PRODUCT_KEY));
- memcpy(master_meta_info.product_secret, PRODUCT_SECRET, strlen(PRODUCT_SECRET));
- memcpy(master_meta_info.device_name, DEVICE_NAME, strlen(DEVICE_NAME));
- memcpy(master_meta_info.device_secret, DEVICE_SECRET, strlen(DEVICE_SECRET));
- IOT_SetLogLevel(IOT_LOG_DEBUG);
- /* Register Callback */
- IOT_RegisterCallback(ITE_CONNECT_SUCC, user_connected_event_handler);
- IOT_RegisterCallback(ITE_DISCONNECTED, user_disconnected_event_handler);
- IOT_RegisterCallback(ITE_SERVICE_REQUEST, user_service_request_event_handler);
- IOT_RegisterCallback(ITE_PROPERTY_SET, user_property_set_event_handler);
- IOT_RegisterCallback(ITE_REPORT_REPLY, user_report_reply_event_handler);
- IOT_RegisterCallback(ITE_TRIGGER_EVENT_REPLY, user_trigger_event_reply_event_handler);
- IOT_RegisterCallback(ITE_TIMESTAMP_REPLY, user_timestamp_reply_event_handler);
- IOT_RegisterCallback(ITE_INITIALIZE_COMPLETED, user_initialized);
- IOT_RegisterCallback(ITE_FOTA, user_fota_event_handler);
- IOT_RegisterCallback(ITE_COTA, user_cota_event_handler);
- domain_type = IOTX_CLOUD_REGION_SHANGHAI;
- IOT_Ioctl(IOTX_IOCTL_SET_DOMAIN, (void *)&domain_type);
- /* Choose Login Method */
- dynamic_register = 0;
- IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER, (void *)&dynamic_register);
- /* post reply doesn't need */
- post_reply_need = 1;
- IOT_Ioctl(IOTX_IOCTL_RECV_EVENT_REPLY, (void *)&post_reply_need);
- /* Create Master Device Resources */
- g_user_example_ctx.master_devid = IOT_Linkkit_Open(IOTX_LINKKIT_DEV_TYPE_MASTER, &master_meta_info);
- if (g_user_example_ctx.master_devid < 0) {
- EXAMPLE_TRACE("IOT_Linkkit_Open Failed\n");
- return -1;
- }
- rt_kprintf("== 1 ==\n");
- /* Start Connect Aliyun Server */
- res = IOT_Linkkit_Connect(g_user_example_ctx.master_devid);
- if (res < 0) {
- EXAMPLE_TRACE("IOT_Linkkit_Connect Failed\n");
- return -1;
- }
- rt_kprintf("== 2 ==\n");
- while (1) {
- IOT_Linkkit_Yield(EXAMPLE_YIELD_TIMEOUT_MS);
- /* Post Proprety Example */
- if ((cnt % 2) == 0) {
- user_post_property();
- }
- /* Post Event Example */
- if ((cnt % 10) == 0) {
- user_post_event();
- }
- if (++cnt > 3600) {
- break;
- }
- HAL_SleepMs(1000);
- }
- IOT_Linkkit_Close(g_user_example_ctx.master_devid);
- IOT_DumpMemoryStats(IOT_LOG_DEBUG);
- IOT_SetLogLevel(IOT_LOG_NONE);
- return 0;
- }
- MSH_CMD_EXPORT_ALIAS(linkkit_solo_main, ali_linkkit_solo_sample, ali linkkit sole sample);
- #endif
|