MCU JeeSDK 接收命令
前提条件
开发者已在物栖开放平台完成注册和资质认证。开发者应具备 MCU 开发能力,熟悉固件开发流程。
准备工作
已经完成 JeeSDK的 MCU 的设备接入开发。如何进行设备接入开发,请参见:设备接入
功能原理
设备端系统向 SDK 注册命令处理函数,等待接收用户命令。
用户使用冒泡物联 App 向设备端发送控制命令,经过物栖物联网平台路由到设备后,设备端核心服务回调设备系统注册的命令处理函数,并将处理结果返回给冒泡物联 App,向用户进行展示。
使用示例
开发者完成 ”接收命令“ 功能的开发,设备即可接收来自物栖物联网平台的命令。
实现步骤:
在物栖开放平台注册设备命令,并配置命令的参数。
关于如何配置命令参数,请参见:命令设计
设备配网成功后,启动 SDK 核心服务,并注册命令处理回调函数。
在命令处理回调函数中处理接收到的命令,并返回处理结果。
代码示例:
首先初始化SDK并启动核心服务,初始化的时候需要提供一些参数,这些参数有的来自配网时由手机客户端提供,有些需要开发者自己从开放平台获取。在启动核心服务之前,需要注册相关的命令处理函数。
void message_thread(beken_thread_arg_t arg) { struct login_info_st login_info; // 在开放平台申请的设备号,共40字节数据 login_info.secret_data = sys_config_manage(SYS_SECRET_KEY, SYS_READ, 0, 0); // 配网时由手机客户端传给设备的 user ID 参数 uint64 *puser_id = sys_config_manage(SYS_USER_ID, SYS_READ, 0, 0); login_info.userId = *puser_id; // 配网时由手机客户端传给设备的 Server Key 参数 login_info.serveKey = (uint8 *)sys_config_manage(SYS_SERVER_KEY, SYS_READ, 0, 0); // 固件的版本号 login_info.version = versionStringToint(); // SDK 初始化,每次上电只能调用一次。 __jeesdk = jeesdk_init(&login_info); // 注册回调函数:与服务器断开连接时回调 jeesdk_register_on_disconnected(__jeesdk, on_disconnected); // 注册回调函数:收到来自服务器的命令时回调 jeesdk_register_on_recv_cmd(__jeesdk, execCommand); // 注册回调函数:收到来自服务器的 OTA 升级命令时回调 jeesdk_register_ota(__jeesdk, on_ota_begin, on_ota_download, on_ota_finish); while (1) { // 检查设备是否配网成功 if (mhdr_get_station_status() == RW_EVT_STA_GOT_IP && reConnectFlag == 0) { reConnectFlag = 1; struct sockaddr_in s_addr; // DNS 解析 message_update_hostInfo(&s_addr); // 启动 SDK 核心函数,接收来自服务器的命令 jeesdk_main(__jeesdk, &s_addr); } rtos_delay_milliseconds((TickType_t)2000); //mS } }
断网回调函数的实现示例:
static void on_disconnected(JEESDK jeesdk) { // 检查是否可以正常访问网络 if (mhdr_get_station_status() == RW_EVT_STA_GOT_IP) { struct sockaddr_in s_addr; // DNS 解析 message_update_hostInfo(&s_addr); // 连接云平台并等待接收命令 jeesdk_main(jeesdk, &s_addr); return; } reConnectFlag = 0; }
收到命令回调函数的示例:
// 插座开关命令,此命令需要开发者在创建产品时在开放平台自行创建 #define TRON (0x54524F4E) // TRON 命令的第一个参数 #define ARG_TRON_SW (0x01) // TRON 命令第一个参数的值 #define TRON_SW_OFF (0x00) // 打开开关 #define TRON_SW_ON (0x01) // 关闭开关 static int execCommand(int event, ArgsObj arr[]) { switch (event) { case TRON: { uint32 swithcValue = 0; // 获取此命令的参数 ArgsObj sw = arr[ARG_TRON_SW]; // 将参数解析为 int 值 swithcValue = __conbineTo32(sw.data[0], sw.data[1], sw.data[2], sw.data[3]); if ((TRON_SW_ON == swithcValue) && (smt_get_connect_flag_value() == 0)) { //turn on the switch printf("trun off\r\n"); led_status_set(LED_STATE_OFF); k1_output_status = K1_STATUS_OFF; k1_set(k1_output_status); } else if ((TRON_SW_OFF == swithcValue) && (smt_get_connect_flag_value() == 0)) { printf("trun on\r\n"); led_status_set(LED_STATE_CONNECTED); k1_output_status = K1_STATUS_ON; k1_set(k1_output_status); } return EXECUT_OK; } break; default: break; } return NO_MEANING; }