alaimaro
总版主
总版主
  • UID2
  • 粉丝0
  • 关注0
  • 发帖数109
阅读:845回复:0

Linux环境下配置MQTT扩展库的操作手册(php5.6 宝塔)

楼主#
更多 发布于:2021-01-21 10:30
1. MQTT简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,
有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,
被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。


目前在中国市场应用比较多的是云喇叭和云打印。
服务器端需要有一个能接收和发送MQTT消息的服务器。可以采购阿里云的微消息队列 MQTT 版
https://www.aliyun.com/product/mq4iot?source=5176.11533457&type=copy
微消息队列 MQTT 版是专为移动互联网(MI)、物联网(IoT)领域设计的消息产品,
覆盖互动直播、金融支付、智能餐饮、即时聊天、移动 Apps、智能设备、车联网等多种应用场景;
通过对 MQTT、WebSocket 等协议的全面支持,连接端和云之间的双向通信,实现 C2C、C2B、B2C
等业务场景之间的消息通信,可支撑千万级设备与消息并发。
阿里云已经做好了MQTT相关环境的配置,后台还有一些统计和查询等功能,还是比较方便。
初期可以选择按照流量计费。这样比较节省费用。


如果你自己不想采用阿里云的MQTT的服务器,也可以自己配置标准MQTT环境,也不难。


以上是服务器端。下面说说客户端,用PHP开发MQTT相关程序在客户端就需要安装相关的类库。
这有2种方法。


1.下载phpMQTT.php一个小型的类库,但是不稳定。用的很少。
2.下载mosquitto库,然后在Linux环境下编译安装。下载地址
http://mosquitto.org/files/source


笔者已经在Linux centos环境下PHP5.6的环境下配置成功mosquitto 1.5
配置手册因为篇幅原因不详细列出。如果有需要,可以联系我本人QQ:804752009


本人采购的是阿里云MQTT的服务器,客户端代码一部分如下


use Mosquitto\Client;
##此处填写阿里云帐号 AccessKey
$accessKey = 'LTAI4G6rWGk1KQ1qmZ9Xcj11';
##此处填写阿里云帐号 SecretKey
$secretKey = '0moMPlnaMoHfB4aG86GDEeYd3tcD22';
## 接入点地址,购买实例后从控制台获取
$endPoint = '22-cn-nif20cwcu01.mqtt.aliyuncs.com';
##实例 ID,购买后从控制台获取
$instanceId = 'post-cn-nif20cwcu44';
## MQTT 第一级 Topic 需要在 MQTT 控制台提前申请
$topic = 'JUXTC_yuyin';
## MQTT 客户端ID 前缀, GroupID,需要在 MQTT 控制台申请
$groupId = 'GID_juxtc';
## MQTT 客户端ID 后缀,DeviceId,业务方自由指定,需要保证全局唯一,禁止 2 个客户端连接使用同一个 ID
## 设备IMEI号码
$deviceId = '862167051682090';
## QOS必须为2
$qos = 2;
$port = 1883;
$keepalive = 90;
$cleanSession = true;
$clientId = $groupId . '@@@' . $deviceId;
## 发送端ClientID,@@@后面字符串可以随意修改,不能与设备IMEI重复
$masterClientId=$groupId . '@@@20191010master';
echo $clientId . "\n";
$mid = 0;
## 初始化客户端,需要设置 clientId 和 CleanSession 参数,参考官网文档规范
$mqttClient = new Mosquitto\Client($masterClientId, $cleanSession);
## 设置鉴权参数,参考 MQTT 客户端鉴权代码计算 username 和 password
$username = 'Signature|' . $accessKey . '|' . $instanceId;
$sigStr = hash_hmac("sha1", $masterClientId, $secretKey, true);
$password = base64_encode($sigStr);
echo "UserName:" . $username . "  Password:" . $password . "\n";
$mqttClient->setCredentials($username, $password);
## 设置连接成功回调
$mqttClient->onConnect(function ($rc, $message) use ($mqttClient, &$mid, $topic, $qos, $clientId) {
    echo date('Y-m-d H:i:s')." 连接成功:Connnect to Server Code is " . $rc . " message is " . $message . "\n";
    ## P2P消息的二级 topic 是/p2p/,三级 topic 是目标客户端的 clientId
    $mqttP2PTopic = $topic . "/p2p/" . $clientId;
    $printText="ABCD1\r\n";//打印内容
    $ZPL=bin2hex($printText);
    $hexBin=pack("H*",$ZPL);
    $len=strlen($hexBin)+4;//打印指定尾部4字节
    $lenHex=dechex($len);
    $len_MSB=dechex(($len&0xff00)>>8);
    $len_LSB=dechex($len&0x00ff);
    $lenMSBStr=str_pad($len_MSB,2,0,STR_PAD_LEFT);
    $lenLSBSTR=str_pad($len_LSB,2,0,STR_PAD_LEFT);
    echo "数据长度:".$len;
    echo "\r最高位是".$lenMSBStr;
    echo "\r最低位是".$lenLSBSTR;
    $printHex="1E1001".$lenMSBStr.$lenLSBSTR.$ZPL."1B636F90";
    echo "\r最终打印内容,请转HEX:".$printHex;
    echo date('Y-m-d H:i:s')." 推送Topic:".$mqttP2PTopic."\n";
    echo date('Y-m-d H:i:s')." 推送内容:".$printHex."\n";
    $mqttClient->publish($mqttP2PTopic, pack("H*",$printHex), $qos);
});




如果有需要,可以联系我本人QQ:804752009
游客

返回顶部