Mqtt.ts 6.07 KB
import { FormSchema } from '/@/components/Form';

enum EnumMQTT {
  IS_DEFAULT = 'DEFAULT',
  IS_MQTT = 'MQTT',
  IS_PROTOBUF = 'PROTOBUF',
  IS_COAP = 'COAP',
  IS_LWM2M = 'LWM2M',
  IS_SNMP = 'SNMP',
  IS_PSM = 'PSM',
  IS_DRX = 'E_DRX',
  IS_EFENTO_NBIOT = 'EFENTO',
}

const isProtobuf = (type: string) => {
  return type === EnumMQTT.IS_PROTOBUF;
};

export const MqttSchemas: FormSchema[] = [
  {
    field: 'deviceTelemetryTopic',
    component: 'Input',
    label: '筛选器',
    required: true,
    defaultValue: 'v1/devices/me/telemetry',
    componentProps: {
      placeholder: '请输入遥测数据 topic 筛选器',
    },
    colProps: { span: 11 },
  },
  {
    field: 'deviceAttributesTopic',
    component: 'Input',
    required: true,
    label: 'topic filter',
    defaultValue: 'v1/devices/me/attributes',
    componentProps: {
      placeholder: '请输入Attributes topic 筛选器',
    },
    colProps: { span: 11 },
  },
  {
    field: 'desc',
    component: 'InputTextArea',
    label: '描述',
    defaultValue: `支持单[+]和多级[#]通配符。[+] is suitable for any topic filter level。例如:
    v1/devices/+/telemetry or
     +/devices/+/attributes。[#]可以替换 topic filter 本身,并且必须是 topic 的最后一个符号。例如:# or v1/devices/me/#。
    `,
    componentProps: {
      autoSize: {
        maxRows: 10,
      },
    },
    colProps: { span: 22 },
  },
  {
    field: 'transportPayloadType',
    component: 'Select',
    label: '设备信息',
    defaultValue: 'JSON',
    componentProps: {
      options: [
        { label: 'JSON', value: 'JSON' },
        { label: 'PROTOBUF', value: 'PROTOBUF' },
      ],
    },
    colProps: { span: 11 },
  },
  {
    field: 'useJsonPayloadFormatForDefaultDownlinkTopics',
    label: '',
    colProps: { span: 22 },
    defaultValue: false,
    component: 'Checkbox',
    renderComponentContent: `启用后,平台将默认使用Protobuf有效载荷格式。如果解析失败,平台将尝试使用JSON有效负载格式。用于固件更新期间的向后兼容性。例如,固件的初始版本使用Json,而新版本使用Protobuf。在设备组的固件更新过程中,需要同时支持Protobuf和JSON。兼容性模式会导致性能轻微下降,因此建议在所有设备更新后禁用此模式。`,
    ifShow: ({ values }) => isProtobuf(values.transportPayloadType),
  },
  {
    field: 'enableCompatibilityWithJsonPayloadFormat',
    label: '',
    colProps: { span: 22 },
    defaultValue: false,
    component: 'Checkbox',
    renderComponentContent: `启用后,平台将使用Json有效负载格式通过以下主题推送属性和RPC:v1/devices/me/attributes/response/$request_id, v1/devices/me/attributes, v1/devices/me/rpc/request/$request_id,v1/devices/me/rpc/response/$request_id.此设置不会影响使用新(v2)主题发送的属性和rpc订阅:v2/a/res/$request_id, v2/a, v2/r/req/$request_id, v2/r/res/$request_id. Where $request_id是一个整数请求标识符。`,
    ifShow: ({ values }) =>
      isProtobuf(values.transportPayloadType) &&
      !!values.useJsonPayloadFormatForDefaultDownlinkTopics,
  },
  {
    field: 'deviceTelemetryProtoSchema',
    label: '遥测数据',
    colProps: { span: 22 },
    component: 'InputTextArea',
    componentProps: {
      autoSize: {
        maxRows: 10,
      },
    },
    defaultValue: `
    syntax ="proto3";
    package telemetry;

    message SensorDataReading {
      optional double temperature = 1;
      optional double humidity = 2;
      InnerObject innerObject = 3;
      message InnerObject {
        optional string key1 = 1;
        optional bool key2 = 2;
        optional double key3 = 3;
        optional int32 key4 = 4;
        optional string key5 = 5;
      }
    }
    `,
    ifShow: ({ values }) => isProtobuf(values.transportPayloadType),
  },
  {
    field: 'deviceAttributesProtoSchema',
    label: 'Attributes',
    colProps: { span: 22 },
    component: 'InputTextArea',
    componentProps: {
      autoSize: {
        maxRows: 10,
      },
    },
    defaultValue: `
    syntax ="proto3";
    package attributes;

    message SensorConfiguration {
      optional string firmwareVersion = 1;
      optional string serialNumber = 2;
    }
    `,
    ifShow: ({ values }) => isProtobuf(values.transportPayloadType),
  },
  {
    field: 'deviceRpcRequestProtoSchema',
    label: 'RPC 请求 ',
    colProps: { span: 22 },
    component: 'InputTextArea',
    componentProps: {
      autoSize: {
        maxRows: 10,
      },
    },
    defaultValue: `
    syntax ="proto3";
    package rpc;
    
    message RpcRequestMsg {
      optional string method = 1;
      optional int32 requestId = 2;
      optional string params = 3;
    }
    `,
    ifShow: ({ values }) => isProtobuf(values.transportPayloadType),
  },
  {
    field: 'deviceRpcResponseProtoSchema',
    label: 'RPC 响应',
    colProps: { span: 22 },
    component: 'InputTextArea',
    componentProps: {
      autoSize: {
        maxRows: 10,
      },
    },
    defaultValue: `
    syntax ="proto3";
    package rpc;
    
    message RpcResponseMsg {
      optional string payload = 1;
    }
    `,
    ifShow: ({ values }) => isProtobuf(values.transportPayloadType),
  },
];

export const deviceTelemetryProtoSchemaData = `
syntax ="proto3";
package telemetry;

message SensorDataReading {
  optional double temperature = 1;
  optional double humidity = 2;
  InnerObject innerObject = 3;
  message InnerObject {
    optional string key1 = 1;
    optional bool key2 = 2;
    optional double key3 = 3;
    optional int32 key4 = 4;
    optional string key5 = 5;
  }
}
`;

export const deviceAttributesProtoSchemaData = `
syntax ="proto3";
package attributes;

message SensorConfiguration {
  optional string firmwareVersion = 1;
  optional string serialNumber = 2;
}
`;

export const deviceRpcRequestProtoSchemaData = `
syntax ="proto3";
package rpc;

message RpcRequestMsg {
  optional string method = 1;
  optional int32 requestId = 2;
  optional string params = 3;
}
`;

export const deviceRpcResponseProtoSchemaData = `
syntax ="proto3";
package rpc;

message RpcResponseMsg {
  optional string payload = 1;
}
`;