|
const net = require('net');
|
const { info, warn, error } = require('./logger'); // 引入自定义的日志模块
|
const {calculateChecksum,funToModel,getFormattedDateTime,fetchServerList} =require('./jiexiData')
|
const iot = require('aliyun-iot-device-sdk');
|
|
|
// 初始化阿里云物联网设备客户端
|
function createIotClient(config) {
|
const client = iot.device({
|
productKey: config.productKey,
|
deviceName: config.deviceName,
|
deviceSecret: config.deviceSecret,
|
region: 'cn-shanghai' // 根据实际情况选择区域
|
});
|
|
client.on('connect', () => {
|
info(`阿里云物联网设备 ${config.deviceName} 已连接`);
|
});
|
|
client.on('error', (err) => {
|
error(`阿里云物联网设备 ${config.deviceName} 连接发生错误: ${err.message}`);
|
});
|
|
return client;
|
}
|
function connectToServer(server, iotConfig) {
|
let client;
|
let sendInterval;
|
const iotClient = createIotClient(iotConfig);
|
|
function attemptConnect() {
|
if (client) {
|
client.destroy(); // 确保旧的Socket实例被销毁
|
}
|
client = new net.Socket();
|
info(`${getFormattedDateTime()} 正在尝试连接到 ${server.host}:${server.port}`);
|
client.connect(server.port, server.host, () => {
|
info(`${getFormattedDateTime()} 已成功连接到 ${server.host}:${server.port}`);
|
|
// 定时发送数据
|
sendInterval = setInterval(() => {
|
if (client.writable) {
|
client.write(Buffer.from([0xFF, 0x55, 0x00, 0x50, 0xEE, 0x42]));
|
info(`${getFormattedDateTime()} 向 ${server.host}:${server.port} 发送数据`);
|
}
|
}, server.interval);
|
});
|
|
client.on('data', (data) => {
|
// 将接收到的 Buffer 数据转换为 16 进制字符串
|
const hexData = data.toString('hex').toUpperCase();
|
info(`${getFormattedDateTime()} 从 ${server.host}:${server.port} 接收到数据(16进制): ${hexData}`);
|
|
// 将接收到的数据发送到阿里云物联网平台
|
console.log(data)
|
//计算校验码
|
const jyma= calculateChecksum(data)
|
console.log(jyma,data.length)
|
// 将接收到的数据发送到阿里云物联网平台
|
//数据头 67 89 长度86 做校验 贝朗的透析机
|
if(data[0]==103&&data[1]===137&&data.length===86&&jyma===data[85]){
|
try{
|
const mode=funToModel(data)
|
iotClient.postProps(mode)
|
}catch(error){
|
console.log('数据解析有误')
|
}
|
}else{
|
console.log('无效的数据')
|
console.log(data[0],data[1],data[85])
|
}
|
});
|
|
client.on('close', (hadError) => {
|
clearInterval(sendInterval); // 清除定时发送
|
warn(`${getFormattedDateTime()} 连接到 ${server.host}:${server.port} 已关闭。发生错误: ${hadError}`);
|
|
// 无限次重连
|
const delay = Math.pow(2, server.retryCount++) * 1000; // 指数退避
|
warn(`${getFormattedDateTime()} 将在 60 秒后重试连接...`);
|
setTimeout(attemptConnect, 60000);
|
});
|
|
client.on('error', (err) => {
|
error(`${getFormattedDateTime()} 与 ${server.host}:${server.port} 的连接发生错误: ${err.message}`);
|
client.destroy(); // 确保发生错误时关闭连接,以便触发重连
|
});
|
}
|
|
attemptConnect();
|
}
|
|
async function start() {
|
try {
|
// const res = await fetchServerList();
|
// const servers=res?.data?.设备列表
|
fetchServerList().then(res => {
|
// const servers=[
|
// {
|
// '设备IMEI号': 'C35AD053',
|
// '设备名称': 'TQS88-HDF',
|
// '阿里云物联网平台ProductKey': 'k08fz9VK3Q8',
|
// 'IP设置': '{"isEnabled":"1","ip":"127.0.0.1","port":"60000","work_mode":"client","interval":"30"}',
|
// '设备SIM号': '',
|
// '阿里云物联网信息': {
|
// owner: true,
|
// utcCreate: '2024-09-02T06:33:38.000Z',
|
// gmtActive: '2024-09-19 11:10:26',
|
// utcActive: '2024-09-19T03:10:26.617Z',
|
// ipAddress: '123.146.28.7',
|
// gmtOnline: '2024-09-20 10:14:19',
|
// gmtCreate: '2024-09-02 14:33:38',
|
// nodeType: 0,
|
// productKey: 'k08fz9VK3Q8',
|
// deviceName: 'C35AD053',
|
// productName: 'DORA6000',
|
// utcOnline: '2024-09-20T02:14:19.902Z',
|
// deviceSecret: '7dd8aaabae652f10ff7ab4410eda05dd',
|
// iotId: 'VCTmJy29VI1A62dfYlVsk08fz0',
|
// region: 'cn-shanghai',
|
// status: 'OFFLINE'
|
// },
|
// '设备编号': 'DEVICE1332405137464',
|
// '设备序列号': 'C35AD053',
|
// '设备医院编号': 'C35AD053',
|
// '阿里云物联网平台DeviceName': 'C35AD053',
|
// '阿里云物联网平台Secrect': '7dd8aaabae652f10ff7ab4410eda05dd'
|
// }
|
// ]
|
const servers=res.data.设备列表
|
console.log('获取到客户设备信息')
|
console.log(servers)
|
servers.forEach(server => {
|
if(server.阿里云物联网平台ProductKey==='k08fz9VK3Q8'){
|
const IP设置=JSON.parse(server.IP设置)
|
const ser={
|
host: IP设置.ip,
|
port: IP设置.port,
|
interval: IP设置.interval*1000,
|
retryCount: 0,
|
maxRetries: 5,
|
iotConfig: {
|
productKey: server.阿里云物联网平台ProductKey,
|
deviceName: server.阿里云物联网平台DeviceName,
|
deviceSecret: server.阿里云物联网平台Secrect
|
}
|
}
|
connectToServer(ser, ser.iotConfig);
|
}
|
|
});
|
}).catch(error => {
|
console.error('错误:', error);
|
});
|
|
} catch (err) {
|
error('启动失败:', err.message);
|
}
|
}
|
|
|
start();
|