请选择 进入手机版 | 继续访问电脑版
查看: 821|回复: 0

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

[复制链接]

8

主题

12

帖子

33

积分

助理工程师

Rank: 1

积分
33
发表于 2020-7-31 22:02:27 | 显示全部楼层 |阅读模式
本帖最后由 BLE001 于 2020-7-31 22:06 编辑

能使用gateway工程配合dongle硬件进行配网后,我们来分析一下gateway工程代码。
上位机操作:
    点击Scan开始搜索设备并通过USB下发 e9 ff 01
    点击Stop停止搜索设备并通过USB下发 e9 ff 00


代码分析:
    在USB回调函数中调用 app_hci_cmd_from_usb_handle 并进行处理,我们将关键代码提取出来:

HCI_CMD_GATEWAY_CTL                        = 0xFFE9
HCI_GATEWAY_CMD_START                = 0x00
HCI_GATEWAY_CMD_STOP                = 0x01

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];
        if(op_code == HCI_GATEWAY_CMD_START){
                set_provision_stop_flag_act(0);
        }else if (op_code == HCI_GATEWAY_CMD_STOP){
                set_provision_stop_flag_act(1);
        }
}

void set_provision_stop_flag_act(u8 stop_flag)
{
        provision_mag.pro_stop_flag = stop_flag;
        if(stop_flag){
                mesh_provision_para_reset();               
                prov_para.link_id_filter =0;
                disable_mesh_adv_filter();
                gateway_adv_filter_init();
                rf_link_light_event_callback(PROV_END_LED_CMD);
        }else{
                rf_link_light_event_callback(PROV_START_LED_CMD);       
        }
}


上位机操作:
    在ScanDev窗口显示MAC地址。

代码分析:
    在gateway_upload_mac_address函数中上报数据:
   数据格式为:TSCRIPT_GATEWAY_DIR_RSP + HCI_GATEWAY_CMD_UPDATE_MAC + 6字节的MAC地址 + 广播包数据

HCI_GATEWAY_CMD_UPDATE_MAC         = 0x88,
TSCRIPT_GATEWAY_DIR_RSP          = 0x91,

void mesh_pro_rc_beacon_dispatch(pro_PB_ADV *p_adv,u8 *p_mac){
    ...
        // if the stop flag ==1 ,can not send link open cmd part
        if(provision_mag.pro_stop_flag){        //需要先点击Scan
                return ;
        }
        // upload the adv part and the device uuid part
        gateway_upload_mac_address(p_mac,(u8 *)p_adv);
    ...
}

u8 gateway_upload_mac_address(u8 *p_mac,u8 *p_adv)
{
        u8 para[40];//0~5 mac,adv ,6,rssi ,7~8 dc
        u8 len;
        len = p_adv[0];
        memcpy(para,p_mac,6);
        memcpy(para+6,p_adv,len+4);
        return gateway_common_cmd_rsp(HCI_GATEWAY_CMD_UPDATE_MAC,para,len+10);
}

u8 gateway_common_cmd_rsp(u8 code,u8 *p_par,u8 len )
{
        u8 head[3] = {TSCRIPT_GATEWAY_DIR_RSP};
        head[1] = code;
    if(code == HCI_GATEWAY_CMD_SEND_CPS_INFO){
        ...
    }else{
                return my_fifo_push_hci_tx_fifo(p_par,len, head, 2);
        }
}


上位机操作:
   在ScanDev窗口中选择并双击需要配网的MAC,这时USB会往模块发e9 ff 08 + 6字节的MAC地址。
代码分析:
HCI_CMD_GATEWAY_CTL                                = 0xFFE9
HCI_GATEWAY_CMD_SET_ADV_FILTER         = 0x08

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_ADV_FILTER){
                set_gateway_adv_filter(p+1);
        }
    ...
}

static u8 gateway_connect_filter[6];
void set_gateway_adv_filter(u8 *p_mac)
{
        memcpy(gateway_connect_filter,p_mac,sizeof(gateway_connect_filter));        //更改gateway_connect_filter
}

回复

使用道具 举报

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

本版积分规则

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