热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

信息:开始协议处理句柄[httpnio8080]_Matlab实例解析GPS接收器(NMEA0183协议(最新版))的数据...

本文目的和所述方法在开发自动驾驶感知系统(见下方链接)过程中,涉及到GPS接收器数据的采集与处理。本分主要分享GPS数据处理的多个问题&#
abf2bf8df8d9ada4ee2388bf4a0850e2.png

本文目的和所述方法

在开发自动驾驶感知系统(见下方链接)过程中,涉及到GPS接收器数据的采集与处理。本分主要分享GPS数据处理的多个问题,包括,但不限于:

若谷:Matlab串口通信读取GPS/镜头/雷达等设备的数据​zhuanlan.zhihu.com
3372d40c2f878d4a5e56b11aaae6e460.png
  1. Matlab串口通信编程
  2. GPS接收器数据协议 NMEA0183 (最新版)
  3. GPS数据提取
  4. OSM 地图数据下载与应用
  5. 以上主要阶段的技术原理和相关背景

GPS接收器硬件

e26156ee856a87a00ba8707eb70a7319.png

GPS 接收的数据

$GPGGA,055258.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*7E
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055258.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*5B$GPGGA,055259.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*7F
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055259.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*5A$GPGGA,055300.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*72
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055300.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*57$GPGGA,055301.000,3027.4932,N,11424.2381,E,1,06,2.9,102.0,M,-13.6,M,,0000*79
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPRMC,055301.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*56$GPGGA,055302.000,3027.4932,N,11424.2381,E,1,06,2.9,102.0,M,-13.6,M,,0000*7A
$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35
$GPGSV,3,1,12,28,82,174,34,06,41,252,36,57,34,129,31,58,32,165,39*77
$GPGSV,3,2,12,30,13,199,39,02,10,244,36,01,14,046,21,03,39,063,26*78
$GPGSV,3,3,12,10,50,145,,12,44,316,,19,43,060,,08,18,305,*77
$GPRMC,055302.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*55

Matlab程序

gps接收器硬件串口

84b06493848e69a7cea6e2aee945a1af.png

% GPS_serialPort_deve
% 获取当前串口状态信息% 关闭此前创建的所有串口
delete(instrfindall)% instrhelp serial% 获取当前所有的串口号;
all_Ports = instrhwinfo('serial')
% 获取所有串口的名称
all_Ports.ObjectConstructorName%使用默认设置创建串口s
% 利用GPSInfo软件,获知当前目标GPS的串口是COM3
% 下列属性,是GPS硬件指定的
s = serial('COM4','BaudRate',4800,'DataBits',8,'Parity','none','StopBits',1, 'FlowControl','none')fopen(s); %打开串口
str = fscanf(s)
fclose(s);
delete(s);
clear s;

gps数据处理

% GPS_serialPort_deve
% 1. 获取当前串口状态信息
% 2. 获取gps 接收器数据
% 3. 解析GPS接收器数据
% https://blog.csdn.net/u010384390/article/details/93055319% 关闭此前创建的所有串口
delete(instrfindall)% instrhelp serial% 获取当前所有的串口号;
all_Ports = instrhwinfo('serial')
% 获取所有串口的名称
all_Ports.ObjectConstructorName%使用默认设置创建串口s
% 利用GPSInfo软件,获知当前目标GPS的串口是COM3
% 下列属性,是GPS硬件指定的
s = serial('COM4','BaudRate',4800,'DataBits',8,'Parity','none','StopBits',1, 'FlowControl','none')fopen(s); %打开串口
% Built-in function.k = datetime
kkk = [num2str(k.Year),'-',num2str(k.Month),'-',num2str(k.Day),'-',num2str(k.Hour),'-',num2str(k.Minute),'-gps_log.txt']gps_log_file = fopen(kkk,'a');%'A.txt'为文件名;'a'为打开方式:在打开的文件末端添加数据,若文件不存在则创建。
i_row = 0;
while i_row <1000i_row &#61; i_row&#43;1str &#61; fscanf(s)S &#61; regexp(str, &#39;,&#39;, &#39;split&#39;);% 只保存$GPGGA&#xff0c;以便获取时间授时、位置if strcmp(S(1),&#39;$GPGGA&#39;) % 解析fprintf(gps_log_file,&#39;%sn&#39;,str);%fp为文件句柄&#xff0c;指定要写入数据的文件。注意&#xff1a;%d后有空格。end
end
fclose(gps_log_file);%关闭文件。fclose(s);
delete(s);
clear s;

NMEA 0183协议

GPS协议标准目前常用到的是NMEA-0183&#xff0c;很显然&#xff0c;这是由NMEA发布的一个标准。

NMEA是National Marine Electronics Association &#xff0c;即美国国家海洋电子协会的缩写&#xff0c;NMEA是GPS的管理者&#xff0c;为方便GPS的推广应用&#xff0c;发布了一系列GPS协议的标准格式。

NMEA-0183就是GPS协议标准的一个&#xff0c;它的早期版本为NMEA-0180和NMEA-0182。虽然它现在仍然用得很多&#xff0c;但时光的车轮在前进&#xff0c;它将会逐渐被最新的NMEA 2000所替代。

NMEA&#xff0d;183是一个基于ASCII的串行通信协议&#xff0c;它由一个个的语句组成&#xff0c;理解起来很简单。下面对它的一些常用的语句进行举例说明&#xff0c;这些&#xff0c;是协议分析中会碰到的。这些常用的NMEA-0183语句如下&#xff1a;GPGGA&#xff08;定位信息&#xff09;

84b06493848e69a7cea6e2aee945a1af.png
65806814699f2bbf299cc0bc664fdef1.png

$GPGGA,HHMMSS.SS,DDMM.MMMM,S,DDDMM.MMMM,S,N,QQ,PP.P,SAAAAA.AA,M,±XXXX.XX,M,SSS,AAAA*CC

例&#xff1a;

$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,M,19.7,M,,,0000*1F

字段0&#xff1a;$GPGGA&#xff0c;语句ID&#xff0c;表明该语句为Global Positioning System Fix Data&#xff08;GGA&#xff09;GPS定位信息

字段1&#xff1a;UTC 时间&#xff0c;hhmmss.sss&#xff0c;时分秒格式

字段2&#xff1a;纬度ddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;

字段3&#xff1a;纬度N&#xff08;北纬&#xff09;或S&#xff08;南纬&#xff09;

字段4&#xff1a;经度dddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;

字段5&#xff1a;经度E&#xff08;东经&#xff09;或W&#xff08;西经&#xff09;

字段6&#xff1a;GPS状态&#xff0c;0&#61;不可用(FIX NOT valid)&#xff0c;1&#61;单点定位(GPS FIX)&#xff0c;2&#61;差分定位(DGPS)&#xff0c;3&#61;无效PPS&#xff0c;4&#61;实时差分定位&#xff08;RTK FIX&#xff09;&#xff0c;5&#61;RTK FLOAT&#xff0c;6&#61;正在估算

字段7&#xff1a;正在使用的卫星数量&#xff08;00 - 12&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段8&#xff1a;HDOP水平精度因子&#xff08;0.5 - 99.9&#xff09;

字段9&#xff1a;海拔高度&#xff08;-9999.9 - 99999.9&#xff09;

字段10&#xff1a;单位&#xff1a;M&#xff08;米&#xff09;

字段11&#xff1a;地球椭球面相对大地水准面的高度 WGS84水准面划分

字段12&#xff1a;WGS84水准面划分单位&#xff1a;M&#xff08;米&#xff09;

字段13&#xff1a;差分时间&#xff08;从接收到差分信号开始的秒数&#xff0c;如果不是差分定位将为空&#xff09;

字段14&#xff1a;差分站ID号0000 - 1023&#xff08;前导位数不足则补0&#xff0c;如果不是差分定位将为空&#xff09;

字段15&#xff1a;校验值

GPGSA&#xff08;当前卫星信息&#xff09;

$GPGSA,A,B,CC,DD,EE,FF,GG,HH,II,JJ,KK,MM,NN,OO,P.P,Q.Q,R.R*CC

例&#xff1a;

$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A

字段0&#xff1a;$GPGSA&#xff0c;语句ID&#xff0c;表明该语句为GPS DOP and Active Satellites&#xff08;GSA&#xff09;当前卫星信息

字段1&#xff1a;定位模式(选择2D/3D)&#xff0c;A&#61;自动选择&#xff0c;M&#61;手动选择

字段2&#xff1a;定位类型&#xff0c;1&#61;未定位&#xff0c;2&#61;2D定位&#xff0c;3&#61;3D定位

字段3&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第1信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段4&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第2信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段5&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第3信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段6&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第4信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段7&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第5信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段8&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第6信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段9&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第7信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段10&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第8信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段11&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第9信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段12&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第10信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段13&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第11信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段14&#xff1a;PRN码&#xff08;伪随机噪声码&#xff09;&#xff0c;第12信道正在使用的卫星PRN码编号&#xff08;00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段15&#xff1a;PDOP综合位置精度因子&#xff08;0.5 - 99.9&#xff09;

字段16&#xff1a;HDOP水平精度因子&#xff08;0.5 - 99.9&#xff09;

字段17&#xff1a;VDOP垂直精度因子&#xff08;0.5 - 99.9&#xff09;

字段18&#xff1a;校验值

GPGSV(可见卫星信息)

$GPGSV,T,M,N,II,EE,AAA,SS,…II,EE,AAA,SS,*CC

例&#xff1a;

$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70

字段0&#xff1a;$GPGSV&#xff0c;语句ID&#xff0c;表明该语句为GPS Satellites in View&#xff08;GSV&#xff09;可见卫星信息

字段1&#xff1a;本次GSV语句的总数目&#xff08;1 - 3&#xff09;

字段2&#xff1a;本条GSV语句是本次GSV语句的第几条&#xff08;1 - 3&#xff09;

字段3&#xff1a;当前可见卫星总数&#xff08;00 - 12&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段4&#xff1a;PRN 码&#xff08;伪随机噪声码&#xff09;&#xff08;01 - 32&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段5&#xff1a;卫星仰角&#xff08;00 - 90&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段6&#xff1a;卫星方位角&#xff08;00 - 359&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段7&#xff1a;信噪比&#xff08;00&#xff0d;99&#xff09;dbHz

字段8&#xff1a;PRN 码&#xff08;伪随机噪声码&#xff09;&#xff08;01 - 32&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段9&#xff1a;卫星仰角&#xff08;00 - 90&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段10&#xff1a;卫星方位角&#xff08;00 - 359&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段11&#xff1a;信噪比&#xff08;00&#xff0d;99&#xff09;dbHz

字段12&#xff1a;PRN 码&#xff08;伪随机噪声码&#xff09;&#xff08;01 - 32&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段13&#xff1a;卫星仰角&#xff08;00 - 90&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段14&#xff1a;卫星方位角&#xff08;00 - 359&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段15&#xff1a;信噪比&#xff08;00&#xff0d;99&#xff09;dbHz

字段16&#xff1a;校验值

GPRMC&#xff08;推荐定位信息数据格式&#xff09;

$GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V*CC

例&#xff1a;

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

字段0&#xff1a;$GPRMC&#xff0c;语句ID&#xff0c;表明该语句为Recommended Minimum Specific GPS/TRANSIT Data&#xff08;RMC&#xff09;推荐最小定位信息

字段1&#xff1a;UTC时间&#xff0c;hhmmss.sss格式

字段2&#xff1a;状态&#xff0c;A&#61;定位&#xff0c;V&#61;未定位

字段3&#xff1a;纬度ddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;

字段4&#xff1a;纬度N&#xff08;北纬&#xff09;或S&#xff08;南纬&#xff09;

字段5&#xff1a;经度dddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;

字段6&#xff1a;经度E&#xff08;东经&#xff09;或W&#xff08;西经&#xff09;

字段7&#xff1a;速度&#xff0c;节&#xff0c;Knots

字段8&#xff1a;方位角&#xff0c;度

字段9&#xff1a;UTC日期&#xff0c;DDMMYY格式

字段10&#xff1a;磁偏角&#xff0c;&#xff08;000 - 180&#xff09;度&#xff08;前导位数不足则补0&#xff09;

字段11&#xff1a;磁偏角方向&#xff0c;E&#61;东W&#61;西

字段16&#xff1a;校验值

GPVTG&#xff08;地面速度信息&#xff09;

$GPVTG,TTT,C,TTT,C,GGG.GG,U,GGG,GG,U*CC

例&#xff1a;

$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F

字段0&#xff1a;$GPVTG&#xff0c;语句ID&#xff0c;表明该语句为Track Made Good and Ground Speed&#xff08;VTG&#xff09;地面速度信息

字段1&#xff1a;运动角度&#xff0c;000 - 359&#xff0c;&#xff08;前导位数不足则补0&#xff09;

字段2&#xff1a;T&#61;真北参照系

字段3&#xff1a;运动角度&#xff0c;000 - 359&#xff0c;&#xff08;前导位数不足则补0&#xff09;

字段4&#xff1a;M&#61;磁北参照系

字段5&#xff1a;水平运动速度&#xff08;0.00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段6&#xff1a;N&#61;节&#xff0c;Knots

字段7&#xff1a;水平运动速度&#xff08;0.00&#xff09;&#xff08;前导位数不足则补0&#xff09;

字段8&#xff1a;K&#61;公里/时&#xff0c;km/h

字段9&#xff1a;校验值

GPGLL&#xff08;地理定位信息&#xff09;

$GPGLL,DDMM.MMMM,S,DDDMM.MMMM,S,HHMMSS.SS,S*CC

例&#xff1a;

$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D

字段0&#xff1a;$GPGLL&#xff0c;语句ID&#xff0c;表明该语句为Geographic Position&#xff08;GLL&#xff09;地理定位信息

字段1&#xff1a;纬度ddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;

字段2&#xff1a;纬度N&#xff08;北纬&#xff09;或S&#xff08;南纬&#xff09;

字段3&#xff1a;经度dddmm.mmmm&#xff0c;度分格式&#xff08;前导位数不足则补0&#xff09;

字段4&#xff1a;经度E&#xff08;东经&#xff09;或W&#xff08;西经&#xff09;

字段5&#xff1a;UTC时间&#xff0c;hhmmss.sss格式

字段6&#xff1a;状态&#xff0c;A&#61;定位&#xff0c;V&#61;未定位

字段7&#xff1a;校验值

matlab源程序

e26156ee856a87a00ba8707eb70a7319.png



推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • 以下两种传参的方式哪个更好? ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
我有很多头小毛驴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有