上位机操作:
点击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 } ... }
|