【问题标题】:PHP MQTT subscribe not consistentPHP MQTT 订阅不一致
【发布时间】:2017-03-01 12:53:31
【问题描述】:

我正在尝试在基于 PHP 的页面上使用 MQTT 显示一些值。 PHP 代码包含订阅者。我正在为 MQTT 代理使用 Bluemix IoT 服务。此外,消息通过 Python 代码在本地机器上发布。

当我尝试使用页面刷新在页面上显示值时,页面有时无法显示值。发布者端没有问题,Bluemix IoT 服务已成功显示这些值。

我的代码如下:

<?php
// include class
require('phpMQTT.php');
// set configuration values
if( getenv("VCAP_SERVICES") ) {


// get MySQL service configuration from Bluemix


$services = getenv("VCAP_SERVICES");
$services_json = json_decode($services, true);

$mysql_config = $services_json["iotf-service"][0]["credentials"];

$org_id = $mysql_config["org"];


$port = $mysql_config["mqtt_u_port"];


$username = $mysql_config["apiKey"];


$password = $mysql_config["apiToken"];


} 

// set configuration values
$config = array(
  'org_id' => $org_id,
  'port' => $port,
  'app_id' => 'm',
  'iotf_api_key' => $username,
  'iotf_api_secret' => $password,
  'device_id' => 'trial',
  'qos' => 1

);

global $Val_A;
global $Val_B;
global $Val_C;
global $Val_D;

//Read already existing file

$ini_b = parse_ini_file("data.ini",true);

$Val_A = $ini_b['Data']['A'];
$Val_B = $ini_b['Data']['B'];
$Val_C = $ini_b['Data']['C'];
$Val_D = $ini_b['Data']['D'];


$config['server'] = $config['org_id'] . '.messaging.internetofthings.ibmcloud.com';


$config['client_id'] = 'a:' . $config['org_id'] . ':' . $config['app_id'];

#echo $config['client_id'];

// initialize client
$mqtt_dev = new phpMQTT($config['server'], $config['port'], $config['client_id']); 
$mqtt_dev->debug = false;


// connect to broker
if(!$mqtt_dev->connect(true, null, $config['iotf_api_key'], $config['iotf_api_secret'])){
  echo 'ERROR: Could not connect to IoT cloud';
    exit();
} 
else
{
 #echo "Success";
}

$topics['iot-2/type/newdevice/id/' . $config['device_id'] . '/evt/status/fmt/json'] = 
  array('qos' =>1, 'function' => 'getLocation');


$mqtt_dev->subscribe($topics, 1);

$elapsedSeconds = 0;

while ($mqtt_dev->proc(true)) { 

  #echo json_encode($json);

  if (count($location) == 2) {



    break;
  } 

  if ($elapsedSeconds == 5) {

    break;  
  }

  $elapsedSeconds++;
  sleep(1);

}

// disconnect

//I have tried commenting this too
$mqtt_dev->close();

function getLocation($topic, $msg) {

  global $location;
  global $json;

  $json = json_decode($msg);

  $Val_A = $json->A;
  $Val_B = $json->B;
  $Val_C = $json->C;  
  $Val_D = $json->D;

//Read already existing file

$ini_backup = parse_ini_file("data.ini",true);

$ValA_b = $ini_backup['Data']['A'];
$ValB_b = $ini_backup['Data']['B'];
$ValC_b = $ini_backup['Data']['C'];
$ValD_b = $ini_backup['Data']['D'];


if($Val_A != 0)
{
$ValA_b = $Val_A;
}
else
{
$Val_A = $ValA_b;
}

if($Val_B != 0)
{
$ValB_b = $Val_B;
}
else
{
$Val_B = $ValB_b;
}

if($Val_C != 0)
{
$ValC_b = $Val_C;
}
else
{
$Val_C = $ValC_b;
}

if($Val_D != 0)
{
$ValD_b = $Val_D;
}
else
{
$Val_D = $ValD_b;
}



$file = fopen("data.ini","w");

fwrite($file,"[Data]". "\n" );
fwrite($file,"A =" . $ValA_b . "\n" );
fwrite($file,"B =" . $ValB_b . "\n" );
fwrite($file,"C =" . $ValC_b . "\n" );
fwrite($file,"D =" . $ValD_b . "\n" );

fclose($file);


  return $location;
}

?>

<!DOCTYPE html>
<html lang="en">
  <head>

      <meta http-equiv="refresh" content="5" > 
      <div id="footer">
        This page will automatically reload every 5 seconds. <br/>
      </div>
    <label for="A">A</label>
    <input type="text" value="<?php echo $Val_A ?>" />
    <label for="B">B</label>
    <input type="text" value="<?php echo $Val_B ?>" />
    <label for="C">C</label>
    <input type="text" value="<?php echo $Val_C ?>" />
    <label for="D">D</label>
    <input type="text" value="<?php echo $Val_D ?>" />

  </body>
</html>

有人可以指导我哪里出错了吗?

【问题讨论】:

    标签: containers ibm-cloud mqtt phpmqtt


    【解决方案1】:

    不要使用meta来指定刷新,尝试使用php header("Refresh:5");
    有一个旧堆栈overflow thread 讨论在 php 中使用元与标头进行 refrseh。

    【讨论】:

    • 感谢您的回复。我会试试的。
    • 问题不在于刷新。我想这与订户和经纪人有关。我尝试将保留标志用作 true,以便代理存储最后一个值。但订阅者有时仍会失败。
    • Watson IoT Platform 对 MQTT 消息传递的保留消息功能提供有限支持。如果在从设备、网关或应用程序发送的 MQTT 消息中将保留消息标志设置为 true,则该消息将作为未保留消息处理。 Watson IoT Platform 组织无权发布保留的消息。当保留消息标志设置为 true 时,Watson IoT Platform 服务会覆盖保留消息标志并处理消息,就像将保留消息标志设置为 false 一样。 console.ng.bluemix.net/docs/services/IoT/reference/mqtt/…
    • 非常感谢。这有帮助。阅读本文后,我决定使用 exec 方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多