This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

sensor如何通过指定PanID入网?

设置一个已知PANID网络,让sensor,主动加入

  • collector不能要求sensor 主动入网,入网请求是sensor发起的。
  • 你可以把collector跟sensor的PANID都設置成一樣,但是還是需要collector使能permit join才能讓sensor加入到相同PANID的collector
  • 我的意思是,sensor发起beaacon request,我动态传入一个PANID,这样可以实现,加入指定网络吗?
  • 动态?是可以的,不过你需要HOLD_START,禁止上电自动入网扫网。

    试着动态修改如下应该可以实现

     Public function defined in cllc.h
     */
    void Cllc_init(ApiMac_callbacks_t *pMacCbs, Cllc_callbacks_t *pCllcCbs)
    {
        uint16_t panId = CONFIG_PAN_ID;
    
        /* Initialize coordinator PAN ID if a valid value is defined in config */
        if((panId != 0x0000) && (panId != CLLC_INVALID_PAN))
        {
            coordInfoBlock.panID = panId;
        }

    。。。。。。。

  • 如果我清除sensor的信息,然后在设置sensor的PANID,collector使能permit join是打开的。sensor可以加入到设置的PANID中吗?那原来的collector的sensor NV信息不清除会影响吗?
  • 这个PANID动态传入我已经实现了,我的意思是,如果现在有collector 的panid X和Y,x属于当前连接,现在我要断掉x,去连接y。sensor清空当前NV信息,然后去连接Y。那x,里面的sensor信息,会有影响吗?或者说现在此功能已经实现了。
  • 不会有影响,当你向这X网络时会发出leave请求

    Cllc_removeDevice会清除NV的。
    /*!
    * @brief Handle Disassociate indication callback
    *
    * @param pData - pointer to disassociate indication structure
    */
    static void disassocIndCb(ApiMac_mlmeDisassociateInd_t *pData)
    {
    if(pData->disassociateReason == ApiMac_disassocateReason_device)
    {
    /* remove device from association table */
    Cllc_removeDevice(&pData->deviceAddress);
    }

    if(macCallbacksCopy.pDisassociateIndCb)
    {
    macCallbacksCopy.pDisassociateIndCb(pData);
    }
    }
  • 你的意思是,我在当前网络里面,可以直接去连接其他网络?sensor里面的NV信息,不需要自己处理。回调时候会自己清除?
    如果我用collector控制sensor,断开连接,先发送分离请求,然后清掉NV,然后加入黑名单。这中间的删除NV的时候,拓展地址我应该怎么得到, id.subID,一直没有弄清楚是什么意思?这个ID对应的是一条NV信息吗?可以通过短地址查询到吗?你能跟我讲解下吗?
    Cllc_sendDisassociationRequest(item.devInfo.shortAddress,
    item.capInfo.rxOnWhenIdle);

    /* remove device from the NV list */
    Cllc_removeDevice(&item.devInfo.extAddress);

    /* Remove it from the Device list */
    Csf_removeDeviceListItem(&item.devInfo.extAddress);
    Csf_addBlackListItem(&addr);
  • 如果sensor 是被collector 踢出会进到

    static void jdllcDisassocIndCb(ApiMac_sAddrExt_t *pExtAddress,
                                   ApiMac_disassocateReason_t reason)
    {
        /* Stop the reporting timer */
        Ssf_setReadingClock(0);
        Ssf_clearNetworkInfo();
    
    #ifdef FEATURE_NATIVE_OAD
        /* OAD abort with no auto resume */
        OADClient_abort(false);
    #endif //FEATURE_NATIVE_OAD
    }

    也就是会clear networkinfo。

    如果是主动退出调用如下;

     Send disassociation request.
    
     Public function defined in jdllc.h
     */
    void Jdllc_sendDisassociationRequest(void)
    {
        ApiMac_mlmeDisassociateReq_t disassocReq;
    
        /* Zero-init the data strcture
         * set up the sec field: no security
         * */
        memset(&disassocReq,0x00, sizeof(disassocReq));
    
        if(CONFIG_FH_ENABLE && CONFIG_RX_ON_IDLE)
        {
            disassocReq.deviceAddress.addrMode = ApiMac_addrType_extended;
            Util_copyExtAddr(&disassocReq.deviceAddress.addr.extAddr,
                             &devInfoBlock.coordExtAddr);
        }
        else
        {
            disassocReq.deviceAddress.addrMode = ApiMac_addrType_short;
            disassocReq.deviceAddress.addr.shortAddr = devInfoBlock.coordShortAddr;
        }
    
        disassocReq.devicePanId = devInfoBlock.panID;
        disassocReq.disassociateReason = ApiMac_disassocateReason_device;
        disassocReq.txIndirect = false;
        ApiMac_mlmeDisassociateReq(&disassocReq);
    }
    也会清掉network info。


  • 如果有疑问建议你有问题之前多去读一下:


    dev.ti.com/.../beacon-mode.html
  • 因为我测试出来的东西跟这个不一致,non beacon-mode我自己分配了collector的信道CONFIG_CHANNEL_MASK{03},这个时候sensor的CONFIG_CHANNEL_MASK{FF},只有这一个collector,sensor入网信道是0,我通过抓包和sensor的串口输出得到的。
  • collector的信道CONFIG_CHANNEL_MASK{03}是可以在信道0或1組網,你先確認collector是在信道0還是1,不然就是把collector的信道設置為CONFIG_CHANNEL_MASK{0x02},這樣collector就一定是在信道1組網,你在測試看看

  • 我把collector改为0x02,sensor 为FF,确实在信道1组网,为何collector是0x03,在0信道,信道定义不是从0x01--0x07吗?
  • 信道定義是bit flag,換句話說0x01是信道0,0x02是信道1,0x04是信道2,0x08是信道3,0x10是信道4,0x20是信道5,0x40是信道6,你設置是3的話就是0x01|0x02所以是開了信道0跟1
  • 哦,知道了,是跟事件定义差不多。好的,非常感谢IT支持。
  • 刚刚看网络加入的图,貌似测试不出来。我的目的是,sensor直接加入collector。
    sensor发送beaacon request,回调过来的是collector的NV信息,然后把collector的panid存起来,发送关联请求。
    如果是这样子。我要主动去连接collector,是不是直接去发送对应collector的关联请求就可以入网了?
  • 你沒有開permit join的話是加不進去的
  • 已經在另一個你類似的討論串回覆