局域网绑定

更新时间:2023-10-08 08:39:53下载pdf

App 与设备在同一个局域网时,App 会下发 Token 到设备,设备收到 Token 后进行后续的激活绑定流程。局域网绑定的方案主要适用于无需依赖其他设备进行配网,就可连接路由的设备。

流程说明

设备路由器APP云端有线或无线连接连接成功,返回 IP连接连接成功监听广播包发送广播帧转发广播帧发起连接连接成功获取 Token返回 Token发送 Token接收成功定期查询设备信息注册激活激活成功返回激活成功设备设备路由器APP云端

开发指导

环境准备

  • App 和设备连接在同一个局域网。
  • 设备本地端口 6667、6668、7000 未被限制。
  • 路由器可以访问广域网。

设备开发

  • 设置配网模式为有线配网。

    connect_mode = PARING_MODE_WIRED
    
    static OPERATE_RET __TUYA_IPC_SDK_START(TUYA_IPC_PARING_MODE_E connect_mode, CHAR_T *p_token)
    {
        printf("SDK Version:%s\r\n", tuya_ipc_get_sdk_info());
        TUYA_IPC_LINK_TYPE_E link_type = TUYA_IPC_LINK_WIRE;
    TUYA_IPC_SDK_RUN_VAR_S ipc_sdk_run_var ={0};
    memset(&ipc_sdk_run_var,0,sizeof(ipc_sdk_run_var));
    
    /*certification information(essential)*/
    strcpy(ipc_sdk_run_var.iot_info.product_key,s_ipc_pid);
    strcpy(ipc_sdk_run_var.iot_info.uuid,s_ipc_uuid);
    strcpy(ipc_sdk_run_var.iot_info.auth_key,s_ipc_authkey);
    strcpy(ipc_sdk_run_var.iot_info.dev_sw_version,s_app_version);
    strcpy(ipc_sdk_run_var.iot_info.cfg_storage_path,s_ipc_storage);
    //normal device
    ipc_sdk_run_var.iot_info.dev_type = NORMAL_POWER_DEV;
    //if needed, change to low power device
    //ipc_sdk_run_var.iot_info.dev_type= LOW_POWER_DEV;
    
    /*connect mode (essential)*/
    ipc_sdk_run_var.net_info.connect_mode = connect_mode;
    ipc_sdk_run_var.net_info.ipc_status_change_cb = TUYA_IPC_Status_Changed_cb;
        ipc_sdk_run_var.net_info.link_type = link_type;
        printf("MODE:%d  LINK_TYPE:%d\r\n", connect_mode, ipc_sdk_run_var.net_info.link_type);
    if(p_token)
    {
        strcpy(ipc_sdk_run_var.debug_info.qrcode_token,p_token);
    }
    
  • 设置连接模式为有线连接。

    TUYA_IPC_LINK_TYPE_E link_type = TUYA_IPC_LINK_WIRE;
    ipc_sdk_run_var.net_info.link_type = link_type;
    
  • 适配 tkl_wired.c
    开发框架会提供一套 Linux 标准实现接口,您根据平台特性需要检查并完成适配。
    特别关注以下 API:

    • tkl_wired_set_status_cb

      OPERATE_RET tkl_wired_set_status_cb(TKL_WIRED_STATUS_CHANGE_CB cb);
      

      当网络状态发生变更时,需要回调接口主动告知 SDK。
      例如,当断开以太网时,执行 cb(TKL_WIRED_LINK_DOWN)。当连接以太网并分配到 IP 地址时,执行 cb(TKL_WIRED_LINK_UP)
      如果 App 无法通过局域网发现设备,或者设备没有发送广播包,可以先确认是否将 TKL_WIRED_LINK_UP 状态告知 SDK。

    • tkl_wired_get_status

      当 SDK 需要获取当前网络接口的连接状态时,会调用该接口,SDK 关心的是网络接口是否有 IP 地址。如果网络接口是处于激活状态并且有 IP 地址,则返回 TKL_WIRED_LINK_UP,否则返回 TKL_WIRED_LINK_DOWN

    • tkl_wired_get_ip

      当 SDK 需要获取当前网络接口的 IP 地址时,会调用该接口,用于 Socket 通讯绑定地址。对于多网口设备,返回的是哪个网络接口的IP 地址,就使用哪个网络接口通讯。一般使用连接外网的网络接口,根据自己的实际情况正确返回 IP 地址。

  • API 调用顺序如下。

启动配网
调用 tkl_wifi_init
调用 tkl_wifi_station_get_status
调用 tkl_wifi_get_mac
调用 tkl_wired_get_ip
调用 tkl_wifi_set_work_mode
调用 tkl_wifi_get_work_mode
调用 tkl_wired_set_status_cb
调用 tkl_wired_get_status
调用 tkl_wired_get_ip
设备有线连接状态主动通过 TKL_WIRED_STATUS_CHANGE_CB 告知 SDK 状态
SDK 内部完成云端注册激活
设备通过 ipc_status_change_cb 回调感知设备上线成功
结束配网

常见问题

App 无法发现设备?

  1. 设备和 App 是否连入同一局域网。
  2. 配网模式和连接模式是否正确设置。
  3. tuya_ipc_init_sdktuya_ipc_start_sdk 初始化服务 API 是否有明显异常退出。
  4. TKL 接口适配是否完整,TKL_WIRED_LINK_UP 状态是否回调给 SDK。
  5. 设备本地端口 6667、6668、7000 是否有限制。
  6. 确认设备日志等级为 TY_LOG_LEVEL_DEBUG,是否有 lan init success 串口日志输出。
  7. 网络抓包分析。

App 可以发现设备,但是无法添加或者添加失败?

  1. 确认 App 是否成功连接路由器广域网。
  2. 设备初始化传入 PID、UUID、AUTHKEY 信息是否正确,有无拼写错误。

设备支持无线,想通过局域网绑定,应该如何设置配网模式和连接模式?

  • 配网模式设置为:PARING_MODE_WIRED
  • 连接模式设置为:TUYA_IPC_LINK_WIRE
  • tkl_wifi.ctkl_wired.c 都需要适配。

设备同时支持无线和有线,想使用局域网绑定,应该如何设置配网模式和连接模式?

  • 配网模式设置为:PARING_MODE_WIRED
  • 连接模式设置为:TUYA_IPC_LINK_WIRE
  • 设置有线连接优先 tuya_svc_netmgr_linkage_set_default(LINKAGE_TYPE_WIRED)

设备配网过程中日志不断打印 unreg not found,是什么原因?

  1. 检查 tkl_system 组件里面 tkl_queue_create_init 平台适配是否完整,还有其他 queue 相关接口是否有平台适配差异。
  2. 确认修改的 tkl_system 代码编译到程序里面。
  3. 走查其他的 TKL 适配。