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

73 lines
2.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
public array $notNeedLogin = ['upload'];
/**
* @throws ProtocolNotSupportedException
*/
public function initialize()
{
parent::initialize();
# 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);
}
}
}