oLamp คืนชีพ

Started by Max Lab, May 01, 2015, 10:47:13 AM

Previous topic - Next topic

Max Lab

ที่ล่มเพราะใช้ ESP8266 แล้วสตรีมมิ่งผ่านโปรโตคอล TCP ไม่มีสเถียรภาพครับ เลยยกเลิกโครงการเลย หลักยกเลิกแล้วเลยเอาโค้ดมาแบ่งกันครับ เผื่อใครสนใจจะนำไปพัฒนาต่ออีก

ESP8266 by Arduino IDE

#include <ESP8266WiFi.h>

char ssid[20] = "Max Home 2";
char pass[20] = "987654321";
char host[20] = "maxlabapi.com";
int tcpPort = 8086;

WiFiClient client;

void ConnectHost();

void setup() {
  Serial.begin(115200);
  delay(10);
 
  // put your setup code here, to run once:
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, pass);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected"); 
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
 
  Serial.println("Start TCP client");
  ConnectHost();
 
  /* client.print("{\"a\":\"NwDv\",\"uid\":\"5540911a6d5d905477a3199d\"}");
  while(client.connected()){
    while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.println(line);
    }
  }
 
  client.flush();
  client.stop();
  Serial.println("closing connection");
  */
}

void loop() {
  if (!client.connected())
    ConnectHost();
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.println(line);
    if (line == "T"){
      client.print("{\"a\":\"K\"}");
    }
  }
  delay(100);
}

void ConnectHost(){
  while (!client.connect(host, tcpPort)) {
    Serial.println("Connection failed");
    delay(1000);
  }
  Serial.println("Connection success");
}


TCP Server ใช้ภาษา NodeJS ร่วมกับ MongoDB ครับ

#!/bin/env node

// Settings
var settings = {
WebservicePort: 8080,
SocketPort: 8086,
loginDB: {
host: '127.0.0.1',
port: 27017,
user: "admin",
pass: "YOUPASSWORD",
dbName: "olamp",
}
};

var collection = {};
var clients = [];
var NumID = 0;

// Retrieve
var MongoClient = require('mongodb').MongoClient;
net = require('net'),
app = require('express')(),
bodyParser = require('body-parser'),
multer = require('multer'),
sha1 = require('sha1'),
md5 = require('MD5');

// function
var passEncode = function(psw){
return md5(sha1(psw) + "thisoLampPass");
}
var isEmail = function(email) {
    var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
    return re.test(email);
}
var testLogin = function(collection, login, callback) {
collection.findOne({email: login.email, pass: login.pass}, function(err, items) {
if (typeof callback === 'function')
callback((items ? false : true), (items ? items._id.toHexString() : 0));
});
}
var isDataLogin = function(login, callback) {
if (typeof callback !== 'function')
return false;
if (!login.email || !login.pass){
callback('Please enter your email address and password');
return;
}
if (!isEmail(login.email)){
callback('Email Address in invalid format');
return;
}
if (login.pass.length < 6){
callback('Passwords must be at least 6 characters');
return;
}
callback(false);
}

// Connect to the db
MongoClient.connect('mongodb://' + settings.loginDB.user + ':' + settings.loginDB.pass + '@' + settings.loginDB.host + ':' + settings.loginDB.port + '/' + settings.loginDB.dbName, function(err, db) {
if(!err) {
console.log("We are connected");

/* db.listCollections({name: 'member'}, function(err, collinfo) {
if (!collinfo)
db.createCollection('member');
});

db.listCollections({name: 'device'}, function(err, collinfo) {
if (!collinfo)
db.createCollection('device');
});

db.listCollections({name: 'clients'}).next(function(err, collinfo) {
if (!collinfo)
db.createCollection('clients');
}); */

// Collection
collection.member = db.collection('member');
collection.device = db.collection('device');
collection.clients = db.collection('clients');

collection.device.update({}, { $set: { socket: -1 }}, function (err, result) {
if (err) console.log(err);
});

/* collection.member.find().toArray(function(err, items) {
console.log(items);
var jsonTotext = JSON.stringify(items);
}); */

// Keep track of the chat clients
// var clients = [];

console.log('TCP Server');

net.createServer(function (socket) {
// Put this new client in the list
var clientsId = ++NumID;
clients[clientsId] = socket;

socket.on('data', function (data) {
console.log(data.toString());
try{
var revData = JSON.parse(data.toString());
if (revData.a == 'NwDv'){
collection.device.insert({ uid: revData.uid, status: 0, socket: clientsId }, function(err, result) {
if (err) console.log("MongoDB err: " + err);

var dvID = result.ops[0]._id;
socket.write('id:' + dvID + "\r");
});
}else if (revData.a == 'LiN'){
collection.device.updateOne({_id: revData.id}, { $set: { socket: clientsId }}, function(err, result) {
if (err) console.log("MongoDB err: " + err);

socket.write("OK\r");
});
}else if(revData.a == 'K'){
setTimeout(function(){
socket.write("T\r");
// console.log('TestConK' + clientsId);
}, 10000);
}
} catch (e) {
console.log(e);
}
});

var onEndSocket = function() {
console.log(clients.indexOf(socket) + ' end');
clients.splice(clients.indexOf(socket), 1);
}

// Remove the client from the list when it leaves
socket.on('end', onEndSocket);

socket.on('error', onEndSocket);

setTimeout(function(){
socket.write("T\r");
// console.log('TestCon' + clientsId);
}, 10000);

console.log((clients.length - 1) + ' connected');

// socket.write("Welcome " + socket.name + "\n");
}).listen(settings.SocketPort, function() {
console.log("Port: " + settings.SocketPort + " listener");
});

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.all('/', function (req, res) {
res.send('<h1>Hello! this oLamp system.</h1>');
});

app.post('/register', function (req, res) {
var post = req.body;
// console.log(post);
if (!post){
res.json({ err: 'post null for \'name\' \'email\' and \'pass\'' });
return;
}
isDataLogin({email: post.email, pass: post.pass}, function(err) {
if (err){
res.json({ err: err });
return;
}
if (!post.name){
res.json({ err: 'Please enter your name' });
return;
}
if (post.name.length < 3){
res.json({ err: 'Name must be at least 3 characters' });
return;
}

var name = post.name,
email = post.email,
pass = post.pass,
ENpass = passEncode(post.pass);

collection.member.findOne({email: email }, function(err, items) {
if (err) {
console.log("MongoDB err: " + err);
res.json({ err: err });
return;
}

if (items){
res.json({ err: 'Sorry. This email account is already used.' });
return;
}

collection.member.insertOne({ name: name, email: email, pass: ENpass }, function(error, result) {
if (err) {
console.log("MongoDB err: " + err);
res.json({ err: err });
return;
}
res.json({ err: false });
});
});
});
});

app.post('/login', function (req, res) {
var post = req.body;
// console.log(post);
if (!post){
res.json({ err: 'post null for \'email\' and \'pass\'' });
return;
}
isDataLogin({email: post.email, pass: post.pass}, function(err) {
if (err){
res.json({ err: err });
return;
}

var email = post.email,
pass = post.pass,
ENpass = passEncode(post.pass);

testLogin(collection.member, {email: email, pass: ENpass}, function(err) {
if (err){
res.json({ err: 'email or password is incorrect.' });
return;
}
res.json({ err: false });
});
});
});

app.get('/device/list', function (req, res) {
var get = req.query;
if (!get){
res.json({ err: 'get null for \'email\' and \'pass\'' });
return;
}
isDataLogin({email: get.email, pass: get.pass}, function(err) {
if (err){
res.json({ err: err });
return;
}

var email = get.email,
pass = get.pass,
ENpass = passEncode(get.pass);

testLogin(collection.member, {email: email, pass: ENpass}, function(err, userid) {
if (err){
res.json({ err: 'login fail.' });
return;
}

collection.device.find({ uid: userid }).toArray(function(err, items) {
if (err)
console.log(err);

res.json({err: false, device: items});
});
});
});
});

app.listen(settings.WebservicePort, function() {
console.log('Starting web service port ' + settings.WebservicePort);
});
}else{
console.log(err);
}
});


ปัญหาที่ผมเจอคือเปิด Socket แล้ว แต่พอเชื่อมต่อไปได้ซัพพัก ตัว ESP8266 ก็หลุดออกจากเซิฟเวอร์ไปครับ ต้องเชือมต่อใหม่ กว่าจะเชื่อมต่อได้ก็ยากเย็นมากครับ Fail อยู่หลายรอบเลย อีกอย่างคือพอหลุดจากเซิฟเวอร์แล้ว เซิฟเวอร์ก็ไม่รับรู้ว่าหลุดไปแล้วด้วยครับ มันเลยไม่ยอมปิด Socket ทิ้งไปซักที :-[
ตสใปกติแล้วถ้าโครงการนี้สำเร็จ ก็แค่ผลิตตัวชิ้นอุปกรณ์อย่างเดียว ส่วนเรื่องเซิฟเวอร์เราเอาไปไว้บน Cloud ครับ มีแอพควบคุมได้จากทุกส่วนบนโลก

Edit: ในขณะที่ความหวังริปหรี่กับ ESP8266 (03) ก็พบว่า ESP-12 น่าจะทำงานได้ดีกว่า โครงการนี้อาจจะมีชีวิตกลับมาอีกครั้งครับ
Elec-Za เพื่อนอิเล็กทรอนิกส์ : http://www.elec-za.com/

wlasoi

ปัญหาคล้ายกับ  WS500 คือ มันรับ stream ไม่ได้ .. ลองแก้โดยส่ง UDP ครับ ลดขนาด package ลงมา

wlasoi

อย่าว่าแต่ ESP WS500  เลยของ Microchip ก็เป็น ... พวก chip TCP/IP ราคาถูกๆก็แบบนี้แหละ ทำงานได้แต่ เร็วไม่ได้


Max Lab

Quote from: wlasoi on May 01, 2015, 07:39:44 PM
ปัญหาคล้ายกับ  WS500 คือ มันรับ stream ไม่ได้ .. ลองแก้โดยส่ง UDP ครับ ลดขนาด package ลงมา
ผมติดปัญหาอย่างที่บอก เวลามัน Disconnect มันจับไม่ได้ว่าได้หายไปแล้ว ถ้าเปิดนานๆจะทำให้เซิฟเวอร์ค้างครับ ผมว่าถึงเปลี่ยนมาใช้ UDP ก็คงมีปัญหาเดียวกัน :'(
Elec-Za เพื่อนอิเล็กทรอนิกส์ : http://www.elec-za.com/

Max Lab

จับมันคืนชีพมาอีกครั้งครับ พอมาใช้ ESP-12 ก็พบว่ามันทำงานได้ดีขึ้นมาก จากเดิมที่ใช้ ESP-03 แล้วมันหลุดบ้าง ค้างบ้าง เชื่อมต่อไม่ได้บ้างครับ
Elec-Za เพื่อนอิเล็กทรอนิกส์ : http://www.elec-za.com/

amaloma

ผมสนใจ ESP8266 จากหลายกระทู้ในนี้
แต่ที่สงสัยก็คือ ESP- version ไหนๆ ก็ใช้ชิบตัวเดียวกัรนี้ครับ อาจจะเกิดจากสัญญาณรบกวน
ตัว ESP-12 มีอะไรต่างจาก ESP-03 บ้างครับ

Max Lab

Quote from: amaloma on May 03, 2015, 09:41:55 PM
ผมสนใจ ESP8266 จากหลายกระทู้ในนี้
แต่ที่สงสัยก็คือ ESP- version ไหนๆ ก็ใช้ชิบตัวเดียวกัรนี้ครับ อาจจะเกิดจากสัญญาณรบกวน
ตัว ESP-12 มีอะไรต่างจาก ESP-03 บ้างครับ
มันเร็วกว่าครับ ด้วยสาเหตุอันใดอันนี้ไม่ทราบจริงๆครับ ปัญหาตามที่บอกคือใช้ 03 มันมีปัญหาอยู่ตลอด พอมาใช้ 12 ปัญหาไม่มีครับ และเร็วมากๆด้วย ผมก็ไม่เข้าใจเหมือนกันครับว่าทำไมถึงเป็นแบบนั้น สัญญาณรบกวนก็อาจจะเป็นไปได้ครับ ???
Elec-Za เพื่อนอิเล็กทรอนิกส์ : http://www.elec-za.com/

db4linq

ผมทำจบไปแล้วกำลัง test ระบบอยู่

ESP8266 กับ LED RGB  connect กับ Cloud Server ที่พัฒนาขึ้นมาเอง

http://www.youtube.com/v/R019bat8gco

ESP8266 2 ชุด connect กับ Cloud Server

http://www.youtube.com/v/uvc8TM7pB6w

ใช้ 03 ก็ OK ไม่มีปัญหาเรื่องหลุด แต่ช้ากว่า 07, 12