PHP MQTT 实践
<p>MQTT介绍:http://mqtt.org</p><p>服务器端<br>https://mosquitto.org/download/</p>
<p>PHP客户端<br>https://github.com/bluerhinos/phpMQTT</p>
<p>MQTT QOS等级订阅和发布的关系<br>https://www.jianshu.com/p/ebe4b2c0461d</p>
<p>qos = 0:仅发一次,不管是否能收到<br>qos = 1:没返回一直发,可能有重复接收(接收到消息可能未传递给客户端)<br>qos = 2:保证必须收到,并且不重复(使用MSG_ID保证不重复接收)</p>
<p>也就是服务器只会按pub和sub两者qos等级最小的那个qos规则来发送消息。<br>pub时指定的qos是服务器肯定按此规则接收,但是最终订阅者不一定。<br>sub时指定的qos表示订阅者可以接收的最高消息等级,也就是可能收到更低等级的消息。</p>
<p><strong>遇到的问题</strong></p>
<p>1. qos=2 一直没有测试成功,mosquitto 已经收到客户端的消息,但订阅端就是接收不到。<br>2. 当有多个订阅端时,又是后收到的消息居然会不全,前面会有乱码出现。<br>3. 没有HTTP简单直接;感觉没有HTTP可靠通用;</p>
<p><strong>消息发布</strong></p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">require</span>("../phpMQTT.php"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$server</span> = '127.0.0.1'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 服务器IP</span>
<span style="color: rgba(128, 0, 128, 1)">$port</span> = 1883; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 服务器端口</span>
<span style="color: rgba(128, 0, 128, 1)">$username</span>= ''; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用户名</span>
<span style="color: rgba(128, 0, 128, 1)">$password</span>= ''; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 密码</span>
<span style="color: rgba(128, 0, 128, 1)">$client_id</span> = 'pub_' . <span style="color: rgba(0, 128, 128, 1)">uniqid</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(128, 0, 128, 1)">$mqtt</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> Bluerhinos\phpMQTT(<span style="color: rgba(128, 0, 128, 1)">$server</span>, <span style="color: rgba(128, 0, 128, 1)">$port</span>, <span style="color: rgba(128, 0, 128, 1)">$client_id</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$mqtt</span>->connect(<span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(128, 0, 128, 1)">$username</span>, <span style="color: rgba(128, 0, 128, 1)">$password</span><span style="color: rgba(0, 0, 0, 1)">))
{
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span>=0; <span style="color: rgba(128, 0, 128, 1)">$i</span><100; <span style="color: rgba(128, 0, 128, 1)">$i</span>++<span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(128, 0, 128, 1)">$topic</span> = 'topic01'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = 'Hello World! at (' . <span style="color: rgba(128, 0, 128, 1)">$i</span> . ') ' . <span style="color: rgba(0, 128, 128, 1)">date</span>('Y-m-d H:i:s'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 128, 128, 1)">date</span>('Y-m-d H:i:s') . ' SEND [' . <span style="color: rgba(128, 0, 128, 1)">$topic</span> . '] ' . <span style="color: rgba(128, 0, 128, 1)">$msg</span> . <span style="color: rgba(255, 0, 255, 1)">PHP_EOL</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> qos = 0:仅发一次,不管是否能收到
// qos = 1:没返回一直发,可能有重复接收
// qos = 2:保证必须收到,并且不重复</span>
<span style="color: rgba(128, 0, 128, 1)">$mqtt</span>->publish(<span style="color: rgba(128, 0, 128, 1)">$topic</span>, <span style="color: rgba(128, 0, 128, 1)">$msg</span>, 0<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">usleep</span>(100000<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(128, 0, 128, 1)">$mqtt</span>-><span style="color: rgba(0, 0, 0, 1)">close();
}
</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "Time out!\n"<span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p><strong>消息订阅</strong></p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">require</span>("../phpMQTT.php"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$server</span> = '127.0.0.1'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 服务器IP</span>
<span style="color: rgba(128, 0, 128, 1)">$port</span> = 1883; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 服务器端口</span>
<span style="color: rgba(128, 0, 128, 1)">$username</span>= ''; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 用户名</span>
<span style="color: rgba(128, 0, 128, 1)">$password</span>= ''; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 密码</span>
<span style="color: rgba(128, 0, 128, 1)">$client_id</span> = 'sub_' . <span style="color: rgba(0, 128, 128, 1)">uniqid</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(128, 0, 128, 1)">$mqtt</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> Bluerhinos\phpMQTT(<span style="color: rgba(128, 0, 128, 1)">$server</span>, <span style="color: rgba(128, 0, 128, 1)">$port</span>, <span style="color: rgba(128, 0, 128, 1)">$client_id</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$mqtt</span>->debug = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(128, 0, 128, 1)">$mqtt</span>->connect(<span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 0, 255, 1)">NULL</span>, <span style="color: rgba(128, 0, 128, 1)">$username</span>, <span style="color: rgba(128, 0, 128, 1)">$password</span><span style="color: rgba(0, 0, 0, 1)">))
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "连接失败!\n"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">exit</span>(1<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 订阅列表</span>
<span style="color: rgba(128, 0, 128, 1)">$topics</span> =<span style="color: rgba(0, 0, 0, 1)"> [
</span>'topic01' => ['qos' => 0, 'function' => 'procmsg'],<span style="color: rgba(0, 0, 0, 1)">
];
</span><span style="color: rgba(128, 0, 128, 1)">$mqtt</span>->subscribe(<span style="color: rgba(128, 0, 128, 1)">$topics</span>, 0<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">while</span> (<span style="color: rgba(128, 0, 128, 1)">$mqtt</span>-><span style="color: rgba(0, 0, 0, 1)">proc()){}
</span><span style="color: rgba(128, 0, 128, 1)">$mqtt</span>-><span style="color: rgba(0, 0, 0, 1)">close();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 消息处理函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> procmsg(<span style="color: rgba(128, 0, 128, 1)">$topic</span>, <span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 128, 128, 1)">date</span>('Y-m-d H:i:s') . ' [' . <span style="color: rgba(128, 0, 128, 1)">$topic</span> . '] ' . <span style="color: rgba(128, 0, 128, 1)">$msg</span> . <span style="color: rgba(255, 0, 255, 1)">PHP_EOL</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<hr>
<b>
欢迎转载,转载请注明:转载自[
http://www.cnblogs.com/zjfree/
]</b><br><br>
来源:https://www.cnblogs.com/zjfree/p/11428718.html
頁:
[1]