<?php date_default_timezone_set("Asia/Shanghai"); global $val; set_time_limit(0); //设置IP和端口号 $address = "192.168.19.254"; $port = 60000; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //阻塞模式 socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //绑定到socket端口 $result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //开始监听 $result = socket_listen($sock) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n"); //将数据写入共享内存,供客户端请求 $systemid=864; $mode="c"; $permission=0755; $size=128; $shmid=shmop_open($systemid,$mode,$permission,$size);//打开内存 $size=shmop_size($shmid); do { //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息 $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n"); //socket_read函数会一直读取客户端数据,直到遇见 , 或者 字符.PHP脚本把这写字符看做是输入的结束符. $buf = @socket_read($msgsock, 2048); if($buf){ //客户端发来的字符串长度 $len=strlen($buf); if($len>0){ echo $len."--arduino--".$buf; //截取字符串,如果前五位是"value" (Arduino 客户端发来的数据) $str=substr($buf, 0,5); if($str=="value"){ echo ("--write--".date("H:i:s").$buf);//打印出Arduino发来的数据 //socket_write($msgsock,"1"); //删除内存 //shmop_delete($shmid); //写入内存 $data=substr($buf,0,52); shmop_write($shmid,$data,0); $dongle=shmop_read($shmid,0,$size); echo "--read--".$dongle." "; echo "----- "; } } } socket_close($msgsock); sleep(1); } while (true); socket_close($sock);
下面是客户端 读取共享内存的代码
<?php date_default_timezone_set("Asia/Shanghai"); set_time_limit(0); while(true){ $systemid=864; $mode="c"; $permission=0755; $size=128; $shmid=shmop_open($systemid,$mode,$permission,$size);//打开内存 $size=shmop_size($shmid); //读取共享内存 $dongle=shmop_read($shmid,0,$size); //shmop_delete($shmid); if($dongle){ echo $dongle." "; } //shmop_close($systemid);//关闭共享内存 //break; sleep(1); }