2017-10-18 160 views
0

我运行Debian 8 6的NodeJS,并与IBM沃森物联网平台玩耍连接的NodeJS对象:https://github.com/ibm-watson-iot/iot-nodejs请共享数据库/内存

我创建了一个IBM的网关,并能使用以下代码连接并发布数据:

var gatewayClient = new iotf.IotfGateway(config); 

gatewayClient.connect(); 

gatewayClient.on('connect', function(){ 
    gatewayClient.publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}'); 

}); 

配置包含有关我的唯一网关的唯一信息。

我现在面临的挑战是,我希望能够在其他NodeJS实例中重用gatewayClient。所以我想的有点像以下(伪代码):

var gatewayClient = new iotf.IotfGateway(config); 
gatewayClient.connect(); 

sharedDatabase-perhaps-Redis[unique-gatewayClient-ID].push(gatewayClient); 

然后在同一台服务器上的任何我的NodeJS可以拨打:

sharedDatabase-perhaps-Redis[unique-gatewayClient-ID].publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}'); 

我希望这是有意义的,但如果它是可存档的,如何以及如果Redis可以成为解决方案或其他数据库类型的东西,我有点困惑。

整个想法是能够保持连接活动/持久性,并让来自不同NodeJS实例的客户端通过该实例推送数据,而不会创建新的连接。

回答

1

网络连接不是可序列化的,不能轻易在进程间共享。您应该考虑创建一个维护与IBM后端连接的单个“主”进程,客户端将与该主服务器而不是直接与IBM进行通信(对于IoT目的,常用的通信方法是使用MQTT)。

此外,什么阻止您运行将在单个进程中的这些单独的Node.js进程中运行的代码?这也可以解决问题,因为每一个可以直接使用连接。

根据我的理解,您已经有一个服务器进程接受客户端消息,并应将这些消息转发给IBM后端。对于每个唯一的客户端,您希望创建到后端的新连接,或重新使用先前创建的连接。

你可以使用这样的事情(错误处理扣缴简洁):

// Function to get the connection for a particular client id, 
// or, if one doesn't exist yet, create a new one. 

let clients = {}; 
function connectionForClient(uniqueGatewayClientID) { 
    // Check if we already have a connection for this client. 
    if (! clients[uniqueGatewayClientID]) 

    // No, create a new one, represented by a promise. 
    clients[uniqueGatewayClientID] = new Promise(function(resolve) { 
     let client = new iotf.IotfGateway(config); 

     client.connect(); 

     client.on('connect', function() { 
     resolve(client); 
     }); 
    }); 

    } 
    return clients[uniqueGatewayClientID]; 
} 

要使用:

connectionForClient(uniqueGatewayClientID).then(function(client) { 
    client.publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}'); 
}); 
+0

我有我的设备JSON数据发布到使用Express来听我的NodeJS应用在端口80上。此数据应通过网关连接发布到IBM,该连接可能已建立,也可能尚未建立。如果它已经建立,那么应该使用它,如果不是,那么应该建立它,以便其他人可以在未来重新使用它。 –

+0

哦,我想我明白你的意思了:你需要为每个独特的客户创建一个新的连接。让我想一想。 – robertklep

+0

好吧,我想现在我已经做了一个证明,我只是在我的Express之外创建一个数组,以存储IBM gatewayClients。然后在收到HTTP POST时检查isConnected。这似乎是一个诀窍,但跨服务器(未来)的扩展可能会很困难...... –