TCP协议接口接收物联网设备数据

最近开发物联网项目,由于人员变动,之前的接口无法使用,只能重新开发,最近今天测试OK了,拿出来和大家分享一下。
由于对JAVA比较熟悉,所以本次使用JAVA开发TCP协议接口,这个开发比较方便,不需要引入任何其他的jar包,运行时标准jvm就可以。
闲话少说,上代码
1,多线程主程序

public class TcpMainTest extends Thread{
	Socket clientSocket;
	
	public TcpMainTest(Socket clientSocket) {
		this.clientSocket = clientSocket;
	}

	@Override
	public void run() {
		try {
			// 设置5分钟超时
			this.clientSocket.setSoTimeout(5 * 60 * 1000);
			
			// 获取客户端来的数据
			char[] a = new char[100];
			String str = "";
			while(true){
				BufferedReader in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
				in.read(a);
				str = new String(a);
				// 清除数组中多余的内容
				str = str.replace("\0", "");
				
				System.out.println("received message:" + str);
				// 因为有心跳指令干扰,必须保证收到login信息
				if (str.contains("login")) {
					break;
				} else {
					try{
						this.clientSocket.close();
					} catch(IOException e) {
						System.out.println("connection closed!");
					}
				}
			}
			
			// 返回的信息中有login的话,属于登录等成功
			if (str.contains("login")) {
				String sn = "";
				JSONObject jo = JSONObject.parseObject(str);
				sn = jo.getString("sn");  //设备编号
				
				while(true){
					// 发送指令
					byte[] s = Util.hexStrToBinaryStr("010300012342C40B");
					this.clientSocket.getOutputStream().write(s);
					// 接收信息
					byte[] rsByte = new byte[100];
					this.clientSocket.getInputStream().read(rsByte);
					String recMsg = Util.BinaryToHexString(rsByte);
					
					// 以02 02 03开头的信息为数据信息
					if(recMsg.startsWith("02 02 03")){
						// 清除16进制字符串中的空格
						recMsg = recMsg.replace(" ", "");
						// 截取出温度和湿度
						String temperatureHex = recMsg.substring(6, 10);
						String humidityHex = recMsg.substring(10, 14);
						
						System.out.println(sn + " / " + "Tem:" + temperatureHex + " / " + "Hum:" + humidityHex);
					}
					// 每次休眠1秒钟
					Thread.sleep(1000);
				}
			}
		} catch (Exception e) {
			System.out.println("发生错误:" + e.getMessage());
			try {
				this.clientSocket.close();
			} catch (IOException e1) {
				System.out.println("Socket关闭发生错误:" + e1.getMessage());
			}
		}
	}
	
	public static void main(String[] args) throws IOException {
		System.out.println("服务已启动, 等待连接!");
		//建立TCP连接服务,绑定端口
		ServerSocket tcpServer = new ServerSocket(7777);
		//接受连接,每个TCP连接都是一个java线程
		while(true){
			Socket clientSocket = tcpServer.accept();
			new TcpMainTest(clientSocket).start();
		}
	}
}

2,Util工具类

public class Util {
	// 将16进制的字符串转换成字节数组
	public static byte[] hexStrToBinaryStr(String hexString) {
		hexString = hexString.replaceAll(" ", "");
		int len = hexString.length();
		int index = 0;
 
		byte[] bytes = new byte[len / 2];
		while (index < len) {
			String sub = hexString.substring(index, index + 2);
			bytes[index/2] = (byte)Integer.parseInt(sub,16);
			index += 2;
		}
		return bytes;
	}
	
	// 将字节数组转换为16进制字符串
	public static String BinaryToHexString(byte[] bytes) {
		String hexStr = "0123456789ABCDEF";
		String result = "";
		String hex = "";
		for (byte b : bytes) {
			hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 4));
			hex += String.valueOf(hexStr.charAt(b & 0x0F));
			result += hex + " ";
		}
		return result;
	}
}

3,因为设置了setSoTimeout(5 * 60 * 1000),所以超过5分钟没有消息,长连接会自动断开(报read time out错误),等待设备再次发送登录报文。
4,上面的程序经过多日的试验,无论稳定性,还是断点续连都是可以的,分享给大家,一起共勉。

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
硬件设备传输报文数据到指定服务器通常是通过网络进行的。下面是一般的步骤: 1. 硬件设备连接网络:硬件设备需要连接到一个网络,可以是局域网 (LAN)、广域网 (WAN) 或者物联网 (IoT) 网络。这可以通过有线连接(如以太网)或者无线连接(如Wi-Fi、蓝牙、LoRa等)实现。 2. 配置网络设置:硬件设备需要配置网络设置,包括IP地址、子网掩码、默认网关等。这些设置可以手动配置或者通过动态主机配置协议(DHCP)自动获取。 3. 使用传输协议:硬件设备使用合适的传输协议将报文数据发送到指定服务器。常见的传输协议包括TCP(传输控制协议)和UDP(用户数据协议)。 - TCP协议TCP提供可靠的、面向连接数据传输。设备需要建立与服务器的TCP连接,然后将报文数据分割成数据包,并通过该连接发送数据。服务器接收数据后进行重组,并发送确认消息。 - UDP协议:UDP提供无连接数据传输,不保证可靠性。设备将报文数据封装成UDP数据包,然后通过网络发送给服务器。服务器接收到UDP数据包后进行处理,不需要建立连接或发送确认消息。 4. 指定服务器地址:硬件设备需要知道指定服务器的地址(IP地址和端口号),以便将报文数据发送到正确的位置。这通常在设备的配置文件或者代码进行设置。 5. 数据传输:硬件设备使用网络接口和传输协议将报文数据封装成数据包,并通过网络传输到指定服务器。数据包在网络经过路由器和交换机等设备,最终到达服务器。 6. 服务器接收数据:指定服务器接收数据后,通过相应的应用程序或服务进行处理。这可以是一个Web服务器、消息代理、数据库等,根据具体的应用场景而定。 总的来说,硬件设备通过网络连接和传输协议将报文数据发送到指定服务器,以实现数据的传输和处理。具体的实施方式会根据设备和网络环境的不同而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值