本公司是生产智能水表的,有个工程是集中器与后台服务器socket通讯。接到这个任务时,一脸懵逼,因为以前是做安卓的,从来没写过socket通讯,期间,遇到了无数的问题,翻阅了无数资料,经过十几个夜晚的奋斗,终于通讯成功。废话不多说,上硬货~~
当集中器模块链接上服务器时,如果无论怎么发送数据,服务器都接收不到数据或者接收到乱码的时候,请检查集中器模块(GPRS模块或者单片机模块),将心跳包去掉,在这里当时我卡住了两天。
服务器接收到数据后,却解析不出数据,请将读取数据流的方法改成读取字节格式,千万不要读取成string类型,不然后面解析起来会出现乱码。
我们后台的服务器使用java写的,而客户端是由单片机和GPRS组成,单片机发送数据的时候如果发送的是无符号型byte数组,java这里解析起来会出现65533乱码,所以在与客户端人员可以协调一下,将单片机中发送的字节数组格式改变成有符号型byte。
java中byte的取值范围是-128~127,所以,当需要发送大于127(byte型80-FF)的数据的时候,请注意格式转换,代码已经贴在下面
关于字符串转十六进制数组,如下
package com.cb.socket;
public class ZJutils {
static byte[] Str2Bytes(String str) {
byte[] bytes = new byte[str.length() / 2];
String str2 = "";
for (int i = 0; i < str.length() / 2; i++) {