实时告警采用消息方式,采用socket/tcp协议,OMC为socket的server端,NMS为socket的client端。
5.3.1 消息格式
消息数据由消息头和消息体组成。消息头由9个字节(byte)表示,消息体长度不固定,各类消息不同。消息头的9个字节不能当做字符处理,需要按整型数处理。
上面是文档,下面是我的代码部分,代码是有问题的。
$con->onConnect = function(AsyncTcpConnection $con){
$messageBody = "reqLoginAlarm;user=xxx;key=xxx;type=xxx";
$dataArr = explode(";", $messageBody);
$msgType = $this->msgTypeArr[$dataArr[0]];
$timeStamp = time();
$lenOfBody = mb_strlen($messageBody);
$bytes = new Bytes();
$startSign = 0xFFFF;
$startSign = $bytes->shortToBytes ( intval ( $startSign ) );
$msgType = $bytes->shortToBytes ( intval ( $msgType ) );
$timeStamp = $bytes->integerToBytes ( intval ( $timeStamp ) );
$lenOfBody = $bytes->integerToBytes ( intval ( $lenOfBody ) );
$messageBody = $bytes->getBytes($messageBody);
$return_betys = array_merge($startSign, $msgType , $timeStamp , $lenOfBody , $messageBody);
//$msg = $bytes->toStr ($return_betys);
// $strLen = strlen($msg);
// $packet = pack("a{$strLen}", $msg);
// $pckLen = strlen($packet);
//Log::channel('workerman')->info($return_betys);
$con->send($return_betys);
};
自定义协议:https://www.workerman.net/doc/workerman/protocols/how-protocols.html
是文档上说的是tcp协议。碰到的问题是不知道如何将bytes数组发送到服务端。
你可以参考一下这个:https://www.workerman.net/a/1265
这个对目前的问题似乎没多大帮助呢,能不能再具体一点。
原代码不变,
$con->send($return_betys);
改成$con->send(implode('', $return_betys));
试下。发送的数据必须是字符串,不能是数组试了也不行。服务端不识别头部直接断开连接。
没有报错。
workerman 如何发送 byte数组。
php里byte数组就是字符串。数字的话需要用pack打包下。
$return_betys 是一个数组,键值是数字,请问怎么将这个数组 使用pack打包。
pack('a*', $return_betys[0], $return_betys[1], $return_betys[2]); 这样吗?
等下我给你写个例子
大概是这样
谢谢 我试试
问题解决了大哥,能加个微信吗?老板说了必须要发红包。
不用红包,可以的话这里可以给workerman捐赠 https://gitee.com/walkor/workerman?donate=true
老大厉害
给大佬跪了