阅读:1013回复:0
Linux环境下配置MQTT扩展库的操作手册(php5.6 宝塔)
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 |
|