微信客户端+微信公众平台+新浪云SAE+Arduino+WS100(控制LED)

第一步:准备
1、智能手机微信客户端或微信电脑版
2、注册微信公众平台
3、注册新浪账号
4、拥有一块Arduino UNO R3
5、拥有一块WS100

第二步:工作流程



第三步:开始工作
步骤1:硬件部分
1)、Arduino、WS100、网线、路由器。
2)、路由器设置
下图的mac和IP是分配到Arduino设备的(非必须,未验证)
3)、Arduino设备程序烧录
Arduino IDE
Eclipse IDE
http://eclipse.baeyens.it/download.php(含有自带的arduino的插件,eclipse安装前需要安装JDK和配置环境变量)
#include "Arduino.h"
#include <SPI.h>
#include <Ethernet.h>


char state = '0';
char c;
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,3,2);

IPAddress myDns(192,168,3,1);

EthernetClient client;

char server[] = "你的链接";
int sensrdata = 50;

unsigned long lastConnectionTime = 0;
boolean lastConnected = false;
const unsigned long postingInterval = 200*1000;

//The setup function is called once at startup of the sketch
void setup()
{
// Add your initialization code here
	  Serial.begin(9600);
	  delay(1000);
	  Ethernet.begin(mac, ip, myDns);
	  Serial.print("My IP address: ");
	  Serial.println(Ethernet.localIP());
	  pinMode(13, OUTPUT);
	  pinMode(7, OUTPUT);
}

// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
	  while(client.available()) {
		  state = client.read();
		if(state == '{'){				//关灯	0
			Serial.println(state);
			digitalWrite(13, LOW);
			digitalWrite(7, HIGH);
			delay(9000);
		  }else if(state == '}'){		//开灯	1
			Serial.println(state);
			digitalWrite(13, HIGH);
			digitalWrite(7, LOW);
			delay(9000);
		  }
	  }

	  if (!client.connected() && lastConnected) {
	    Serial.println("disconnecting 2.");
	    client.stop();
	  }

	  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
	    if (client.connect(server, 80)) {

	    	Serial.println("connecting");
	      // send the HTTP PUT request:
	      client.print("GET /downup.php?token=你的Token&data=");
	      client.print(sensrdata);
	      client.println(" HTTP/1.1");
	      client.println("Host: 你的链接");
	      client.println("User-Agent: arduino-ethernet");
	      client.println("Connection: close");
	      client.println();

	      lastConnectionTime = millis();
	    }else {
	      Serial.println("connection failed");
	      Serial.println("disconnecting 1.");
	      client.stop();
	    }
	  }
	  lastConnected = client.connected();
}

步骤2:服务器端
1)、新浪云SAE
数据库构建
index.php代码

    
    FromUserName;
$toUserName = $xmlObj->ToUserName;
$msgType = $xmlObj->MsgType;
 
 
if($msgType == 'voice') {//判断是否为语音
        $content = $xmlObj->Recognition;
}elseif($msgType == 'text'){
        $content = $xmlObj->Content;
}else{
        $retMsg = '只支持文本和语音消息';
}
 
if (strstr($content, "编号")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        mysql_select_db("你的数据库名字", $con);//修改数据库名
 
        $result = mysql_query("SELECT * FROM sensor");
        while($arr = mysql_fetch_array($result)){
          if ($arr['ID'] == 1) {
                  $tempr = $arr['data'];
          }
        }
        mysql_close($con);
 
    $retMsg = "报告:"."\n"."编号为".$tempr."!";
}else if (strstr($content, "打开LED")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
 
 
        $dati = date("h:i:sa");
        mysql_select_db("你的数据库名字", $con);//修改数据库名
 
        $sql ="UPDATE switch SET timestamp='$dati',state = '1' WHERE ID = '1'";//修改开关状态值
 
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());
        }else{
                mysql_close($con);
                $retMsg = "OK";
        }
}else if (strstr($content, "关闭LED")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
 
 
        $dati = date("h:i:sa");
        mysql_select_db("你的数据库名字", $con);//修改数据库名
 
        $sql ="UPDATE switch SET timestamp='$dati',state = '0' WHERE ID = '1'";//修改开关状态值
 
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());
        }else{
                mysql_close($con);
                $retMsg = "OK";
        }        
}else{
        $retMsg = "命令无响应";
}
 
//装备XML
$retTmp = "
    
    
                
     
     
     
     
                
     
     
     
     
                
     
     
      
      %s
     
     
                
     
     
     
     
                
     
     
     
     
                
     
     
      
      0
     
     
                
    
    ";
$resultStr = sprintf($retTmp, $fromUserName, $toUserName, time(), $retMsg);
 
//反馈到微信服务器
echo $resultStr;
?>
<?php
 
//错误日志
function echo_server_log($log){
        file_put_contents("log.txt", $log, FILE_APPEND);
}
 
//定义TOKEN
define ( "TOKEN", "微信TOKEN" );
 
//验证微信公众平台签名
function checkSignature() {
        $signature = $_GET ['signature'];
        $nonce = $_GET ['nonce'];
        $timestamp = $_GET ['timestamp'];
        $tmpArr = array ($nonce, $timestamp, TOKEN );
        sort ( $tmpArr );
         
        $tmpStr = implode ( $tmpArr );
        $tmpStr = sha1 ( $tmpStr );
        if ($tmpStr == $signature) {
                return true;
        }else{
                return false;
        }
}
if(false == checkSignature()) {
        exit(0);
}
 
//接入时验证接口
$echostr = $_GET ['echostr'];
if($echostr) {
        echo $echostr;
        exit(0);
}
 
//获取POST数据
function getPostData() {
        $data = $GLOBALS['HTTP_RAW_POST_DATA'];
        return        $data;
}
$PostData = getPostData();
 
//验错
if(!$PostData){
        echo_server_log("wrong input! PostData is NULL");
        echo "wrong input!";
        exit(0);
}
 
//装入XML
$xmlObj = simplexml_load_string($PostData, 'SimpleXMLElement', LIBXML_NOCDATA);
 
//验错
if(!$xmlObj) {
        echo_server_log("wrong input! xmlObj is NULL\n");
        echo "wrong input!";
        exit(0);
}
 
//准备XML
$fromUserName = $xmlObj->FromUserName;
$toUserName = $xmlObj->ToUserName;
$msgType = $xmlObj->MsgType;
 
 
if($msgType == 'voice') {//判断是否为语音
        $content = $xmlObj->Recognition;
}elseif($msgType == 'text'){
        $content = $xmlObj->Content;
}else{
        $retMsg = '只支持文本和语音消息';
}
 
if (strstr($content, "编号")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        mysql_select_db("你的数据库名字", $con);//修改数据库名
 
        $result = mysql_query("SELECT * FROM sensor");
        while($arr = mysql_fetch_array($result)){
          if ($arr['ID'] == 1) {
                  $tempr = $arr['data'];
          }
        }
        mysql_close($con);
 
    $retMsg = "报告:"."\n"."编号为".$tempr."!";
}else if (strstr($content, "打开LED")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
 
 
        $dati = date("h:i:sa");
        mysql_select_db("你的数据库名字", $con);//修改数据库名
 
        $sql ="UPDATE switch SET timestamp='$dati',state = '1' WHERE ID = '1'";//修改开关状态值
 
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());
        }else{
                mysql_close($con);
                $retMsg = "OK";
        }
}else if (strstr($content, "关闭LED")) {
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
 
 
        $dati = date("h:i:sa");
        mysql_select_db("你的数据库名字", $con);//修改数据库名
 
        $sql ="UPDATE switch SET timestamp='$dati',state = '0' WHERE ID = '1'";//修改开关状态值
 
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());
        }else{
                mysql_close($con);
                $retMsg = "OK";
        }        
}else{
        $retMsg = "命令无响应";
}
 
//装备XML
$retTmp = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>0</FuncFlag>
                </xml>";
$resultStr = sprintf($retTmp, $fromUserName, $toUserName, time(), $retMsg);
 
//反馈到微信服务器
echo $resultStr;
?>
downup.php代码
<?php  
error_reporting(E_ALL ^ E_DEPRECATED);//在php程序代码里面设置报警级别

	if ($_GET['data'] && ($_GET['token'] == "微信TOKEN")) {//可以改token,这相当于密码,在Arduino端改成相应的值即可
        $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
        $data = $_GET['data'];
        mysql_select_db("你的数据库名字", $con);//要改成相应的数据库名
 
        $result = mysql_query("SELECT * FROM switch");
        while($arr = mysql_fetch_array($result)){//找到需要的数据的记录,并读出状态值
                if ($arr['ID'] == 1) {
                        $state = $arr['state'];
                }
        }
        $dati = date("h:i:sa");//获取时间
        $sql ="UPDATE sensor SET timestamp='$dati',data = '$data' WHERE ID = '1'";//更新相应的传感器的值
        if(!mysql_query($sql,$con)){
            die('Error: ' . mysql_error());//如果出错,显示错误
        }
        mysql_close($con);
        
        if($state == "0"){			//关灯
        	echo "{";
        }else if($state == "1"){	//开灯
            echo "}";
        }
            
}else{
        echo "Failed!";//请求中没有type或data或token或token错误时,显示Failed
}
 
?>
2)、微信公众平台
步骤3:测试网络互通
硬件IP(内网):192.168.3.2
硬件DNS(内网):192.168.3.1
工作电脑IP(内网):192.168.3.100
新浪云地址:http://1.gamesalad.applinzi.com/
新浪云端口:80或443
微信TOKEN:自己定义
微信填写的服务器URL:http://1.gamesalad.applinzi.com/index.php


步骤4:调试手段
硬件:采用串口输出
服务器端:
注:本案例涉及多个过程,请逐步调试。
微信客户端与新浪云数据交互(通过查看数据库的值来判断交互情况)
硬件与新浪云交互(通过查看数据库的值来判断交互情况)

第四步:


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏一点

您的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值