阿里云物联网平台为设备提供安全可靠的连接通信能力,支撑设备数据采集上云,我们这里认为阿里云物联网平台是 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@github.com:simps-cloud/aliyun-iot.git

实现说明

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

配置文件

创建 config/aliyuniot.php 配置文件

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

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

return [// 连接域名'host' => "{$YourProductKey}.iot-as-mqtt.{$region}.aliyuncs.com",// 端口默认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 文档

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

  1. 微信小程序连接物联网(三):微信小程序远程遥控宿舍开门 基于NodeMCU通过MQTT协议连接阿里云物联网平台

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  2. 树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制

    树莓派mqtt协议连接阿里云物联网平台(三) 前面树莓派的数据已经上传到云端,可是我的android手机该如何获取树莓派上传的这些数据呢,,困惑了我好几天的疑问,解开的那一刻,真的时拨开云雾见青天啊. ...

  3. 中移M5311模块MQTT协议连接阿里云物联网平台(干货)

    一.准备三元组 在阿里云物联网平台新建产品和设备后,平台给每一个设备自动赋予三元组. 二.准备MQTT协议参数 新建产品时,阿里云物联网平台会分配一个含productkey的子域名,端口号固定是188 ...

  4. ESP8266 基于AT指令集连接阿里云物联网平台设备

    总结一下之前学习的内容.想通过ESP8266连接上阿里云物联网平台上创建的设备. 用ESP8266连接阿里云,本质上就是开启ESP8266的透传模式,发送MQTT报文.所谓MQTT报文,就是符合MQT ...

  5. STM32+ESP8266+MQTT协议连接阿里云物联网平台

    一.环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可.比如:GSM模块.有线网卡等. 开发软件:keil5 硬件连接功能: ...

  6. 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(五)---MQTT.fx模拟设备连接阿里云

    前文提到,物联网设备在阿里云物联网平台登记了"身份证"之后,阿里云物联网平台上的设备就处于"未激活""离线"或者"在线" ...

  7. Esp8266 进阶之路29【高级篇】百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  8. Paho Java Client 连接阿里云物联网平台

    Paho Java Client 连接阿里云物联网平台 进入阿里云物联网平台->点击产品->新建 点击设备->添加设备 查看设备证书,复制记录,后面使用 阿里云TCP通信 一机一密. ...

  9. esp32连接阿里云物联网平台进行MQTT通信

    前提:IDE是采用arduino IDE,arduino使用的库是pubsubclient 开发板可以使用esp32(esp8266也是一样的) 已经学会pubsubclient库的基本使用 使用pu ...

最新文章

  1. ceph-kvstore-tool 工具使用详解
  2. iOS进阶之架构设计MVVM的实现示例(5)
  3. python RuntimeError: maximum recursion depth exceeded
  4. chrome/edge插件备忘
  5. 新增Skin-watercolor
  6. Alpha 通道的概念与功能
  7. ubuntu mv和cp命令
  8. Maven Helper 安装使用(jar 包管理工具)
  9. Git分布式版本管理
  10. printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...
  11. ubuntu需要多大的固态硬盘_Ubuntu16.10 迁移到 SSD
  12. 原生android字体,不用Root,国产安卓手机如何把字体切换成安卓原生字体
  13. 时钟转盘html源代码
  14. bt种子制作php,BT种子制作
  15. 华硕主板如何用u盘启动计算机,华硕主板怎么设置u盘启动 华硕主板设置u盘启动方法【图文】...
  16. 网页播放器的使用(ckplayer)
  17. http server response 一览
  18. 学习游戏开发,先学OpenGL再学Direct3D还是直接学习Direct3D?
  19. 三维可视化引擎让空间数据管理更高效
  20. hdu5238 calculator (线段树+crt)

热门文章

  1. 关于在Eclipse里面启动了服务,但是localhost:8080无法访问的问题:
  2. 判断wifi连接是否可用
  3. [转载] python isinstance()方法的使用
  4. [转载] 机器学习 scikit-learn1 预测贷款用户是否会逾期
  5. [转载] Python列表拷贝复制函数copy()函数的作用
  6. 数组的顺序存储和实现
  7. 【Java】 归并排序的非递归实现
  8. 一次频繁Full GC问题排查过程分享
  9. python os模块 os.chmod
  10. Feature Extractor[VGG]