$wxObj0 = new class_wechat_sdk($wx_options);
$deviceid = $_POST["subscribe_deviceid"];
$openid = $_POST["subscribe_openid"];
echo "Input Device ID = " . $deviceid . "<br>";
echo "Input User ID = " . $openid . "<br>";
//Step1:刷新Token
echo "<br><H2>微信硬件工作环境即将开始......<br></H2>";
$wxObj = new class_wx_IOT_sdk(WX_APPID, WX_APPSECRET);
//实验Token是否已经被刷新
echo "<br>测试最新刷新的Token=<br>" . "{$wxObj->access_token}" . "<br>";
// Step2 设备状态查询
echo "<br>查询设备状态 <br>";
var_dump($wxObj->getstat_qrcodebyDeviceid($deviceid));
// Step3 用户绑定设备查询
echo "<br>查询用户绑定状态 <br>";
$result = $wxObj->getstat_qrcodebyOpenId($openid);
var_dump($result);
echo "<br>Device_List =  <br>";
$devicetype = $result["device_list"][0]["device_type"];
var_dump($result["device_list"]);
// Step4 微信云强制绑定设备
$result = $wxObj->compel_bind($deviceid, $openid);
echo "<br>微信云强制绑定设备结果  <br>";
var_dump($result);
// Step5 第三方数据库绑定
$wxDbObj = new class_mysql_db();
echo "<br>第三方云数据库查询设备结果  <br>";
var_dump($wxDbObj->db_BleBoundInfo_query($openid));
echo "<br>第三方云数据库强绑设备结果  <br>";
var_dump($wxDbObj->db_BleBoundInfo_save($openid, $deviceid, $openid, $devicetype));
//end of tool_main();
 public function receive_deviceMessage($data)
 {
     $msgType = $data->MsgType;
     //经过simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)之后,数据已经可以使用指针操作
     //一个关键点是,LIBXML_NOCDATA这个选项是否合适
     switch ($msgType) {
         case "device_text":
             //先推送接受到的设备消息给客服/测试人员的微信界面上
             //已经BASE64解码后的数据
             //给硬件设备发送回复消息,直接使用客服接口给微信界面
             $content = base64_decode($data->Content);
             $transMsg = "收到设备消息DEVICE_TEXT是: " . $content;
             $this->send_custom_message($data->OpenID, 'text', $transMsg);
             //使用API-CURL推送客服微信用户
             //发送到L3的比特流还需要被反系列化
             $wxL3Obj = new class_L3_Process_Func();
             $rev = $wxL3Obj->L3_deviceMsgProcess("device_text", $content, $data->FromUserName, $data->DeviceID);
             // BASE64编码后,再发送给设备,使用ECHO-XML方式推送微信用户
             $tmp = base64_encode($rev);
             $transMsg = $this->xms_responseDeviceText($data->FromUserName, $data->ToUserName, $data->DeviceType, $data->DeviceID, $data->SessionID, $tmp);
             break;
         case "device_event":
             if ($data->Event == "bind" or $data->Event == "unbind") {
                 //a) 先推送信息给客户/测试人员的微信界面,但考虑到EVENT中详细的内容都是客户推送结果,故而省略以下推送
                 $inputContent = base64_decode($data->Content);
                 //应该是空包,即$content = ''
                 //b) 再执行绑定解绑存储,以便下一次查询
                 if ($data->Event == "bind") {
                     $wxDbObj = new class_mysql_db();
                     //其实,还需要看看是否已经绑定了,否则不应该重新绑定
                     if ($wxDbObj->db_BleBoundInfo_duplicate($data->FromUserName, $data->DeviceID, $data->OpenID, $data->DeviceType)) {
                         $transMsg = "DEVICE_EVENT重复绑定,不处理";
                     } else {
                         $transMsg = "DEVICE_EVENT初次绑定成功";
                         $wxDbObj->db_BleBoundInfo_save($data->FromUserName, $data->DeviceID, $data->OpenID, $data->DeviceType);
                     }
                     //c) 这里还有个假设:解绑来自于用户的操作,Event/Ubscribe和Event_device/Ubind是分离的
                     //如果解绑逻辑触发跟Unsubscribe是一起的,这个逻辑就要改变
                 } else {
                     $db_con = new class_mysql_db();
                     $db_con->db_BleBoundInfo_delete($data->FromUserName);
                     $transMsg = "DEVICE_EVENT解绑";
                 }
                 $this->send_custom_message($data->OpenID, 'text', $transMsg);
                 //d) 最后执行可能的L3解码,处理后的内容,直接使用echo给微信界面即可
                 //因为是DEVICE_EVENT事件,设备内传输的L3信息应该是空的,反馈给设备的L3依然保留,留下一个悬念
                 //反序化及系列化,TBD
                 $wxL3Obj = new class_L3_Process_Func();
                 $tmp = $wxL3Obj->L3_deviceMsgProcess($data->Event, $inputContent, $data->FromUserName, $data->DeviceID);
                 $tmp = base64_encode($tmp);
                 //使用ECHO-XML方式推送微信用户
                 $transMsg = $this->xms_responseDeviceEvent($data->FromUserName, $data->ToUserName, $data->Event, $data->DeviceType, $data->DeviceID, $data->SessionID, $tmp);
                 break;
             } else {
                 $transMsg = $this->xms_responseText($data->FromUserName, $data->ToUserName, "收到非法绑操消息");
             }
             break;
         default:
             //设备级的其它消息体
             $transMsg = $this->xms_responseText($data->FromUserName, $data->ToUserName, "收到未识别的设备级消息");
             break;
     }
     //MsgType判定结束
     return $transMsg;
 }