使用Tessel设备与Heroku服务器进行WebSocket通信

目的 – 为了达到某个预定的结果或目标而进行的行动或活动。

(Note: The given phrase is already in Chinese. Paraphrasing it would simply involve providing synonyms or rephrasing it in a different way.)

在Tessel上似乎无法使用Socket.io客户端,所以我尝试了另一种WebSocket通信的方法。这次我将使用Tessel的WebSocket通信示例以及通过npm安装的nodejs-websocket库。

顺便提一下,我刚刚了解到,Socket.io似乎不能直接连接原生的WebSocket。虽然我还没有查看过源代码,所以不太确信,如果有人知道如何做,请告诉我一下。

请使用以下内容进行参考

尝试使用socket.io客户端

使用WebSocket:
https://forums.tessel.io/t/使用WebSocket/821

socket.io有类似sockjs的原始WebSocket访问吗?

操作步骤

服务器端的实现

我准备了以下的源代码。

我会在npm上安装nodejs-websocket和mongoose。我觉得应该是这样的。我使用mongoose将WebSocket收到的JSON存储起来以供确认之用。

$npm install nodejs-websocket --save
$npm install mongoose --save
var ws = require('nodejs-websocket');
var mongoose = require('mongoose');

var port = process.env.PORT || 8000;
var mongodb_uri = process.env.MONGOLAB_URI;

var db = mongoose.connect(mongodb_uri);

var HelloSchema = new mongoose.Schema({
     date:{type:String}
});
var Hello = db.model('hello', HelloSchema);

// Create the websocket server, provide connection callback
var server = ws.createServer(function (conn) {
  console.log('Accepted new connection...');

  // If get a binary stream is opened up
  conn.on('binary', function(stream) {
    // When we get data
    stream.on('data', function(data) {
      // Log the data
      console.log('Got data:', data.toString());

      var hello = new Hello(JSON.parse(data));
      hello.save(function(err){
          if(err){
            console.log(err);
            return;
          }
          console.log("saved");
      });

    });
  });

  conn.on("close", function (code, reason) {
      console.log("Connection closed");
  });

}).listen(port);

console.log('Listening on port', port);

MONGOLAB_URI是mongolab服务器的URI,格式如下所示。

mongodb://<USER>:<PASS>@xxxx.mongolab.com:49150/<SCHEMA>

将应用程序部署到Heroku上。

我认为是这个样子的。

$git init
$git add .
$git commit -m "initial commit"
$heroku craete <Application Name>
$git push heroku master

这次我们通过Web控制台设置了两个环境变量MONGODB_URI和PORT。但是使用命令更简单呢。
http://chomast.com/study/web/heroku-environment-variables.html

客户端的实现

var ws = require('nodejs-websocket');

// Set the binary fragmentation to 1 byte so it instantly sends anything we write to it
ws.setBinaryFragmentation(1);

// When we get a connection
var connection = ws.connect('ws://<URI>', function(err) {

  if(err){
    console.log(err);
    return;
  }
  console.log("connected");

  setInterval(function (){
    var now = new Date();
    var str = '{ "date" : "' + now + '" }';
    connection.sendBinary(new Buffer(str));
  }, 1000);

});

在执行之前需要先进行nodejs-websocket的npm安装。

最好从本地进行一次正常的操作确认。

$node client.js

这次我通过查看MongoLab的消息来进行了操作确认。

在 Tessel 上运行

$tessel run client.js

似乎有动过。 guò.)