连接阿里物联网平台 Stomp连接失败

纯黑

https://help.aliyun.com/document_detail/172487.html?spm=a2c4g.11186623.2.23.570c719fqNPeJp#concept-2553070

我用这个官方大大这个月发的demo一直提示我连接失败

https://wenda.workerman.net/question/5741

截图

这个是我设置的参数
截图

我用阿里官方提供的stomp demo是可以连上的

3692 12 1
12个回答

纯黑

另外官方大大是否可以提供个阿里云 消息队列 RocketMQ 版 的workman demo 官方只提供了http的 tcp暂时没有
https://help.aliyun.com/document_detail/114448.html?spm=a2c4g.11186623.6.589.4a107e80jcLzas

  • walkor 2020-10-24

    我这没有RocketMQ客户端,你用他们http接口吧

  • 纯黑 2020-10-24

    http我看也是用死循环监听 开进程 我没这样搞过 不知道有没有啥问题

walkor

发下你的完整调用代码。不要只截图代码片段。
debug设置为true,看下输出日志

纯黑

截图
那个问题解决了
是主题不存在导致的 现在 一启动就断开连接

截图

  • walkor 2020-10-24

    看阿里云文档例子 61614是ssl端口,你需要把ssl选项加上。
    $client = new \Workerman\Stomp\Client('stomp://域名.com:61614', [
    'debug' => true,
    'login' => 'xx',
    'passcode' => 'xx',
    'ssl' =>['verify_peer' => true, 'verify_peer_name' => false]
    ]);

  • 纯黑 2020-10-24

    报错了

纯黑

截图

截图

  • walkor 2020-10-24

    文件头部加上 use Workerman\Stomp\Client;

walkor

代码示例

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;
use Workerman\Stomp\Client;

$worker = new Worker();
$worker->onWorkerStart = function(){
    $accessKey = "x";
    $accessSecret = "x";
    $consumerGroupId = "DEFAULT_GROUP";
    //iotInstanceId:购买的实例请填写实例ID,公共实例请填空字符串""。
    $iotInstanceId = "";
    $timeStamp = round(microtime(true) * 1000);
    //签名方法:支持hmacmd5,hmacsha1和hmacsha256。
    $signMethod = "hmacsha1";
    $clientId = "client-1";
    //userName组装方法,请参见AMQP客户端接入说明文档。
    //若使用二进制传输,则userName需要添加encode=base64参数,服务端会将消息体base64编码后再推送。具体添加方法请参见下一章节“二进制消息体说明”。
    $userName = $clientId . "|authMode=aksign"
        . ",signMethod=" . $signMethod
        . ",timestamp=" . $timeStamp
        . ",authId=" . $accessKey
        . ",iotInstanceId=" . $iotInstanceId
        . ",consumerGroupId=" . $consumerGroupId
        . "|";
    $signContent = "authId=" . $accessKey . "&timestamp=" . $timeStamp;
    //计算签名,password组装方法,请参见AMQP客户端接入说明文档。
    $password = base64_encode(hash_hmac("sha1", $signContent, $accessSecret, $raw_output = TRUE));
    $client = new Client('stomp://xxx.iot-amqp.cn-shanghai.aliyuncs.com:61614', array(
        'debug'      => true,
        'login'      => $userName,
        'passcode'   => $password,
        'heart_beat' => 30000,
        'ssl'        => ['verify_peer' => true, 'verify_peer_name' => false],
    ));
    $client->onConnect = function(Client $client) {
        $client->subscribe('/topic/#', function(Client $client, $data) {
            var_export($data);
        });
    };
    $client->onError = function ($e) {
        echo $e;
    };
    $client->connect();
};
Worker::runAll();
  • 纯黑 2020-10-24

    我测试可以连上 但是 只要有消息过来 就直接断开了不知道为啥

纯黑

截图
只要有消息过来 就直接断开了 然后重连

  • walkor 2020-10-24

    打开文件 vendor/workerman/stomp/src/Protocols/Stomp.php,找到input方法,echo $buffer;,看下发来的数据格式。

  • 纯黑 2020-10-24

    好像没有进来 我打印了没有反应 就直接断了

  • 纯黑 2020-10-24

    发布一个消息后立马断开 重连 之后一直在重连

  • walkor 2020-10-24

    改完代码记得restart。如果没打印,说明你找错文件了。

  • 纯黑 2020-10-24

    找到了 截图已发

纯黑

截图

  • 暂无评论
纯黑

截图

  • 暂无评论
纯黑

截图

  • walkor 2020-10-24

    看到了,阿里云这stomp协议不完善,没有content-length头,导致无法包长无法算出来。我兼容下。

  • 纯黑 2020-10-24

    好 麻烦了

  • walkor 2020-10-24

    更新下 workerman/stomp 到1.0.3或者后续的更高版本

  • 纯黑 2020-10-24

    好的 麻烦了

  • 纯黑 2020-10-27

    @1:好像一段时间没有消息过来就会断开重连 这个也可以设置心跳吧?
    $worker->pingInterval = 30; 截图已发

  • 纯黑 2020-10-27

    @1:我刚设置了一下 好像没用 还是断开重连了

纯黑

截图
好像一段时间没有消息过来就会断开 这个也可以设置心跳吧?
$worker->pingInterval = 30;

  • 纯黑 2020-10-27

    我刚设置了一下 好像没用 还是断开重连了

  • walkor 2020-10-27

    我不清楚阿里云的有没有心跳。你看下他们文档。有没有心跳,心跳格式

  • 纯黑 2020-10-27

    我发最新的回复了 要设置一个参数

walkor

更新workerman/stomp 到1.0.4或者后续的更高版本,已经增加了心跳支持。
用法:

$client = new Client('stomp://地址:端口', array(
    'debug'    => true,
    'login'    => $userName,
    'passcode' => $password,
    'heart_beat' => 10000, // 代表10秒发送一个心跳
    'ssl'      => ['verify_peer' => true, 'verify_peer_name' => false],
));
年代过于久远,无法发表回答
🔝