NMEA1803协议3.0版本及以上说明
NMEA1803 协议3.0版本及以上说明
- 一、 NMEA1803协议格式:
- 二、标准信息发送器标识说明:
- 1.GNSS7种卫星系统说明
- 2.NMEA1803协议3.01与4.1版本标识符区别
- 三、常用标准信息语句说明:
- 1.RMC(推荐最小定位信息)
- 2.GGA(接收机时间、 位置及定位相关的数据)
- 3.GSA(定位的卫星编号与 DOP 信息)
- 4.GSV(可见卫星的卫星编号及其仰角、 方位角、 载噪比等信息)
- 三、 解析程序参考思路:
一、 NMEA1803协议格式:
二、标准信息发送器标识说明:
1.GNSS7种卫星系统说明
GNSS接收系统主要有以下7个发送系统:
1.Galileo(欧洲伽利略系统)
2.BeiDou(中国北斗系统)
3.GPS(美国GPS系统)
4.QZSS(准天顶系统)
5.NAVIC(IRNSS印度区域导航卫星系统)
6.GLONASS(俄罗斯格洛纳斯系统)
7.Combination of Multiple Satellite Systems(联合卫星系统(以上全部或部分系统联合定位时输出的数据))。
其中:
全球定位系统:
BeiDou、GPS、GLONASS、Galileo
区域定位系统:
QZSS、IRNSS
增强系统:
WAAS(美国)、MSAS(日本)、EGNOS(联合国)、GAGAN(印度)、 NIGCOMSAT-1(尼日亚非洲区域卫星)。
2.NMEA1803协议3.01与4.1版本标识符区别
三、常用标准信息语句说明:
1.RMC(推荐最小定位信息)
示例报文:
NMEA:3.0-4.0x示例数据
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54
示例报文:
NMEA:4.1x示例数据
$GNRMC,015107.00,A,3412.76124010,N,10849.67444051,E,0.003,114.8,010323,3.4,W,A,V*4C
版本区别:4.1x增加<14>导航状态标识字段
如上图两个语句使用“x”进行补齐操作
在末尾高亮处(14或13)个字段的位置当“A”对齐后3.0版本直接接替*输出校验位。
而4.1版本“A”对齐后接“,”输出“V”第14字段导航状态标识后接校验位
2.GGA(接收机时间、 位置及定位相关的数据)
示例报文:
NMEA:3.0-4.0x示例数据
$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77
示例报文:
NMEA:4.1x示例数据
$GNGGA,015111.00,3412.76134514,N,10849.67440085,E,1,28,0.6,399.1382,M,-33.6324,M,,*55
版本区别:无区别字段长度相同
如上图两个语句使用“x”进行补齐操作
字段个数一致二版本下无区别
3.GSA(定位的卫星编号与 DOP 信息)
示例报文:
NMEA:3.0-4.0x示例数据
$GNGSA,M,3,87,66,77,67,76,,,,,,,,0.7,0.4,0.6*2A
$GNGSA,M,3,02,03,07,25,30,36,08,,,,,,0.7,0.4,0.6*2A
$GNGSA,M,3,01,02,06,07,10,16,24,26,03,33,14,35,0.7,0.4,0.6*23
$GNGSA,M,3,39,40,42,45,59,60,44,04,05,21,09,,0.7,0.4,0.6*2D
示例报文:
NMEA:4.1x示例数据
$GNGSA,A,3,03,04,08,16,27,28,29,31,195,199,,,1.13,0.61,0.94,1*0A
$GNGSA,A,3,,,,,,,,,,,,,1.13,.61,0.94,3*0A
$GNGSA,A,3,03,04,07,10,21,22,26,29,39,40,45,59,1.13,0.61,0.94,4*03
版本区别:4.1x 增加systemid
如上图两个语句使用“x”或者“,x”进行补齐操作后可以对比法线缺少补全“,x”内容,即缺少systemid内容。
0.6x,x2D(3.0)
0.94,403(4.1)
4.GSV(可见卫星的卫星编号及其仰角、 方位角、 载噪比等信息)
示例报文:
NMEA:3.0-4.0x示例数据
$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70
$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E
$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D
示例报文:
NMEA:4.1x示例数据
$GPGSV,2,1,07,04,33,316,37,03,31,260,44,16,63,232,45,26,72,026,45,1*65
$GPGSV,2,2,07,28,34,075,45,29,12,042,35,31,41,067,40,1*57
版本区别:4.1x增加<14>导航状态标识字段
如上图在GSV最后进行补齐,可以看到3.0版本缺少“,x”内容,即缺少GNSS信号ID
30*,x70
45,1*65
三、 解析程序参考思路:
这里只提供两种参考方法及部分核心代码段。
分析特点:
NMEA报文格式特点即从“ ”出发每经过一个“,”或末尾“ ∗ ”该数据内容结束, ∗ 之后为校验位。所有标识符 ( “ ”出发每经过一个“,”或末尾“*”该数据内容结束,*之后为校验位。 所有标识符(“ ”出发每经过一个“,”或末尾“∗”该数据内容结束,∗之后为校验位。所有标识符(“”、“,”、“*”)综和等于字段个数。
方法1:
采用两个指针一前一后进行遍历标识符截取字段。
适用于简单适用,只提取使用或常用的字段,写法简单清晰,可增加标识符个数检索接口,
从而再for中确定每个字段对应len长度。
缺点:编写起来比较冗余,在GSV,GSA等多条解析字段下将变得鸡肋。
void gnssscr_Ctrl(char *gnssscr)
{char *strfirst=NULL;char *strnext=NUNLL;strfirst=gnssscr;if((strfirst=strstr(strfirst,"$GNRMC"))!=NULL){for(uint8_t i=0;i<14;i++)//RMC 14个段(掐头去尾去中间数据段){if (i == 0){ if ((strfirst = strstr(gnssscr, ",")) == NULL) {LOG("err"); //解析错误}}else//如果没有错误{strfirst++;strnext = strstr(strfirst, ",");LOG("strnext=%s",strnext); if (strnext != NULL){ LOG("strfirst = %s",strfirst);len=strnext-strfirst;switch(i){case 1: //获取UTC时间memset(gnss_data_src.UTCTime,0,sizeof(gnss_data_src.UTCTime));if(len==0){memset(gnss_data_src.UTCTime,0x30,10);}else{memset(gnss_data_src.UTCTime,0x30,sizeof(gnss_data_src.UTCTime)-1);memcpy(gnss_data_src.UTCTime+sizeof(gnss_data_src.UTCTime)-len-1,strfirst,len); LOG("UTCTimelen:%d--%d",sizeof(gnss_data_src.UTCTime),len); }break;....//省略} strfirst = strnext;//每执行一次subString的值将被替换为subStringNext} else{LOG("解析错误");} }}}if((strfirst=strstr(strfirst,"$GNGGA"))!=NULL){for(uint8_t i=0;i<11;i++)//GGA(实际17个段) 11个段(舍弃不需要的段){if (i == 0){ if ((strfirst = strstr(gnssscr, ",")) == NULL) {LOG("err"); //解析错误}}else//如果没有错误{strfirst++;strnext = strstr(strfirst, ",");LOG("strnext=%s",strnext); if (strnext != NULL){ LOG("strfirst = %s",strfirst);len=strnext-strfirst;switch(i){case 6: //获取定位状态memset(gnss_data_src.Positioning_state,0,sizeof(gnss_data_src.Positioning_state));if(len==0){memset(gnss_data_src.Positioning_state,0x30,1);}else{ memset(gnss_data_src.Positioning_state,0x30,sizeof(gnss_data_src.Positioning_state)-1);memcpy(gnss_data_src.Positioning_state+sizeof(gnss_data_src.Positioning_state)-len-1,strfirst,len);}LOG("gnss_data_src.Positioning_state:%s",gnss_data_src.Positioning_state); break; ...//省略}strfirst = strnext;//每执行一次subString的值将被替换为subStringNext} else{LOG("解析错误");} }}}
}
方法2:
遍历标识符个数,将所有标识符地址保存在一个指针数组中。两个相邻的指针相减即为该字段数据内容的长度。
方法说明:
依照核心接口,可自由开发后续解析,适应GSV或者GSA等多条内容的解析。并可兼容因3.0或4.1版本字段总个数不一的情况。
/*************************************** 函数名称:get_Symbol_Sign* 函数入口:* gnsscr:定位源串* delimt:索引* 函数出口:* p:索引值地址* 正确返回已经存储的地址个数* 错误返回0;* 函数说明:遍历存储所有","的地址* ***************************************/
uint8_t get_Symbol_Sign(const char *gnssscr, char *p[],const char *delimt)
{uint8_t count= 0;char *scr = NULL;if ((scr = strstr(gnssscr, delimt)) != NULL){p[count++] = scr; // 存首地址"$"while (1){if (*scr < ' ' || *scr > 'z') // 存在非法字符将结束{LOG("Illegal character exists!!!\r\n");return count; }else{if (*scr == ','){p[count++] = scr; // 存“,”地址}else if(*scr == '*'){LOG("count:%d\r\n", count);p[count++] = scr; // 存“*”地址return count;}}scr++;}}else{return 0;}return count;
}
/*************************************** 函数名称:gnss_Addr_Ctrl* 函数入口:* gnsscr:定位源串* p: “,”及“*”位置存放缓冲区* len :报文段的个数* buf:数据段缓冲区* 函数出口:* 函数说明:检索“,”“*”前每段数据存放buf
* 二维数组元素大小给定20,因为最长数据段长度如假设经度小数点前8位,小数点后8位加点1位 加\0 才18字节* ***************************************/
void gnss_Addr_Ctrl(const char *gnssscr, char *p[], uint8_t segcont, char (*buf)[20])
{uint8_t i=0;uint16_t scrlen = 0;memcpy(*buf, gnssscr, p[1] - p[0]);//先拿每个语句的头如$GNRMCscrlen += strlen(*buf) + 1;for(i = 1; i < segcont - 1; i++){memcpy(*(buf + i), gnssscr + scrlen, p[i + 1] - p[i]-1 );//从第一个拿到除校验位最后一个//LOG("buf:%s\r\n",*(buf + i));scrlen += strlen(*(buf + i)) + 1;}memcpy(*(buf + i), gnssscr + scrlen, 2 );//最后拿校验位
}
/*************************************** 函数名称:get_Head_Kind* 函数入口:* gnssscr:定位数据原串* * head:头存储二维数组* * delim:索引标识符* 函数出口:* head:检索同一数据(如xxGGA)头种类存储二维组* 返回检索相关头的个数* 函数说明: 获取语句头的种类,如定位板卡吐出数据中有GNGGA与GPGGA
*或存储这两种系统头,用于其他函数检索,可将解析后的数据解析到对应系统结构体中* ***************************************/
uint8_t get_Head_Kind(const char *gnssscr,char (*head)[7],const char *delimt)
{uint8_t num=0;uint8_t cont=0;uint8_t diff_flag=0;char *headbuf=NULL;if((headbuf=strstr(gnssscr,delimt))!=NULL){memcpy(head[cont],headbuf-3,6);// 第一出现只存while(1){ if((headbuf=strstr(headbuf+1,delimt))!=NULL){for(num=0;num<cont+1;num++){if(!memcmp(headbuf-3,head[num],6)){diff_flag=1;break;}}if(!diff_flag){memcpy(head[++cont],headbuf-3,6);// 第一出现只存 }diff_flag=0;}else{return cont+1;}}}else{return cont;}
}
/*************************************** 函数名称:get_Nmea1803_Ver* 函数入口:* head:GNSS头二维数组* len:头个数* 函数出口:* 返回1:NEMA4.10* 返回0:NEMA 3.0-4.0* 函数说明:获取当前NMEA的版本号* ***************************************/
uint8_t get_Nmea1803_Ver(char (*head)[7],uint8_t len,const char *gnssscr)
{char *p[25] = {0};//存储每个“,”地址char *strfirst=NULL;char rmchead[7]={0};for(uint8_t i=0;i<len;i++)//不完全,需要增加一些字段段个数测验{if((!memcmp(head[i]+1,"GB",2) ) || (!memcmp(head[i]+1,"GQ",2)) || (!memcmp(head[i]+1,"GI",2)))//4.1{LOG("NMEA_1803 4.1UP!!!\r\n");return 1;}}if((strfirst=strstr(gnssscr,"RMC"))!=NULL)//极端下可以再次增加其他相关字段校验判断当前默认判断RMC{memcpy(rmchead,strfirst-3,6);if (get_Symbol_Sign(gnssscr, p, rmchead)==15)//其他判断方法{LOG("NMEA_1803 4.1UP!!!\r\n");return 1;//4.1}}LOG("NMEA_1803 3.0UP!!!\r\n");return 0;//3.0
}
/*************************************** 函数名称:head_to_select_num* 函数入口:* head:定位数据原串* verflag:版本标识* 函数出口:* 根据返回的版本标识确定调用结构体* 函数说明:解析GNSS数据到结构体* ***************************************/
uint8_t head_to_select_num(char *head,uint8_t verflag)
{QL_UART_DEMO_LOG("head%s\r\n",head);if ((!memcmp(head,"GP",2)))// 公共资源 GPs{return 0;}else if((!memcmp(head,"GN",2)))//Combination of Multiple Satellite Systems{return 1;}else if((!memcmp(head,"GA",2)))//Galileo{return 4;}else if((!memcmp(head,"GL",2)))//GLONASS{return 3;}if(verflag==1)//4.11专精{if((!memcmp(head,"GB",2)))//BeiDou{return 2;}else if((!memcmp(head,"GQ",2)))//膏药旗Qzss{return 6;}else if((!memcmp(head,"GI",2)))//NAVIC(IRNSS){return 5;}}else//3.0{if((!memcpy(head,"BD",2)))//BeiDou{return 2;}else if((!memcpy(head,"IR",2)))//NAVIC(IRNSS){return 5;}}return 7;
}
下面展示 解析RMC时代码段
。
/*************************************** 函数名称:gnss_Class_RMC* 函数入口:* gnssscr:定位数据原串* 函数出口:* 函数说明:RMC数据解析 * ***************************************/
void gnss_Class_RMC(const char *gnssscr)
{char headbuf[7][7]={0};//不管什么协议最多上限只会存在七种头uint8_t i=0;uint8_t len=0;uint8_t verflag=0;uint8_t select_num=0;if((len=get_Head_Kind(gnssscr,headbuf,"RMC")))//判断种类{LOG("len:%d\r\n",len);verflag=get_Nmea1803_Ver(headbuf, len,gnssscr);//判断版本号LOG("verflag:%d\r\n",verflag);for(i=0;i<len;i++){select_num=head_to_select_num(&headbuf[i][1], verflag);//头转系统号LOG("select_num:%d\r\n",select_num);switch(select_num)//走那个结构体 {case GNSS_Gpgs:gnss_RMC_Crtl(gnssscr,&headbuf[i][0],&gnss_rmc_gp);//GPS系统解析break;case GNSS_Comsys:gnss_RMC_Crtl(gnssscr,&headbuf[i][0],&gnss_rmc_gn);//GN联合系统解析break;case GNSS_Beidou:gnss_RMC_Crtl(gnssscr,&headbuf[i][0],&gnss_rmc_bd);//北斗系统解析break;case GNSS_Glonass:break;//暂未开发case GNSS_Galileo:break;case GNSS_Navic:break;case GNSS_Qzss:break;default:break;}}}else{LOG("RMC not have\r\n");}
}
/*************************************** 函数名称:gnss_RMC_Crtl* 函数入口:* gnssscr:定位数据原串** headbuf:GNSS头标识符* * gnssdatastruct:参数结构体* 函数出口:* head:检索头种类存储二维组* 返回检索相关头的个数* 函数说明:解析GNSS数据到结构体* ***************************************/
uint8_t gnss_RMC_Crtl(const char *gnssscr,const char *headbuf,GnssRMCData * gnss_rmc_struct)
{uint8_t len=0;char *p[25] = {0};//存储每个“,”地址char *firststr = NULL;//中间指针if ((len = get_Symbol_Sign(gnssscr, p, headbuf)))//遍历标识附地址存储{firststr = strstr(gnssscr, headbuf);get_Rmc_Data(firststr, len, p, gnss_rmc_struct);//按照存储标识地址获取数据到结构体变量return 0;}else{QL_UART_DEMO_LOG("[%s]not have\r\n",headbuf);return 1;}
}
/**************************************
* 函数名称:get_Rmc_Data
* 函数入口:
* gnsscr:定位源串
* len “,”个数
* p: “,”位置存放缓冲区
* gnssstruct:存数据放缓冲区
* 函数出口:
* 函数说明:检索gnssscr中“,”位置
* ***************************************/void get_Rmc_Data(char *gnssscr, uint8_t len, char *p[], GnssRMCData *gnsss_rmc_struct){char buf[15][20] = {0};uint8_t i = 0;gnss_Addr_Ctrl(gnssscr, p, len, buf);//根据标识符地址解析各段数据到BUF中#if DATALOGSWITCH//可屏蔽LOGfor (i = 0; i < len; i++)//len即是标识符个数{LOG("buf:%s\r\n", buf[i]);}#endiffor(i=0;i<len;i++){switch(i){case 0:memcpy(gnsss_rmc_struct->head, buf[i], strlen(buf[i])+1);//语句头//LOG("RMChead:%s\r\n", gnsss_rmc_struct->head);break;// case 1:memcpy(gnsss_rmc_struct->UTCtime, buf[i], strlen(buf[i])+1);//UTCTIME//LOG("UTCTime:%s\r\n", gnsss_rmc_struct->UTCtime);break;case 2:memcpy(gnsss_rmc_struct->status, buf[i], strlen(buf[i])+1);//定位状态//LOG("UTCTime:%s\r\n", gnsss_rmc_struct->status);break;case 3:memcpy(gnsss_rmc_struct->lat, buf[i], strlen(buf[i])+1);//纬度//LOG("Latitude:%s\r\n", gnsss_rmc_struct->lat);break;case 4:memcpy(gnsss_rmc_struct->uLat, buf[i], strlen(buf[i])+1);//纬度标识//LOG("N_S:%s\r\n", gnsss_rmc_struct->uLat);break;case 5:memcpy(gnsss_rmc_struct->lon, buf[i], strlen(buf[i])+1);//经度//LOG("Longitude:%s\r\n", gnsss_rmc_struct->lon);break;case 6:memcpy(gnsss_rmc_struct->uLon, buf[i], strlen(buf[i])+1);//经度标识//LOG("E_W:%s\r\n", gnsss_rmc_struct->uLon);break;case 7:memcpy(gnsss_rmc_struct->spd, buf[i], strlen(buf[i])+1);//速度//LOG("Speed:%s\r\n", gnsss_rmc_struct->spd);break;case 8:memcpy(gnsss_rmc_struct->cog, buf[i], strlen(buf[i])+1);//航向角//LOG("Azimuth:%s\r\n", gnsss_rmc_struct->cog);break;case 9:memcpy(gnsss_rmc_struct->date, buf[i], strlen(buf[i])+1);//日期//LOG("UTCDate:%s\r\n", gnsss_rmc_struct->date);break;case 10:memcpy(gnsss_rmc_struct->mv, buf[i], strlen(buf[i])+1);//磁偏角//LOG("mv:%s\r\n", gnsss_rmc_struct->mv);break;case 11:memcpy(gnsss_rmc_struct->mvE, buf[i], strlen(buf[i])+1);磁偏角方向//LOG("mvE:%s\r\n", gnsss_rmc_struct->mvE);break;case 12:memcpy(gnsss_rmc_struct->mode, buf[i], strlen(buf[i])+1);//定位模式//LOG("rmc_mode:%s\r\n", gnsss_rmc_struct->mode);break;case 13:case 14:if(len==15)//因为第15字段因版本原因可能存在后着不存在{memcpy(gnsss_rmc_struct->xor, buf[i+1], strlen(buf[i])+1);//异或校验//LOG("XOR:%s\r\n", gnsss_rmc_struct->xor);}else if(len==14){break;}break;default:break;}}}
GGA解析与RMC类似
。
GSA: 解析方法类似,但是当需要进行单系统解析操作时需要做特殊处理,例如在NMEA4.0版本下由于没有systemid字段,因此在输出$GNGSA联合系统也无法进行区分定位系统,但是在NMEA4.1以上系统将需要进行判断systemid从而将联合系统解析到单系统。(当处理NMEA4.0以下版本数据时,一般遍历所有的GNGSA相比较,选最长的一个报文进行解析即可,毕竟GSA中最关心的数据是三个定位因子,此处暂不提供代码)。
GSV: 由于具备总条数、当前条数、卫星数且已经知道每条语句最多显示4组卫星参数不足将在下一条。也就是说当总条目为5,那么前4条是4组卫星参数段,最后一条GSV语句需要结合卫星总数来计算剩余卫星总数,例如卫星数为18,那么前4条GSV已经表达了4*4=16组卫星参数了,因此最后一条GSV语句将只显示18-16=2组卫星参数。需要注意GSV在不存在其他卫星组时将会缺省,卫星组内数据段与其他报文内容无数据“,”间将会补空,例如上例GSV语句最后只有2组卫星数,将只显示该两组数据加校验位结束,如下例子
$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70
$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E
$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D
从而在最后一条处理的时候需要做些处理及注意。
总结:以上解析内容完全依照get_Symbol_Sign(保存标识符地址API)与gnss_Addr_Ctrl(解析标识符间内容API),来完成后续操作的,可自由依照次进行开发及升级。以上仅提供交流学习。如有不正确欢迎批评指正。
NMEA1803协议3.0版本及以上说明相关推荐
- “知识共享”国际许可协议4.0版本
"知识共享"国际许可协议4.0版本 近年来,鲁宾逊非标准分析高举"知识共享"许可协议大旗,如虎添翼,在我国高校迅速推开. 国人对"知识共享" ...
- 北斗通讯协议4.0 java_北斗4.0协议讲解.doc
北斗4.0协议讲解 北斗用户机用户接口协议 (4.0版本外用) 接口数据传输约定 串口非同步传送,参数定义如下: 传输速率:19200bit/s(默认),可根据用户机具体情况设置其它速率: 1 bit ...
- 北斗通讯协议4.0 java_北斗4.0协议解析.doc
北斗4.0协议解析 北斗用户机用户接口协议 (4.0版本外用) 接口数据传输约定 串口非同步传送,参数定义如下: 传输速率:19200bit/s(默认),可根据用户机具体情况设置其它速率: 1 bit ...
- 独家专访:SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL!
SequoiaDB 3.0 版本正式发布!协议级完整兼容MySQL! 标签:SequoiaDB 3.0,MySQL,OLTP SequoiaDB巨杉数据库 3.0,在产品GA发布后,经过近半年在金融级 ...
- ShuttleFlow 2.0版本跨链协议上线,同时支持OKExChain、Heco及BSC双向互操作
近日,ShuttleFlow 跨链协议发布 2.0 版本,将实现 Conflux 网络上资产反向跨到主流公链的功能,同时完成与 OKExChain.火币生态链 (Heco) .币安智能链 (BSC)三 ...
- Android Bluetooth蓝牙开发\蓝牙协议\蓝牙通信例子_Android支持蓝牙4.0版本_BLE开发
一.Android Bluetooth现状 在android官网可以了解到android4.2新增了部分新功能,但是对于BT熟悉的人或许开始头疼了,那就是Android4.2引入了一个新的蓝牙协议栈针 ...
- 基于MQTT协议的WZ指令开发V3.0版本支持onenet
title: 基于MQTT协议的WZ指令开发V3.0版本支持onenet tags: WZ指令 date: 2019-02-18 10:53:00 视频讲解:(V3.0版本)-https://www. ...
- FPGA解析串口协议帧3.0版本,增加了错误重发功能,提供仿真文件以及源码
FPGA解析串口协议帧已经发布2个版本了,分别如下: 版本1:点击查看版本1 版本1详细介绍了串口协议帧的帧组成和设计思想,但设计粗糙,注释不详细: 版本1:点击查看版本2 版本2优化了代码,添加了详 ...
- PouchContainer 发布 0.3.0 版本,支持 Kubernetes 拥抱 CNCF 生态
划重点 PouchContainer 是一款轻量级.开源的富容器技术,拥有快速高效.隔离性强.可移植性高.资源占用少等特性,可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用 ...
最新文章
- 130.被围绕的区域
- linux NFS配置:NFS相关概念及其配置与查看
- C语言跟随鼠标画方框,JS拖动鼠标画出方框实现鼠标选区的方法
- linux浏览器不能播放音频文件夹,在html中插入音频文件在浏览器中播放音频文件的兼容性问题...
- 接口和抽象类是否继承了Object
- CentOS7安装oracle11G数据库
- zookeeper专题:zookeeper的节点类型,数据持久化机制
- 揭秘网络:互联网调查入门 出版发行时间_cqy、cdx、zqsg……啥意思?揭秘QQ上的“00后黑话”...
- Jquery的validate表单验证
- 20科大考研经验分享-数学
- 自由手写体字帖pdf_20款漂亮的手写字体,可供下载
- Hadoop KMS 透明加密配置以及测试
- 全志A31编译脚本 .
- 【西语】【2】Recuërdame antes de que se desaparezca la memoria del amor 在爱的记忆消失前,请记住我
- 今日学习——冒泡排序
- 一些数据采集卡使用过程中常见问题
- 电磁兼容八种测试的「实质」
- Single-Stage 6D Object Pose Estimation 论文详解
- java 同步数据,同步数据到另一个库中。
- 深入理解Oracle中的case when then else end
热门文章
- Ubuntu 用GParted调整分区大小
- 亚媒社和亚洲传媒集团的发展,亚洲传媒集团,亚洲传媒集团怎么样,亚洲传媒,亚太传媒
- iloc和loc区别和应用总结
- 为什么美国程序员不用加班,而中国程序员就只能996?
- 最短路径——迪杰斯特拉(Dijkstra)算法
- Drools Runtime概念
- AGS的相关项目的问题和解决方案
- Hihocoder-H国的身份证号码I
- Solidworks标准件模型库零件大全非标自动化设备机械设计SW图纸
- A CLOSER LOOK AT DEEP LEARNING HEURISTICS: LEARNING RATE RESTARTS, WARMUP AND DISTILLATION