SocketCAN + Express.js + Node.js + Socket.io

时间:2018-10-22 09:32:43

标签: node.js sockets express socket.io socketcan

因此,我已经安装了SocketCAN,Express和Socket.io节点模块。

我想做的是: *通过Express服务器上的Socket.io初始化Socket *使用服务器上的socketCAN“ node-can”模块将消息发送到我的Frontend(Angular6)

到目前为止我做了什么:

*创建一个Express服务器并初始化Socket.io和节点,可以在那里 *能够连接到我的应用程序中的套接字

以下是实现此目的的代码:

    const express = require('express');
    const path = require('path');
    const http = require('http');
    const socketIO = require('socket.io');
    var can = require('socketcan');

    var channel = can.createRawChannel("vcan0", true);

    channel.start();

    const app = express();
    const port = process.env.PORT || 3000;

    app.use(express.static(path.join(__dirname, 'dist/akkaDiagTool')));

    app.get('*', (req, res) => {
      res.sendFile(path.join(__dirname, 'dist/akkaDiagTool/index.html'));
    });

    const server = http.createServer(app);

    const io = socketIO(server);

    io.on('connection', (socket) => {
      console.log('socket connected');

     socket.on('can message', (from, msg) => {
        msg.channel.addListener("onMessage", function(data) {console.log(data);});
        console.log('Recieved message by', from , 'sayin ', msg);
      });

  socket.on('disconnected', (socket) => {
    console.log('socket disconnected');
  })
})
server.listen(port, () => {
  console.log(`Server running on port ${port}`)
})

因此,当我启动我的应用并使用socketcan发送罐头消息时:cansend vcan0 37F#0000000012343412 我只会看到我的msg.channel.addListener("onMessage", function(data) {console.log(data);});

的日志

但没有console.log('Recieved message by', from , 'sayin ', msg);日志

我的Angular组件看起来像这样:

import { Component, OnInit } from '@angular/core';
import * as io from 'socket.io-client';

@Component({
.
.
.
})
export class StaticDataComponent implements OnInit {
  socket;

  constructor() {
    this.socket = io();
    this.socket.on('can message', (data) => {
      console.log(data);
    });
  }

因为我在控制台中收到了socket connected登录,所以应该连接了Socket。

任何帮助将不胜感激

提前谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,我设法弄清楚了。

我必须在服务器上具有socket.io的socket.emit内io.emit():

webapps/myapp/WEB-INF/lib/myapp.jar

,这里是Angular组件中的代码:

<?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                               http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
           version="2.4">

<context-param>
   <param-name>contextInitializerClasses</param-name>
   <param-value>com.x.server.spring.LocalConfigPropertiesApplicationInitializer</param-value>
</context-param>

. . .

<listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

提供的代码非常简单,只需在开发者控制台中登录数据即可。