自定義協(xié)議類實現(xiàn)ProtocolInterface接口啟動時報找不到Workerman下的ProtocolInterface這個接口實際上是有的
<?php
namespace Protocols;
use App\Models\DeviceInfo;
use App\Service\Admin\DeviceInfoService;
use App\Utils\CRC16Util;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Workerman\Connection\ConnectionInterface;
use Workerman\Protocols\ProtocolInterface;
class DeviceHandle implements ProtocolInterface
{
public
static function input($recv_buffer, ConnectionInterface $connection)
{
$tempdata = bin2hex($recv_buffer);
echo "=========================收到上報數(shù)據(jù)==================== " . PHP_EOL . $tempdata . PHP_EOL;
if (self::isMagicStr($tempdata) && strlen($tempdata) < 24) {
return 0;
}
$messageData = $tempdata;
// 是否以7d7d開頭--用于粘包處理
while (self::isMagicStr($messageData)) {
// 獲取報文長度
$length = substr($messageData, 18, 4);
$dataLength = (hexdec($length) * 2);//獲取命令字節(jié)到報文結(jié)束的長度(除去CRC校驗的兩字節(jié))
//截取數(shù)據(jù)報文
$data = substr($messageData, 22, $dataLength + 4); // 拆包傳輸問題
$dataLen = strlen($data);
if ($dataLen < $dataLength) {
// 接收的不是一個完整的報文
return 0;
}
$checkData = substr($messageData, 4, 14 + $dataLen); // 獲取需要校驗的數(shù)據(jù)
$crcCheckResult = dechex(CRC16Util::crc16($checkData, "hex", 0x1021, 0, 0, true, true));
$crcJoin = DeviceInfoService::crcLengthJoin($crcCheckResult);
$crcCheckResult = $crcJoin . $crcCheckResult;
echo "CRC校驗碼為:" . $crcCheckResult . PHP_EOL;
if (substr($data, $dataLen - 4) != $crcCheckResult) {
return false;
}
// 截取固定消息頭
$fixation = substr($messageData, 0, 22);
Log::info("截取報文數(shù)據(jù)===> " . $fixation . $data);
return (strlen($fixation) + $dataLen) / 2;
}
return false;
}
/**
* 判斷是否7d7d開頭
* @param $message
* @return bool
*/
public static function isMagicStr($message): bool
{
$stateStr = substr($message, 0, 4);
return strcasecmp($stateStr, "7d7d") == 0;
}
public
static function decode($recv_buffer, ConnectionInterface $connection)
{
$tempdata = bin2hex($recv_buffer);
return $tempdata;
}
public
static function encode($data, ConnectionInterface $connection)
{
// TODO: Implement encode() method.
return $data;
}
}