本帖最后由 吹口琴的钢铁侠 于 2015-9-10 20:58 编辑
由于一些原因,我测试Edison上的蓝牙发射广播包时,总是出现错误(在树莓派上用同样的代码是可行的),加上已经开始军训,于是我目前只能降低要求(军训完有空会继续折腾之前的设想),在原来基础上,加了些功能。
有兴趣使用这套方案的可以加 291715187
该方案的初衷是只用微信来控制物联网,免去开发其他的控制端应用。
此次更改主要加上了Edison,并不是简单地让微信来控制Edison,这太简单了.......
稍微加点难度,想到了在保证控制的及时情况下,减小服务器端的资源消耗。
简单地讲,就是每个Arduino或其他物联网节点,通过Edison来发送传感器数据和获取控制命令。
前面的内容类似于这个帖子,服务器端可以照做,注意要先通过新浪云的实名认证,有自己的VPS资源更佳。
在Edison主要使用node.js,来接受终端的请求和发起对服务器的请求。
在随便一个位置添加以下代码
- //httpserverrequestget.js
- var http =require('http');
- var http2 = require('http');
- var url = require('url');
- var querystring = require("querystring");
- var path1 = '/downup.php?token=doubleq&data=';
- var sensordata = '123';
- var pathful;
- var options;
- var resdata;
-
- http.createServer(function(req,res){
- res.writeHead(200,{'Content-Type':'text/html'});
- var objectUrl = url.parse(req.url);
- var objectQuery = querystring.parse(objectUrl.query);
- var gething = objectQuery['data'];
- pathful = path1+gething;
- options = {
- host: '1.ulink42.sinaapp.com',
- path: pathful,
- method: 'GET',
- headers: {
- 'Accept': 'text/html'
- }
- };
- var req = http2.request(options, function(res2) {
- res2.setEncoding('utf8');
- res2.on('data', function(data) {
- console.log(data);
- resdata = data;
- });
- });
- req.end();
- res.end(resdata);
- }).listen(8080);
复制代码
我测试的物联网终端是DFRobot出的WIDO
用IDE烧写以下的代码
- #include <Adafruit_CC3000.h>
- #include <ccspi.h>
- #include <SPI.h>
- #include <string.h>
- #include "utility/debug.h"
-
- #define WiDo_IRQ 7
- #define WiDo_VBAT 5
- #define WiDo_CS 10
-
- Adafruit_CC3000 WiDo = Adafruit_CC3000(WiDo_CS, WiDo_IRQ, WiDo_VBAT,
- SPI_CLOCK_DIVIDER);
-
- #define WLAN_SSID "yourwifi"
- #define WLAN_PASS "yourpswd"
- #define WLAN_SECURITY WLAN_SEC_WPA2
- int value = 0;
- char tem[5];
- char state;
- char c;
-
- #define TIMEOUT_MS 20000
-
- void setup(){
- Serial.begin(9600);
- pinMode(2, OUTPUT);
- Serial.println(F("Hello, Wido!\n"));
- Serial.println(F("\nInitialising the CC3000 ..."));
- if (!WiDo.begin())
- {
- Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
- while(1);
- }
-
- if (!WiDo.connectToAP(WLAN_SSID,WLAN_PASS,WLAN_SECURITY)) {
- Serial.println(F("Failed!"));
- while(1);
- }
-
- Serial.println(F("Connected!"));
- Serial.println(F("Request DHCP"));
- while (!WiDo.checkDHCP())
- {
- delay(100);
- }
- }
-
-
- void loop(){
- static Adafruit_CC3000_Client client;
-
- if(client.connected()){
-
- if(state == '0'){
- digitalWrite(2, LOW);
- }else if(state == '1'){
- digitalWrite(2, HIGH);
- }
-
-
-
- value = analogRead(0);
- value= int(value*0.0048828125*100); //把读取到的val转换为温度数值,系数一:0.00488125=5/1024,0~5V对应模拟口读数1~1024,系数二:100=1000/10,1000是毫伏与伏的转换;10是每10毫伏对应一度温升。
- itoa(value,tem,10);
- Serial.println(tem);
- client.fastrprint("GET /?data=");
- client.fastrprint(tem);
- client.fastrprint(" HTTP/1.1\r\nHost: 192.168.11.132\r\nUser-Agent: arduino-ethernet\r\nConnection: close");
- Serial.println("geted");
- client.fastrprint(F("\r\n"));
- client.fastrprint(F("\r\n"));
-
- Serial.println();
-
- unsigned long lastRead = millis();
- while (client.connected() && (millis() - lastRead < TIMEOUT_MS)) {
- while(client.available()) {
- c = client.read();
- Serial.print(c);
- if (c == '{'){
- state = client.read();
- Serial.print(state);
- }
- }
- }
- client.close();
- }else{
- uint32_t ip = WiDo.IP2U32(192,168,11,132);
- client = WiDo.connectTCP(ip,8080);
- Serial.println("Connecting IoT Server...");
- }
- delay(5000);
- }
复制代码
其中发起请求的ip是Edison的地址,务必使他们在同一局域网内,可在Edison的命令行中输入ifconfig来进行查看。
在这个例子中,WIDO收集LM35的温度值,上传到Edison,Edison收到请求后,将数据上传至新浪云上的服务器,并获得控制LED的命令,返回给WIDO,WIDO再对LED进行控制。
|