suyuan-breed/app/api/controller/MqttController.php

73 lines
2.4 KiB
PHP
Raw Normal View History

2024-01-21 11:58:55 +08:00
<?php
namespace app\api\controller;
use PhpMqtt\Client\ConnectionSettings;
use PhpMqtt\Client\MqttClient;
use think\App;
class MqttController extends BaseApiController
{
public string $host = "60.204.152.17";
public int $port = 2883;
public ?MqttClient $mqtt_client = null;
private string $username = "root";
private string $password = "root";
private ?ConnectionSettings $settings;
2024-01-21 12:00:11 +08:00
public array $notNeedLogin = ['upload'];
2024-01-21 11:58:55 +08:00
/**
* @throws ProtocolNotSupportedException
*/
2024-01-21 12:00:11 +08:00
public function initialize()
2024-01-21 11:58:55 +08:00
{
2024-01-21 12:00:11 +08:00
parent::initialize();
2024-01-21 11:58:55 +08:00
# mqtt配置
$this->mqtt_client = new MqttClient($this->host, $this->port);
$this->settings = new ConnectionSettings();
$this->settings = $this->settings->setUsername($this->username)->setPassword($this->password);
}
/**
* @throws ConfigurationInvalidException
* @throws ConnectingToBrokerFailedException
*/
public function upload(): void
{
try {
# 获取mqtt请求体
$msg = $this->request->post();
$payload = json_decode($msg["payload"], true);
# 获取json字符串长度用于校验是否丢失包
$payload_receive_len = strlen(json_encode($payload));
# 获取l参数得到原始发送包长度
$payload_send_len = $payload["l"];
# 如果不相等name返回
if ($payload_receive_len != $payload_send_len) {
return;
}
# 获取measurements参数表示字段的名称
$measurements = $payload["m"];
# 获取字段相应的值
$values = $payload["v"];
# 拼接字符串得到iotdb的数据库设备名称
$device = sprintf("%s.%s", "root.farm", $payload["v"][0]);
# 构造json通过mqtt发送到iotdb数据库
$send_array = array(
"device" => $device,
"timestamp" => intval(microtime(true) * 1000),
"measurements" => $measurements,
"values" => $values
);
# 数组转为json字符串
$send_json = json_encode($send_array);
dump($send_json);
# 连接mqtt
$this->mqtt_client->connect($this->settings);
# 发送消息
$this->mqtt_client->publish("xumu", $send_json);
} catch (Exception $e) {
dump($e);
}
}
}