Есть ли способ отправить сообщения CAN с устройства приложения Android с помощью веб-сокета? - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в Javascript и разработке всего веб-приложения. Я работаю над установлением связи CAN через websocket между двумя устройствами. Прямо сейчас принимаются входящие сообщения, и я могу отправлять CAN-сигналы вручную, используя CANoe, и устройство отвечает на них. Я работаю над отправкой сообщений с устройства нажатием кнопки.

Вот код для открытия веб-сокета, чтения сообщения и его обработки:

import * as jspb from "google-protobuf";

export class CanRxMessagePack extends jspb.Message {
  getCanrxmessageMap(): jspb.Map<number, CanRxMessage>;
  clearCanrxmessageMap(): void;
  serializeBinary(): Uint8Array;
  toObject(includeInstance?: boolean): CanRxMessagePack.AsObject;
  static toObject(includeInstance: boolean, msg: CanRxMessagePack): CanRxMessagePack.AsObject;
  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
  static serializeBinaryToWriter(message: CanRxMessagePack, writer: jspb.BinaryWriter): void;
  static deserializeBinary(bytes: Uint8Array): CanRxMessagePack;
  static deserializeBinaryFromReader(message: CanRxMessagePack, reader: jspb.BinaryReader): CanRxMessagePack;
}

export namespace CanRxMessagePack {
  export type AsObject = {
    canrxmessageMap: Array<[number, CanRxMessage.AsObject]>,
  }
}

export class CanRxMessage extends jspb.Message {
  getNoofsignals(): number;
  setNoofsignals(value: number): void;

  getCanrxsignalsMap(): jspb.Map<string, number>;
  clearCanrxsignalsMap(): void;
  serializeBinary(): Uint8Array;
  toObject(includeInstance?: boolean): CanRxMessage.AsObject;
  static toObject(includeInstance: boolean, msg: CanRxMessage): CanRxMessage.AsObject;
  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
  static serializeBinaryToWriter(message: CanRxMessage, writer: jspb.BinaryWriter): void;
  static deserializeBinary(bytes: Uint8Array): CanRxMessage;
  static deserializeBinaryFromReader(message: CanRxMessage, reader: jspb.BinaryReader): CanRxMessage;
}

export namespace CanRxMessage {
  export type AsObject = {
    noofsignals: number,
    canrxsignalsMap: Array<[string, number]>,
  }
}

readData = (): void => {
    const worker = new CanReaderWorker();
    worker.onmessage = (message): void => {
        if (message.data instanceof ArrayBuffer) {
            const messageData: Uint8Array = message.data as Uint8Array;

            const messagePack = CanRxMessagePack.deserializeBinary(messageData);

            const messagesMap = messagePack.getCanrxmessageMap();

            this.accTargetIdDec = null;

            if (messagesMap.getLength()) {
                this.processDetectedObjectMessages(messagesMap);
                this.processLaneMessages(messagesMap);
                this.processVehicleData(messagesMap);
            }
        }
    };
}

/**
     * Process CAN data 
     * @param messagesMap Map containing CAN messages
     */
    processDetectedObjectMessages(messagesMap: MapProtobuf<number, CanRxMessage>): void {
        const existingMessages: { idDec: number; message: CanRxMessage }[] = [];

        for (let msgIdx = 0; msgIdx < DETECTED_OBJECTS_MESSAGES_IDS.length; msgIdx += 1) {
            const idDec = DETECTED_OBJECTS_MESSAGES_IDS[msgIdx];
            const message = messagesMap.get(idDec);
            if (message !== undefined) {
                existingMessages.push({
                    idDec,
                    message
                });
            }
        }

        for (let msgIdx = 0; msgIdx < existingMessages.length; msgIdx += 1) {
            this.processDetectedObjectMessage(existingMessages[msgIdx].message, existingMessages[msgIdx].idDec);
        }
    }

    /**
     * @param message CAN message of the detected object
     * @param idDec Base 10 id of the message
     */
    processDetectedObjectMessage(message: CanRxMessage, idDec: number): void {
        const detectedObjectProperties: Map<string, number> = new Map();

        if (idDec === CanMessages.BV_Obj_01_A.idDec) {
            this.extractFieldsFromDetectedObjectMessage(message, detectedObjectProperties, 1);
        }
        if (idDec === CanMessages.BV_Obj_02_A.idDec) {
            this.extractFieldsFromDetectedObjectMessage(message, detectedObjectProperties, 2);
        }

        this.updateDetectedObject(idDec, detectedObjectProperties);
    }

_________________________________________________________________________________________________________

Существует также класс с форматом сообщения, которое необходимо передать следующим образом:

import * as jspb from "google-protobuf";

export class CanTxMessage extends jspb.Message {
  getId(): number;
  setId(value: number): void;

  getLength(): number;
  setLength(value: number): void;

  getData(): Uint8Array | string;
  getData_asU8(): Uint8Array;
  getData_asB64(): string;
  setData(value: Uint8Array | string): void;

  serializeBinary(): Uint8Array;
  toObject(includeInstance?: boolean): CanTxMessage.AsObject;
  static toObject(includeInstance: boolean, msg: CanTxMessage): CanTxMessage.AsObject;
  static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
  static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
  static serializeBinaryToWriter(message: CanTxMessage, writer: jspb.BinaryWriter): void;
  static deserializeBinary(bytes: Uint8Array): CanTxMessage;
  static deserializeBinaryFromReader(message: CanTxMessage, reader: jspb.BinaryReader): CanTxMessage;
}

export namespace CanTxMessage {
  export type AsObject = {
    id: number,
    length: number,
    data: Uint8Array | string,
  }
}

Мне действительно нужна помощь, чтобы использовать вышеуказанный код отправлять сообщение CAN каждый раз, когда нажимается кнопка. Любая другая информация, касающаяся topi c и вокруг него, также приветствуется. Я нахожу это действительно интересным и стремлюсь изучать новые вещи. Заранее большое спасибо.

...