Skip to main content

JX-AD02

关于JX-AD02产品蓝牙通信相关方法全部封装在AD02_BLE类中,引入方法:

import { AD02_BLE } from "@iot9x.com/ipc-utils";

指令生成与解析

tip

获取指令的所有方法返回值均是Uint8Array类型,可通过蓝牙直接下发。

硬件版本

获取读取硬件版本指令:

const cmd = AD02_BLE.readHardwareVersionCMD();

解析返回的硬件版本:

// data是蓝牙返回的内容,举例为:7B 00 09 00 0F 56 31 2E 30 FD 7D
const version = AD02_BLE.resolveHardwareVersion(data);
console.log(version); // ——> V1.0

软件版本

获取读取软件版本指令:

const cmd = AD02_BLE.readSoftwareVersionCMD();

解析返回的软件版本:

const version = AD02_BLE.resolveSoftwareVersion(data);
console.log(version); // ——> V2.3

协议版本

获取读取协议版本指令:

const cmd = AD02_BLE.readProtocolVersionCMD();

解析返回的协议版本:

const version = AD02_BLE.resolveProtocolVersion(data);
console.log(version); // ——> "1"
注意

协议版本返回的是字符串,但是协议版本实际上的作用应该是正整数。

密码验证

获取密码验证指令:

const password = "1234";
const cmd = AD02_BLE.passwordCheckCMD(password);

解析返回的密码验证结果:

const result = AD02_BLE.resolvePasswordCheck(data);
console.log(result); // ——> true or false

重新设置密码

获取设置密码指令:

const password = "1234";
const cmd = AD02_BLE.setPasswordCMD(password);

解析返回的密码设置结果:

const result = AD02_BLE.resolveSetPassword(data);
console.log(result); // ——> true or false

模拟量输入(AI)相关

量程/类型

获取模拟量输入(AI)类型(量程)指令:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.readAITypeCMD(channel);

该方法仅支持传入一个参数,表示通道类型

  • 传入0,表示读取通道 1AI1)的量程/类型。
  • 传入1,表示读取通道 2AI2)的量程/类型。

解析蓝牙返回的 AI 量程:

const type = AD02_BLE.resolveAIType(data);
console.log(type); // ——> 0 or 1
// 0 ——> 电压(0-10V)
// 1 ——> 电流:0-24mA

返回结果封装了一个枚举类,如下所示:

/** 模拟量量程/类型 */
export enum AD02_AIType {
/** 电压:0~10V */
Voltage = 0,
/** 电流:0-24mA */
Current = 1,
}

该类型可以从库中引入:

import { AD02_AIType } from "@iot9x.com/ipc-utils";

获取设置 AI 量程的指令:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.writeAITypeCMD(channel, AD02_AIType.Voltage);

解析蓝牙返回结果:

const result = AD02_BLE.resolveWriteAITypeRes(data, channel);
console.log(result); // ——> true or false
// true ——> 设置成功
// false ——> 设置失败

测量值

获取模拟量输入(AI)的测量值。

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.readAICMD(channel);

解析蓝牙返回的 AI 测量值:

const value = AD02_BLE.resolveAI(data);

valuenumber类型,如果 AI 的量程为电压,则返回值的范围在:0~10000,单位:毫伏;如果 AI 的量程为电流,则返回的范围在:0~24000,单位:微安

运算值

tip

运算值即为模拟量输入测量值经过用户配置的运算公式运算后的结果,其格式为FLOAT格式,也是协议中唯一的一处FLOAT格式数据。

获取模拟量输入(AI)的运算值指令:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.readUserAICMD(channel);

解析蓝牙返回的 AI 运算值:

const value = AD02_BLE.resolveUserAI(data);

valuenumber类型,其格式为FLOAT格式。

运算公式

针对每路模拟量输入均支持用户自定义的双层四则运算,获取运算公式时需要针对每个通道单独获取,如下所示:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.readAICalculate(channel);

该方法仅支持传入一个参数,表示通道类型

  • 传入0,表示读取通道 1AI1)的用户自定义运算公式。
  • 传入1,表示读取通道 2AI2)的用户自定义运算公式。

解析蓝牙返回的 AI 运算公式:

const formula = AD02_BLE.resolveAICalculate(data);

其中formula为封装的一个对象,该对象的类型为AD02_AICalculate,可从@iot9x.com/ipc-utils中引入,具体内容如下所示:

import { AD02_AICalculate } from "@iot9x.com/ipc-utils";

/** AI运算类型 */
export interface AD02_AICalculate {
/** 运算符1 */
operator1: AD02_AIOperator;
/** 运算数1,有符号整数,i16格式 */
value1: number;
/** 运算符2 */
operator2: AD02_AIOperator;
/** 运算数2,有符号整数,i16格式 */
value2: number;
}

/** AI运算符 */
export enum AD02_AIOperator {
/** 无运算 */
None = 0,
/** 加 */
Add = 1,
/** 减 */
Subtract = 2,
/** 乘 */
multiply = 3,
/** 除 */
divide = 4,
/** 指数 */
Index = 5,
}

获取设置运算公式指令:

const channel: InputChannel = 0; // or 1
const formula: AD02_AICalculate = {
operator1: AD02_AIOperator.Add,
value1: 2,
operator1: AD02_AIOperator.None,
value1: 0,
};
const cmd = AD02_BLE.writeAICalculateCMD(channel, formula);

蓝牙返回值解析:

const result = AD02_BLE.resolveWriteAICalculateRes(data, channel);
console.log(result); // ——> true or false
// true ——> 写入成功
// false ——> 写入失败

校准

注意

校准设置不能一次设置四个校准点,但是读取还是按照这里面的读取方式,设置请看下面的 V2 版本

获取校准点配置指令:

const channel: InputChannel = 0; // or 1
const type = 2; // or 3 2——电压;3——电流
const cmd = AD02_BLE.readAICalibrateCMD(channel, type);

解析蓝牙返回的校准点配置:

const [v1, v2, v3, v4] = AD02_BLE.resolveAICalibrate(data);

AD02_BLE.resolveAICalibrate方法的返回值是一个包含四个整数UInt16格式)的元组

生成 AI 校准配置的命令:

const channel: InputChannel = 0; // or 1
const type = 2; // or 3 2——电压;3——电流
const cmd = AD02_BLE.calibrateAICMD(channel, type, [v1, v2, v3, v4]);

注意函数的第三个参数为校准值列表,配置完成后蓝牙返回结果解析:

const channel: InputChannel = 0; // or 1
const type = 2; // or 3 2——电压;3——电流
const result = AD02_BLE.resolveCalibrateAIRes(data, channel, type);
console.log(result); // ——> true or false
// true ——> 校准成功
// false ——> 校准失败

校准—V2 版本

生成 AI 校准配置的命令:

const channel: InputChannel = 0; // or 1
const type = 2; // or 3 2——电压;3——电流
const point = 1; // 1 or 2 or 3 or 4 校准点,从1开始,一共四个校准点
const value = 3500; // 校准值
const cmd = AD02_BLE.calibrateAICMD_V2(channel, type, point, value);

配置完成后蓝牙返回结果解析:

const channel: InputChannel = 0; // or 1
const type = 2; // or 3 2——电压;3——电流
const point = 1; // 1 or 2 or 3 or 4 校准点,从1开始,一共四个校准点
const value = 3500; // 校准值
const result = AD02_BLE.resolveCalibrateAIRes_V2(
data,
channel,
type,
point,
value
);
console.log(result); // ——> true or false
// true ——> 校准成功
// false ——> 校准失败

自动上报

生成读取 AI 自动上报配置指令:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.readAIUploadCMD(channel);

解析蓝牙返回的 AI 自动上报配置:

const upload = AD02_BLE.resolveAIUpload(data);

AD02_BLE.resolveAIUpload函数返回值是为了方便而专门封装的AD02_AIUpload类,可以从@iot9x.com/ipc-utils中引入,具体内容如下所示:

import { AD02_AIUpload } from "@iot9x.com/ipc-utils";

/** AI 自动上报类型 */
export interface AD02_AIUpload {
/** 自动上报类型列表 */
typeList: AD02_AIUploadType[];
/** 变化最小值,UInt16格式 */
minChangeValue: number;
/** 定时时间,单位:秒,UInt16格式 */
timerValue: number;
/** 区间下限值,Int16格式 */
minZoneValue: number;
/** 区间上限值,Int16格式 */
maxZoneValue: number;
}

/** AI上报类型 */
export enum AD02_AIUploadType {
/** 变化上报 */
Change = 1,
/** 定时上报 */
Timer = 2,
/** 小于区间上报 */
LessZone = 4,
/** 区间内上报 */
InZone = 8,
/** 大于区间上报 */
MoreZone = 16,
}

生成配置自动上报的指令:

import { AD02_AIUploadType } from "@iot9x.com/ipc-utils";

const channel: InputChannel = 0; // or 1
const typeList: AD02_AIUploadType[] = [
AD02_AIUploadType.Change,
AD02_AIUploadType.Timer,
AD02_AIUploadType.LessZone,
AD02_AIUploadType.InZone,
AD02_AIUploadType.MoreZone,
];
const minChangeValue: number = 0; // 变化最小值,UInt16格式
const timerValue: number = 10; // 定时时间,单位:秒,UInt16格式
const minZoneValue: number = -1; // 区间下限值,Int16格式
const maxZoneValue: number = 100; // 区间上限值,Int16格式

const cmd = AD02_BLE.writeAIUploadCMD(
channel,
typeList,
minChangeValue,
timerValue,
minZoneValue,
maxZoneValue
);

配置完成后蓝牙返回结果解析:

const result = AD02_BLE.resolveAIUploadRes(data, channel);
console.log(result); // ——> true or false
// true ——> 写入成功
// false ——> 写入失败

模拟量输出(AO)相关

tip

AO的可控范围为:[0-10V],读取和控制均是以毫伏为单位,这样AO值就可以使用一个寄存器表示,代码中的数据类型为UInt16无符号 16 位整型)。

获取 AO 值

由于两个 AO 输出的值寄存器排列连续,所以这里一次读取两个值

const cmd = AD02_BLE.readAOCMD();

蓝牙返回值解析:

const [ao1, ao2] = AD02_BLE.resolveAO(data);

返回值是一个元组类型:[number, number],第一个元素表示AO1的值,第二个元素表示AO2的值,二者的单位均是毫伏,范围为:[0, 10000],也就是说输出电压最大为10V

写入控制 AO 值

由于两个 AO 输出的值寄存器排列连续,所以写入也是一次写入两个值。生成写入命令的方法:

const cmd = AD02_BLE.writeAOCMD(ao1, ao2);

参数说明:

  • ao1AO1的控制值,单位:毫伏,合法范围为:0-10000
  • ao2AO2的控制值,单位:毫伏,合法范围为:0-10000

蓝牙返回值解析:

const result = AD02_BLE.resolveWriteAORes(data);
console.log(result); // ——> true or false
// true ——> 写入控制成功
// false ——> 写入控制失败

获取上电初始值

获取设置 AO 上电初始值的指令如下所示:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.readAOInitCMD(channel);

参数为通道 ID,0——AO11——AO2

蓝牙返回值解析:

const value = AD02_BLE.resolveAOInit(data);
console.log(value); // ——> 3500

返回值为UInt16格式,单位:毫伏

设置上电初始值

获取设置 AO 上电初始值的指令如下所示:

const channel: InputChannel = 0; // or 1
const cmd = AD02_BLE.writeAOInitCMD(channel, 1500);

参数说明:

  • 第一个参数为通道 ID,0——AO11——AO2
  • 第二个参数为上电初始值,单位:毫伏,合法范围为:0-10000

蓝牙返回值解析:

const result = AD02_BLE.resolveWriteAOInitRes(data, channel);
console.log(result); // ——> true or false
// true ——> 写入成功
// false ——> 写入失败

周期输出

生成读取 AO 周期输出配置指令:

const channel: OutputChannel = 0; // or 1
const cmd = AD02_BLE.readAOOutputCMD(channel);

解析蓝牙返回的 AO 周期输出配置:

const output = AD02_BLE.resolveAOOutput(data);

AD02_BLE.resolveAOOutput函数返回值是为了方便而专门封装的AD02_AOOutput类,可以从@iot9x.com/ipc-utils中引入,具体内容如下所示:

import { AD02_AOOutput } from "@iot9x.com/ipc-utils";

/** AO 周期输出类型 */
export interface AD02_AOOutput {
/** 输出周期数 */
period: number;
/** 周期1电压值,单位:毫伏 */
voltage1: number;
/** 周期1持续时间,单位:秒 */
delay1: number;
/** 周期2电压值,单位:毫伏 */
voltage2: number;
/** 周期2持续时间,单位:秒 */
delay2: number;
/** 周期3电压值,单位:毫伏 */
voltage3: number;
/** 周期3持续时间,单位:秒 */
delay3: number;
/** 周期4电压值,单位:毫伏 */
voltage4: number;
/** 周期4持续时间,单位:秒 */
delay4: number;
/** 周期5电压值,单位:毫伏 */
voltage5: number;
/** 周期5持续时间,单位:秒 */
delay5: number;
/** 周期6电压值,单位:毫伏 */
voltage6: number;
/** 周期6持续时间,单位:秒 */
delay6: number;
/** 周期7电压值,单位:毫伏 */
voltage7: number;
/** 周期7持续时间,单位:秒 */
delay7: number;
}

生成配置 AO 周期输出的指令:

import { AD02_AOOutput } from "@iot9x.com/ipc-utils";

const channel: OutputChannel = 0; // or 1
const config: AD02_AOOutput = {
period: 7,
voltage1: 3500,
delay1: 1,
voltage2: 345,
delay2: 0,
voltage3: 123,
delay3: 3,
voltage4: 333,
delay4: 4,
voltage5: 555,
delay5: 5,
voltage6: 0,
delay6: 0,
voltage7: 345,
delay7: 0,
};

const cmd = AD02_BLE.writeAOOutputCMD(channel, config);

配置完成后蓝牙返回结果解析:

const result = AD02_BLE.resolveWriteAOOutputRes(data, channel);
console.log(result); // ——> true or false
// true ——> 写入成功
// false ——> 写入失败

通信相关

串口参数

生成读取串口参数的指令:

const cmd = AD02_BLE.readUartConfigCMD();

解析蓝牙返回的串口参数信息:

const uartConfig = AD02_BLE.resolveUartConfig(data);

AD02_BLE.resolveUartConfig函数返回值是为了方便而专门封装的AD02_UartConfig类,可以从@iot9x.com/ipc-utils中引入,具体内容如下所示:

import {
AD02_UartConfig,
AD02_UartBaudrateType,
AD02_UartParityType,
} from "@iot9x.com/ipc-utils";

/** 串口参数类型 */
export interface AD02_UartConfig {
/** 波特率 */
baudrate: AD02_UartBaudrateType;
/** 数据位,目前只能设置8 */
databits: 8;
/** 校验位 */
parity: AD02_UartParityType;
/** 停止位 */
stopbits: 1 | 2;
/** 流控,当前版本不可设置 */
// flowControl: 0;
}

/** 串口波特率类型 */
export enum AD02_UartBaudrateType {
hz600 = 0,
hz1200 = 1,
hz2400 = 2,
hz4800 = 3,
hz9600 = 4,
hz19200 = 5,
hz38400 = 6,
hz57600 = 7,
hz115200 = 8,
}

/** 串口校验位类型 */
export enum AD02_UartParityType {
/** 无校验 */
None = 0,
/** 奇校验 */
Odd = 1,
/** 偶校验 */
Even = 2,
/** 高校验 */
Mark = 3,
/** 低校验 */
Space = 4,
}

生成配置串口参数的指令:

import {
AD02_UartConfig,
AD02_UartBaudrateType,
AD02_UartParityType,
} from "@iot9x.com/ipc-utils";

const uartConfig: AD02_UartConfig = {
baudrate: AD02_UartBaudrateType.hz9600,
databits: 8,
parity: AD02_UartParityType.Even,
stopbits: 1,
};

const cmd = AD02_BLE.writeUartConfigCMD(uartConfig);

配置完成后蓝牙返回结果解析:

const result = AD02_BLE.resolveWriteUartConfigRes(data);
console.log(result); // ——> true or false
// true ——> 串口参数配置成功
// false ——> 串口参数配置失败

Modbus 参数

生成读取 Modbus 参数的指令:

const cmd = AD02_BLE.readModbusConfigCMD();

解析蓝牙返回的 Modbus 参数信息:

const modbusConfig = AD02_BLE.resolveModbusConfig(data);

AD02_BLE.resolveModbusConfig函数返回值是为了方便而专门封装的AD02_ModbusConfig类,可以从@iot9x.com/ipc-utils中引入,具体内容如下所示:

import { AD02_ModbusConfig } from "@iot9x.com/ipc-utils";

/** Modbus参数类型 */
export interface AD02_ModbusConfig {
/** 从机地址,1-255 */
slaveId: number;
/** 分帧时间,单位:毫秒。UInt16格式 */
timeout: number;
}

生成配置 Modbus 参数的指令:

import { AD02_ModbusConfig } from "@iot9x.com/ipc-utils";

const modbusConfig: AD02_ModbusConfig = {
slaveId: 1,
timeout: 25,
};

const cmd = AD02_BLE.writeModbusConfigCMD(modbusConfig);

配置完成后蓝牙返回结果解析:

const result = AD02_BLE.resolveWriteModbusConfigRes(data);
console.log(result); // ——> true or false
// true ——> Modbus参数配置成功
// false ——> Modbus参数配置失败

操作命令

caution

操作命令均可能抛出无权限的错误,捕获示例如下所示:

try {
AD02_BLE.resolveRebootRes(data);
} catch (error) {
expect((error as Error).message).toBe("无权限");
}

重启

生成重启指令:

const cmd = AD02_BLE.rebootCMD();

解析蓝牙返回的控制结果:

const result = AD02_BLE.resolveRebootRes(data);
console.log(result); // ——> true or false
// true ——> 控制重启成功,设备应在5秒后重启
// false ——> 控制重启失败

恢复出厂设置

生成恢复出厂设置指令:

const cmd = AD02_BLE.recoveryCMD();

解析蓝牙返回的控制结果:

const result = AD02_BLE.resolveRecoveryRes(data);
console.log(result); // ——> true or false
// true ——> 控制恢复出厂设置成功,设备应在5秒后恢复出厂设置并重启
// false ——> 控制恢复出厂设置失败