硬件搭建参考上篇:https://blog.csdn.net/qq_34472145/article/details/94561226
一、前言
上篇主要完成插座接收MQTT服务器的消息,而服务器则要接收到APP的发送的指令并转换为自定义的消息下发到WiFi模块,系统架构图如下:
WIFI模块运行的代码见上篇,接下来是服务器提供MQTT和WEB的服务程序,秉承简易的原则,这里采用PHP编写
二、准备环境
(一)硬件环境:
一台有公网IP的服务器,推荐采用云服务器(百度、阿里、腾讯或其他)
(提示:用虚拟机也可以,不过要在局域网下,且手机能够访问得到)
(二)软件环境:
LAMP环境:linux(ubuntu)+apache2+mysql+php5
必要的库:MQTT类代码 https://segmentfault.com/a/1190000014031341?utm_source=tag-newest
三、实施步骤
(一)新建三个文件,分别是Mqtt.class.php、mymqtt.php、processControl.php
Mqtt.class.php:为上面的MQTT类代码
mymqtt.php:封装mqtt要使用的参数和功能函数
processControl.php:get方式接收用户发送的参数,执行消息发布动作
1)mymqtt.php 功能函数主要有封装数据、发布消息
<?php
require_once "Mqtt.class.php";
class MyMQTT
{
public $server_ip = "134.175.231.46"; //服务器 ip地址
private $server = "j8home.cn"; // 服务代理地址(mqtt服务端地址)
private $port = 1883; // 通信端口
private $username = "admin"; // 用户名(如果需要)
private $password = "123456"; // 密码(如果需要
private $client_id = "server_smho001"; // 设置你的连接客户端id
//发布消息
function pubmsg($topic,$msg){
$mqtt = new Mqtt($this->server, $this->port, $this->client_id); //实例化MQTT类
if ($mqtt->connect(true, NULL, $this->username, $this->password)) {
//如果创建链接成功
$mqtt->publish($topic, $msg, 0); //发布
$mqtt->close(); //发送后关闭链接
} else {
echo "Time out!\n";
}
}
//订阅消息
function submsg($topic,$msg){
$mqtt = new Mqtt($this->server, $this->port, $this->client_id);
if(!$mqtt->connect(true, NULL, $this->username, $this->password)) { //链接不成功再重复执行监听连接
exit(1);
}
$topics[$topic] = array("qos" => 0, "function" => "procmsg");
// 订阅主题, qos为0
$mqtt->subscribe($topics, 0);
while($mqtt->proc()){
}
//死循环监听
$mqtt->close();
}
//处理消息
function procmsg($topic, $msg){ //信息回调函数 打印信息
echo "Msg Recieved: " . date("r") . "\n";
echo "Topic: {$topic}\n\n";
echo "\t$msg\n\n";
$a = json_decode($msg);
var_dump($a);
die;
}
//按json格式封装成消息内容
function makepacket($id,$status){
return '{"id":"'.$id.'","status":"'.$status.'"}';
}
}
?>
2)processControl.php 以访问url链接的形式发送消息(非安全地),如下:
//processControl.php
<?php
header("Content-type:text/html;charset=utf-8");
require_once "mymqtt.php";
$topic ="devices/socket/relay1";
$id = isset($_GET['id'])? strval($_GET['id']):""; //插座ID
$status = isset($_GET['status'])? strval($_GET['status']):""; //插座状态
$mqtt = new MyMQTT(); //创建自定义类对象
$msg = $mqtt-> makepacket($id,$status); //封装数据
$mqtt->pubmsg($topic,$msg); //发布消息
?>
服务端准备结束,接下来就是安卓端制作了,未完。。待续