询问一个PHP SOCKET的问题
有个gps串口转以太网的东西,这个以太口以tcp server的方式一直在发送包,格式是:所有语句均以“$”开头,以<CR><LF>结束,<CR>为0x0D<LF>为0x0A。我现在用php取这些数据,一次取一行的数据,问题是并不是每次都能取到“$”开头的数据,有的时候是从中间开始的,请问如何控制总是以“$”开头?
举例:
正常数据扔出来这样:
$2SGGA,064324.00,3955.11933,N,11618.03183,E,G,07,1.3,50.6,M,0.0,M,,*68
$2SRMC,064324.00,A,3955.11933,N,11618.03183,E,0.0,322.5,310513,,,4*5C
$2SGGA,064325.00,3955.11933,N,11618.03185,E,G,07,1.3,50.5,M,0.0,M,,*6C
$2SRMC,064325.00,A,3955.11933,N,11618.03185,E,0.0,322.5,310513,,,4*5B
$2SGGA,064326.00,3955.11932,N,11618.03187,E,G,07,1.3,50.4,M,0.0,M,,*6D
$2SRMC,064326.00,A,3955.11932,N,11618.03187,E,0.0,322.5,310513,,,4*5B
$2SGGA,064327.00,3955.11932,N,11618.03187,E,G,07,1.3,50.4,M,0.0,M,,*6C
$2SRMC,064327.00,A,3955.11932,N,11618.03187,E,0.0,322.5,310513,,,4*5A
我想按照这种格式一行一行的取,但用php的socket_read取出来,有的时候是这样的:
RMC,144641.00,A,3955.11757,N,11618.03404,E,0.0,0.0,310513,,,4*59 $2S
或者
07,1.3,49.3,M,0.0,M,,*61 $2SRMC,064703.00,A,3955.11939,N,11618.03137,
请问如何总能按照标准格式取?谢谢
本帖最后由 satrun7 于 2013-05-31 16:26 编辑
explode("\r \n" ,$data);或者是 explode("\r\n" ,$data) ; 本帖最后由 korx 于 2013-05-31 15:50 编辑
回复 2# satrun7
这个函数是分割值到数组吧,我如果一开始取的值$data就不是完整的,怎么处理?
$socket=socket_create(AF_INET,SOCK_STREAM,getprotobyname("tcp"));
socket_connect($socket,"10.10.10.10",1000);
$receiveStr=socket_read($socket,70);
echo $receiveStr;
这样取出来的值有的时候就不是以$开头的,怎么限制只能取$开头的70个字符? 在数组里判断,如果值没有包含$字符的,就做unset。 回复 4# satrun7
也就是说重点在于看取到数据的合规性?搞个循环一直取?直到符合为止///
因为获取的数据流是不确定准确性,所以只能做不符合数据值做忽略处理。
放到数组里比较好处理。 回复 6# satrun7
考虑了一下,还是决定多读一些数据处理后放到变量中,谢谢你的思路 tcp发出来的信息写文件,然后php去读文件解析这才是正解。
页:
[1]