Documentation - PHP | CloudMQTTHosted message broker for the Internet of Things. Perfectly configured and optimized message queues for IoT, ready in seconds.https://www.cloudmqtt.com/docs-php.html
GitHub - bluerhinos/phpMQTT: a simple php class to connect/publish/subscribe to a MQTT brokera simple php class to connect/publish/subscribe to a MQTT broker - GitHub - bluerhinos/phpMQTT: a simple php class to connect/publish/subscribe to a MQTT brokerhttps://github.com/bluerhinos/phpMQTT
Documentation | CloudMQTTHosted message broker for the Internet of Things. Perfectly configured and optimized message queues for IoT, ready in seconds.https://www.cloudmqtt.com/docs.html
/**
* Created by PhpStorm.
* Time: 16:47
*/
namespace App\Http\Controllers\Mqtt\v1;
use App\Common\Common;
use App\Http\Controllers\Controller;
use App\until\phpMQTT;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use App\Events\Handle;
class Subscript extends Controller
{
/*
手动执行监听 MQTT 订阅;
* php artisan Mqtt
*/
//所有配置放在 配置文件config中
public function subscript(){
$server = config('mqtt.host'); // change if necessary 服务器IP
$port = config('mqtt.port'); // change if necessary 端口 一般是1883
$username = config('mqtt.username'); // set your username mosquitto设置的用户名
$password = config('mqtt.password'); // set your password mosquitto设置的密码
$client_id = config('mqtt.clientId'); //你的连接客户端id
$keepAlive = config('mqtt.keepAlive');
$mqtt = new phpMQTT($server, $port, $client_id,'',$keepAlive); //进行连接
//cleanSession 设为false,客户端掉线后 服务器端不会清除session,当重连后可以接收之前订阅主题的消息。
//当客户端上线后会接受到它离线的这段时间的消息
//但是这个只是进行了重连,重连后还需要再次发起订阅
//接收遗嘱消息
if(!$mqtt->connect(true, NULL, $username, $password)) {
exit('error'); //连接失败
} else {
echo "success"; //连接成功
}
//topics["topic"] 为接受的主题名 需要和发送的主题名一致 否则会订阅不到
//订阅信息 Qos为信息登记,需要和发送的等级一致
//可以订阅多个不同类型通知
$topics["SERVER/#"] = array("qos" => 0, "function" =>array($this,"onMessage"));
$topics["IM/#"] = array("qos" => 0, "function" =>array($this,"onImMessage"));
$mqtt->subscribe($topics, 0);
//死循环监听
while($mqtt->proc()){
}
$mqtt->close();
}
/**
* 在此处接MQtt的信息 进行业务处理
* @param $topic
* @param $msg
* 设备订阅主题
* device/xxxxx/硬件号
* 设备发布的主题
* server/xxxxx/硬件号
* 设备遗嘱主题
* will/xxxxx/硬件号
* 处理逻辑写到handle文件中
* 处理逻辑写到handle文件中
* 处理逻辑写到handle文件中
*/
function onMessage($topic,$msg){
echo $topic;
echo "Msg Recieved: ".$msg;
//所有逻辑全移到handle
HandleController::business($topic,$msg);
}
/*
* 消息处理
*/
function onImMessage($topic,$msg){
// echo $msg;
echo $topic;
echo "Msg Recieved: ".$msg;
//所有逻辑全移到Im
ImMessageController::business($topic,$msg);
}
}
namespace App\Http\Controllers\Mqtt\v1;
use App\Http\Controllers\Controller;
use App\until\phpMQTT;
use Illuminate\Http\Request;
class Publish extends Controller
{
/**
* @return bool
* 发送信息 第三个参数为Qos服务质量等级
* Qos0 发送者只发送一次消息,不进行重试,Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息
* Qos1 发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息
* Qos2 Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次
*/
public static function push($topic, $message, $QOS = 0, $will = null)
{
if (!$topic || !$message) {
return false;
}
//默认主题都大写。
// $topic=strtoupper($topic);
$host = config('mqtt.host'); //主机
$port = config('mqtt.port'); //端口
$username = config('mqtt.username'); //如果没有则为空
$password = config('mqtt.password'); //如果没有则为空
//phpMQTT 有四个参数:主机,端口,客户端id,证书。官网这里的案例没写证书,请参考phpMQTT类
//没有证书的时候只能连接1883端口,不能连接8883端口。
$mqtt = new phpMQTT($host, $port, "SERVER" . rand());
//连接
if ($mqtt->connect(true, $will, $username, $password)) {
$mqtt->publish($topic, $message, $QOS);
$mqtt->close(); //关闭
} else {
echo "Fail or time out
";
}
HandleController::logMqtt($topic, json_decode($message, true));
}
public function publish(Request $request)
{
$topic = $request->input('theme'); //发送的主题
$message = $request->input('content'); //要发送的消息
$QOS = $request->input('qos', 0); //要发送的消息服务质量等级
// print_r($topic);die;
// $willTopic = input('willTopic');
// $willMessage = input('willMessage');
// $willQos = input('willQos',0);
// $willRetain = input('willRetain',false);//1 true
if (!$topic) {
return returnJson(50000, "主题不能为空");
}
if (!$message) {
return returnJson(50000, "消息不能为空");
}
$will = null;
// if($willMessage && $willTopic){
// $will['topic'] = $willTopic;
// $will['content'] = $willMessage;
// $will['qos'] = $willQos;
// $will['retain'] = $willRetain;
// }
self::push($topic, $message, $QOS, $will);
}
}
Publish::push($theme, json_encode($pushDate,JSON_UNESCAPED_UNICODE), Common::QOS());