Я новичок в 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 и вокруг него, также приветствуется. Я нахожу это действительно интересным и стремлюсь изучать новые вещи. Заранее большое спасибо.