MCU JeeSDK 接收命令

前提条件

开发者已在物栖开放平台完成注册和资质认证。开发者应具备 MCU 开发能力,熟悉固件开发流程。

准备工作

已经完成 JeeSDK的 MCU 的设备接入开发。如何进行设备接入开发,请参见:设备接入

功能原理

设备端系统向 SDK 注册命令处理函数,等待接收用户命令。

用户使用冒泡物联 App 向设备端发送控制命令,经过物栖物联网平台路由到设备后,设备端核心服务回调设备系统注册的命令处理函数,并将处理结果返回给冒泡物联 App,向用户进行展示。

mcu-sdk-msgreceived-toplogy

使用示例

开发者完成 ”接收命令“ 功能的开发,设备即可接收来自物栖物联网平台的命令。

  1. 实现步骤:

    1. 在物栖开放平台注册设备命令,并配置命令的参数。

      关于如何配置命令参数,请参见:命令设计

    2. 设备配网成功后,启动 SDK 核心服务,并注册命令处理回调函数。

    3. 在命令处理回调函数中处理接收到的命令,并返回处理结果。

  2. 代码示例:

    1. 首先初始化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  
          }  
      }
      
    2. 断网回调函数的实现示例:

      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;  
      }
      
    3. 收到命令回调函数的示例:

      // 插座开关命令,此命令需要开发者在创建产品时在开放平台自行创建  
      #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;  
      }
      

results matching ""

    No results matching ""