Compare commits

...

11 Commits

Author SHA1 Message Date
Chenc 9addc4bf7f composer 2019-12-08 12:04:16 +08:00
Chenc e267d30f75 Array and string offset access syntax with curly braces is deprecated 2019-12-08 11:55:59 +08:00
Salman Zafar 794934bc62 Merge branch 'development' 2019-10-29 17:39:06 +05:00
Salman Zafar 7148ef7228 added qos and retan flags for publishing and subsrcbe methods 2019-10-29 17:01:02 +05:00
salman zafar 5ec057142d
Update composer.json 2019-09-23 19:16:46 +05:00
Salman Zafar 7911a8cb6a added support for laravel 6 2019-09-23 14:32:39 +05:00
Salman Zafar 344f501811 added client id of users choice feature 2019-07-15 15:39:48 +05:00
Salman Zafar d80df23ff9 code cleanup 2019-06-28 12:46:41 +05:00
Salman Zafar 487c533750 code indentation and readablity 2019-06-28 12:35:41 +05:00
Salman Zafar a17fc4cebc Added example link in docs 2019-06-14 13:27:42 +05:00
Salman Zafar 48e71697bc updated readme 2019-06-14 12:24:26 +05:00
5 changed files with 72 additions and 34 deletions

View File

@ -1,9 +1,11 @@
# Laravel MQTT Package
A simple Laravel 5 Library to connect/publish to MQTT broker
A simple Laravel 5 and 6 Library to connect/publish/subscribe to MQTT broker
Based on [bluerhinos/phpMQTT](https://github.com/bluerhinos/phpMQTT)
For Example see this [repo](https://github.com/salmanzafar949/Laravel-Mqtt-Example)
## Installation
```
composer require salmanzafar/laravel-mqtt
@ -13,8 +15,12 @@ composer require salmanzafar/laravel-mqtt
* Name and Password Authentication
* Certificate Protection for end to end encryption
* Enable Debug mode to make it easier for debugging
* Now you can also set Client_id of your choice and if you don't want just simply don't use or set it to null
* Set QOS flag directly from config file
* Set Retain flag directly from config file
## Enable the package (Optional)
This package implements Laravel auto-discovery feature. After you install it the package provider and facade are added automatically for laravel >= 5.5.
__This step is only required if you are using laravel version <5.5__
@ -47,6 +53,8 @@ php artisan vendor:publish --provider="Salman\Mqtt\MqttServiceProvider"
'certfile' => env('mqtt_cert_file',''),
'port' => env('mqtt_port','1883'),
'debug' => env('mqtt_debug',false) //Optional Parameter to enable debugging set it to True
'qos' => env('mqtt_qos', 0), // set quality of service here
'retain' => env('mqtt_retain', 0) // it should be 0 or 1 Whether the message should be retained.- Retain Flag
```
#### Publishing topic
@ -56,7 +64,8 @@ use Salman\Mqtt\MqttClass\Mqtt;
public function SendMsgViaMqtt($topic, $message)
{
$mqtt = new Mqtt();
$output = $mqtt->ConnectAndPublish($topic, $message);
$client_id = Auth::user()->id;
$output = $mqtt->ConnectAndPublish($topic, $message, $client_id);
if ($output === true)
{
@ -73,7 +82,9 @@ use Mqtt;
public function SendMsgViaMqtt($topic, $message)
{
$output = Mqtt::ConnectAndPublish($topic, $message);
$client_id = Auth::user()->id;
$output = Mqtt::ConnectAndPublish($topic, $message, $client_id);
if ($output === true)
{
@ -92,11 +103,12 @@ use Salman\Mqtt\MqttClass\Mqtt;
public function SubscribetoTopic($topic)
{
$mqtt = new Mqtt();
$client_id = Auth::user()->id;
$mqtt->ConnectAndSubscribe($topic, function($topic, $msg){
echo "Msg Received: \n";
echo "Topic: {$topic}\n\n";
echo "\t$msg\n\n";
});
}, $client_id);
}
@ -112,7 +124,7 @@ public function SubscribetoTopic($topic)
echo "Msg Received: \n";
echo "Topic: {$topic}\n\n";
echo "\t$msg\n\n";
});
},$client_id);
}

View File

@ -1,6 +1,6 @@
{
"name": "salmanzafar/laravel-mqtt",
"description": "A simple Laravel 5 Library to connect/publish to MQTT broker",
"name": "salmanzafar-chenc/laravel-mqtt",
"description": "A simple Laravel 5 and 6 Library to connect/publish/subscribe to MQTT broker",
"type": "library",
"license": "MIT",
"authors": [

View File

@ -40,6 +40,8 @@ class Mqtt
protected $password = null;
protected $port = null;
protected $debug = null;
protected $qos = 0;
protected $retain = 0;
public function __construct()
{
@ -49,17 +51,21 @@ class Mqtt
$this->cert_file = config('mqtt.certfile');
$this->port = config('mqtt.port');
$this->debug = config('mqtt.debug');
$this->qos = config('mqtt.qos');
$this->retain = config('mqtt.retain');
}
public function ConnectAndPublish($topic, $msg)
public function ConnectAndPublish($topic, $msg, $client_id=null)
{
$client = new MqttService($this->host,$this->port, rand(0,100), $this->cert_file, $this->debug);
$id = empty($client_id) ? rand(0,999) : $client_id;
$client = new MqttService($this->host,$this->port, $id, $this->cert_file, $this->debug);
if ($client->connect(true, null, $this->username, $this->password))
{
$client->publish($topic,$msg);
$client->publish($topic,$msg, $this->qos, $this->retain);
$client->close();
return true;
@ -69,15 +75,17 @@ class Mqtt
}
public function ConnectAndSubscribe($topic, $proc)
public function ConnectAndSubscribe($topic, $proc, $client_id=null)
{
$client = new MqttService($this->host,$this->port, rand(0,100), $this->cert_file, $this->debug);
$id = empty($client_id) ? rand(0,999) : $client_id;
$client = new MqttService($this->host,$this->port,$id, $this->cert_file, $this->debug);
if ($client->connect(true, null, $this->username, $this->password))
{
$topics[$topic] = array("qos" => 0, "function" => $proc);
$client->subscribe($topics, 0);
$client->subscribe($topics, $this->qos);
while($client->proc())
{

View File

@ -9,21 +9,22 @@
namespace Salman\Mqtt\MqttClass;
/*
A simple php class to connect/publish to an MQTT broker
A simple php class to connect/publish/Subscribe to an MQTT broker
*/
/* phpMQTT */
class MqttService
{
private $socket; /* holds the socket */
private $msgid = 1; /* counter for message id */
public $keepalive = 10; /* default keepalive timmer */
public $timesinceping; /* host unix time, used to detect disconects */
public $keepalive = 10; /* default keepalive timer */
public $timesinceping; /* host unix time, used to detect disconnects */
public $topics = array(); /* used to store currently subscribed topics */
public $debug = false; /* should output debug messages */
public $address; /* broker address */
public $port; /* broker port */
public $clientid; /* client id sent to brocker */
public $clientid; /* client id sent to broker */
public $will; /* stores the will of the client */
private $username; /* stores username */
private $password; /* stores password */
@ -33,6 +34,7 @@ class MqttService
$this->debug = $debug;
$this->broker($address, $port, $clientid, $cafile);
}
/* sets the broker details */
function broker($address, $port, $clientid, $cafile = NULL){
$this->address = $address;
@ -40,12 +42,14 @@ class MqttService
$this->clientid = $clientid;
$this->cafile = $cafile;
}
function connect_auto($clean = true, $will = NULL, $username = NULL, $password = NULL){
while($this->connect($clean, $will, $username, $password)==false){
sleep(10);
}
return true;
}
/* connects to the broker
inputs: $clean: should the client send a clean session flag */
function connect($clean = true, $will = NULL, $username = NULL, $password = NULL){
@ -103,21 +107,22 @@ class MqttService
if($this->username) $buffer .= $this->strwritestring($this->username,$i);
if($this->password) $buffer .= $this->strwritestring($this->password,$i);
$head = " ";
$head{0} = chr(0x10);
$head{1} = chr($i);
$head[0] = chr(0x10);
$head[1] = chr($i);
fwrite($this->socket, $head, 2);
fwrite($this->socket, $buffer);
$string = $this->read(4);
if(ord($string{0})>>4 == 2 && $string{3} == chr(0)){
if(ord($string[0])>>4 == 2 && $string[3] == chr(0)){
if($this->debug) echo "Connected to Broker\n";
}else{
error_log(sprintf("Connection failed! (Error: 0x%02x 0x%02x)\n",
ord($string{0}),ord($string{3})));
ord($string[0]),ord($string[3])));
return false;
}
$this->timesinceping = time();
return true;
}
/* read: reads in so many bytes */
function read($int = 8192, $nb = false){
// print_r(socket_get_status($this->socket));
@ -140,6 +145,7 @@ class MqttService
return $string;
}
/* subscribe: subscribes to topics */
function subscribe($topics, $qos = 0){
$i = 0;
@ -165,6 +171,7 @@ class MqttService
$bytes = ord(substr($string,1,1));
$string = $this->read($bytes);
}
/* ping: sends a keep alive ping */
function ping(){
$head = " ";
@ -173,18 +180,21 @@ class MqttService
fwrite($this->socket, $head, 2);
if($this->debug) echo "ping sent\n";
}
/* disconnect: sends a proper disconect cmd */
/* disconnect: sends a proper disconnect cmd */
function disconnect(){
$head = " ";
$head{0} = chr(0xe0);
$head{1} = chr(0x00);
$head[0] = chr(0xe0);
$head[1] = chr(0x00);
fwrite($this->socket, $head, 2);
}
/* close: sends a proper disconect, then closes the socket */
function close(){
$this->disconnect();
stream_socket_shutdown($this->socket, STREAM_SHUT_WR);
}
/* publish: publishes $content on a $topic */
function publish($topic, $content, $qos = 0, $retain = 0){
$i = 0;
@ -202,14 +212,15 @@ class MqttService
$cmd = 0x30;
if($qos) $cmd += $qos << 1;
if($retain) $cmd += 1;
$head{0} = chr($cmd);
$head[0] = chr($cmd);
$head .= $this->setmsglength($i);
fwrite($this->socket, $head, strlen($head));
fwrite($this->socket, $buffer, $i);
}
/* message: processes a recieved topic */
/* message: processes a received topic */
function message($msg){
$tlen = (ord($msg{0})<<8) + ord($msg{1});
$tlen = (ord($msg[0])<<8) + ord($msg[1]);
$topic = substr($msg,2,$tlen);
$msg = substr($msg,($tlen+2));
$found = 0;
@ -227,7 +238,8 @@ class MqttService
}
if($this->debug && !$found) echo "msg recieved but no match in subscriptions\n";
}
/* proc: the processing loop for an "allways on" client
/* proc: the processing loop for an "always on" client
set true when you are doing other stuff in the loop good for watching something else at the same time */
function proc( $loop = true){
if(1){
@ -291,18 +303,20 @@ class MqttService
}
return 1;
}
/* getmsglength: */
function getmsglength(&$msg, &$i){
$multiplier = 1;
$value = 0 ;
do{
$digit = ord($msg{$i});
$digit = ord($msg[$i]);
$value += ($digit & 127) * $multiplier;
$multiplier *= 128;
$i++;
}while (($digit & 128) != 0);
return $value;
}
/* setmsglength: */
function setmsglength($len){
$string = "";
@ -316,6 +330,7 @@ class MqttService
}while ( $len > 0 );
return $string;
}
/* strwritestring: writes a string to a buffer */
function strwritestring($str, &$i){
$ret = " ";
@ -328,12 +343,13 @@ class MqttService
$i += ($len+2);
return $ret;
}
function printstr($string){
$strlen = strlen($string);
for($j=0;$j<$strlen;$j++){
$num = ord($string{$j});
$num = ord($string[$j]);
if($num > 31)
$chr = $string{$j}; else $chr = " ";
$chr = $string[$j]; else $chr = " ";
printf("%4d: %08b : 0x%02x : %s \n",$j,$num,$num,$chr);
}
}

View File

@ -13,5 +13,7 @@ return [
'username' => env('mqtt_username',''),
'certfile' => env('mqtt_cert_file',''),
'port' => env('mqtt_port','1883'),
'debug' => env('mqtt_debug',false) //Optional Parameter to enable debugging set it to True
'debug' => env('mqtt_debug',false), //Optional Parameter to enable debugging set it to True
'qos' => env('mqtt_qos', 0), // set quality of service here
'retain' => env('mqtt_retain', 0) // it should be 0 or 1 Whether the message should be retained.- Retain Flag
];