900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

时间:2019-11-23 05:21:41

相关推荐

java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅

阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 MQTT 服务端,那么我们自己的设备作为客户端,应该如何实现消息订阅?

阿里云没有提供 PHP 的 SDK,而 MQTT 是一个通用协议,我们可以使用 PHP 实现 MQTT 协议解析相关代码,同时也可以使用 Swoole 作为 MQTT 服务端或客户端

Simps 框架基于 Swoole 的TCP ServerCoClient集成了 MQTT 服务端和客户端

这篇文章就以 Simps 框架作为演示,实现 MQTT 客户端连接阿里云物联网平台设备进行消息订阅

创建产品 / 设备

使用物联网平台的第一步是在云端创建产品和对应设备,我们需要前往阿里云物联网平台创建产品和设备,具体操作请参考文档

创建完成后分别在产品详情和设备详情中获取设备证书(ProductKeyProductSecretDeviceNameDeviceSecret),后面连接时需要用到

代码实现

示例代码放在了 GitHub 上:simps-cloud/aliyun-iot,可以使用 composer 进行安装或者直接使用 git clone 源码

composer create-project simps-cloud/aliyun-iotgit clone git@:simps-cloud/aliyun-iot.git

实现说明

下面我们分别来说明一下对应的代码实现,使用 Swoole 作为客户端可以保证我们recv到一个完整的 MQTT 包,然后解析对应的数据包即可

配置文件

创建config/aliyuniot.php配置文件

client_id是 MQTT 建立连接时需要指定的 ClientID,保证全局唯一就可以

将我们刚才获取的设备证书信息,写入到对应的配置文件中

return [// 连接域名'host' => "{$YourProductKey}.iot-as-mqtt.{$region}.",// 端口默认1883'port' => 1883,// 心跳'keepalive' => 300,// clientID'client_id' => "d812edc1-18da-2085-0edf-a4a588c296d1",'device_name' => "",'device_secret' => "",'product_key' => "",'product_secret' => "",];

连接密码

MQTT 建立连接时需要指定的 Password,而这个密码有阿里云的要求:需要把提交给服务器的参数(ProductKey、DeviceName、timestamp 和 clientId)按字典排序并拼接后,使用hmacsha256方法和设备的DeviceSecret,加签生成 Password

文档中解释了一下 clientId、securemode 等参数,其实是说连接时的参数,而不是 Password 的生成,不要被误导了,实际上只需要关注 content 的值就可以…

而对于的签名算法类型,PHP 可以使用hash_hmac函数来实现,所以密码生成可以封装为:

/*** @param $config* @param string $signmethod 签名算法类型。支持hmacmd5,hmacsha1和hmacsha256,默认为hmacmd5*/function signAliIot($config, $signmethod = "hmacmd5"){$sign_config = ['clientId' => $config['client_id'],'productKey' => $config['product_key'],'deviceName' => $config['device_name'],];ksort($sign_config);$data = "";foreach ($sign_config as $key => $item) {$data .= $key . $item;}switch ($signmethod){case "hmacmd5":$sign = hash_hmac('md5', $data, $config['device_secret']);break;case "hmacsha1":$sign = hash_hmac('sha1', $data, $config['device_secret']);break;case "hmacsha256":$sign = hash_hmac('sha256', $data, $config['device_secret']);break;}return strtoupper($sign);}

Password 生成没有加时间戳参数,我测试的时候加上时间戳会导致连接失败,返回错误码是 4,username 或 password 格式错误

连接

Password 我们搞定之后就可以开始连接了,参考代码 bin/subscribe.php

使用SimpsClientMQTTClient进行连接操作

我们收到消息时,如果 QoS 是 1,根据 MQTT 协议我们需要回复 ACK,否则它会推送多次

$buffer = $client->recv();var_dump($buffer);if (is_array($buffer)) {switch ($buffer['cmd']) {case 9:echo "收到订阅确认消息rn";break;case 3:echo "收到订阅消息:{$buffer['content']}rn";// 收到消息如果是qos 1 需要回复if ($buffer['qos'] === 1) {$client->sendBuffer(['cmd' => MQTT::PUBACK, 'message_id' => $buffer['message_id']], false); // 4}break;}}

执行命令启动订阅

php bin/subscribe.php

这个时候我们去访问阿里云控制台中的设备详情,会发现 DeviceName 旁边的在线标识

可以测试一下延迟,测试网络延迟时将会向设备发送一条 QoS1 的空消息,会看到网络延迟,表示我们客户端是正常的

但这样还不够,如何发送指定消息到客户端呢?

依旧在设备详情中点击Topic列表->自定义 Topic,就可以看到发布消息的按钮,我们可以点击进入填写发布消息内容并选择对应的 QoS 等级,阿里云暂不支持 QoS2,所以只有 0 和 1

我们来发一个Hello,Simps.

Simps 的 MQTTClient 也支持发布功能,这里简单说明一下,执行命令启动并访问一次

php bin/simps.php http:startcurl http://127.0.0.1:9501/

这里需要查看阿里云日志服务,会看到一条设备到云消息的记录,我们查看一下

以上就是基于 Swoole 使用 MQTT 协议进行 TCP 连接通信,支持请前往点个 Star:Simps、Swoole

当然也可以使用 Swoole 来实现一个 MQTT 服务端,Simps 也提供了相应的封装,参考 Simps 文档

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。