⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layer3infodecode.cpp

📁 ABis无线接口全套资料
💻 CPP
📖 第 1 页 / 共 5 页
字号:
CCellInfo Cell_Infomation; 
map <link_info,CCellInfo> cellinfo_map;
map <link_info,CCellInfo>::iterator  iter;
void layer3_system_information_type2(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	struct SNccPermitted ncc_permit;
	struct SRachControlParameters rach_control;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_system_information_type2:input parameter error!");
		return;
	}

	offset++;// L2 Pseudo Length

	if((msuBuf[offset] & 0x0f) != RADIO_MANAGEMTNE){
	        //printf("layer3_system_information_type2:error RADIO_MANAGEMTNE\n");
	        return;
	}
	offset++;

	if(msuBuf[offset] != LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2)
	{
    	//printf("layer3_system_information_type2:error LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2\n");
    	return;
	}
	//store system type
	pdu.PutIE(LAYER3INFO_IE_SYSTEM_TYPE,	sizeof(UINT8), (char *)&msuBuf[offset]);
	offset++;

//test 察看主要的format_ID
    {
        SCellChannelDescripFormat& frmid = *((SCellChannelDescripFormat*)msuBuf+3);
        unsigned char* pos = msuBuf+offset;
	 if(frmid.BIT126 != 0)
	 	printf("system type2 frmid.BIT126 != 0\n");
        if((frmid.BIT128 == 0)&&(frmid.BIT127 == 0))
        {
        	unsigned char bitmap0[124];
    		int j = 0;

    		memset(bitmap0, 0, sizeof(bitmap0));

            for(int i = 15; i >= 1; --i)
            {
            	SCharBitMap& bmap = *((SCharBitMap*)(pos+i));

                bitmap0[j] = bmap.BIT0;
                j++;

                bitmap0[j] = bmap.BIT1;
                j++;

                bitmap0[j] = bmap.BIT2;
                j++;

                bitmap0[j] = bmap.BIT3;
                j++;

                bitmap0[j] = bmap.BIT4;
                j++;

                bitmap0[j] = bmap.BIT5;
                j++;


                bitmap0[j] = bmap.BIT6;
                j++;

                bitmap0[j] = bmap.BIT7;
                j++;

            }


            SCharBitMap& bmap = *((SCharBitMap*)(pos));
            {
                    bitmap0[j] = bmap.BIT0;
                    j++;

                    bitmap0[j] = bmap.BIT1;
                    j++;


                    bitmap0[j] = bmap.BIT2;
                    j++;

                    bitmap0[j] = bmap.BIT3;
            }

    		pdu.PutIE(LAYER3INFO_IE_BITMAP0, sizeof(bitmap0), (char *)bitmap0);

		short linknumber = 0;
		CIeBase  * pIe = NULL;
		struct SAddressField address_field;

		 pIe = pdu.GetIE(ABIS_LK_IE_LINKNUMBER);
		 if(pIe != NULL)
		 {

		        UINT32 data = pIe->GetIeData();

			memcpy(&linknumber, (char *)&data, sizeof(short));
			struct link_header joyit_header;
			memcpy(&joyit_header, (char *)&data, sizeof(link_header));
			pIe = pdu.GetIE(ABIS_LK_IE_ADDRESS);
			if(pIe != NULL)
			{
				UINT32 data2 = pIe->GetIeData();

				memcpy(&address_field, (char *)&data2, sizeof(SAddressField));
				link_info Link_Infomation;
				//Link_Infomation.linknum = linknumber;
				Link_Infomation.linknum = (joyit_header.E1_num) |((joyit_header.board_num&0x07)<<3);
				Link_Infomation.address_TEI = address_field.TEI;
				Link_Infomation.address_SAPI = address_field.SAPI;
				cellinfo_map[Link_Infomation] + Cell_Infomation.CCellInfo_bitmap(LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2,(char *)bitmap0);
			}
		 }
        }
        else if((frmid.BIT128 == 1)&&(frmid.BIT127 == 0)&&(frmid.BIT124 == 0))
        {
            printf("sys info 2 1024 range\t");
        }
        else if((frmid.BIT128 == 1)&&(frmid.BIT127 == 0)&&(frmid.BIT124 == 1)&&(frmid.BIT123 == 0)&&(frmid.BIT122 == 0))
        {
            printf("sys info 2 512 range\t");
        }
        else if((frmid.BIT128 == 1)&&(frmid.BIT127 == 0)&&(frmid.BIT124 == 1)&&(frmid.BIT123 == 0)&&(frmid.BIT122 == 1))
        {
            printf("sys info 2 256 range\n");
        }
        else if((frmid.BIT128 == 1)&&(frmid.BIT127 == 0)&&(frmid.BIT124 == 1)&&(frmid.BIT123 == 1)&&(frmid.BIT122 == 0))
        {
            printf("sys info 2 128 range\t");
        }
        else if((frmid.BIT128 == 1)&&(frmid.BIT127 == 0)&&(frmid.BIT124 == 1)&&(frmid.BIT123 == 1)&&(frmid.BIT122 == 1))
        {
        	int orig_arfcn = 0;

        	struct SVBitFormat bitfmt;
    		struct SVBitFormat vbit[111];

        	SCharBitMap bmap = *((SCharBitMap*)(pos));
    		int j = 0;
    		orig_arfcn = (bmap.BIT0<<9) | ((*(pos+1))<<1) |((*(pos+2)&0x80)>>7);
    		pos += 2;

    		memset(&vbit, 0, sizeof(vbit));
    		bmap = *((SCharBitMap*)(pos));

    		if(bmap.BIT6 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;

    		if(bmap.BIT5 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;

    		if(bmap.BIT4 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;

    		if(bmap.BIT3 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;

    		if(bmap.BIT2 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;

    		if(bmap.BIT1 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;

    		if(bmap.BIT0 != 0){
    			vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    			//vbit[j].set = 1;
    		}
    		j++;
    		pos++;

    		for(int i = 0; i < 13; i++)
    		{
    			SCharBitMap bmap = *((SCharBitMap*)(pos+i));


    			if(bmap.BIT7 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT6 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT5 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT4 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT3 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT2 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT1 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;

    			if(bmap.BIT0 != 0){
    				vbit[j].rrfcn = (orig_arfcn + (j+1)) % 1024;
    				//vbit[j].set = 1;
    			}
    			j++;
    		}

    		pdu.PutIE(LAYER3INFO_IE_VBITMAP, sizeof(vbit), (char *)(struct SVBitFormat *)&vbit);

		short linknumber = 0;
		CIeBase  * pIe = NULL;
		struct SAddressField address_field;

		 pIe = pdu.GetIE(ABIS_LK_IE_LINKNUMBER);
		 if(pIe != NULL)
		 {

		        UINT32 data = pIe->GetIeData();

			memcpy(&linknumber, (char *)&data, sizeof(short));
			struct link_header joyit_header;
			memcpy(&joyit_header, (char *)&data, sizeof(link_header));
			
			pIe = pdu.GetIE(ABIS_LK_IE_ADDRESS);
			if(pIe != NULL)
			{
				UINT32 data2 = pIe->GetIeData();

				memcpy(&address_field, (char *)&data2, sizeof(SAddressField));
				link_info Link_Infomation;
				//Link_Infomation.linknum = linknumber;
				Link_Infomation.linknum = (joyit_header.E1_num) |((joyit_header.board_num&0x07)<<3);
				Link_Infomation.address_TEI = address_field.TEI;
				Link_Infomation.address_SAPI = address_field.SAPI;
				cellinfo_map[Link_Infomation] + Cell_Infomation.CCellInfo_vbit(LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2,(struct SVBitFormat *)&vbit);
			}
		 }
        }
        else
        {
            printf("sys info 2 error systeme type format\n");
        }
    }

	offset += 16; // BCCH Frequency List

	memcpy(&ncc_permit, &msuBuf[offset], sizeof(SNccPermitted));
	pdu.PutIE(LAYER3INFO_IE_NCC_PERMITTED, sizeof(SNccPermitted), (char *)&ncc_permit);
	offset += sizeof(SNccPermitted);

	memcpy(&rach_control, &msuBuf[offset], sizeof(SRachControlParameters));
	pdu.PutIE(LAYER3INFO_IE_RACH_CONTROL_PARAMETER, sizeof(SRachControlParameters), (char *)&rach_control);

	{
		//Add for test code
		short linknumber = -1;
		int pcm = -1;
		int cell_id = -1;
		CIeBase  * pIe = NULL;
		unsigned char tei = 0;

		 pIe = pdu.GetIE(ABIS_LK_IE_LINKNUMBER);
	        if(pIe != NULL)
	        {

	            UINT32 data = pIe->GetIeData();

	            memcpy(&linknumber, (char *)&data, sizeof(short));
		     pcm = linknumber / 64;
	        }

		  pIe = pdu.GetIE(ABIS_LK_IE_ADDRESS);
		   if(pIe != NULL)
		   {
		        UINT32 data = pIe->GetIeData();
		        SAddressField addr = *((SAddressField*)&data);
		        tei = addr.TEI;
			cell_id = BtsTrx2Cell(pcm, tei-1);
		   }
		   msg_array[pcm][cell_id].system_type2++;
	}
}


void layer3_system_information_type2bis(unsigned char *msuBuf, short msu_len, CPduBase &pdu)
{
	short offset = 0;
	struct SRachControlParameters rach_control;

	if((msuBuf == NULL) || (msu_len <= 0)){
		//Print("layer3_system_information_type2bis:input parameter error!");
		return;
	}

	offset ++; //skip L2 Pseudo Length

	//RR management Protocol Discriminator and Skip Indicator
	if((msuBuf[offset] & 0x0f) != RADIO_MANAGEMTNE){
		printf("layer3_system_information_type3:error, not equal to RADIO_MANAGEMTNE\n");
		return;
	}
	offset++; // skip RR management Protocol Discriminator and Skip Indicator

	if(msuBuf[offset] != LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2BIS){
		printf("layer3_system_information_type2bis:error, not equal to LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2BIS\n");
		return;
	}
		//store system type
	pdu.PutIE(LAYER3INFO_IE_SYSTEM_TYPE,	sizeof(UINT8), (char *)&msuBuf[offset]);
	offset++;// System information type 3


	{
	        SCellChannelDescripFormat& frmid = *((SCellChannelDescripFormat*)msuBuf+3);
	        unsigned char* pos = msuBuf+offset;

		 if(frmid.BIT126 != 0)
	 		printf("system type2 frmid.BIT126 != 0\n");
       	 if((frmid.BIT128 == 0)&&(frmid.BIT127 == 0))
	        {
	        	unsigned char bitmap0[124];
	    		int j = 0;

	    		memset(bitmap0, 0, sizeof(bitmap0));

	            for(int i = 15; i >= 1; --i)
	            {
	            	SCharBitMap& bmap = *((SCharBitMap*)(pos+i));

	                bitmap0[j] = bmap.BIT0;
	                j++;

	                bitmap0[j] = bmap.BIT1;
	                j++;

	                bitmap0[j] = bmap.BIT2;
	                j++;

	                bitmap0[j] = bmap.BIT3;
	                j++;

	                bitmap0[j] = bmap.BIT4;
	                j++;

	                bitmap0[j] = bmap.BIT5;
	                j++;


	                bitmap0[j] = bmap.BIT6;
	                j++;

	                bitmap0[j] = bmap.BIT7;
	                j++;

	            }


	            SCharBitMap& bmap = *((SCharBitMap*)(pos));
	            {
	                    bitmap0[j] = bmap.BIT0;
	                    j++;

	                    bitmap0[j] = bmap.BIT1;
	                    j++;


	                    bitmap0[j] = bmap.BIT2;
	                    j++;

	                    bitmap0[j] = bmap.BIT3;
	            }

	    		pdu.PutIE(LAYER3INFO_IE_BITMAP0, sizeof(bitmap0), (char *)bitmap0);

			short linknumber = 0;
			CIeBase  * pIe = NULL;
			struct SAddressField address_field;

		 	pIe = pdu.GetIE(ABIS_LK_IE_LINKNUMBER);
		 	if(pIe != NULL)
		 	{

		       	UINT32 data = pIe->GetIeData();

				memcpy(&linknumber, (char *)&data, sizeof(short));
				struct link_header joyit_header;
				memcpy(&joyit_header, (char *)&data, sizeof(link_header));
			
				pIe = pdu.GetIE(ABIS_LK_IE_ADDRESS);
				if(pIe != NULL)
				{
					UINT32 data2 = pIe->GetIeData();

					memcpy(&address_field, (char *)&data2, sizeof(SAddressField));
					link_info Link_Infomation;
					//Link_Infomation.linknum = linknumber;
					Link_Infomation.linknum = (joyit_header.E1_num) |((joyit_header.board_num&0x07)<<3);
					Link_Infomation.address_TEI = address_field.TEI;
					Link_Infomation.address_SAPI = address_field.SAPI;
					cellinfo_map[Link_Infomation] + Cell_Infomation.CCellInfo_bitmap(LAYER3INFO_MSG_SYSTEM_INFORMATION_TYPE2BIS,(char *)bitmap0);
				}
		 	}		
	        }
	        else if((frmid.BIT128 == 1)&&(frmid.BIT127 == 0)&&(frmid.BIT124 == 0))
	        {
	            printf("sys info 2bis 1024 range\t");
	        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -