
第一步:准备
1、智能手机微信客户端或微信电脑版
2、注册微信公众平台
3、注册新浪账号
4、拥有一块Arduino UNO R3
http://item.jd.com/1593883356.html
5、拥有一块WS100
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.NJ6mUE&id=528047071612&_u=4p210bab347
第二步:工作流程
第三步:开始工作
步骤1:硬件部分
1)、Arduino、WS100、网线、路由器。
2)、路由器设置
下图的mac和IP是分配到Arduino设备的(非必须,未验证)
3)、Arduino设备程序烧录
Arduino IDE
https://www.arduino.cc/en/Main/Software
Eclipse IDE
http://eclipse.baeyens.it/download.php(含有自带的arduino的插件,eclipse安装前需要安装JDK和配置环境变量)
Arduino代码
- #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代码
- <?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 NULLn”);
- 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:调试手段
硬件:采用串口输出
服务器端:
注:本案例涉及多个过程,请逐步调试。
微信客户端与新浪云数据交互(通过查看数据库的值来判断交互情况)
硬件与新浪云交互(通过查看数据库的值来判断交互情况)
第四步:
COMMENTS