Compare commits
	
		
			8 Commits
		
	
	
		
			6a2fb2e902
			...
			9ea8e4e3e7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9ea8e4e3e7 | ||
| 
						 | 
					27db86cf2a | ||
| 
						 | 
					b612c376ee | ||
| 
						 | 
					284532f979 | ||
| 
						 | 
					4ed37ae613 | ||
| 
						 | 
					1b2181adcc | ||
| 
						 | 
					ee79034ddf | ||
| 
						 | 
					488e237b6f | 
@ -2,23 +2,25 @@ import socket from '@ohos.net.socket'
 | 
				
			|||||||
import util from '@ohos.util'
 | 
					import util from '@ohos.util'
 | 
				
			||||||
import promptAction from '@ohos.promptAction'
 | 
					import promptAction from '@ohos.promptAction'
 | 
				
			||||||
import TcpToByte from './utils/tcp2byte'
 | 
					import TcpToByte from './utils/tcp2byte'
 | 
				
			||||||
import {bytesToDecimal} from './utils/tools'
 | 
					import { bytesToDecimal } from './utils/tools'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const TAG = '[TCP2BYTE]'
 | 
					const TAG = '[TCP2BYTE]'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface RES {
 | 
					interface RES {
 | 
				
			||||||
  code: number|string,
 | 
					  code: number | string,
 | 
				
			||||||
  message?: string
 | 
					  message?: string
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const config = {
 | 
					const config = {
 | 
				
			||||||
  address: '114.55.125.222',
 | 
					  address: '172.37.55.191',
 | 
				
			||||||
  port: 50189
 | 
					  port: 40000
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const singleTcpClient = (function () {
 | 
					const singleTcpClient = (function () {
 | 
				
			||||||
  let instance;
 | 
					  let instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  function createInstance() {
 | 
					  function createInstance() {
 | 
				
			||||||
    return socket.constructTCPSocketInstance()
 | 
					    return socket.constructTCPSocketInstance()
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -34,51 +36,105 @@ const singleTcpClient = (function () {
 | 
				
			|||||||
})();
 | 
					})();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async function tcp2ByteRequest(data): Promise<RES> {
 | 
					export default async function tcp2ByteRequest(data): Promise<RES> {
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return new Promise(async (resolve, reject) => {
 | 
					  return new Promise(async (resolve, reject) => {
 | 
				
			||||||
    const tcpClient: socket.TCPSocket = singleTcpClient.getClient()
 | 
					    const tcpClient: socket.TCPSocket = singleTcpClient.getClient();
 | 
				
			||||||
 | 
					    const { address, port } = config;
 | 
				
			||||||
 | 
					    const tcp2Byte = new TcpToByte();
 | 
				
			||||||
 | 
					    const sendData = tcp2Byte.getRequest(data);
 | 
				
			||||||
 | 
					    console.info(TAG, 'sendData=>' + JSON.stringify(sendData));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const {address,port} = config
 | 
					    // 设置超时时间(例如 10 秒)
 | 
				
			||||||
    const tcp2Byte = new TcpToByte()
 | 
					    const timeoutDuration = 15000; // 10 秒
 | 
				
			||||||
    const sendData = tcp2Byte.getRequest(data)
 | 
					    let timeoutHandle: number | null = null;
 | 
				
			||||||
    console.info(TAG, 'sendData=>' + JSON.stringify(sendData))
 | 
					
 | 
				
			||||||
 | 
					    // 超时处理函数
 | 
				
			||||||
 | 
					    const timeoutPromise = new Promise<RES>((_, rejectTimeout) => {
 | 
				
			||||||
 | 
					      timeoutHandle = setTimeout(() => {
 | 
				
			||||||
 | 
					        const errMsg = 'TCP request timed out';
 | 
				
			||||||
 | 
					        console.log(TAG, "超时", errMsg);
 | 
				
			||||||
 | 
					        promptAction.showToast({
 | 
				
			||||||
 | 
					          message: errMsg,
 | 
				
			||||||
 | 
					          duration: 3000,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        tcpClient.close();
 | 
				
			||||||
 | 
					        rejectTimeout(new Error(errMsg));
 | 
				
			||||||
 | 
					      }, timeoutDuration);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      await tcpClient.connect({address: {address, port}})
 | 
					      await tcpClient.connect({
 | 
				
			||||||
      //发送消息
 | 
					        address: {
 | 
				
			||||||
      handSendMessage(tcpClient, data.sjbs, sendData)
 | 
					          address,
 | 
				
			||||||
 | 
					          port,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // 发送消息
 | 
				
			||||||
 | 
					      handSendMessage(tcpClient, data.sjbs, sendData);
 | 
				
			||||||
    } catch (e) {
 | 
					    } catch (e) {
 | 
				
			||||||
      console.log(TAG, 'tcp client connect error' + JSON.stringify(e))
 | 
					      console.log(TAG, 'tcp client connect error' + JSON.stringify(e));
 | 
				
			||||||
      promptAction.showToast({
 | 
					      promptAction.showToast({
 | 
				
			||||||
        message: 'tcp client connect error' + JSON.stringify(e),
 | 
					        message: 'tcp client connect error' + JSON.stringify(e),
 | 
				
			||||||
        duration: 3000
 | 
					        duration: 3000,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      reject(e)
 | 
					      reject(e);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //收到消息
 | 
					    // 收到消息
 | 
				
			||||||
    tcpClient.on('message', (data) => {
 | 
					    tcpClient.on('message', (data) => {
 | 
				
			||||||
      const res = handReceiveMessage(tcpClient, sendData, data.message)
 | 
					      const res = handReceiveMessage(tcpClient, sendData, data.message);
 | 
				
			||||||
      if(res){
 | 
					      if (res) {
 | 
				
			||||||
        tcpClient.close()
 | 
					        if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | 
				
			||||||
        resolve(res)
 | 
					        tcpClient.close();
 | 
				
			||||||
 | 
					        resolve(res);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    })
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tcpClient.on('error', (e) => {
 | 
					    tcpClient.on('error', (e) => {
 | 
				
			||||||
      const errMsg = 'tcp client receive error' + JSON.stringify(e)
 | 
					      const errMsg = 'tcp client receive error' + JSON.stringify(e);
 | 
				
			||||||
      promptAction.showToast({
 | 
					      promptAction.showToast({
 | 
				
			||||||
        message: 'tcp client receive error' + JSON.stringify(e),
 | 
					        message: 'tcp client receive error' + JSON.stringify(e),
 | 
				
			||||||
        duration: 3000
 | 
					        duration: 3000,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      console.log(TAG, errMsg)
 | 
					      console.log(TAG, errMsg);
 | 
				
			||||||
      tcpClient.close()
 | 
					      if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | 
				
			||||||
 | 
					      tcpClient.close();
 | 
				
			||||||
      resolve({
 | 
					      resolve({
 | 
				
			||||||
        code: -1, message: errMsg
 | 
					        code: 2300028,
 | 
				
			||||||
      })
 | 
					        message: errMsg,
 | 
				
			||||||
    })
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  })
 | 
					    // 使用 Promise.race 处理超时和 TCP 请求
 | 
				
			||||||
 | 
					    Promise.race([timeoutPromise, new Promise<RES>((resolveMain) => {
 | 
				
			||||||
 | 
					      // 将 resolve 逻辑移到此处
 | 
				
			||||||
 | 
					      tcpClient.on('message', (data) => {
 | 
				
			||||||
 | 
					        const res = handReceiveMessage(tcpClient, sendData, data.message);
 | 
				
			||||||
 | 
					        if (res) {
 | 
				
			||||||
 | 
					          resolveMain(res);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      tcpClient.on('error', (e) => {
 | 
				
			||||||
 | 
					        const errMsg = 'tcp client receive error' + JSON.stringify(e);
 | 
				
			||||||
 | 
					        resolveMain({
 | 
				
			||||||
 | 
					          code: 2300028,
 | 
				
			||||||
 | 
					          message: errMsg,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    })])
 | 
				
			||||||
 | 
					      .then((result) => {
 | 
				
			||||||
 | 
					        if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | 
				
			||||||
 | 
					        tcpClient.close();
 | 
				
			||||||
 | 
					        resolve(result);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .catch((error) => {
 | 
				
			||||||
 | 
					        if (timeoutHandle) clearTimeout(timeoutHandle); // 清除超时
 | 
				
			||||||
 | 
					        tcpClient.close();
 | 
				
			||||||
 | 
					        reject(error);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//处理发送的数据
 | 
					//处理发送的数据
 | 
				
			||||||
@ -89,22 +145,23 @@ function handSendMessage(client: socket.TCPSocket, type, data) {
 | 
				
			|||||||
    case '02-21-000009':
 | 
					    case '02-21-000009':
 | 
				
			||||||
    case '02-21-000012':
 | 
					    case '02-21-000012':
 | 
				
			||||||
    case '02-21-000014':
 | 
					    case '02-21-000014':
 | 
				
			||||||
      data.forEach((item) => {
 | 
					      data.forEach((item, index) => {
 | 
				
			||||||
        client.send({ data: new Uint8Array(item).buffer  })
 | 
					        console.log(TAG, "分包", index.toString(), JSON.stringify(item))
 | 
				
			||||||
 | 
					        client.send({ data: new Uint8Array(item).buffer })
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case '02-21-000010':
 | 
					    case '02-21-000010':
 | 
				
			||||||
    case '02-21-000011':
 | 
					    case '02-21-000011':
 | 
				
			||||||
    case '02-21-000013':
 | 
					    case '02-21-000013':
 | 
				
			||||||
      client.send({ data: new Uint8Array(data).buffer  })
 | 
					      client.send({ data: new Uint8Array(data).buffer })
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:break;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//处理接收的数据
 | 
					//处理接收的数据
 | 
				
			||||||
function handReceiveMessage(client: socket.TCPSocket, sendData, rData:ArrayBuffer):RES {
 | 
					function handReceiveMessage(client: socket.TCPSocket, sendData, rData: ArrayBuffer): RES {
 | 
				
			||||||
  const receiveData = new Uint8Array(rData)
 | 
					  const receiveData = new Uint8Array(rData)
 | 
				
			||||||
  console.info(TAG, 'receiveData=>' + JSON.stringify(receiveData))
 | 
					  console.info(TAG, 'receiveData=>' + JSON.stringify(receiveData))
 | 
				
			||||||
  //返回的消息类型
 | 
					  //返回的消息类型
 | 
				
			||||||
@ -112,35 +169,43 @@ function handReceiveMessage(client: socket.TCPSocket, sendData, rData:ArrayBuffe
 | 
				
			|||||||
  console.info(TAG, 'receiveData messageType=>' + JSON.stringify(receiveData))
 | 
					  console.info(TAG, 'receiveData messageType=>' + JSON.stringify(receiveData))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //流水号
 | 
					  //流水号
 | 
				
			||||||
  const lsh =   bytesToDecimal([receiveData[2],receiveData[3]]);
 | 
					  const lsh = bytesToDecimal([receiveData[2], receiveData[3]]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //开始补包
 | 
					  //开始补包
 | 
				
			||||||
  if(messageType === 0xF0){
 | 
					  if (messageType === 0xF0) {
 | 
				
			||||||
    //获取消息体长度
 | 
					    //获取消息体长度
 | 
				
			||||||
    const messageLength = receiveData[13]
 | 
					    const messageLength = receiveData[13]
 | 
				
			||||||
    //分包总数
 | 
					    //分包总数
 | 
				
			||||||
    const packages = receiveData.slice(14, 14 + messageLength * 2);
 | 
					    const packages = receiveData.slice(14, 14 + messageLength * 2);
 | 
				
			||||||
    const forArr = new Array(messageLength).fill(1)
 | 
					    const forArr = new Array(messageLength).fill(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    forArr.forEach((item,index)=>{
 | 
					    forArr.forEach((item, index) => {
 | 
				
			||||||
      const start = index * 2;
 | 
					      const start = index * 2;
 | 
				
			||||||
      const end = start + 1;
 | 
					      const end = start + 1;
 | 
				
			||||||
      const packageIndex =  bytesToDecimal([packages[start],packages[end]]);
 | 
					      const packageIndex = bytesToDecimal([packages[start], packages[end]]);
 | 
				
			||||||
      console.info(TAG, '补包内容' + JSON.stringify(new Uint8Array(sendData[packageIndex -1])))
 | 
					      console.info(TAG, '补包内容' + JSON.stringify(new Uint8Array(sendData[packageIndex -1])))
 | 
				
			||||||
      client.send({data:new Uint8Array(sendData[packageIndex -1]).buffer});
 | 
					      printInBatches(new Uint8Array(sendData[packageIndex -1]), 100)
 | 
				
			||||||
 | 
					      client.send({ data: new Uint8Array(sendData[packageIndex -1]).buffer });
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  }else{
 | 
					  } else {
 | 
				
			||||||
    const decoder =  util.TextDecoder.create('utf-8');
 | 
					    const decoder = util.TextDecoder.create('utf-8');
 | 
				
			||||||
    const messageLength = bytesToDecimal([receiveData[9],receiveData[10]]);
 | 
					    const messageLength = bytesToDecimal([receiveData[9], receiveData[10]]);
 | 
				
			||||||
    const markLength = receiveData[11];
 | 
					    const markLength = receiveData[11];
 | 
				
			||||||
    const markContent = decoder.decodeWithStream(receiveData.slice(12, 12 + markLength ));
 | 
					    const markContent = decoder.decodeWithStream(receiveData.slice(12, 12 + markLength));
 | 
				
			||||||
    console.info(TAG + messageType, 'markContent=>' + markContent)
 | 
					    console.info(TAG + messageType, 'markContent=>' + markContent)
 | 
				
			||||||
    const tipLength = receiveData[13];
 | 
					    const tipLength = receiveData[13];
 | 
				
			||||||
    const messageContent = decoder.decodeWithStream(receiveData.slice(13 + markLength, 13 + markLength + tipLength));
 | 
					    const messageContent = decoder.decodeWithStream(receiveData.slice(13 + markLength, 13 + markLength + tipLength));
 | 
				
			||||||
    console.info(TAG + messageType, 'messageContent=>' + messageContent)
 | 
					    console.info(TAG + messageType, 'messageContent=>' + messageContent)
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      code:markContent,
 | 
					      code: markContent,
 | 
				
			||||||
      message:messageContent
 | 
					      message: messageContent
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function printInBatches(array, batchSize) {
 | 
				
			||||||
 | 
					  for (let i = 0; i < array.length; i += batchSize) {
 | 
				
			||||||
 | 
					    const batch = array.slice(i, i + batchSize);
 | 
				
			||||||
 | 
					    console.log(TAG, "补包细分", batch);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user