查看: 1194|回复: 0

[技术交流] 8258_mesh_gw 工程说明-代码说明(二)

[复制链接]

8

主题

12

帖子

33

积分

助理工程师

Rank: 1

积分
33
发表于 2020-7-31 22:09:55 | 显示全部楼层 |阅读模式
上位机操作:
    点击Prov会跳出provision窗口,并且USB会往模块发e9 ff 0c
   模组收到并处理后会上报:91 8b + sts + pro_net_info
   sts 为0:表示网关没有配网信息,可以点击SetPro_internal设置网关配置信息(pro_net_info)。
   sts 为1:表示网关已有配网信息,无法点击SetPro_internal设置网关配置信息(pro_net_info)。



代码分析:

HCI_CMD_GATEWAY_CTL                                 = 0xFFE9
HCI_GATEWAY_CMD_GET_PRO_SELF_STS       = 0x0c
HCI_GATEWAY_CMD_PRO_STS_RSP                  = 0x8b


typedef struct{
        u8  net_work_key[16];
        u16  key_index;
        union{
                mesh_ctl_fri_update_flag_t prov_flags;
                u8  flags;
        };
        u8  iv_index[4];
        u16  unicast_address;
}provison_net_info_str;


int app_hci_cmd_from_usb_handle (u8 *buff, int n)
{
    u16 type = buff[0] + (buff[1] << 8);
    u8 *hci_data = buff + HCI_CMD_LEN;
    u16 hci_data_len = n - HCI_CMD_LEN;
        ...
    else if (HCI_CMD_GATEWAY_CTL == type){
            gateway_cmd_from_host_ctl(hci_data, hci_data_len);
        }
    ...
}


u8 gateway_cmd_from_host_ctl(u8 *p, u16 len )
{
        u8 op_code = p[0];
    ...               
        else if (op_code == HCI_GATEWAY_CMD_GET_PRO_SELF_STS){
                gateway_upload_provision_slef_sts(is_proved_state());
        }
    ...
}


u8 gateway_upload_provision_slef_sts(u8 sts)
{
        u8 buf[26];
        buf[0]=sts;
        if(sts){
                memcpy(buf+1,(u8 *)(&provision_mag.pro_net_info),25);
        }
        provison_net_info_str* p_net = (provison_net_info_str*)(buf+1);
        p_net->unicast_address = provision_mag.unicast_adr_last;
        return gateway_common_cmd_rsp(HCI_GATEWAY_CMD_PRO_STS_RSP,buf,sizeof(buf));
}




上位机操作:
如果网关没有配网信息,则需点击SetPro_internal,此时USB会往模块下发
    e9 ff 09 + pro_net_info
    e9 ff 0d + mesh_gw_set_devkey_str

代码分析:
HCI_CMD_GATEWAY_CTL                                 = 0xFFE9
HCI_GATEWAY_CMD_SET_PRO_PARA          = 0x09
HCI_GATEWAY_CMD_SET_DEV_KEY      = 0x0d

typedef struct{
        u8  net_work_key[16];
        u16  key_index;
        union{
                mesh_ctl_fri_update_flag_t prov_flags;
                u8  flags;
        };
        u8  iv_index[4];
        u16  unicast_address;
}provison_net_info_str;

typedef struct{
    u16 unicast;
    u8 dev_key[16];
}mesh_gw_set_devkey_str;

int app_hci_cmd_from_usb_handle (u8 *buff, int n)
{
    u16 type = buff[0] + (buff[1] << 8);
    u8 *hci_data = buff + HCI_CMD_LEN;
    u16 hci_data_len = n - HCI_CMD_LEN;
        ...
    else if (HCI_CMD_GATEWAY_CTL == type){
            gateway_cmd_from_host_ctl(hci_data, hci_data_len);
        }
    ...
}

u8 gateway_cmd_from_host_ctl(u8 *p, u16 len )
{
        u8 op_code = p[0];
    ...               
        else if (op_code == HCI_GATEWAY_CMD_SET_PRO_PARA){
                // set provisioner net info para
                provison_net_info_str *p_net;
                p_net = (provison_net_info_str *)(p+1);
                provision_mag.gatt_mode = GATT_PROXY_MODE;
                set_provisioner_para(p_net->net_work_key,p_net->key_index,
                                                                p_net->flags,p_net->iv_index,p_net->unicast_address);
                // use the para (node_unprovision_flag) ,and the flag will be 0
        }       
    else if (op_code == HCI_GATEWAY_CMD_SET_DEV_KEY){
        mesh_gw_set_devkey_str *p_set_devkey = (mesh_gw_set_devkey_str *)(p+1);
        set_dev_key(p_set_devkey->dev_key);
        #if (DONGLE_PROVISION_EN)
                        VC_node_dev_key_save(p_set_devkey->unicast,p_set_devkey->dev_key,2);
            #endif
        }
    ...
}





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表