微信客户端+微信公众平台+新浪云SAE+Arduino+WS100(控制LED)
2016-09-04 15:20
330 查看
第一步:准备
1、智能手机微信客户端或微信电脑版
2、注册微信公众平台
https://mp.weixin.qq.com
3、注册新浪账号
http://www.sinacloud.com
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和配置环境变量)
步骤2:服务器端
1)、新浪云SAE
数据库构建
index.php代码
downup.php代码
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:调试手段
硬件:采用串口输出
服务器端:
注:本案例涉及多个过程,请逐步调试。
微信客户端与新浪云数据交互(通过查看数据库的值来判断交互情况)
硬件与新浪云交互(通过查看数据库的值来判断交互情况)
第四步:
1、智能手机微信客户端或微信电脑版
2、注册微信公众平台
https://mp.weixin.qq.com
3、注册新浪账号
http://www.sinacloud.com
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和配置环境变量)
#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 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 = "%s%s%stext%s0"; $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:调试手段
硬件:采用串口输出
服务器端:
注:本案例涉及多个过程,请逐步调试。
微信客户端与新浪云数据交互(通过查看数据库的值来判断交互情况)
硬件与新浪云交互(通过查看数据库的值来判断交互情况)
第四步:
相关文章推荐
- 微信客户端+微信公众平台+新浪云SAE+Arduino+WS100(控制LED)
- Arduino+W5100+新浪云SAE(开发语言:Python)+微信公众平台(实现LED控制)
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(九)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(二)
- 微信公众平台用新浪云自带的域名提示非微信官方网页怎么解决办法
- 友盟社会化分享之判断是否安装了QQ、微信、新浪微博客户端
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(十一)使用domoticz+mosquitto+Android客户端实现控制STM32板上的LED(二)
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(八)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(一)
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(3:实现菜单/工具栏按钮的解耦及状态控制)
- 新浪微博客户端(31)-显示相册图片上的GIF标记
- 新浪微博客户端(34)-block的细节与本质
- 用PWM波控制LED灯的闪烁
- 微信公众平台接口调试(微信订阅号自动回复接口)
- 新浪围脖android客户端下载
- 基于Proteus+8051汇编应用实例系列之四--4×4键盘矩阵控制条形LED显示
- 微信Android客户端架构演进之路
- 仿新浪微盾客户端项目简介一
- 微信公众平台开发之申请微信开发测试号及花生壳内网映射
- OneNET平台控制W5500开发板LED灯
- window下版本控制工具Git 客户端安装