应用实例(STM32)

更新时间:2022-10-08 09:40:27下载pdf

本文以 STM32L431RCT6 与 NX1 AT 固件为例,演示完整的 NB-IoT Link SDK 移植流程。您可以参考本实例,在您自己的 MCU 上快速移植开发。

材料准备

  • MCU:STM32 单片机
  • NB-IoT 模组:NX1-AT
  • 授权码:涂鸦 NB-IoT Link SDK 授权码

SDK 资源占用说明

  • Flash:约 60K
  • RAM:约 10K

SDK 目录结构说明

├── examples(参考例程)
├── include(SDK 头文件,API 接口)
├── src(SDK 源代码)
├── libraries(外部依赖库 CoAP、LwM2M、OneNet、Mbed TLS)
├── middleware(LwM2M、OneNet 中间件)
├── interface(平台必要移植接口,SDK 功能接口)
├── platform(平台移植接口适配)
├── utils(通用工具模块)
├── tuyaFilePaths.cmake
├── CMakeLists.txt
├── PortingGuide.md
├── README.md
└── LICENSE

快速移植说明

新建基础工程

以 STM32L431 为例,首先创建一个基础工程,包含两个串口初始化等基础配置。

应用实例(STM32)

串口重定向

将串口 1 作为日志输出口,请提前配置好串口重定向。

应用实例(STM32)

获取 SDK 文件并添加到项目中

根据 SDK 目录结构说明,请将以下必要文件夹添加到项目中。

应用实例(STM32)

在 MDK 中配置依赖项

应用实例(STM32)

请将对应.c文件添加到工程中。

应用实例(STM32)

根据提供的 example.c 文件,将必要的接口移植至 STM32 工程的 main.c 中。
根据 linksdk-lwm2m\examples\tuya_nbiot_demo\tuya_nbiot_demo.c 例程,将 SDK 的主状态机循环放在 while(1) 中。为了保证 SDK 运行质量,主循环请不要有较长阻塞延时。

int main(void)
{
  /* USER CODE BEGIN 1 */
int ret = OPRT_OK;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  ret = OPRT_OK;
  const tuya_iot_config_t config = {
            .productkey = TUYA_PRODUCT_KEY,
            .software_ver = SOFTWARE_VER,
            .imei = TUYA_DEVICE_IMEI,
            .uuid = TUYA_DEVICE_UUID,
            .authkey = TUYA_DEVICE_AUTHKEY,
            .psk = TUYA_DEVICE_PSK,
            .imsi = TUYA_DEVICE_IMSI,               //International Mobile Subscriber Identity
            .is_test_env = false,                   //env:0(online);1(preview)
            .is_wakeup = false,                     //is woken up from sleep? please invoke tuya_iot_retention_restore() before sleep!
            .lifetime = 120,                        //LIFETIME_DEFAULT,
            .link_mode = NBIOT_LINK_ISP,
            .power_mode = NBIOT_MODE_PSM,
            .apn = "cmnbiot",                              
            .event_handler = user_event_handler_on,                
            .dp_ack_cb = user_dp_report_notify_callback,          
            .hb_send_cb = user_heartbeat_send_timeout_callback,     
    };
	    /* Initialize Tuya device configuration */
    ret = tuya_iot_init(&client, &config);
 

    tuya_file_dl_init(&file_dl_handle, &(const tuya_file_dl_config_t){
        .event_cb = user_file_dl_event_cb,
    });
 
    /* Start tuya iot task */
    tuya_iot_start(&client);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		tuya_iot_yield(&client);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

最后,请将 Heap_Size 空间调至适当大小,例如:

应用实例(STM32)

编译验证

应用实例(STM32)

编译无误后,烧录单片机,打开日志,观察运行情况。
如有对应 SDK 日志输出,且可正常打印设备授权信息等,即代表设备运行正常。

应用实例(STM32)

接口适配

根据 SDK 说明文档可知,接口适配,重点需要适配三个接口。

linksdk-lwm2m\platform\stm32 下:

network_wrapper.c    //网络接口,由于本次使用 MCU+AT 指令开发的模式,仅需适配域名解析接口即可
storage_wrapper.c    //数据持久化接口,可移植开源的 KV 组件来实现,例如 easyflash
system_wrapper.c     //系统内存与滴答时钟等接口,根据平台自行调整即可

应用实例(STM32)

NX1 模组 AT 固件连接移动 OneNet 测试

设备启动打印产品信息

应用实例(STM32)

设备驻网完成

应用实例(STM32)

请求注册 OneNet

应用实例(STM32)
应用实例(STM32)

Observer 响应

应用实例(STM32)
应用实例(STM32)

涂鸦 IoT 云激活

应用实例(STM32)

激活响应 Seckey 与 DeviceID

应用实例(STM32)

请求下载 schema 文件

应用实例(STM32)

schema 文件循环下载完成

应用实例(STM32)

手机 App 绑定

应用实例(STM32)

心跳数据上报

应用实例(STM32)

用户 DP 数据上报下发

应用实例(STM32)

应用实例(STM32)