mqtt接收设备的消息,wss server连接微信小程序,如何把一方的消息转发到另一方?
$mqtt_worker = new Worker();
$mqtt_worker->onWorkerStart = function(){
$options = [
'username' => 'mq_user_00001',
'password' => 'qiR89ns',
'resubscribe' => true,
'client_id' => 'client_id_00001',
'clean_session' => true,
];
$mqtt = new Workerman\Mqtt\Client('mqtt://127.0.0.1:1883',$options);
$mqtt->onConnect = function($mqtt) {
echo("\n mqtt-onConnect \n");
echo(date('Y-m-d H:i:s')."\n");
$mqtt->subscribe('pzb/ws/v1/up/+');//$mqtt->subscribe('pzb/ws/v1/up/Dev00001');
log_mqtt('[onConnect]');
};
$mqtt->onMessage = function($topic, $content, $mqtt){
echo("\n mqtt-onMessage \n");
echo(date('Y-m-d H:i:s')."\n");
//如何把$content通过wss发送出去?
};
$mqtt->connect();
};
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '/www/wwwroot/www.dog.com/dog_com.pem', // 也可以是crt文件
'local_pk' => '/www/wwwroot/www.dog.com/dog_com.key',
'verify_peer' => false,
'allow_self_signed' => false, //如果是自签名证书需要开启此选项
)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$wss_worker = new Worker('websocket://0.0.0.0:8282', $context);
// 设置transport开启ssl,websocket+ssl即wss
$wss_worker->transport = 'ssl';
$wss_worker->onConnect = function(TcpConnection $con) {
echo("\n\nwss_worker--onConnect:\n");
echo(date('Y-m-d H:i:s')."\n");
echo($con->getRemoteIp()."\n");
log_wss('['.$con->getRemoteIp().'][onConnect]');
};
$wss_worker->onMessage = function(TcpConnection $con, $msg) {
echo("\n\nwss_worker--onMessage:\n");
echo(date('Y-m-d H:i:s')."\n");
echo($con->getRemoteIp()."\n");
log_wss('['.$con->getRemoteIp().'][onMessage]'.$msg);
var_dump($msg);
$con->send('ok');
//如何把msg通过mqtt发送出去?
};
mqtt本质就是订阅/发布,
用emqx做服务端, emqx是支持wss方式接入的。
设备发布topic到emqx , 小程序订阅相同的topic , 就会收到消息,不用额外操作 。
如果涉及更复杂的转发,emqx支持消息入mysql, 还有hook
mqtt就是处理emqx的消息,需要处理后转发,而不是单纯的转发消息。比如收到一个ping,然后回复pong,应该怎么做呢。
处理完消息以后用 : $mqtt->publish(); 向指定主题发送消息。看手册: https://www.workerman.net/doc/workerman/components/workerman-mqtt.html#publish