ที่ล่มเพราะใช้ 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 น่าจะทำงานได้ดีกว่า โครงการนี้อาจจะมีชีวิตกลับมาอีกครั้งครับ