一、客户端的更新/开通

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环境