解决方案

基站侧与核心网侧进行交互涉及PLMN和PLMN ID换算及其代码实现

seo靠我 2023-09-25 16:31:00

先简单介绍一下PLMN的格式:

PLMN(Public Land Mobile Network,公共陆地移动网络)由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网络。PLMN =SEO靠我 MCC + MNC。例如中国移动的PLMN为46000,中国联通的PLMN为46001,中国电信的PLMN为46003。其中,MCC:Mobile Country Code,移动国家码,MCC的资源SEO靠我由国际电联(ITU)统一分配和管理,唯一识别移动用户所属的国家,共3位,中国为460; MNC:Mobile Network Code,移动网络码,共2位或者3位,但中国的三大运营商是由2位组成的。中SEO靠我国移动TD系统使用00,中国联通GSM系统使用01,中国移动GSM系统使用02,中国电信CDMA系统使用03。

接下来说一说PLMN ID的格式:

在计算机和通信中,他们的编码方式不一样,通信中应尽量提升SEO靠我码的利用率。由于PLMN的码流特性(0-9),于是将计算机中的PLMN的二进制码进行了BCD码(一种对数字的编码方式)的转换,可以将6字节的PLMN转成3字节的PLMN ID,这样在传输过程中减少了一SEO靠我般的码流传输。可知,PLMN ID的格式为3字节。

PLMN和PLMN ID转换关系:

PLMN中的都是0-9的数字,0-9之间的数字在计算机中用4bit就可以表示。通过这种表示关系也可知6字节的PLMNSEO靠我可以转成3字节的PLMN ID。那么他们间的转换关系在通信协议标准上规定是如何的呢?

      通信协议标准规定:

      MCC digit2 + MCC digit1 --> PLMN ID digit1

MNC digSEO靠我it3 + MCC digit3 --> PLMN ID digit2

      MNC digit2 + MNC digit1 --> PLMN ID digit3

MNC有2位或者3位的,有些运营商的MNC码是SEO靠我2位,则在转成PLMN ID中 MNC digit3用全F代替。这样我们在将PLMN ID转成PLMN时可以通过这个特性来判断MNC是2位码还是3位码。

MCC digit1 =  PLMN ID diSEO靠我git1 & 0x0F

     MCC digit2 = PLMN ID digit1 & 0xF0 >> 4

     MCC digit3 = PLMN ID digit2 & 0x0F

判断PLMN ID digit2SEO靠我 & 0xF0 >> 4 是否等于0x0F,如果是:则MNC digit3 = 0,可知MNC是由2位码组成;如果否:则MNC digit3 = PLMN ID digit2 & 0xF0 >> 4。SEO靠我

    MNC digit1 = PLMN ID digit3 & 0x0F

    MNC digit2 = PLMN ID digit3 & 0xF0 >> 4

下面由代码实现上述转换:

#include <strinSEO靠我g.h> #include <iostream>using namespace std; namespace {struct Plmn{unsignedSEO靠我 char mcc[3];unsigned char mnc[3];unsigned short mncLen;};struct PlmnId{unsigned char data[3];};inliSEO靠我ne bool isValidDigit(const unsigned char* data, unsigned short size){if (size > 3)return false;for (SEO靠我int i = 0; i < size; ++i){if (!(data[i] >= 0 && data[i] <= 9))return false;}return true;}inline boolSEO靠我 isValid(const Plmn& plmn){return isValidDigit(plmn.mcc, 3) && isValidDigit(plmn.mnc, plmn.mncLen);}SEO靠我bool Plmn2PlmnId(const Plmn& plmn, PlmnId& plmnId){if (!isValid(plmn))return false;plmnId.data[0] = SEO靠我((plmn.mcc[1] & 0x0F) << 4) | (plmn.mcc[0] & 0x0F);if (plmn.mncLen == 3){plmnId.data[1] = ((plmn.mncSEO靠我[2] & 0x0F) << 4) | (plmn.mcc[2] & 0x0F);}else{plmnId.data[1] = (0x0F << 4) | (plmn.mcc[2] & 0x0F);}SEO靠我plmnId.data[2] = ((plmn.mnc[1] & 0x0F) << 4) | (plmn.mnc[0] & 0x0F);return true;}///inline bool isBCSEO靠我D(unsigned char data){if ((data >> 4) >= 10 || (data & 0x0F) >= 10)return false;return true;}bool isSEO靠我Valid(const PlmnId& plmnId){if ((plmnId.data[1] & 0xF0 ) == 0xF0)return isBCD(plmnId.data[0]) && isBSEO靠我CD(plmnId.data[1] & 0x0F) && isBCD(plmnId.data[2]);elsereturn isBCD(plmnId.data[0]) && isBCD(plmnId.SEO靠我data[1]) && isBCD(plmnId.data[2]);}inline void revertToMcc(const PlmnId& plmnId, Plmn& plmn){plmn.mcSEO靠我c[0] = plmnId.data[0] & 0x0F;plmn.mcc[1] = (plmnId.data[0] & 0xF0) >> 4;plmn.mcc[2] = plmnId.data[1]SEO靠我 & 0x0F;}inline void revertToMnc(const PlmnId& plmnId, Plmn& plmn){if ((plmnId.data[1] & 0xF0) == 0xSEO靠我F0){plmn.mncLen = 2;}else{plmn.mncLen = 3;plmn.mnc[2] = (plmnId.data[1] & 0xF0) >> 4;}plmn.mnc[0] = SEO靠我plmnId.data[2] & 0x0F;plmn.mnc[1] = (plmnId.data[2] & 0xF0) >> 4;}bool PlmnId2Plmn(const PlmnId& plmSEO靠我nId, Plmn& plmn){if (!isValid(plmnId))return false;revertToMcc(plmnId, plmn);revertToMnc(plmnId, plmSEO靠我n);return true;} } // int main(int argc, char **argv) {Plmn plmn;::mSEO靠我emset(&plmn, 0x00, sizeof(plmn));plmn.mcc[0] = 4, plmn.mcc[1] = 6, plmn.mcc[2] = 0;plmn.mnc[0] = 0, SEO靠我plmn.mnc[1] = 0;plmn.mncLen = 2;PlmnId plmnId;::memset(&plmnId, 0x00, sizeof(plmnId));if (!Plmn2PlmnSEO靠我Id(plmn, plmnId)){cout << "Plmn2PlmnId failure" << endl;return -1;}Plmn destPlmn;::memset(&destPlmn,SEO靠我 0x00, sizeof(destPlmn));if (!PlmnId2Plmn(plmnId, destPlmn)){cout << "PlmnId2Plmn failure" << endl;rSEO靠我eturn -1;}if (::memcmp(&plmn, &destPlmn, sizeof(Plmn)) != 0){cout << "assert equal failure" << endl;SEO靠我return -1;}else{cout << "Congratulation!!!!!!" << endl;}return 0; }
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2