一、客户端的更新/开通
str urlencode(str s){
//合成url时用的函数,可以把特殊字符和汉字转成%XX的格式
str us=" !#$%+@:=?&";
str o="";
int i;
int c;
int len;
len=strlen(s);
for (i=0;i<len;i++){
c=asc(s,i);
if (strpos(us,substr(s,i,1))>=0){
o=o+"%"+int2hex(c,2);
}else{
if (c>=128){
o=o+"%"+int2hex(c,2);
}else{
o=o+chr(c);
}
}
}
return o;
}
void s2.onclick()
{
str url;
str name;
int md;
str smd;
name=bind_get("SNAME");
echo("name=["+name+"]\r\n");
md=getsn(0x1F48);
smd=int2hex(md,4);
name=urlencode(name);
//url="id=PD4B7DB097&name="+name+"&md="+smd;
url="http://shmictrl.com/wifi/s_home_post.php?id="+getsn(6)+"&name="+name+"&md="+smd;
echo("url="+url+";\r\n");
wifi_httpget(url);
//合成访问页面url的二维码
q1.text="http://shmictrl.com/wifi/s_home.php?id="+getsn(6)+"&md="+smd;
}
所谓的开通,即是将本机的序列号(唯一)作为key用于初始化数据库中的数据,也就是开通,同时将16个设备的名称更新到服务器,用于显示,这就是更新
二、服务器端代码
服务器端代码使用PHP环境,代码如下:
s_home_post.php
<?php
include_once("common.php");
include_once ("db_mysql_class.php");
$sn=$_GET[id]; //获取序列号作为数据库的id
$name=$_GET[name]; //获取16个按键的名称,|隔开
$md=$_GET[md]; //验证参数
//var_dump($sn);
//PDC88CA7B5
if (strlen($sn)==10){
$sn1=substr($sn,2);
$db=new DB_MySql();
$db->qconnect('mqttsys');
$sn=fieldstring($sn);
$name=fieldstring($name);
$md=fieldstring($md);
$sql="select * from s_home where sn='$sn'";
$db->pquery($sql); //检测序列号是否存在
if ($db->next_record()){
//有数据,则更新按钮名称
$sql="update s_home set sname='$name',md='$md' where sn='$sn'";
}
else{ //无数据,则插入新数据,相当于开通
$sql="insert into s_home (sn,sname,md) values('$sn','$name','$md')";
}
// var_dump($sql);
$db->pquery($sql);
}
?>[OK]
s_home.php
<?php
/* 智能家居端口
?id=PDC88CA7B5&md=md5(id+mqttsys.md) 直接进入 无需MD码
?id=xxxx&msg=S1&md=md5(id+mqttsys.md) 发送信息处理
*/
$hs="0"; //0-关闭 1-开启
include_once("common.php");
include_once ("db_mysql_class.php");
$uid=$_GET["id"];
$msg=$_GET["msg"];
if (strlen($uid)!=10){
echo ("ERR ID");exit;
}
$md=$_GET["md"];
$sn=fieldstring($uid);
$db=new DB_MySql();
$db->qconnect('mqttsys');
$sql="select * from s_home where sn='$sn'";
$db->pquery($sql);
if ($db->next_record()){
$fname=$db->f("sname");
$fmd=$db->f("md");
}
else{
echo("ERR:Not Found UID:$uid;请先利用屏端代码开通(上传数据)方可使用。");exit;
}
$aname = explode("|", $fname);
//var_dump($aname);
$md5=md5($uid.$fmd);
/*if ($md5!=$md){
echo("ERR:md码不正确,请确认屏端二维码合成的URL.");
}*/
if ($msg=="") $msg="RS";
$bz=0; //$bz=1 表示CMDERR
$cn=strlen($msg);
if (($cn==2)&($msg!=="RS")) {$bz=1;}
if ($cn==3){
if ($msg[0]!=='S') $bz=1;
if (($msg[2]!=='0')&($msg[2]!=='1')) $bz=1;
}
if (($cn<1)|($cn>3)) $bz=1;
if (($msg!=="")&($bz==1)){echo ("ERR CMD");exit;}
$rn=0;
if ($msg!=""){
//以下是核心代码,远程调用端口
$url="http://i.a-diy.cn/tool/d.php?m=s_home&s=$uid&c=$msg";
$s=readURL($url,3); //$s="R[55aa]";
//var_dump($s); //返回R[hhhh];
if (substr($s,0,2)=="R["){
$hs=substr($s,2,4);
$rn=hexdec($hs);
//var_dump($rn);
}
else{
echo("该设备不在线....");exit;
}
}
?>
<!DOCTYPE html>
<html lang="zh-cn" dir="ltr">
<head>
<meta charset="GB2312">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SHMICTRL 神秘魔控 控制界面</title>
<link rel="stylesheet" href="css_js/uikit.docs.min.css">
</head>
<body>
<div class="uk-container uk-container-center uk-margin-top uk-margin-large-bottom">
<div class="uk-grid" data-uk-grid-margin>
<div class="uk-width-medium-1-1">
<h1>SHMICTRL 神秘魔控 智能家居控制器</h1>
</div>
</div>
<hr class="uk-grid-divider">
<div class="uk-grid" data-uk-grid-margin>
<div class="uk-width-medium-1-1">
<a class="uk-button uk-button-primary uk-button-large" href="s_home.php?id=<?php echo($uid);?>&md=<?php echo($md);?>" >获取设备状态</a>
<br>网页进入时,所有的断开默认关闭,点击“获取设备状态”可以通过网络得到设备各端口的开关状态。
</div>
</div>
<hr class="uk-grid-divider">
<div class="uk-width-medium-1-1">
<p>服务器返回:<br><?php echo($s);?></p>
</div>
<div class="uk-grid" data-uk-grid-margin>
<?php
$er=array();$hl=array();
$er['0']="关闭";$er['1']="开启";
$hl['0']="S0";$hl['1']="S1";
//此时 $rn 是16位开关状态 b0=B0 b15=B15
for($i=0;$i<16;$i++){
$hs=$rn&1; $rn>>=1;
$hl['0']="S". strtoupper(dechex($i))."0";
$hl['1']="S".strtoupper(dechex($i))."1";
echo("<div class=\"uk-width-medium-1-4 uk-panel uk-panel-box uk-panel-box-primary\">");
echo("<h2>B{$i}:".$aname[$i]."</h2>");
echo("<p>当前路状态:".$er[$hs]);
$k="0";
if ($hs=="0") $k="1";
echo("<a class=\"uk-button uk-button-primary uk-margin-left\" ");
echo("href=\"s_home.php?id={$uid}&md={$md}&msg={$hl[$k]}\">{$er[$k]}</a></p>");
echo("</div>");
}
?>
</div>
<div class="uk-grid" data-uk-grid-margin>
<div class="uk-width-medium-1-1">
<div class="uk-panel uk-panel-box uk-text-center">
<p><strong>sHMIctrl:</strong>一个可以跑C代码的串口屏 <a class="uk-button uk-button-primary uk-margin-left" href="/">首页</a></p>
</div>
</div>
</div>
</body>
</html>
核心接口:d.php
<?php
/* mqtt服务器进行的api程序
http://i.a-diy.cn/tool/d.php?m=shmi-R1&s=PDC88CA7B5&c=RS
返回:
R[0] //route A 关闭
R[1] //route A 开启
R[xxx]是封装格式, xxx是mqtt传来的消息
*/
$cfg_m=$_GET["m"]; //获取项目名称
$cfg_s=$_GET["s"]; //获取序列号
$cfg_c=$_GET["c"]; //获取命令
$cfg_topic=$cfg_m."/".$cfg_s; //合成mqtt的topic
// 创建Mosquitto客户端实例
$client = new Mosquitto\Client("php_client");
$msgok=0; //=1表示收到消息
// 设置连接回调
$client->onConnect(function($rc, $message) {
if ($rc === 0) {
//echo "连接成功\n";
} else {
echo "ERR[$rc]";
}
});
// 设置消息接收回调
$client->onMessage(function($message) {
global $msgok;
echo("R[".$message->payload."]");
$msgok=1;
});
$client->setCredentials("shmictrl", "shmictrl123");
// 连接到MQTT服务器
$client->connect("i.a-diy.cn", 1883, 60);
// 发布消息
$client->publish($cfg_topic, $cfg_c, 0);
// 订阅主题
$client->subscribe($cfg_topic, 0);
// 等待消息
$timeout=2; //超时2秒
$startTime = microtime(true);
while (($msgok==0) && (microtime(true) - $startTime) < $timeout) {
$client->loop(50);
usleep(50000); // 50ms延迟
}
// 断开连接
$client->disconnect();
?>
本程序需要安装到带有 mosquitto 模块的php环境
