• NXP QN9020


    NXP的这个BLE蓝牙方案也很有趣, 一起研究.

    这个函数在app_gpa_task.c里面

     ****************************************************************************************
     * @brief Handles create connection request complete event from the GAP.    *//**  处理GAP连接结束后的事件.
     *
     * @param[in] msgid     GAP_LE_CREATE_CONN_REQ_CMP_EVT   参数一是GAP连接请求处理完毕的event的id
     * @param[in] param     Pointer to struct gap_le_create_conn_req_cmp_evt 参数二是这个event的struct的指针.
     * @param[in] dest_id   TASK_APP   目的设备的id
     * @param[in] src_id    TASK_GAP  源设备的id
     *
     * @return If the message was consumed or not.  return是消息是否成功发送.
     * @description
     *
     * This handler is used to inform the application the outcome of connection establishment.
     ****************************************************************************************
     */
    #if (!BLE_BROADCASTER && !BLE_OBSERVER)     //确定一下不是广播或者观察设备.
    int app_gap_le_create_conn_req_cmp_evt_handler(ke_msg_id_t const msgid, struct gap_le_create_conn_req_cmp_evt const *param,
                                                   ke_task_id_t const dest_id, ke_task_id_t const src_id)   //参数跟函数名.
    {
        QPRINTF("Connection with %02X%02X%02X%02X%02X%02X result is 0x%x. ",   //打印一下, 这个连接上来的设备是谁, 地址多少, 这个地址会变化, 应该不是mac地址...
            param->conn_info.peer_addr.addr[5],
            param->conn_info.peer_addr.addr[4],
            param->conn_info.peer_addr.addr[3],
            param->conn_info.peer_addr.addr[2],
            param->conn_info.peer_addr.addr[1],
            param->conn_info.peer_addr.addr[0],
            param->conn_info.status);

        if (APP_ADV == ke_state_get(TASK_APP))  //这里TASK_APP, 是在一个在ke_task.h的文件里面定义的, 我看了一下, 跟OSAL的定义很像, 定义了一个枚举类型, 里面有两个是app层面的task, 一个叫TASK_APP, 另一个叫TASK_USER, 这里的意思是确定一下当前的state是广告
        {
            ke_state_set(TASK_APP, APP_IDLE);  //既然连接上了, 就把state设置成APP_IDLE
            app_set_role(GAP_PERIPHERAL_SLV);   //然后把角色设置成peripheral还是个slave
        }
        else
        {
            app_set_role(GAP_CENTRAL_MST);   //如果当前不是广告的, 是这个设备主动连的人家, 那就是central+master了.
        }

        if (param->conn_info.status == CO_ERROR_NO_ERROR)   //这里是连接出错的处理
        {
            app_set_link_status_by_conhdl(param->conn_info.conhdl, &param->conn_info, true);

            // Enable service here, for Server init phase 2
    #if (BLE_PERIPHERAL)   //如果设备设置成peripheral, 那么就要启动server, 提供service
            app_enable_server_service(true, param->conn_info.conhdl);
    #endif
        }

        app_task_msg_hdl(msgid, param);    //这里估计就跟OSAL一样, 将标记恢复成已处理状态, 避免事件被重复执行.
        
        return (KE_MSG_CONSUMED);
    }
    #endif

    上面是连接成功, 紧接着断开就不分析了, 差不多.

    来看看写入char的值是如何处理的.

    在app_qpps_task.c里面, 有个app_qpps_data_ind_handler的函数.

        ///Client value send to APP
        QPPS_DAVA_VAL_IND,

     ****************************************************************************************
     * @brief Handles the data ind message from the QPPS.       *//**
     *
     * @param[in] msgid     QPPS_DAVA_VAL_IND  看上面的define, 内意思, 这个时候, client, 就是手机, 发送了数据给server, 即9020
     * @param[in] param     Pointer to the struct qpps_data_val_ind   数据都在这儿了.
     * @param[in] dest_id   TASK_APP 
     * @param[in] src_id    TASK_QPPS
     *
     * @return If the message was consumed or not.
     * @description
     * This handler is used to handle the data sent form peer device
     *
     ****************************************************************************************
     */
    int app_qpps_data_ind_handler(ke_msg_id_t const msgid,
                                  struct qpps_data_val_ind *param,
                                  ke_task_id_t const dest_id,
                                  ke_task_id_t const src_id)
    {
        if (param->length > 0)
        {
            QPRINTF("len=%d, I%02X", param->length, param->data[0]);
        }
        QPRINTF(" ");

        return (KE_MSG_CONSUMED);
    }

    我xue微的修改一下, 把内容打印一下吧.

        unsigned int i;
        QPRINTF("Client sent:");
        if (param->length > 0)
        {
            //QPRINTF("len=%d, I%02X", param->length, param->data[0]);
                for(i=0;i<param->length;i++){
                QPRINTF("%02X ", param->data[i]);
                }
        }
        QPRINTF(" ");

    欧了.

  • 相关阅读:
    搭建hexo个人博客
    Scanner类使用close()方法问题
    记录一次Ubuntu基础配置和美化
    Linux更换默认Shell
    python-成员修饰符
    ysoserial项目之URLDNS利用分析
    Apereo Cas4.x 反序列化漏洞复现之复现分析与利用
    JAVA反序列化漏洞之调试环境搭建(含ysoserial项目)
    虚拟机window7忘记密码,如何重置?
    多种类型SQL注入
  • 原文地址:https://www.cnblogs.com/Montauk/p/5545368.html
Copyright © 2020-2023  润新知