diff --git a/AndroidTemplate/.idea/caches/build_file_checksums.ser b/AndroidTemplate/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..459a9ac Binary files /dev/null and b/AndroidTemplate/.idea/caches/build_file_checksums.ser differ diff --git a/AndroidTemplate/.idea/codeStyles/Project.xml b/AndroidTemplate/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/AndroidTemplate/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AndroidTemplate/.idea/gradle.xml b/AndroidTemplate/.idea/gradle.xml index f44e04a..7ac24c7 100644 --- a/AndroidTemplate/.idea/gradle.xml +++ b/AndroidTemplate/.idea/gradle.xml @@ -3,9 +3,8 @@ - + diff --git a/AndroidTemplate/app/build.gradle b/AndroidTemplate/app/build.gradle index 915ea80..a0ad1a0 100644 --- a/AndroidTemplate/app/build.gradle +++ b/AndroidTemplate/app/build.gradle @@ -2,6 +2,11 @@ apply plugin: 'com.android.application' android { compileSdkVersion 26 + sourceSets{ + main { + jniLibs.srcDirs = ['libs'] + } + } defaultConfig { applicationId "com.example.UserSoftwareAndroidTemplate" minSdkVersion 19 @@ -16,7 +21,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - buildToolsVersion '27.0.0' + buildToolsVersion '27.0.3' } dependencies { @@ -29,4 +34,5 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation 'com.google.code.gson:gson:2.8.2' + implementation files('libs/HslCommunication.jar') } diff --git a/AndroidTemplate/app/libs/HslCommunication.jar b/AndroidTemplate/app/libs/HslCommunication.jar new file mode 100644 index 0000000..9788da9 Binary files /dev/null and b/AndroidTemplate/app/libs/HslCommunication.jar differ diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/BasicFramework/SoftBasic.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/BasicFramework/SoftBasic.java deleted file mode 100644 index 190c047..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/BasicFramework/SoftBasic.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.HslCommunication.BasicFramework; - -/** - * Created by hsl20 on 2017/11/4. - * 静态类,提供许多程序运行的方法 - */ - -public class SoftBasic { - - - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/BasicFramework/SystemVersion.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/BasicFramework/SystemVersion.java deleted file mode 100644 index 238f6d9..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/BasicFramework/SystemVersion.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.example.HslCommunication.BasicFramework; - -/** - * Created by hsl20 on 2017/11/4. - */ - -public class SystemVersion { - - /// - /// 根据格式化字符串的版本号初始化 - /// - /// 格式化的字符串,例如:1.0.0或1.0.0.0503 - public SystemVersion(String VersionString) - { - String[] temp = VersionString.split("\\."); - if (temp.length >= 3) - { - m_MainVersion = Integer.parseInt(temp[0]); - m_SecondaryVersion = Integer.parseInt(temp[1]); - m_EditVersion = Integer.parseInt(temp[2]); - - if (temp.length >= 4) - { - m_InnerVersion = Integer.parseInt(temp[3]); - } - } - } - /// - /// 根据指定的数字实例化一个对象 - /// - /// 主版本 - /// 次版本 - /// 修订版 - public SystemVersion(int main, int sec, int edit) - { - m_MainVersion = main; - m_SecondaryVersion = sec; - m_EditVersion = edit; - } - /// - /// 根据指定的数字实例化一个对象 - /// - /// 主版本 - /// 次版本 - /// 修订版 - /// 内部版本号 - public SystemVersion(int main, int sec, int edit, int inner) - { - m_MainVersion = main; - m_SecondaryVersion = sec; - m_EditVersion = edit; - m_InnerVersion = inner; - } - private int m_MainVersion = 2; - /// - /// 主版本 - /// - public int MainVersion() - { - return m_MainVersion; - } - private int m_SecondaryVersion = 0; - /// - /// 次版本 - /// - public int SecondaryVersion() { - return m_SecondaryVersion; - } - - private int m_EditVersion = 0; - /// - /// 修订版 - /// - public int EditVersion() { - return m_EditVersion; - } - private int m_InnerVersion = 0; - /// - /// 内部版本号,或者是版本号表示为年月份+内部版本的表示方式 - /// - public int InnerVersion() - { - return m_InnerVersion; - } - - /// - /// 根据格式化为支持返回的不同信息的版本号 - /// C返回1.0.0.0 - /// N返回1.0.0 - /// S返回1.0 - /// - /// 格式化信息 - /// - public String toString(String format) - { - if(format == "C") - { - return MainVersion()+"."+SecondaryVersion()+"."+EditVersion()+"."+InnerVersion(); - } - - if(format == "N") - { - return MainVersion()+"."+SecondaryVersion()+"."+EditVersion(); - } - - if(format == "S") - { - return MainVersion()+"."+SecondaryVersion(); - } - - return toString(); - } - - - - @Override - public String toString() { - if(InnerVersion() == 0) - { - return MainVersion()+"."+SecondaryVersion()+"."+EditVersion(); - } - else - { - return MainVersion()+"."+SecondaryVersion()+"."+EditVersion()+"."+InnerVersion(); - } - } - - - public boolean IsSameVersion(SystemVersion sv) { - if (this.m_MainVersion != sv.m_MainVersion) { - return false; - } - - if (this.m_SecondaryVersion != sv.m_SecondaryVersion) { - return false; - } - - if (this.m_EditVersion != sv.m_EditVersion) { - return false; - } - - if (this.m_InnerVersion != sv.m_InnerVersion) { - return false; - } - - return true; - } - - public boolean IsSmallerThan(SystemVersion sv) { - if (this.m_MainVersion < sv.m_MainVersion) { - return true; - } - else if(this.m_MainVersion > sv.m_MainVersion) { - return false; - } - - if (this.m_SecondaryVersion < sv.m_SecondaryVersion) { - return true; - } - else if (this.m_SecondaryVersion > sv.m_SecondaryVersion) { - return false; - - } - - if (this.m_EditVersion < sv.m_EditVersion) { - return true; - } - else if (this.m_EditVersion > sv.m_EditVersion) { - return false; - } - - if (this.m_InnerVersion < sv.m_InnerVersion) { - return true; - } - else if (this.m_InnerVersion > sv.m_InnerVersion) { - return false; - } - - return false; - } - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslCommunicationCode.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslCommunicationCode.java deleted file mode 100644 index 0c9d55b..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslCommunicationCode.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.example.HslCommunication.Core.Net; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class HslCommunicationCode { - - - /// - /// 规定所有的网络传输指令头都为32字节 - /// - public static final int HeadByteLength = 32; - - - /// - /// 用于心跳程序的暗号信息 - /// - public static final int Hsl_Protocol_Check_Secends = 1; - /// - /// 客户端退出消息 - /// - public static final int Hsl_Protocol_Client_Quit = 2; - /// - /// 因为客户端达到上限而拒绝登录 - /// - public static final int Hsl_Protocol_Client_Refuse_Login = 3; - /// - /// 允许客户端登录到服务器 - /// - public static final int Hsl_Protocol_Client_Allow_Login = 4; - - - - - /// - /// 说明发送的只是文本信息 - /// - public static final int Hsl_Protocol_User_String = 1001; - /// - /// 发送的数据就是普通的字节数组 - /// - public static final int Hsl_Protocol_User_Bytes = 1002; - /// - /// 发送的数据就是普通的图片数据 - /// - public static final int Hsl_Protocol_User_Bitmap = 1003; - /// - /// 发送的数据是一条异常的数据,字符串为异常消息 - /// - public static final int Hsl_Protocol_User_Exception = 1004; - - - - - /// - /// 请求文件下载的暗号 - /// - public static final int Hsl_Protocol_File_Download = 2001; - /// - /// 请求文件上传的暗号 - /// - public static final int Hsl_Protocol_File_Upload = 2002; - /// - /// 请求删除文件的暗号 - /// - public static final int Hsl_Protocol_File_Delete = 2003; - /// - /// 文件校验成功 - /// - public static final int Hsl_Protocol_File_Check_Right = 2004; - /// - /// 文件校验失败 - /// - public static final int Hsl_Protocol_File_Check_Error = 2005; - /// - /// 文件保存失败 - /// - public static final int Hsl_Protocol_File_Save_Error = 2006; - /// - /// 请求文件列表的暗号 - /// - public static final int Hsl_Protocol_File_Directory_Files = 2007; - /// - /// 请求子文件的列表暗号 - /// - public static final int Hsl_Protocol_File_Directories = 2008; - - - - - /// - /// 不压缩数据字节 - /// - public static final int Hsl_Protocol_NoZipped = 3001; - /// - /// 压缩数据字节 - /// - public static final int Hsl_Protocol_Zipped = 3002; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslSecurity.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslSecurity.java deleted file mode 100644 index 6bcb592..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslSecurity.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.example.HslCommunication.Core.Net; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class HslSecurity { - - - /// - /// 加密方法,只对当前的程序集开放 - /// - /// 等待加密的数据 - /// 加密后的数据 - public static byte[] ByteEncrypt(byte[] enBytes) { - if (enBytes == null) return null; - byte[] result = new byte[enBytes.length]; - for (int i = 0; i < enBytes.length; i++) { - result[i] = (byte) (enBytes[i] ^ 0xB5); - } - return result; - } - - - /// - /// 解密方法,只对当前的程序集开放 - /// - /// 等待解密的数据 - /// 解密后的数据 - public static byte[] ByteDecrypt(byte[] deBytes) { - return ByteEncrypt(deBytes); - } - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslZipped.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslZipped.java deleted file mode 100644 index 6e46f33..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/HslZipped.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.example.HslCommunication.Core.Net; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.GZIPOutputStream; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class HslZipped { - - - /*** - * 压缩GZip - * - * @param data - * @return - */ - public static byte[] CompressBytes(byte[] data) { - byte[] b = null; - try { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - GZIPOutputStream gzip = new GZIPOutputStream(bos); - gzip.write(data); - gzip.finish(); - gzip.close(); - b = bos.toByteArray(); - bos.close(); - } catch (Exception ex) { - ex.printStackTrace(); - } - return b; - } - - /*** - * 解压GZip - * - * @param data - * @return - */ - public static byte[] Decompress(byte[] data) { - byte[] b = null; - try { - ByteArrayInputStream bis = new ByteArrayInputStream(data); - GZIPInputStream gzip = new GZIPInputStream(bis); - byte[] buf = new byte[1024]; - int num = -1; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - while ((num = gzip.read(buf, 0, buf.length)) != -1) { - baos.write(buf, 0, num); - } - b = baos.toByteArray(); - baos.flush(); - baos.close(); - gzip.close(); - bis.close(); - } catch (Exception ex) { - ex.printStackTrace(); - } - return b; - } -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetBase.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetBase.java deleted file mode 100644 index 178a153..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetBase.java +++ /dev/null @@ -1,320 +0,0 @@ -package com.example.HslCommunication.Core.Net; -import android.util.Log; - -import com.example.HslCommunication.Core.Types.HslTimeOut; -import com.example.HslCommunication.Core.Types.OperateResult; -import com.example.HslCommunication.Core.Utilities.boolWithBytes; -import com.example.HslCommunication.Core.Utilities.boolWithSocket; -import com.example.HslCommunication.Log.LogUtil; -import com.example.HslCommunication.Resources.StringResources; - - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.DataOutputStream; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.util.UUID; - - -/** - * Created by DATHLIN on 2017/11/1. - * 该类提供基础的网络操作服务,读写字节流,读写文件流 - */ - - - -public abstract class NetBase { - - /// - /// 用于通信工作的核心对象 - /// - protected Socket WorkSocket = null; - /// - /// 分次接收的数据长度 - /// - public int SegmentationLength = 1024; - - /// - /// 检查超时的子线程 - /// - /// - public void ThreadPoolCheckConnect(Object obj) { - HslTimeOut timeout = (HslTimeOut) obj; - if (timeout != null) { - NetSupport.ThreadPoolCheckConnect(timeout, ConnectTimeout); - } - } - - - /// - /// 网络访问中的超时时间,单位:毫秒,默认值5000 - /// - public int ConnectTimeout = 5000; - - /// - /// 当前对象的身份令牌,用来在网络通信中双向认证的依据 - /// - public UUID KeyToken = UUID.randomUUID(); - - - /**************************************************************************** - * - * 1. 创建并连接套接字 - * 2. 接收指定长度的字节数据 - * 3. 发送字节数据到套接字 - * 4. 检查对方是否接收完成 - * 5. 检查头子节令牌是否通过 - * 6. 将文件流写入套接字 - * 7. 从套接字接收文件流 - * - ****************************************************************************/ - - - /// - /// 创建socket对象并尝试连接终结点,如果异常,则结束通信 - /// - /// 网络套接字 - /// 网络终结点 - /// 结果对象 - /// - /// - protected boolWithSocket CreateSocketAndConnect( - String ipAddress, - int port, - OperateResult result - ) { - boolWithSocket value = new boolWithSocket(); - try { - // create the socket object - value.Socket = new Socket(ipAddress, port); - value.Result = true; - return value; - } catch (Exception ex) { - result.Message = StringResources.ConnectedFailed; - LogUtil.LogE("CreateSocketAndConnect", StringResources.ConnectedFailed, ex); - CloseSocket(value.Socket); - return value; - } - } - - - /// - /// 仅仅接收一定长度的字节数据,如果异常,则结束通信 - /// - /// 套接字 - /// 字节数据 - /// 长度 - /// 结果对象 - /// 接收状态 - /// 是否根据百分比报告进度 - /// 是否回发进度 - /// 是否进行超时检查 - /// 假设发生异常,应该携带什么信息 - /// - protected boolWithBytes ReceiveBytesFromSocket( - Socket socket, - int length, - OperateResult result, - ProgressReport receiveStatus, - boolean reportByPercent, - boolean response, - boolean checkTimeOut, - String exceptionMessage - ) { - boolWithBytes value = new boolWithBytes(); - - try { - value.Content = NetSupport.ReadBytesFromSocket(socket, length, receiveStatus, reportByPercent, response); - } catch (Exception ex) { - CloseSocket(socket); - result.Message = CombineExceptionString(exceptionMessage, ex.getMessage()); - LogUtil.LogE("ReceiveBytesFromSocket", exceptionMessage, ex); - Log.e("接收数据异常", "ReceiveBytesFromSocket: ", ex); - return value; - } - value.Result = true; - return value; - } - - /// - /// 仅仅将数据发送到socket对象上去,如果异常,则结束通信 - /// - /// - /// - /// - /// - /// - protected boolean SendBytesToSocket( - Socket socket, - byte[] send, - OperateResult result, - String exceptionMessage - ) { - try { - DataOutputStream output = new DataOutputStream(socket.getOutputStream()); - output.write(send); - } catch (Exception ex) { - result.Message = CombineExceptionString(exceptionMessage, ex.getLocalizedMessage()); - LogUtil.LogE("SendBytesToSocket", exceptionMessage, ex); - CloseSocket(socket); - send = null; - return false; - } - return true; - } - - - /// - /// 确认对方是否已经接收完成数据,如果异常,则结束通信 - /// - /// - /// - /// - /// - /// - /// - protected boolean CheckRomoteReceived( - Socket socket, - long length, - ProgressReport report, - OperateResult result, - String exceptionMessage - ) { - try { - NetSupport.CheckSendBytesReceived(socket, length, report, true); - return true; - } catch (Exception ex) { - result.Message = CombineExceptionString(exceptionMessage, ex.getLocalizedMessage()); - LogUtil.LogE("CheckRomoteReceived", exceptionMessage, ex); - CloseSocket(socket); - return false; - } - } - - - /// - /// 检查令牌是否正确,如果不正确,结束网络通信 - /// - /// 套接字 - /// 头子令 - /// 令牌 - /// 结果对象 - /// - protected boolean CheckTokenPermission( - Socket socket, - byte[] head, - UUID token, - OperateResult result - ) { - if (NetSupport.CheckTokenEquel(head, KeyToken)) { - return true; - } else { - result.Message = StringResources.TokenCheckFailed; - LogUtil.LogE("CheckTokenPermission", StringResources.TokenCheckFailed + " Ip:" + socket.getInetAddress().toString()); - CloseSocket(socket); - return false; - } - } - - /// - /// 将文件数据发送至套接字,如果结果异常,则结束通讯 - /// - /// - /// - /// - /// - /// - /// - /// - protected boolean SendFileStreamToSocket( - Socket socket, - String filename, - long filelength, - OperateResult result, - ProgressReport report, - String exceptionMessage - ) { - try { - InputStream inputStream = new BufferedInputStream(new FileInputStream(filename)); - NetSupport.WriteSocketFromStream(socket, inputStream, filelength, report, true); - inputStream.close(); - return true; - } catch (Exception ex) { - CloseSocket(socket); - LogUtil.LogE("SendFileStreamToSocket", exceptionMessage, ex); - result.Message = CombineExceptionString(exceptionMessage, ex.getLocalizedMessage()); - return false; - } - } - - - /// - /// 从套接字中接收一个文件数据,如果结果异常,则结束通讯 - /// - /// - /// - /// - /// - /// - /// - /// - protected boolean ReceiveFileSteamFromSocket( - Socket socket, - String filename, - long receive, - ProgressReport report, - OperateResult result, - String exceptionMessage - ) { - try { - OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(filename)); - NetSupport.WriteStreamFromSocket(socket, outputStream, receive, report, true); - outputStream.close(); - return true; - } catch (Exception ex) { - result.Message = CombineExceptionString(exceptionMessage, ex.getLocalizedMessage()); - LogUtil.LogE("ReceiveFileSteamFromSocket", exceptionMessage, ex); - CloseSocket(socket); - return false; - } - } - - /// - /// 获取错误的用于显示的信息 - /// - /// - /// - /// - protected String CombineExceptionString(String message, String exception) { - return message + "\r\n原因:" + exception; - } - - - - protected void CloseSocket(Socket socket) { - if (socket != null) { - try { - socket.close(); - } catch (Exception ex2) { - LogUtil.LogE("CloseSocket","",ex2); - } - } - } - - - protected void ThreadSleep(int milltime) - { - try - { - Thread.sleep(milltime); - } - catch (Exception ex) - { - - } - } -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetShareBase.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetShareBase.java deleted file mode 100644 index 4855159..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetShareBase.java +++ /dev/null @@ -1,681 +0,0 @@ -package com.example.HslCommunication.Core.Net; - -import android.util.Log; - -import com.example.HslCommunication.Core.Types.OperateResult; -import com.example.HslCommunication.Core.Utilities.boolWith2Bytes; -import com.example.HslCommunication.Core.Utilities.boolWithBytes; -import com.example.HslCommunication.Core.Utilities.boolWithIntByte; -import com.example.HslCommunication.Core.Utilities.boolWithIntString; -import com.example.HslCommunication.Core.Utilities.Utilities; -import com.example.HslCommunication.Log.LogUtil; -import com.example.HslCommunication.Resources.StringResources; - - -import java.net.Socket; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public abstract class NetShareBase extends NetBase { - - - /// - /// [自校验] 发送字节数据并确认对方接收完成数据,如果结果异常,则结束通讯 - /// - /// 网络套接字 - /// 头指令 - /// 用户指令 - /// 发送的数据 - /// 用于返回的结果 - /// 发送的进度报告 - /// 失败时存储的额外描述信息 - /// - protected boolean SendBaseAndCheckReceive( - Socket socket, - int headcode, - int customer, - byte[] send, - OperateResult result, - ProgressReport sendReport, - String failedString - ) - { - // 数据处理 - send = NetSupport.CommandBytes(headcode, customer, KeyToken, send); - - Log.i(Utilities.bytes2HexString(send), "SendBaseAndCheckReceive: "); - - // 发送数据 - if (!SendBytesToSocket( - socket, // 套接字 - send, // 发送的字节数据 - result, // 结果信息对象 - failedString // 异常附加对象 - )) - { - send = null; - return false; - } - - // 确认对方是否接收完成 - int remoteReceive = send.length - HslCommunicationCode.HeadByteLength; - Log.i("等待接收数据", "SendBaseAndCheckReceive: "); - - if (!CheckRomoteReceived( - socket, // 套接字 - remoteReceive, // 对方需要接收的长度 - sendReport, // 发送进度报告 - result, // 结果信息对象 - failedString // 异常附加信息 - )) - { - send = null; - return false; - } - - Log.i("对方接收成功", "SendBaseAndCheckReceive: "); - // 对方接收成功 - send = null; - return true; - } - - /// - /// [自校验] 发送字节数据并确认对方接收完成数据,如果结果异常,则结束通讯 - /// - /// 网络套接字 - /// 用户指令 - /// 发送的数据 - /// 用于返回的结果 - /// 发送的进度报告 - /// 异常时记录到日志的附加信息 - /// - protected boolean SendBytesAndCheckReceive( - Socket socket, - int customer, - byte[] send, - OperateResult result, - ProgressReport sendReport, - String failedString - ) - { - if (SendBaseAndCheckReceive( - socket, // 套接字 - HslCommunicationCode.Hsl_Protocol_User_Bytes, // 指示字节数组 - customer, // 用户数据 - send, // 发送数据,该数据还要经过处理 - result, // 结果消息对象 - sendReport, // 发送的进度报告 - failedString // 错误的额外描述 - )) - { - return true; - } - else - { - LogUtil.LogE("SendBytesAndCheckReceive",failedString); - return false; - } - } - - /// - /// [自校验] 直接发送字符串数据并确认对方接收完成数据,如果结果异常,则结束通讯 - /// - /// 网络套接字 - /// 用户指令 - /// 发送的数据 - /// 用于返回的结果 - /// 发送的进度报告 - /// - /// - protected boolean SendStringAndCheckReceive( - Socket socket, - int customer, - String send, - OperateResult result, - ProgressReport sendReport, - String failedString - ) - { - byte[] data =null; - - if(send == null ||send.length() <= 0) - { - - } - else - { - data = send.getBytes(); - } - - if (!SendBaseAndCheckReceive( - socket, // 套接字 - HslCommunicationCode.Hsl_Protocol_User_String, // 指示字符串数据 - customer, // 用户数据 - data, // 字符串的数据 - result, // 结果消息对象 - sendReport, // 发送的进度报告 - failedString // 错误的额外描述 - )) - { - return false; - } - return true; - } - -/* - /// - /// [自校验] 将文件数据发送至套接字,具体发送细节将在继承类中实现,如果结果异常,则结束通讯 - /// - /// 套接字 - /// 文件名称,文件必须存在 - /// 远程端的文件名称 - /// 文件的额外标签 - /// 文件的上传人 - /// 操作结果对象 - /// 发送进度报告 - /// - /// - protected boolean SendFileAndCheckReceive( - Socket socket, - String filename, - String servername, - String filetag, - String fileupload, - OperateResult result, - ProgressReport sendReport, - String failedString - ) - { - // 发送文件名,大小,标签 - File info = new File(filename); - - //FileInfo info = new FileInfo(filename); - - if (!info.exists()) - { - // 如果文件不存在 - if (!SendStringAndCheckReceive(socket, 0, "", result, null, failedString)) return false; - else - { - result.Message = "找不到该文件,请重新确认文件!"; - CloseSocket(socket); - return false; - } - } - - // 文件存在的情况 - Newtonsoft.Json.Linq.JObject json = new Newtonsoft.Json.Linq.JObject - { - { "FileName", new Newtonsoft.Json.Linq.JValue(servername) }, - { "FileSize", new Newtonsoft.Json.Linq.JValue(info.Length) }, - { "FileTag", new Newtonsoft.Json.Linq.JValue(filetag) }, - { "FileUpload", new Newtonsoft.Json.Linq.JValue(fileupload) } - }; - - if (!SendStringAndCheckReceive(socket, 1, json.ToString(), result, null, failedString)) return false; - - - if (!SendFileStreamToSocket(socket, filename, info.Length, result, sendReport, failedString)) - { - return false; - } - - // 检查接收 - // if (!CheckRomoteReceived(socket, info.Length, sendReport, result, failedString)) - // { - // return false; - // } - - return true; - } - - /// - /// [自校验] 将流数据发送至套接字,具体发送细节将在继承类中实现,如果结果异常,则结束通讯 - /// - /// 套接字 - /// 文件名称,文件必须存在 - /// 远程端的文件名称 - /// 文件的额外标签 - /// 文件的上传人 - /// 操作结果对象 - /// 发送进度报告 - /// - /// - protected boolean SendFileAndCheckReceive( - Socket socket, - Stream stream, - String servername, - String filetag, - String fileupload, - OperateResult result, - ProgressReport sendReport, - String failedString - ) - { - // 文件存在的情况 - Newtonsoft.Json.Linq.JObject json = new Newtonsoft.Json.Linq.JObject - { - { "FileName", new Newtonsoft.Json.Linq.JValue(servername) }, - { "FileSize", new Newtonsoft.Json.Linq.JValue(stream.Length) }, - { "FileTag", new Newtonsoft.Json.Linq.JValue(filetag) }, - { "FileUpload", new Newtonsoft.Json.Linq.JValue(fileupload) } - }; - - if (!SendStringAndCheckReceive(socket, 1, json.ToString(), result, null, failedString)) return false; - - - try - { - NetSupport.WriteSocketFromStream(socket, stream, stream.Length, sendReport, true); - } - catch(Exception ex) - { - CloseSocket(socket); - if(LogNet!=null) LogNet.WriteException(failedString, ex); - result.Message = CombineExceptionString(failedString, ex.getLocalizedMessage()); - return false; - } - - // 检查接收 - // if (!CheckRomoteReceived(socket, info.Length, sendReport, result, failedString)) - // { - // return false; - // } - - return true; - }*/ - - - - - /// - /// [自校验] 接收一条完整的同步数据,包含头子节和内容字节,基础的数据,如果结果异常,则结束通讯 - /// - /// 套接字 - /// 头子节 - /// 内容字节 - /// 结果 - /// 接收进度反馈 - /// 失败时用于显示的字符串 - /// - /// result - protected boolWith2Bytes ReceiveAndCheckBytes( - Socket socket, - OperateResult result, - ProgressReport receiveReport, - String failedString - ) - { - boolWith2Bytes value2=new boolWith2Bytes(); - - // 30秒超时接收验证 -// HslTimeOut hslTimeOut = new HslTimeOut() -// { -// DelayTime = 30000, -// IsSuccessful = false, -// StartTime = DateTime.Now, -// WorkSocket = socket, -// }; -// -// ThreadPool.QueueUserWorkItem(new WaitCallback(NetSupport.ThreadPoolCheckTimeOut), hslTimeOut); - - Log.i("准备接收头指令", "ReceiveAndCheckBytes: "); - - boolWithBytes value = ReceiveBytesFromSocket( - socket, // 套接字 - HslCommunicationCode.HeadByteLength, // 头指令长度 - result, // 结果消息对象 - null, // 不报告进度 - false, // 报告是否按照百分比报告 - false, // 不回发接收长度 - true, // 检查是否超时 - failedString // 异常时的附加文本描述 - ); - - if(!value.Result) - { - return value2; - } - - value2.Content = value.Content; - - Log.i("准备检查令牌", "ReceiveAndCheckBytes: "); - - // 检查令牌 - if (!CheckTokenPermission(socket, value.Content, KeyToken, result)) - { - Log.i("令牌检查失败", "ReceiveAndCheckBytes: "); - result.Message = StringResources.TokenCheckFailed; - return value2; - } - - // 接收内容 - byte[] buffer = new byte[4]; - buffer[0]=value.Content[28]; - buffer[1]=value.Content[29]; - buffer[2]=value.Content[30]; - buffer[3]=value.Content[31]; - int contentLength = Utilities.bytes2Int(buffer); - - Log.i("准备接收内容,长度为:"+contentLength, "ReceiveAndCheckBytes: "); - - value =ReceiveBytesFromSocket( - socket, // 套接字 - contentLength, // 内容数据长度 - result, // 结果消息对象 - receiveReport, // 接收进度报告委托 - true, // 按照百分比进行报告数据 - true, // 回发已经接收的数据长度 - false, // 不进行超时检查 - failedString // 异常时附加的文本描述 - ); - - if(!value.Result) - { - return value2; - } - Log.i("内容接收成功", "ReceiveAndCheckBytes: "); - - value2.Content2 = NetSupport.CommandAnalysis(value2.Content, value.Content); - value2.Result=true; - return value2; - } - - - - /// - /// [自校验] 从网络中接收一个字符串数据,如果结果异常,则结束通讯 - /// - /// 套接字 - /// 接收的用户数据 - /// 接收的字节数据 - /// 结果信息对象 - /// 接收数据时的进度报告 - /// 失败时记录日志的字符串 - /// - protected boolWithIntString ReceiveStringFromSocket( - Socket socket, - OperateResult result, - ProgressReport receiveReport, - String failedString - ) - { - boolWithIntString valueString = new boolWithIntString(); - - boolWith2Bytes value2Bytes = ReceiveAndCheckBytes(socket,result, receiveReport, failedString); - - if (!value2Bytes.Result) - { - return valueString; - } - - // check - - byte[] buffer = new byte[4]; - buffer[0]=value2Bytes.Content[0]; - buffer[1]=value2Bytes.Content[1]; - buffer[2]=value2Bytes.Content[2]; - buffer[3]=value2Bytes.Content[3]; - if (Utilities.bytes2Int(buffer) != HslCommunicationCode.Hsl_Protocol_User_String) - { - result.Message = "数据头校验失败!"; - LogUtil.LogE("ReceiveStringFromSocket","数据头校验失败!"); - CloseSocket(socket); - return valueString; - } - - buffer[0]=value2Bytes.Content[4]; - buffer[1]=value2Bytes.Content[5]; - buffer[2]=value2Bytes.Content[6]; - buffer[3]=value2Bytes.Content[7]; - // 分析数据 - valueString.DataInt = Utilities.bytes2Int(buffer); - valueString.DataString = Utilities.byte2String(value2Bytes.Content2); - valueString.Result = true; - return valueString; - } - - /// - /// [自校验] 从网络中接收一串字节数据,如果结果异常,则结束通讯 - /// - /// 套接字 - /// 接收的用户数据 - /// 接收的字节数据 - /// 结果信息对象 - /// 失败时记录日志的字符串 - /// - protected boolWithIntByte ReceiveContentFromSocket( - Socket socket, - OperateResult result, - ProgressReport receiveReport, - String failedString - ) - { - - boolWithIntByte value = new boolWithIntByte(); - - boolWith2Bytes value2Bytes = ReceiveAndCheckBytes(socket,result,null, failedString); - - if (!value2Bytes.Result) - { - return value; - } - - byte[] buffer = new byte[4]; - buffer[0]=value2Bytes.Content[0]; - buffer[1]=value2Bytes.Content[1]; - buffer[2]=value2Bytes.Content[2]; - buffer[3]=value2Bytes.Content[3]; - if (Utilities.bytes2Int(buffer) != HslCommunicationCode.Hsl_Protocol_User_String) - { - result.Message = "数据头校验失败!"; - LogUtil.LogE("ReceiveContentFromSocket","数据头校验失败!"); - CloseSocket(socket); - return value; - } - - buffer[0]=value2Bytes.Content[4]; - buffer[1]=value2Bytes.Content[5]; - buffer[2]=value2Bytes.Content[6]; - buffer[3]=value2Bytes.Content[7]; - // 分析数据 - value.DataInt = Utilities.bytes2Int(buffer); - value.Content = value2Bytes.Content2; - value.Result = true; - return value; - } - -/* - - /// - /// [自校验] 从套接字中接收文件头信息 - /// - /// - /// - /// - /// - /// - /// - /// - /// - protected bool ReceiveFileHeadFromSocket( - Socket socket, - out string filename, - out long size, - out string filetag, - out string fileupload, - OperateResult result, - string failedString = null - ) - { - // 先接收文件头信息 - if (!ReceiveStringFromSocket(socket, out int customer, out string filehead, result, null, failedString)) - { - filename = null; - size = 0; - filetag = null; - fileupload = null; - return false; - } - - // 判断文件是否存在 - if (customer == 0) - { - LogNet?.WriteWarn("对方文件不存在,无法接收!"); - result.Message = StringResources.FileNotExist; - filename = null; - size = 0; - filetag = null; - fileupload = null; - socket?.Close(); - return false; - } - - // 提取信息 - Newtonsoft.Json.Linq.JObject json = Newtonsoft.Json.Linq.JObject.Parse(filehead); - filename = SoftBasic.GetValueFromJsonObject(json, "FileName", ""); - size = SoftBasic.GetValueFromJsonObject(json, "FileSize", 0L); - filetag = SoftBasic.GetValueFromJsonObject(json, "FileTag", ""); - fileupload = SoftBasic.GetValueFromJsonObject(json, "FileUpload", ""); - - return true; - } - - - /// - /// [自校验] 从网络中接收一个文件,如果结果异常,则结束通讯 - /// - /// 网络套接字 - /// 接收文件后保存的文件名 - /// 文件在对方电脑上的文件名 - /// 文件大小 - /// 文件的标识 - /// 文件的上传人 - /// 结果信息对象 - /// 接收进度报告 - /// 失败时的记录日志字符串 - /// - protected bool ReceiveFileFromSocket( - Socket socket, - string savename, - out string filename, - out long size, - out string filetag, - out string fileupload, - OperateResult result, - Action receiveReport, - string failedString = null - ) - { - // 先接收文件头信息 - if (!ReceiveFileHeadFromSocket( - socket, - out filename, - out size, - out filetag, - out fileupload, - result, - failedString - )) - { - return false; - } - - //// 先接收文件头信息 - //if (!ReceiveStringFromSocket(socket, out int customer, out string filehead, result, null, failedString)) - //{ - // filename = null; - // size = 0; - // filetag = null; - // fileupload = null; - // return false; - //} - - //// 判断文件是否存在 - //if (customer == 0) - //{ - // LogNet?.WriteWarn("对方文件不存在,无法接收!"); - // result.Message = StringResources.FileNotExist; - // filename = null; - // size = 0; - // filetag = null; - // fileupload = null; - // socket?.Close(); - // return false; - //} - - //// 提取信息 - //Newtonsoft.Json.Linq.JObject json = Newtonsoft.Json.Linq.JObject.Parse(filehead); - //filename = SoftBasic.GetValueFromJsonObject(json, "FileName", ""); - //size = SoftBasic.GetValueFromJsonObject(json, "FileSize", 0L); - //filetag = SoftBasic.GetValueFromJsonObject(json, "FileTag", ""); - //fileupload = SoftBasic.GetValueFromJsonObject(json, "FileUpload", ""); - - // 接收文件消息 - if (!ReceiveFileSteamFromSocket(socket, savename, size, receiveReport, result, failedString)) - { - return false; - } - - return true; - } - - /// - /// [自校验] 从网络中接收一个文件,写入数据流,如果结果异常,则结束通讯 - /// - /// 网络套接字 - /// 等待写入的数据流 - /// 文件在对方电脑上的文件名 - /// 文件大小 - /// 文件的标识 - /// 文件的上传人 - /// 结果信息对象 - /// 接收进度报告 - /// 失败时的记录日志字符串 - /// - protected bool ReceiveFileFromSocket( - Socket socket, - Stream stream, - out string filename, - out long size, - out string filetag, - out string fileupload, - OperateResult result, - Action receiveReport, - string failedString = null - ) - { - // 先接收文件头信息 - if (!ReceiveFileHeadFromSocket( - socket, - out filename, - out size, - out filetag, - out fileupload, - result, - failedString - )) - { - return false; - } - - - try - { - NetSupport.WriteStreamFromSocket(socket, stream, size, receiveReport, true); - return true; - } - catch (Exception ex) - { - result.Message = ex.Message; - socket?.Close(); - return false; - } - } -*/ - - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetSupport.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetSupport.java deleted file mode 100644 index 1a528d8..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/NetSupport.java +++ /dev/null @@ -1,338 +0,0 @@ -package com.example.HslCommunication.Core.Net; - -import com.example.HslCommunication.Core.Types.HslTimeOut; -import com.example.HslCommunication.Core.Utilities.Utilities; - -import java.io.DataOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.util.Date; -import java.io.DataInputStream; -import java.util.UUID; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class NetSupport { - - private static final int SocketBufferSize = 4096; - - - - public static void ThreadPoolCheckConnect(HslTimeOut timeout, int millisecond) { - while (!timeout.IsSuccessful) { - if ((new Date().getTime() - timeout.StartTime.getTime()) > millisecond) { - // 连接超时或是验证超时 - if (!timeout.IsSuccessful) { - try { - if (timeout.WorkSocket != null) { - timeout.WorkSocket.close(); - } - } catch (java.io.IOException ex) { - // 不处理,放弃 - } - } - break; - } - } - } - - public static boolean IsTwoBytesEquel(byte[] b1, int start1, byte[] b2, int start2, int length) { - if (b1 == null || b2 == null) return false; - for (int i = 0; i < length; i++) { - if (b1[i + start1] != b2[i + start2]) { - return false; - } - } - return true; - } - - public static boolean CheckTokenEquel(byte[] head, UUID token) - { - return IsTwoBytesEquel(head, 12, Utilities.UUID2Byte(token), 0, 16); - } - - - - public static byte[] ReadBytesFromSocket(Socket socket, int receive, ProgressReport report, boolean reportByPercent, boolean response) throws java.io.IOException - { - byte[] bytes_receive = new byte[receive]; - int count_receive = 0; - long percent = 0; - - DataInputStream input = new DataInputStream(socket.getInputStream()); - DataOutputStream output = new DataOutputStream(socket.getOutputStream()); - - while (count_receive < receive) { - // 分割成4KB来接收数据 - int receive_length = 0; - if ((receive - count_receive) >= SocketBufferSize) { - receive_length = SocketBufferSize; - } else { - receive_length = (receive - count_receive); - } - - count_receive += input.read(bytes_receive, count_receive, receive_length); - - if (reportByPercent) { - long percentCurrent = (long) count_receive * 100 / receive; - if (percent != percentCurrent) { - percent = percentCurrent; - // 报告进度 - if (report != null) report.Report(count_receive, receive); - } - } else { - // 报告进度 - if (report != null) report.Report(count_receive, receive); - } - - // 回发进度 - if (response) output.write(Utilities.long2Bytes((long) count_receive)); - } - - return bytes_receive; - } - - - - public static byte[] ReadBytesFromSocket(Socket socket, int receive) throws java.io.IOException { - return ReadBytesFromSocket(socket, receive, null, false, false); - } - - - - /// - /// 读取套接字并且写入流 - /// - /// 文件流 - /// 连接的套接字 - /// 返回的文件长度 - /// 发送的进度报告 - /// - public static void WriteStreamFromSocket(Socket socket, OutputStream stream, long receive, ProgressReport report, boolean reportByPercent) throws java.io.IOException - { - byte[] buffer = new byte[SocketBufferSize]; - long count_receive = 0; - long percent = 0; - - DataInputStream input = new DataInputStream(socket.getInputStream()); - DataOutputStream output = new DataOutputStream(socket.getOutputStream()); - - while (count_receive < receive) - { - // 分割成4KB来接收数据 - int current = input.read(buffer, 0, SocketBufferSize); - - count_receive += current; - stream.write(buffer, 0, current); - if (reportByPercent) - { - long percentCurrent = count_receive * 100 / receive; - if (percent != percentCurrent) - { - percent = percentCurrent; - // 报告进度 - if (report != null) report.Report(count_receive, receive); - } - } - else - { - // 报告进度 - if (report != null) report.Report(count_receive, receive); - } - // 回发进度 - output.write(Utilities.long2Bytes(count_receive)); - } - buffer = null; - } - - - - - /// - /// 读取流并将数据写入socket - /// - /// 文件流 - /// 连接的套接字 - /// 返回的文件长度 - /// 发送的进度报告 - /// - public static void WriteSocketFromStream(Socket socket, InputStream stream, long length, ProgressReport report, boolean reportByPercent) throws java.io.IOException - { - byte[] buffer = new byte[SocketBufferSize]; - long count_send = 0; - long percent = 0; - - DataInputStream input = new DataInputStream(socket.getInputStream()); - DataOutputStream output = new DataOutputStream(socket.getOutputStream()); - - while (count_send < length) - { - int count = stream.read(buffer, 0, SocketBufferSize); - count_send += count; - - - output.write(buffer, 0, count); - - while (count_send != Utilities.bytes2Long(ReadBytesFromSocket(socket, 8))); - - long received = count_send; - - if (reportByPercent) - { - long percentCurrent = received * 100 / length; - if (percent != percentCurrent) - { - percent = percentCurrent; - // 报告进度 - if (report != null) report.Report(received, length); - } - } - else - { - // 报告进度 - if (report != null) report.Report(received, length); - } - - // 双重接收验证 - if (count == 0) - { - break; - } - } - - buffer = null; - } - - - - public static void CheckSendBytesReceived(Socket socket, long length, ProgressReport report, boolean reportByPercent) throws java.io.IOException - { - long remoteNeedReceive = 0; - long percent = 0; - - // 确认服务器的数据是否接收完成 - while (remoteNeedReceive < length) - { - remoteNeedReceive = Utilities.bytes2Long(ReadBytesFromSocket(socket, 8)); - if (reportByPercent) - { - long percentCurrent = remoteNeedReceive * 100 / length; - if (percent != percentCurrent) - { - percent = percentCurrent; - // 报告进度 - if (report != null) report.Report(remoteNeedReceive, length); - } - } - else - { - // 报告进度 - if (report != null) report.Report(remoteNeedReceive, length); - } - } - } - - - /* - - 发送字节数据的最终命令 - - */ - - public static byte[] CommandBytes(int customer, UUID token, byte[] data) - { - return CommandBytes(HslCommunicationCode.Hsl_Protocol_User_Bytes, customer, token, data); - } - - - /* - - 生成发送文本数据的最终命令 - - */ - - public static byte[] CommandBytes(int customer, UUID token, String data) - { - if (data == null) return CommandBytes(HslCommunicationCode.Hsl_Protocol_User_String, customer, token, null); - else return CommandBytes(HslCommunicationCode.Hsl_Protocol_User_String, customer, token, Utilities.string2Byte(data)); - } - - /* - - 生成最终的发送命令 - - */ - - public static byte[] CommandBytes(int command, int customer, UUID token, byte[] data) - { - byte[] _temp = null; - int _zipped = HslCommunicationCode.Hsl_Protocol_NoZipped; - int _sendLength = 0; - if (data == null) - { - _temp = new byte[HslCommunicationCode.HeadByteLength]; - } - else - { - // 加密 - data = HslSecurity.ByteEncrypt(data); - if (data.length > 10240) - { - // 10K以上的数据,进行数据压缩 - data = HslZipped.CompressBytes(data); - _zipped = HslCommunicationCode.Hsl_Protocol_Zipped; - } - _temp = new byte[HslCommunicationCode.HeadByteLength + data.length]; - _sendLength = data.length; - } - - Utilities.int2Bytes(command); - - System.arraycopy(Utilities.int2Bytes(command),0,_temp,0,4); - System.arraycopy(Utilities.int2Bytes(customer),0,_temp,4,4); - System.arraycopy(Utilities.int2Bytes(_zipped),0,_temp,8,4); - System.arraycopy(Utilities.UUID2Byte(token),0,_temp,12,16); - System.arraycopy(Utilities.int2Bytes(_sendLength),0,_temp,28,4); - if (_sendLength > 0) - { - System.arraycopy(data,0,_temp,32,_sendLength); - } - return _temp; - } - - - /* - - 从接收的数据命令开始解析 - - */ - - public static byte[] CommandAnalysis(byte[] head, byte[] content) - { - if (content != null) - { - byte[] buffer = new byte[4]; - buffer[0] = head[8]; - buffer[1] = head[9]; - buffer[2] = head[10]; - buffer[3] = head[11]; - - int _zipped = Utilities.bytes2Int(buffer); - // 先进行解压 - if (_zipped == HslCommunicationCode.Hsl_Protocol_Zipped) - { - content = HslZipped.Decompress(content); - } - // 进行解密 - return HslSecurity.ByteDecrypt(content); - } - else - { - return null; - } - } - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/ProgressReport.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/ProgressReport.java deleted file mode 100644 index 29b7a7e..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Net/ProgressReport.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.HslCommunication.Core.Net; - -/** - * Created by DATHLIN on 2017/11/1. - */ - - -public abstract class ProgressReport { - - - public void Report(long current,long totle) - { - - } - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/HslTimeOut.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/HslTimeOut.java deleted file mode 100644 index 83db408..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/HslTimeOut.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.HslCommunication.Core.Types; - -import java.net.Socket; -import java.util.Date; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class HslTimeOut { - - - public HslTimeOut() - { - StartTime = new Date(); - IsSuccessful = false; - } - - public Date StartTime=null; - - public boolean IsSuccessful=false; - - public int DelayTime=5000; - - public Socket WorkSocket=null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/NetHandle.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/NetHandle.java deleted file mode 100644 index 4ddad35..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/NetHandle.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.example.HslCommunication.Core.Types; - -import com.example.HslCommunication.Core.Utilities.Utilities; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public final class NetHandle { - - - /// - /// 初始化一个暗号对象 - /// - public NetHandle(int value) - { - byte[] buffer = Utilities.int2Bytes(value); - - m_CodeMajor = buffer[3]; - m_CodeMinor = buffer[2]; - m_CodeIdentifier = Utilities.byte2Short(buffer,0); - - - m_CodeValue = value; - } - - - /// - /// 根据三个值来初始化暗号对象 - /// - /// 主暗号 - /// 次暗号 - /// 暗号编号 - public NetHandle(int major, int minor, int identifier) - { - m_CodeValue = 0; - - byte[] buffer_major=Utilities.int2Bytes(major); - byte[] buffer_minor=Utilities.int2Bytes(minor); - byte[] buffer_identifier=Utilities.int2Bytes(identifier); - - m_CodeMajor = buffer_major[0]; - m_CodeMinor = buffer_minor[0]; - m_CodeIdentifier = Utilities.byte2Short(buffer_identifier,0); - - byte[] buffer = new byte[4]; - buffer[3] = m_CodeMajor; - buffer[2] = m_CodeMinor; - buffer[1] = buffer_identifier[1]; - buffer[0] = buffer_identifier[0]; - - m_CodeValue = Utilities.bytes2Int(buffer); - } - - - /// - /// 完整的暗号值 - /// - private int m_CodeValue; - - /// - /// 主暗号分类0-255 - /// - private byte m_CodeMajor; - - /// - /// 次要的暗号分类0-255 - /// - private byte m_CodeMinor; - - /// - /// 暗号的编号分类0-65535 - /// - private short m_CodeIdentifier; - - - - /// - /// 完整的暗号值 - /// - public int get_CodeValue(){ - return m_CodeValue; - } - - /// - /// 主暗号分类0-255 - /// - public byte get_CodeMajor() { - return m_CodeMajor; - } - - /// - /// 次要的暗号分类0-255 - /// - public byte get_CodeMinor() { - return m_CodeMinor; - } - - /// - /// 暗号的编号分类0-65535 - /// - public short get_CodeIdentifier() { - return m_CodeIdentifier; - } - - - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResult.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResult.java deleted file mode 100644 index d5d8874..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResult.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.example.HslCommunication.Core.Types; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class OperateResult { - - /// - /// 指示本次访问是否成功 - /// - public boolean IsSuccess =false; - - - /// - /// 具体的错误描述 - /// - public String Message = "Unknown Errors"; - /// - /// 具体的错误代码 - /// - public int ErrorCode = 10000; - - /// - /// 消息附带的额外信息 - /// - public Object Tag =null; - - /// - /// 获取错误代号及文本描述 - /// - /// - public String ToMessageShowString() - { - return "错误代码:"+ErrorCode +"\r\n错误信息:"+Message; - } - -} \ No newline at end of file diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResultBytes.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResultBytes.java deleted file mode 100644 index bc2d1ba..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResultBytes.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.HslCommunication.Core.Types; - -/** - * Created by DATHLIN on 2017/11/1. - */ - -public class OperateResultBytes extends OperateResult { - public byte[] Content =null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResultString.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResultString.java deleted file mode 100644 index 7f7bea9..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Types/OperateResultString.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.HslCommunication.Core.Types; - -/** - * Created by DATHLIN on 2017/11/1. - */ - - - -public class OperateResultString extends OperateResult { - public String Content = null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/Utilities.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/Utilities.java deleted file mode 100644 index ed2d9b1..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/Utilities.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -import com.example.HslCommunication.Log.LogUtil; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.util.UUID; - -/** - * Created by DATHLIN on 2017/11/1. - */ - - - -public class Utilities { - - public static byte[] int2Bytes(int num) { - byte[] byteNum = new byte[4]; - for (int ix = 0; ix < 4; ++ix) { - int offset = 32 - (ix + 1) * 8; - byteNum[3-ix] = (byte) ((num >> offset) & 0xff); - } - return byteNum; - } - - public static int bytes2Int(byte[] byteNum) { - int num = 0; - for (int ix = 0; ix < 4; ++ix) { - num <<= 8; - num |= (byteNum[3-ix] & 0xff); - } - return num; - } - - public static byte int2OneByte(int num) { - return (byte) (num & 0x000000ff); - } - - public static int oneByte2Int(byte byteNum) { - //针对正数的int - return byteNum > 0 ? byteNum : (128 + (128 + byteNum)); - } - - public static byte[] long2Bytes(long num) { - byte[] byteNum = new byte[8]; - for (int ix = 0; ix < 8; ++ix) { - int offset = 64 - (ix + 1) * 8; - byteNum[7-ix] = (byte) ((num >> offset) & 0xff); - } - return byteNum; - } - - public static long bytes2Long(byte[] byteNum) { - long num = 0; - for (int ix = 0; ix < 8; ++ix) { - num <<= 8; - num |= (byteNum[7-ix] & 0xff); - } - return num; - } - - public static UUID Byte2UUID(byte[] data) { - if (data.length != 16) { - throw new IllegalArgumentException("Invalid UUID byte[]"); - } - long msb = 0; - long lsb = 0; - for (int i = 0; i < 8; i++) - msb = (msb << 8) | (data[i] & 0xff); - for (int i = 8; i < 16; i++) - lsb = (lsb << 8) | (data[i] & 0xff); - - return new UUID(msb, lsb); - } - - public static byte[] UUID2Byte(UUID uuid) { - ByteArrayOutputStream ba = new ByteArrayOutputStream(16); - DataOutputStream da = new DataOutputStream(ba); - try { - da.writeLong(uuid.getMostSignificantBits()); - da.writeLong(uuid.getLeastSignificantBits()); - } - catch (IOException e) { - e.printStackTrace(); - } - byte[] buffer = ba.toByteArray(); - // 进行错位 - byte temp=buffer[0]; - buffer[0] = buffer[3]; - buffer[3] =temp; - temp=buffer[1]; - buffer[1]=buffer[2]; - buffer[2]=temp; - - temp = buffer[4]; - buffer[4]=buffer[5]; - buffer[5] =temp; - - temp = buffer[6]; - buffer[6]=buffer[7]; - buffer[7] =temp; - - return buffer; - } - - public static short byte2Short(byte[] b, int index) { - return (short) (((b[index + 0] << 8) | b[index + 1] & 0xff)); - } - - - public static byte[] short2Byte(short s) { - byte[] targets = new byte[2]; - for (int i = 0; i < 2; i++) { - int offset = (targets.length - 1 - i) * 8; - targets[1-i] = (byte) ((s >>> offset) & 0xff); - } - return targets; - } - - public static byte[] string2Byte(String str) { - if (str == null) { - return null; - } - byte[] byteArray; - try { - byteArray = str.getBytes("unicode"); - } catch (Exception ex) { - byteArray = str.getBytes(); - LogUtil.LogE("string2Byte","unicode编码转换错误",ex); - } -// -// for(int i=0;i>> 4 & 0xf]; - buf[index++] = HEX_CHAR[b & 0xf]; - } - - return new String(buf); - } -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWith2Bytes.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWith2Bytes.java deleted file mode 100644 index e036dd1..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWith2Bytes.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public class boolWith2Bytes extends boolWithBytes { - public byte[] Content2=null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithBytes.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithBytes.java deleted file mode 100644 index 63d3173..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithBytes.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/2. - */ - - -public class boolWithBytes extends boolWithNone { - - - public byte[] Content=null; - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithIntByte.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithIntByte.java deleted file mode 100644 index 70b0d63..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithIntByte.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public class boolWithIntByte extends boolWithBytes { - public int DataInt=0; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithIntString.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithIntString.java deleted file mode 100644 index 733e027..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithIntString.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public class boolWithIntString extends boolWithNone { - - - public int DataInt=0; - - - public String DataString=null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithNone.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithNone.java deleted file mode 100644 index 139ba50..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithNone.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/3. - */ - - - - -/* -* -* 结果类的基础,提供一个boolen -* -* -* */ - -public class boolWithNone { - - /* - 返回真还是否 - */ - public boolean Result = false; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithSiemens.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithSiemens.java deleted file mode 100644 index 10bf9cc..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithSiemens.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/3. - */ - -public class boolWithSiemens extends boolWithNone { - - - public byte type=0; - - public int startAddress=0; - - public short dbAddress=0; - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithSocket.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithSocket.java deleted file mode 100644 index adc5303..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithSocket.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -import java.net.Socket; - -/** - * Created by hsl20 on 2017/11/4. - */ - -public class boolWithSocket extends boolWithNone { - public Socket Socket=null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithString.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithString.java deleted file mode 100644 index cab278b..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Core/Utilities/boolWithString.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.example.HslCommunication.Core.Utilities; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public class boolWithString extends boolWithNone { - - public String Content=null; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/AsyncStateOne.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/AsyncStateOne.java deleted file mode 100644 index 4edfd73..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/AsyncStateOne.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.example.HslCommunication.Enthernet; - -import com.example.HslCommunication.Core.Net.HslCommunicationCode; - -import java.net.Socket; -import java.util.Date; -import java.util.UUID; - -/** - * Created by hsl20 on 2017/11/4. - */ - -public class AsyncStateOne { - - - /// - /// 实例化一个对象 - /// - public AsyncStateOne() { - ClientUniqueID = UUID.randomUUID().toString(); - } - - /// - /// IP地址 - /// - private String IpAddress = ""; - - public String getIpAddress() { - return IpAddress; - } - - private void setIpAddress(String ipAddress) { - IpAddress = ipAddress; - } - - - /* - 端口号 - */ - private int IpPort = 10000; - - public int getIpPort() { - return IpPort; - } - - private void setIpPort(int ipPort) { - IpPort = ipPort; - } - - - /* - 登录的别名 - */ - private String LoginAlias = ""; - - public String getLoginAlias() { - return LoginAlias; - } - - public void setLoginAlias(String loginAlias) { - LoginAlias = loginAlias; - } - - - /* - 心跳验证的时间点 - */ - private Date HeartTime=new Date(); - public Date getHeartTime() { - return HeartTime; - } - - public void setHeartTime(Date heartTime) { - HeartTime = heartTime; - } - - - /* - 客户端类别 - */ - private String ClientType=""; - public void setClientType(String clientType) { - ClientType = clientType; - } - - - public String getClientType() { - return ClientType; - } - - - /* - 客户端的唯一标识 - */ - private String ClientUniqueID=""; - public String getClientUniqueID() { - return ClientUniqueID; - } - - public void setClientUniqueID(String clientUniqueID) { - ClientUniqueID = clientUniqueID; - } - - - - /// - /// 指令头缓存 - /// - byte[] BytesHead = new byte[HslCommunicationCode.HeadByteLength]; - /// - /// 已经接收的指令头长度 - /// - int AlreadyReceivedHead = 0; - /// - /// 数据内容缓存 - /// - byte[] BytesContent = null; - /// - /// 已经接收的数据内容长度 - /// - int AlreadyReceivedContent = 0; - - /// - /// 清除本次的接收内容 - /// - void Clear() { - BytesHead = new byte[HslCommunicationCode.HeadByteLength]; - AlreadyReceivedHead = 0; - BytesContent = null; - AlreadyReceivedContent = 0; - } - - - Socket WorkSocket=null; -} \ No newline at end of file diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/NetComplexClient.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/NetComplexClient.java deleted file mode 100644 index 5a3f41b..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/NetComplexClient.java +++ /dev/null @@ -1,442 +0,0 @@ -package com.example.HslCommunication.Enthernet; - -import com.example.HslCommunication.Core.Net.HslCommunicationCode; -import com.example.HslCommunication.Core.Net.NetShareBase; -import com.example.HslCommunication.Core.Net.NetSupport; -import com.example.HslCommunication.Core.Types.NetHandle; -import com.example.HslCommunication.Core.Types.OperateResult; -import com.example.HslCommunication.Core.Utilities.Utilities; -import com.example.HslCommunication.Core.Utilities.boolWith2Bytes; -import com.example.HslCommunication.Core.Utilities.boolWithSocket; -import com.example.HslCommunication.Log.LogUtil; -import com.example.HslCommunication.Resources.StringResources; - -import java.net.Socket; -import java.util.Date; - -/** - * Created by hsl20 on 2017/11/4. - */ - -public class NetComplexClient extends NetShareBase { - - - - /// - /// 客户端的核心连接块 - /// - private AsyncStateOne stateone = new AsyncStateOne(); - /// - /// 客户端系统是否启动 - /// - public boolean Is_Client_Start = false; - - /// - /// 重连接失败的次数 - /// - public int Connect_Failed_Count = 0; - /// - /// 指示客户端是否处于正在连接服务器中 - /// - private boolean Is_Client_Connecting = false; - /// - /// 登录服务器的判断锁 - /// - private Object lock_connecting = new Object(); - /// - /// 客户端登录的标识名称,可以为ID号,也可以为登录名 - /// - public String ClientAlias = ""; - /// - /// 远程服务器的IP地址和端口 - /// - public String ServerIp = "127.0.0.1"; - /* - 远程服务器的端口 - */ - public int ServerPort = 10000; - - /// - /// 服务器的时间,自动实现和服务器同步 - /// - private Date ServerTime = new Date(); - /// - /// 系统与服务器的延时时间,单位毫秒 - /// - private int DelayTime =0; - - - - public void LoginSuccess() - { - - } - - public void LoginFailed(int times) - { - - } - - public void MessageAlerts(String msg) - { - - } - - public void BeforReConnected() - { - - } - - public void AcceptString(NetHandle handle, String msg) - { - - } - - public void AcceptByte( NetHandle handle, byte[] msg) - { - - } - - - private boolean IsQuie = false; - - /// - /// 关闭该客户端引擎 - /// - public void ClientClose() { - IsQuie = true; - if (Is_Client_Start) - SendBytes(stateone, NetSupport.CommandBytes(HslCommunicationCode.Hsl_Protocol_Client_Quit, 0, KeyToken, null)); - - if (thread_heart_check != null) thread_heart_check.interrupt(); - Is_Client_Start = false; - - - ThreadSleep(10); - - CloseSocket(stateone.WorkSocket); - LogUtil.LogD("ClientClose","Client Close."); - } - /// - /// 启动客户端引擎,连接服务器系统 - /// - public void ClientStart() - { - if (Is_Client_Start) return; - Thread thread_login = new Thread(new Runnable() { - @Override - public void run() { - ThreadLogin(); - } - }); - thread_login.start(); - LogUtil.LogD("ClientStart","Client Start."); - - if (thread_heart_check == null) - { - thread_heart_check = new Thread(new Runnable() { - @Override - public void run() { - ThreadHeartCheck(); - } - }); - thread_heart_check.start(); - } - } - private void ThreadLogin() - { - synchronized (lock_connecting) - { - if (Is_Client_Connecting) return; - Is_Client_Connecting = true; - } - - - if (Connect_Failed_Count == 0) - { - MessageAlerts("正在连接服务器..."); - } - else - { - int count = 10; - while (count > 0) - { - if (IsQuie) return; - MessageAlerts("连接断开,等待" + count-- + "秒后重新连接"); - ThreadSleep(1000); - } - MessageAlerts("正在尝试第" + Connect_Failed_Count + "次连接服务器..."); - } - - - stateone.setHeartTime(new Date()); - LogUtil.LogD("ThreadLogin","Begin Connect Server, Times: " + Connect_Failed_Count); - - - OperateResult result = new OperateResult(); - - Socket socket=null; - boolWithSocket valueSocket = CreateSocketAndConnect(ServerIp,ServerPort,result); - if(!valueSocket.Result) - { - Connect_Failed_Count++; - Is_Client_Connecting = false; - LoginFailed(Connect_Failed_Count); - LogUtil.LogW("ThreadLogin","Connected Failed, Times: " + Connect_Failed_Count); - // 连接失败,重新连接服务器 - ReconnectServer(); - return; - } - - socket = valueSocket.Socket; - - // 连接成功,发送数据信息 - if(!SendStringAndCheckReceive( - socket, - 2, - ClientAlias, - result, - null, - null - )) - { - Connect_Failed_Count++; - Is_Client_Connecting = false; - LogUtil.LogD("ThreadLogin","Login Server Failed, Times: " + Connect_Failed_Count); - LoginFailed(Connect_Failed_Count); - // 连接失败,重新连接服务器 - ReconnectServer(); - return; - } - - // 登录成功 - Connect_Failed_Count = 0; - //stateone.IpEndPoint = (IPEndPoint)socket.RemoteEndPoint; - stateone.setClientType(ClientAlias); - stateone.WorkSocket = socket; - //stateone.WorkSocket.BeginReceive(stateone.BytesHead, stateone.AlreadyReceivedHead, - //stateone.BytesHead.Length - stateone.AlreadyReceivedHead, SocketFlags.None, - //new AsyncCallback(HeadReceiveCallback), stateone); - - Thread receive = new Thread(new Runnable() { - @Override - public void run() { - ThreadReceiveBackground(); - } - }); - receive.start(); - - - - // 发送一条验证消息 - byte[] bytesTemp = new byte[16]; - - //BitConverter.GetBytes(DateTime.Now.Ticks).CopyTo(bytesTemp, 0); - SendBytes(stateone, NetSupport.CommandBytes(HslCommunicationCode.Hsl_Protocol_Check_Secends, 0, KeyToken, bytesTemp)); - - - stateone.setHeartTime(new Date()); - Is_Client_Start = true; - LoginSuccess(); - - LogUtil.LogD("ThreadLogin","Login Server Success, Times: " + Connect_Failed_Count); - - Is_Client_Connecting = false; - - ThreadSleep(1000); - } - - - - private void ThreadReceiveBackground() - { - while (true) - { - OperateResult result = new OperateResult(); - boolWith2Bytes value = ReceiveAndCheckBytes(stateone.WorkSocket, result, null,null); - - if (!value.Result) - { - continue; - } - - // 数据处理 - byte[] buffer1= new byte[4]; - buffer1[0] = value.Content[0]; - buffer1[1] = value.Content[1]; - buffer1[2] = value.Content[2]; - buffer1[3] = value.Content[3]; - - byte[] buffer2= new byte[4]; - buffer2[0] = value.Content[4]; - buffer2[1] = value.Content[5]; - buffer2[2] = value.Content[6]; - buffer2[3] = value.Content[7]; - - int protocol = Utilities.bytes2Int(buffer1); - int customer = Utilities.bytes2Int(buffer2); - - DataProcessingCenter(null,protocol,customer,value.Content2); - } - } - - - // private bool Is_reconnect_server = false; - // private object lock_reconnect_server = new object(); - - - private void ReconnectServer() - { - // 是否连接服务器中,已经在连接的话,则不再连接 - if (Is_Client_Connecting) return; - // 是否退出了系统,退出则不再重连 - if (IsQuie) return; - - LogUtil.LogI("ReconnectServer","Prepare ReConnect Server."); - - // 触发连接失败,重连系统前错误 - BeforReConnected(); - CloseSocket(stateone.WorkSocket); - - Thread thread_login = new Thread(new Runnable() { - @Override - public void run() { - ThreadLogin(); - } - }); - thread_login.start(); - } - - - /// - /// 通信出错后的处理 - /// - /// - /// - void SocketReceiveException(AsyncStateOne receive, Exception ex) - { - if (ex.getMessage().contains(StringResources.SocketRemoteCloseException)) - { - // 异常掉线 - ReconnectServer(); - } - else - { - // MessageAlerts?.Invoke("数据接收出错:" + ex.Message); - } - - LogUtil.LogD("SocketReceiveException","Socket Excepiton Occured."); - } - - - /// - /// 服务器端用于数据发送文本的方法 - /// - /// 用户自定义的命令头 - /// 发送的文本 - public void Send(NetHandle customer, String str) - { - if (Is_Client_Start) - { - SendBytes(stateone, NetSupport.CommandBytes(customer.get_CodeValue(), KeyToken, str)); - } - } - /// - /// 服务器端用于发送字节的方法 - /// - /// 用户自定义的命令头 - /// 实际发送的数据 - public void Send(NetHandle customer, byte[] bytes) - { - if (Is_Client_Start) - { - SendBytes(stateone, NetSupport.CommandBytes(customer.get_CodeValue(), KeyToken, bytes)); - } - } - - private void SendBytes(final AsyncStateOne stateone, final byte[] content) - { - Thread thread_login = new Thread(new Runnable() { - @Override - public void run() { - try { - stateone.WorkSocket.getOutputStream().write(content); - } catch (Exception ex) { - - } - } - }); - thread_login.start(); - //SendBytesAsync(stateone, content); - } - - /// - /// 客户端的数据处理中心 - /// - /// - /// - /// - /// - void DataProcessingCenter(AsyncStateOne receive, int protocol, int customer, byte[] content) - { - if (protocol == HslCommunicationCode.Hsl_Protocol_Check_Secends) - { - //Date dt = new Date(BitConverter.ToInt64(content, 0)); - //ServerTime = new Date(BitConverter.ToInt64(content, 8)); - //DelayTime = (int)(new Date() - dt).TotalMilliseconds; - stateone.setHeartTime(new Date()); - // MessageAlerts?.Invoke("心跳时间:" + DateTime.Now.ToString()); - } - else if (protocol == HslCommunicationCode.Hsl_Protocol_Client_Quit) - { - // 申请了退出 - } - else if (protocol == HslCommunicationCode.Hsl_Protocol_User_Bytes) - { - // 接收到字节数据 - AcceptByte(new NetHandle(customer), content); - } - else if (protocol == HslCommunicationCode.Hsl_Protocol_User_String) - { - // 接收到文本数据 - String str = Utilities.byte2String(content); - AcceptString(new NetHandle(customer), str); - } - } - - - private Thread thread_heart_check = null; - - /// - /// 心跳线程的方法 - /// - private void ThreadHeartCheck() - { - - ThreadSleep(2000); - while (true) - { - ThreadSleep(1000); - - if (!IsQuie) - { - byte[] send = new byte[16]; - System.arraycopy(Utilities.long2Bytes(new Date().getTime()),0,send,0,8); - SendBytes(stateone, NetSupport.CommandBytes(HslCommunicationCode.Hsl_Protocol_Check_Secends, 0, KeyToken, send)); - double timeSpan = (new Date().getTime() - stateone.getHeartTime().getTime())/1000; - if (timeSpan > 1 * 8)//8次没有收到失去联系 - { - LogUtil.LogD("ThreadHeartCheck","Heart Check Failed int "+timeSpan+" Seconds."); - ReconnectServer(); - ThreadSleep(1000); - } - } - else - { - break; - } - } - } - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/NetSimplifyClient.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/NetSimplifyClient.java deleted file mode 100644 index 1b0d31e..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Enthernet/NetSimplifyClient.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.example.HslCommunication.Enthernet; - -import com.example.HslCommunication.Core.Net.HslCommunicationCode; -import com.example.HslCommunication.Core.Net.NetShareBase; -import com.example.HslCommunication.Core.Net.ProgressReport; -import com.example.HslCommunication.Core.Utilities.boolWith2Bytes; -import com.example.HslCommunication.Core.Utilities.Utilities; -import com.example.HslCommunication.Core.Types.NetHandle; -import com.example.HslCommunication.Core.Types.OperateResultBytes; -import com.example.HslCommunication.Core.Types.OperateResultString; -import com.example.HslCommunication.Core.Utilities.boolWithSocket; -import com.example.HslCommunication.Resources.StringResources; - -import java.io.InputStream; -import java.net.Socket; -import java.util.UUID; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public final class NetSimplifyClient extends NetShareBase { - - - - /// - /// 实例化一个客户端的对象,用于和服务器通信 - /// - public NetSimplifyClient(String ipAddress, int port, UUID token) - { - m_ipAddress = ipAddress; - m_port = port; - KeyToken = token; - } - - private String m_ipAddress="127.0.0.1"; - private int m_port=10000; - - /// - /// 客户端向服务器进行请求,请求字符串数据 - /// - /// 用户的指令头 - /// 发送数据 - /// 发送数据时的进度报告 - /// 接收数据时的进度报告 - /// - public OperateResultString ReadFromServer( - NetHandle customer, - String send, - ProgressReport sendStatus, - ProgressReport receiveStatus - ) - { - OperateResultString result = new OperateResultString(); - byte[] data = Utilities.string2Byte(send); - OperateResultBytes temp = ReadFromServerBase(HslCommunicationCode.Hsl_Protocol_User_String, customer.get_CodeValue(), data, sendStatus, receiveStatus); - result.IsSuccess = temp.IsSuccess; - result.ErrorCode = temp.ErrorCode; - result.Message = temp.Message; - if (temp.IsSuccess) - { - result.Content = Utilities.byte2String(temp.Content); - } - temp = null; - return result; - } - - - /// - /// 客户端向服务器进行请求,请求字节数据 - /// - /// 用户的指令头 - /// - /// 发送数据的进度报告 - /// 接收数据的进度报告 - /// - public OperateResultBytes ReadFromServer( - NetHandle customer, - byte[] send, - ProgressReport sendStatus, - ProgressReport receiveStatus - ) - { - return ReadFromServerBase(HslCommunicationCode.Hsl_Protocol_User_Bytes, customer.get_CodeValue(), send, sendStatus, receiveStatus); - } - - /// - /// 需要发送的底层数据 - /// - /// 数据的指令头 - /// 用户的指令头 - /// 需要发送的底层数据 - /// 发送状态的进度报告,用于显示上传进度 - /// 接收状态的进度报告,用于显示下载进度 - /// - private OperateResultBytes ReadFromServerBase( - int headcode, - int customer, - byte[] send, - ProgressReport sendStatus, - ProgressReport receiveStatus) - { - OperateResultBytes result = new OperateResultBytes(); - - // 创建并连接套接字 - Socket socket=null; - boolWithSocket valueSocket=CreateSocketAndConnect(m_ipAddress, m_port,result); - if(!valueSocket.Result) - { - return result; - } - - socket = valueSocket.Socket; - - // 发送并检查数据是否发送完成 - if (!SendBaseAndCheckReceive(socket, headcode, customer, send, result, sendStatus,null)) - { - return result; - } - - // 接收头数据和内容数据 - - boolWith2Bytes value = ReceiveAndCheckBytes(socket, result, receiveStatus,null); - - if (!value.Result) - { - return result; - } - - CloseSocket(socket); - result.Content = value.Content2; - result.IsSuccess = true; - return result; - } - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/PlcNetBase.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/PlcNetBase.java deleted file mode 100644 index 90a403e..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/PlcNetBase.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.example.HslCommunication.Profinet; - -import com.example.HslCommunication.Core.Net.NetBase; - -/** - * Created by DATHLIN on 2017/11/3. - */ - -public abstract class PlcNetBase extends NetBase { - - - protected int m_PortRead = 1000; - protected int m_PortReadBackup = -1; - protected boolean m_IsPortNormal = true; - protected int m_PortWrite = 1001; - - - - /// - /// 获取访问的端口号 - /// - /// - protected int GetPort() - { - if (m_PortReadBackup <= 0) return m_PortRead; - return m_IsPortNormal ? m_PortRead : m_PortReadBackup; - } - /// - /// 更换端口号 - /// - protected void ChangePort() - { - m_IsPortNormal = !m_IsPortNormal; - } - - - public void setPortRead(int value) { - m_PortRead = value; - } - - - public int getPortRead() - { - return m_PortRead; - } - - - /// - /// 控制字节长度,超出选择截断,不够补零 - /// - /// 字节数据 - /// 最终需要的目标长度 - /// 处理后的数据 - protected byte[] ManageBytesLength(byte[] bytes, int length) - { - if (bytes == null) return null; - byte[] temp = new byte[length]; - if (length > bytes.length) - { - System.arraycopy(bytes, 0, temp, 0, bytes.length); - } - else - { - System.arraycopy(bytes, 0, temp, 0, length); - } - return temp; - } - - - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/SiemensPLCS.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/SiemensPLCS.java deleted file mode 100644 index d5dd1b1..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/SiemensPLCS.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.HslCommunication.Profinet; - -/** - * Created by DATHLIN on 2017/11/3. - */ - -public enum SiemensPLCS { - S1200, - S300, - Smart200, -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/SiemensTcpNet.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/SiemensTcpNet.java deleted file mode 100644 index 4ef28f6..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Profinet/SiemensTcpNet.java +++ /dev/null @@ -1,780 +0,0 @@ -package com.example.HslCommunication.Profinet; - -import com.example.HslCommunication.Core.Net.NetSupport; -import com.example.HslCommunication.Core.Types.OperateResult; -import com.example.HslCommunication.Core.Types.OperateResultBytes; -import com.example.HslCommunication.Core.Utilities.Utilities; -import com.example.HslCommunication.Core.Utilities.boolWithBytes; -import com.example.HslCommunication.Core.Utilities.boolWithSiemens; -import com.example.HslCommunication.Core.Utilities.boolWithSocket; - -import java.io.OutputStream; -import java.net.Socket; -import java.util.ArrayList; - -/** - * Created by DATHLIN on 2017/11/3. - */ - -public final class SiemensTcpNet extends PlcNetBase { - - /// - /// 实例化一个数据通信的对象,需要指定访问哪种Plc - /// - /// - public SiemensTcpNet(SiemensPLCS siemens) - { - m_PortRead = 102; - m_PortWrite = 102; - CurrentPlc = siemens; - - switch (siemens) - { - case S1200: plcHead1[18] = 1; break; - case S300: plcHead1[18] = 2; break; - case Smart200:plcHead1[18] = 1; break; - default: plcHead1[18] = 3; break; - } - } - - - /// - /// 可以手动设置PLC类型,用来测试原本不支持的数据访问功能 - /// - /// - public void SetPlcType(byte type) - { - plcHead1[18] = type; - } - - private String ipAddress=""; - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - - private boolWithBytes ReceiveBytesFromSocket(Socket socket) - { - boolWithBytes value =new boolWithBytes(); - try - { - // 先接收4个字节的数据 - byte[] head = NetSupport.ReadBytesFromSocket(socket, 4); - int receive = head[2] * 256 + head[3]; - value.Content = new byte[receive]; - System.arraycopy(head,0,value.Content,0, 4); - byte[] data = NetSupport.ReadBytesFromSocket(socket, receive - 4); - System.arraycopy(data,0,value.Content,4,data.length); - value.Result=true; - return value; - } - catch(Exception ex) - { - CloseSocket(socket); - return value; - } - } - - private boolean SendBytesToSocket(Socket socket, byte[] data) - { - try - { - if (data != null) - { - OutputStream outputStream = socket.getOutputStream(); - outputStream.write(data); - } - return true; - } - catch(Exception ex) - { - CloseSocket(socket); - return false; - } - } - - - private int CalculateAddressStarted(String address) - { - if (address.indexOf('.') < 0) - { - return Integer.parseInt(address) * 8; - } - else - { - String[] temp = address.split("\\."); - return Integer.parseInt(temp[0]) * 8 + Integer.parseInt(temp[1]); - } - } - - /// - /// 解析数据地址 - /// - /// 数据地址 - /// 类型 - /// 其实地址 - /// DB块地址 - /// 结果数据对象 - /// - private boolWithSiemens AnalysisAddress(String address, OperateResult result) - { - boolWithSiemens value = new boolWithSiemens(); - try - { - value.dbAddress = 0; - if (address.charAt(0) == 'I') - { - value.type = -127; - value.startAddress = CalculateAddressStarted(address.substring(1)); - } - else if (address.charAt(0) == 'Q') - { - value.type = -126; - value.startAddress = CalculateAddressStarted(address.substring(1)); - } - else if (address.charAt(0) == 'M') - { - value.type = -125; - value.startAddress = CalculateAddressStarted(address.substring(1)); - } - else if (address.charAt(0) == 'D' || address.substring(0, 2) == "DB") - { - value.type = -124; - String[] adds = address.split("\\."); - if (address.charAt(1) == 'B') - { - value.dbAddress = Short.parseShort(adds[0].substring(2)); - } - else - { - value.dbAddress = Short.parseShort(adds[0].substring(1)); - } - - value.startAddress = CalculateAddressStarted(address.substring(address.indexOf('.') + 1)); - } - else - { - result.Message = "不支持的数据类型"; - value.type = 0; - value.startAddress = 0; - value.dbAddress = 0; - return value; - } - } - catch (Exception ex) - { - result.Message = ex.getMessage(); - return value; - } - - value.Result=true; - return value; - } - - private boolean InitilizationConnect(Socket socket,OperateResult result) - { - // 发送初始化信息 - if(!SendBytesToSocket(socket,plcHead1)) - { - result.Message = "初始化信息发送失败"; - return false; - } - - if(!ReceiveBytesFromSocket(socket).Result) - { - result.Message = "初始化信息接收失败"; - return false; - } - - if(!SendBytesToSocket(socket,plcHead2)) - { - result.Message = "初始化信息发送失败"; - return false; - } - - if(!ReceiveBytesFromSocket(socket).Result) - { - result.Message = "初始化信息接收失败"; - return false; - } - - return true; - } - - - /// - /// 从PLC读取数据,地址格式为I100,Q100,DB20.100,M100,以字节为单位 - /// - /// 起始地址,格式为I100,M100,Q100,DB20.100 - /// 读取的数量,以字节为单位 - /// - public OperateResultBytes ReadFromPLC(String address, short count) - { - return ReadFromPLC(new String[] { address }, new short[] { count }); - } - - - /// - /// 一次性从PLC获取所有的数据,按照先后顺序返回一个统一的Buffer,需要按照顺序处理,两个数组长度必须一致 - /// - /// 起始地址数组 - /// 数据长度数组 - /// - public OperateResultBytes ReadFromPLC(String[] address, short[] count) - { - OperateResultBytes result = new OperateResultBytes(); - - if (address == null) - { - result.Message = "地址不能为空"; - return result; - } - - - if (count == null) - { - result.Message = "数量不能为空"; - return result; - } - if (address.length != count.length) { - result.Message = "两个参数的个数不统一"; - return result; - } - - Socket socket; - boolWithSocket value = CreateSocketAndConnect(ipAddress,getPortRead(), result); - if (!value.Result) - { - ChangePort(); - return result; - } - - socket = value.Socket; - if (!InitilizationConnect(socket, result)) - { - return result; - } - - - // 分批次进行读取,计算总批次 - int times = address.length / 255; - if (address.length % 255 > 0) - { - times++; - } - - // 缓存所有批次的结果 - ArrayList arrays_bytes = new ArrayList(); - - for (int jj = 0; jj < times; jj++) - { - // 计算本批次需要读取的数据 - int startIndex = jj * 255; - int readCount = address.length - startIndex; - if (readCount > 255) - { - readCount = 255; - } - - byte[] _PLCCommand = new byte[19 + readCount * 12]; - // 报文头 - _PLCCommand[0] = 0x03; - _PLCCommand[1] = 0x00; - // 长度 - _PLCCommand[2] = (byte)(_PLCCommand.length / 256); - _PLCCommand[3] = (byte)(_PLCCommand.length % 256); - // 固定 - _PLCCommand[4] = 0x02; - _PLCCommand[5] = -16; - _PLCCommand[6] = -128; - _PLCCommand[7] = 0x32; - // 命令:发 - _PLCCommand[8] = 0x01; - // 标识序列号 - _PLCCommand[9] = 0x00; - _PLCCommand[10] = 0x00; - _PLCCommand[11] = 0x00; - _PLCCommand[12] = 0x01; - // 命令数据总长度 - _PLCCommand[13] = (byte)((_PLCCommand.length - 17) / 256); - _PLCCommand[14] = (byte)((_PLCCommand.length - 17) % 256); - - _PLCCommand[15] = 0x00; - _PLCCommand[16] = 0x00; - - // 命令起始符 - _PLCCommand[17] = 0x04; - // 读取数据块个数 - _PLCCommand[18] = (byte)readCount; - - int receiveCount = 0; - for (int ii = 0; ii < readCount; ii++) - { - receiveCount += count[ii + 255 * jj]; - - boolWithSiemens siemens = AnalysisAddress(address[ii + 255 * jj], result); - // 填充数据 - if (!siemens.Result) - { - CloseSocket(socket); - return result; - } - - // 读取地址的前缀 - _PLCCommand[19 + ii * 12] = 0x12; - _PLCCommand[20 + ii * 12] = 0x0A; - _PLCCommand[21 + ii * 12] = 0x10; - _PLCCommand[22 + ii * 12] = 0x02; - // 访问数据的个数 - _PLCCommand[23 + ii * 12] = (byte)(count[ii + 255 * jj] / 256); - _PLCCommand[24 + ii * 12] = (byte)(count[ii + 255 * jj] % 256); - // DB块编号,如果访问的是DB块的话 - _PLCCommand[25 + ii * 12] = (byte)(siemens.dbAddress / 256); - _PLCCommand[26 + ii * 12] = (byte)(siemens.dbAddress % 256); - // 访问数据类型 - _PLCCommand[27 + ii * 12] = siemens.type; - // 偏移位置 - _PLCCommand[28 + ii * 12] = (byte)(siemens.startAddress / 256 / 256); - _PLCCommand[29 + ii * 12] = (byte)(siemens.startAddress / 256); - _PLCCommand[30 + ii * 12] = (byte)(siemens.startAddress % 256); - } - - - if (!SendBytesToSocket(socket, _PLCCommand)) - { - result.Message = "发送读取信息失败"; - return result; - } - - boolWithBytes content=ReceiveBytesFromSocket(socket); - if (!content.Result) - { - result.Message = "接收信息失败"; - return result; - } - - if (content.Content.length != receiveCount + readCount * 4 + 21) - { - CloseSocket(socket); - result.Message = "数据长度校验失败"; - result.Content = content.Content; - return result; - } - - // 分次读取成功 - byte[] buffer = new byte[receiveCount]; - int kk = 21; - int ll = 0; - for (int ii = 0; ii < readCount; ii++) - { - // 将数据挪回正确的地方 - System.arraycopy(content, kk + 4, buffer, ll, count[ii + 255 * jj]); - kk += count[ii + 255 * jj] + 4; - ll += count[ii + 255 * jj]; - } - arrays_bytes.add(buffer); - } - - - if (arrays_bytes.size() == 1) - { - result.Content = arrays_bytes.get(0); - } - else - { - int length = 0; - int offset = 0; - - // 获取长度并生成缓冲数据 - - for(int ii=0;ii - /// 将数据写入到PLC数据,地址格式为I100,Q100,DB20.100,M100,以字节为单位 - /// - /// 起始地址,格式为I100,M100,Q100,DB20.100 - /// 写入的数据,长度根据data的长度来指示 - /// - public OperateResult WriteIntoPLC(String address, byte[] data) - { - OperateResult result = new OperateResult(); - - - Socket socket; - boolWithSocket value = CreateSocketAndConnect(ipAddress,getPortRead(), result); - if (!value.Result) - { - ChangePort(); - return result; - } - - socket = value.Socket; - if (!InitilizationConnect(socket, result)) - { - return result; - } - - - if (data == null) data = new byte[0]; - - boolWithSiemens siemens = AnalysisAddress(address, result); - // 填充数据 - if (!siemens.Result) - { - CloseSocket(socket); - return result; - } - - - byte[] _PLCCommand = new byte[35 + data.length]; - _PLCCommand[0] = 0x03; - _PLCCommand[1] = 0x00; - // 长度 - _PLCCommand[2] = (byte)((35 + data.length) / 256); - _PLCCommand[3] = (byte)((35 + data.length) % 256); - // 固定 - _PLCCommand[4] = 0x02; - _PLCCommand[5] = -16; - _PLCCommand[6] = -128; - _PLCCommand[7] = 0x32; - // 命令 发 - _PLCCommand[8] = 0x01; - // 标识序列号 - _PLCCommand[9] = 0x00; - _PLCCommand[10] = 0x00; - _PLCCommand[11] = 0x00; - _PLCCommand[12] = 0x01; - // 固定 - _PLCCommand[13] = 0x00; - _PLCCommand[14] = 0x0E; - // 写入长度+4 - _PLCCommand[15] = (byte)((4 + data.length) / 256); - _PLCCommand[16] = (byte)((4 + data.length) % 256); - // 命令起始符 - _PLCCommand[17] = 0x05; - // 写入数据块个数 - _PLCCommand[18] = 0x01; - // 固定,返回数据长度 - _PLCCommand[19] = 0x12; - _PLCCommand[20] = 0x0A; - _PLCCommand[21] = 0x10; - // 写入方式,1是按位,2是按字 - _PLCCommand[22] = 0x02; - // 写入数据的个数 - _PLCCommand[23] = (byte)(data.length / 256); - _PLCCommand[24] = (byte)(data.length % 256); - // DB块编号,如果访问的是DB块的话 - _PLCCommand[25] = (byte)(siemens.dbAddress / 256); - _PLCCommand[26] = (byte)(siemens.dbAddress % 256); - // 写入数据的类型 - _PLCCommand[27] = siemens.type; - // 偏移位置 - _PLCCommand[28] = (byte)(siemens.startAddress / 256 / 256);; - _PLCCommand[29] = (byte)(siemens.startAddress / 256); - _PLCCommand[30] = (byte)(siemens.startAddress % 256); - // 按字写入 - _PLCCommand[31] = 0x00; - _PLCCommand[32] = 0x04; - // 按位计算的长度 - _PLCCommand[33] = (byte)(data.length * 8 / 256); - _PLCCommand[34] = (byte)(data.length * 8 % 256); - - System.arraycopy(data,0,_PLCCommand,35,data.length); - - if(!SendBytesToSocket(socket,_PLCCommand)) - { - result.Message = "发送写入信息失败"; - return result; - } - - boolWithBytes value2=ReceiveBytesFromSocket(socket); - if (!value2.Result) - { - result.Message = "接收信息失败"; - return result; - } - - if (value2.Content[value2.Content.length - 1] != 0xFF) - { - // 写入异常 - CloseSocket(socket); - result.Message = "写入数据异常"; - return result; - } - - CloseSocket(socket); - result.IsSuccess = true; - return result; - } - - - /// - /// 写入PLC的一个位,例如"M100.6","I100.7","Q100.0","DB20.100.0",如果只写了"M100"默认为"M100.0 - /// - /// - /// - /// - public OperateResult WriteIntoPLC(String address, boolean data) - { - OperateResult result = new OperateResult(); - - Socket socket; - boolWithSocket value = CreateSocketAndConnect(getIpAddress(),m_PortWrite, result); - if (!value.Result) - { - ChangePort(); - return result; - } - - socket = value.Socket; - if (!InitilizationConnect(socket, result)) - { - return result; - } - - - - byte[] buffer = new byte[1]; - buffer[0] = data ? (byte)0x01 : (byte)0x00; - - boolWithSiemens siemens = AnalysisAddress(address, result); - // 填充数据 - if (!siemens.Result) - { - CloseSocket(socket); - return result; - } - - - - byte[] _PLCCommand = new byte[35 + buffer.length]; - _PLCCommand[0] = 0x03; - _PLCCommand[1] = 0x00; - // 长度 - _PLCCommand[2] = (byte)((35 + buffer.length) / 256); - _PLCCommand[3] = (byte)((35 + buffer.length) % 256); - // 固定 - _PLCCommand[4] = 0x02; - _PLCCommand[5] = -16; - _PLCCommand[6] = -128; - _PLCCommand[7] = 0x32; - // 命令 发 - _PLCCommand[8] = 0x01; - // 标识序列号 - _PLCCommand[9] = 0x00; - _PLCCommand[10] = 0x00; - _PLCCommand[11] = 0x00; - _PLCCommand[12] = 0x01; - // 固定 - _PLCCommand[13] = 0x00; - _PLCCommand[14] = 0x0E; - // 写入长度+4 - _PLCCommand[15] = (byte)((4 + buffer.length) / 256); - _PLCCommand[16] = (byte)((4 + buffer.length) % 256); - // 命令起始符 - _PLCCommand[17] = 0x05; - // 写入数据块个数 - _PLCCommand[18] = 0x01; - _PLCCommand[19] = 0x12; - _PLCCommand[20] = 0x0A; - _PLCCommand[21] = 0x10; - // 写入方式,1是按位,2是按字 - _PLCCommand[22] = 0x01; - // 写入数据的个数 - _PLCCommand[23] = (byte)(buffer.length / 256); - _PLCCommand[24] = (byte)(buffer.length % 256); - // DB块编号,如果访问的是DB块的话 - _PLCCommand[25] = (byte)(siemens.dbAddress / 256); - _PLCCommand[26] = (byte)(siemens.dbAddress % 256); - // 写入数据的类型 - _PLCCommand[27] = siemens.type; - // 偏移位置 - _PLCCommand[28] = (byte)(siemens.startAddress / 256 / 256); - _PLCCommand[29] = (byte)(siemens.startAddress / 256); - _PLCCommand[30] = (byte)(siemens.startAddress % 256); - // 按位写入 - _PLCCommand[31] = 0x00; - _PLCCommand[32] = 0x03; - // 按位计算的长度 - _PLCCommand[33] = (byte)(buffer.length / 256); - _PLCCommand[34] = (byte)(buffer.length % 256); - - System.arraycopy(buffer,0,_PLCCommand,35,buffer.length); - - if(!SendBytesToSocket(socket,_PLCCommand)) - { - result.Message = "发送写入信息失败"; - return result; - } - - boolWithBytes value2=ReceiveBytesFromSocket(socket); - if (!value2.Result) - { - result.Message = "接收信息失败"; - return result; - } - - if (value2.Content[value2.Content.length - 1] != 0xFF) - { - // 写入异常 - CloseSocket(socket); - result.Message = "写入数据异常"; - return result; - } - - CloseSocket(socket); - result.IsSuccess = true; - return result; - } - - /// - /// 从返回的西门子数组中获取short数组数据,已经内置高地位转换 - /// - /// - /// - public short[] GetArrayFromBytes(byte[] bytes) - { - short[] temp = new short[bytes.length / 2]; - for (int i = 0; i < temp.length; i++) - { - byte[] buffer = new byte[2]; - buffer[0] = bytes[i * 2 + 1]; - buffer[1] = bytes[i * 2]; - temp[i] = Utilities.byte2Short(buffer, 0); - } - return temp; - } - - /// - /// 从返回的西门子数组中获取int数组数据,已经内置高地位转换 - /// - /// - /// - public int[] GetIntArrayFromBytes(byte[] bytes) - { - int[] temp = new int[bytes.length / 4]; - for (int i = 0; i < temp.length; i++) - { - byte[] buffer = new byte[4]; - buffer[0] = bytes[i * 4 + 0]; - buffer[1] = bytes[i * 4 + 1]; - buffer[2] = bytes[i * 4 + 2]; - buffer[3] = bytes[i * 4 + 3]; - temp[i] = Utilities.bytes2Int(buffer); - } - return temp; - } - - /// - /// 根据索引位转换获取short数据 - /// - /// - /// - /// - public short GetShortFromBytes(byte[] content, int index) - { - byte[] buffer = new byte[2]; - buffer[0] = content[index + 0]; - buffer[1] = content[index + 1]; - return Utilities.byte2Short(buffer,0); - } - - - /// - /// 根据索引位转换获取int数据 - /// - /// - /// - /// - public int GetIntFromBytes(byte[] content, int index) - { - byte[] buffer = new byte[4]; - buffer[0] = content[index + 0]; - buffer[1] = content[index + 1]; - buffer[2] = content[index + 2]; - buffer[3] = content[index + 3]; - return Utilities.bytes2Int(buffer); - } - - private byte[] plcHead1 = - { - 0x03, // 报文头 - 0x00, - 0x00, // 数据长度 - 0x16, - 0x11, - -32, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00, - -63, - 0x02, - 0x10, - 0x00, - -62, - 0x02, - 0x03, - 0x01, // 指示cpu - -64, - 0x01, - 0x0A - }; - private byte[] plcHead2 = - { - 0x03, - 0x00, - 0x00, - 0x19, - 0x02, - -16, - -128, - 0x32, - 0x01, - 0x00, - 0x00, - -52, - -63, - 0x00, - 0x08, - 0x00, - 0x00, - -16, - 0x00, - 0x00, - 0x01, - 0x00, - 0x01, - 0x03, - -64 - }; - - private SiemensPLCS CurrentPlc = SiemensPLCS.S1200; - - -} diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Resources/StringResources.java b/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Resources/StringResources.java deleted file mode 100644 index f005a31..0000000 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Resources/StringResources.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.example.HslCommunication.Resources; - -/** - * Created by DATHLIN on 2017/11/2. - */ - -public class StringResources { - - - /*********************************************************************************** - * - * 一般的错误信息 - * - ************************************************************************************/ - - - public static final String ConnectedFailed = "连接失败"; - public static final String UnknownError = "未知错误"; - public static final String ErrorCode = "错误代号"; - public static final String TextDescription = "文本描述"; - public static final String ExceptionMessage = "错误信息:"; - public static final String ExceptionStackTrace = "错误堆栈:"; - public static final String ExceptopnTargetSite = "错误方法:"; - public static final String ExceprionCustomer = "用户自定义方法出错:"; - - - - /*********************************************************************************** - * - * 系统相关的错误信息 - * - ************************************************************************************/ - - public static final String SystemInstallOperater = "安装新系统:IP为"; - public static final String SystemUpdateOperater = "更新新系统:IP为"; - - - /*********************************************************************************** - * - * 套接字相关的信息描述 - * - ************************************************************************************/ - - public static final String SocketIOException = "套接字传送数据异常:"; - public static final String SocketSendException = "同步数据发送异常:"; - public static final String SocketHeadReceiveException = "指令头接收异常:"; - public static final String SocketContentReceiveException = "内容数据接收异常:"; - public static final String SocketContentRemoteReceiveException = "对方内容数据接收异常:"; - public static final String SocketAcceptCallbackException = "异步接受传入的连接尝试"; - public static final String SocketReAcceptCallbackException = "重新异步接受传入的连接尝试"; - public static final String SocketSendAsyncException = "异步数据发送出错:"; - public static final String SocketEndSendException = "异步数据结束挂起发送出错"; - public static final String SocketReceiveException = "异步数据发送出错:"; - public static final String SocketEndReceiveException = "异步数据结束接收指令头出错"; - public static final String SocketRemoteCloseException = "远程主机强迫关闭了一个现有的连接"; - - - /*********************************************************************************** - * - * 文件相关的信息 - * - ************************************************************************************/ - - - public static final String FileDownloadSuccess = "文件下载成功"; - public static final String FileDownloadFailed = "文件下载异常"; - public static final String FileUploadFailed = "文件上传异常"; - public static final String FileUploadSuccess = "文件上传成功"; - public static final String FileDeleteFailed = "文件删除异常"; - public static final String FileDeleteSuccess = "文件删除成功"; - public static final String FileReceiveFailed = "确认文件接收异常"; - public static final String FileNotExist = "文件不存在"; - public static final String FileSaveFailed = "文件存储失败"; - public static final String FileLoadFailed = "文件加载失败"; - public static final String FileSendClientFailed = "文件发送的时候发生了异常"; - public static final String FileWriteToNetFailed = "文件写入网络异常"; - public static final String FileReadFromNetFailed = "从网络读取文件异常"; - - /*********************************************************************************** - * - * 服务器的引擎相关数据 - * - ************************************************************************************/ - - public static final String TokenCheckFailed = "接收验证令牌不一致"; - public static final String TokenCheckTimeout = "接收验证超时:"; - public static final String NetClientAliasFailed = "客户端的别名接收失败:"; - public static final String NetEngineStart = "启动引擎"; - public static final String NetEngineClose = "关闭引擎"; - public static final String NetClientOnline = "上线"; - public static final String NetClientOffline = "下线"; - public static final String NetClientBreak = "异常掉线"; - public static final String NetClientFull = "服务器承载上限,收到超出的请求连接。"; - public static final String NetClientLoginFailed = "客户端登录中错误:"; -} diff --git a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/CommonLibrary/SimplifyHeadCode.java b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/CommonLibrary/SimplifyHeadCode.java index 4b053f6..1cad16d 100644 --- a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/CommonLibrary/SimplifyHeadCode.java +++ b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/CommonLibrary/SimplifyHeadCode.java @@ -1,6 +1,7 @@ package com.example.UserSoftwareAndroidTemplate.CommonLibrary; -import com.example.HslCommunication.Core.Types.NetHandle; + +import HslCommunication.Core.Net.NetHandle; /** * Created by hsl20 on 2017/11/5. diff --git a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Log/LogUtil.java b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LogUtil.java similarity index 86% rename from AndroidTemplate/app/src/main/java/com/example/HslCommunication/Log/LogUtil.java rename to AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LogUtil.java index bf11119..237adef 100644 --- a/AndroidTemplate/app/src/main/java/com/example/HslCommunication/Log/LogUtil.java +++ b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LogUtil.java @@ -1,14 +1,8 @@ -package com.example.HslCommunication.Log; +package com.example.UserSoftwareAndroidTemplate; import android.util.Log; -/** - * Created by hsl20 on 2017/11/4. - * 一个扩展的日志工具,用来实现对记录日志的特殊处理,屏蔽操作 - */ - public class LogUtil { - public static final int VerBose = 1; public static final int Debug = 2; @@ -23,9 +17,9 @@ public class LogUtil { public static int Level = VerBose; - /* + /** 记录零碎的日志 - */ + **/ public static void LogV(String tag, String msg) { if (Level <= VerBose) Log.v(tag, msg); } @@ -64,5 +58,4 @@ public static void LogE(String tag, String msg) { public static void LogE(String tag, String msg, Exception ex) { if (Level <= Error) Log.e(tag, msg, ex); } - } diff --git a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/LoginActivity.java b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/LoginActivity.java index f854d87..e32f65f 100644 --- a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/LoginActivity.java +++ b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/LoginActivity.java @@ -22,12 +22,10 @@ import android.widget.TextView; import android.widget.Toast; -import com.example.HslCommunication.BasicFramework.SystemVersion; -import com.example.HslCommunication.Core.Types.NetHandle; -import com.example.HslCommunication.Core.Types.OperateResultString; -import com.example.HslCommunication.Log.LogUtil; + import com.example.UserSoftwareAndroidTemplate.CommonLibrary.SimplifyHeadCode; import com.example.UserSoftwareAndroidTemplate.CommonLibrary.UserAccount; +import com.example.UserSoftwareAndroidTemplate.LogUtil; import com.example.UserSoftwareAndroidTemplate.MainActivity; import com.example.UserSoftwareAndroidTemplate.R; import com.example.UserSoftwareAndroidTemplate.UserClient; @@ -39,6 +37,10 @@ import java.util.Date; +import HslCommunication.BasicFramework.SystemVersion; +import HslCommunication.Core.Net.NetHandle; +import HslCommunication.Core.Types.OperateResultExOne; + import static com.example.UserSoftwareAndroidTemplate.CommonLibrary.UserAccount.FrameworkVersion; public class LoginActivity extends AppCompatActivity { @@ -205,7 +207,7 @@ public void run() { LogUtil.LogD("loginSystem","开始请求维护检查"); // 第一步请求维护状态 - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.维护检查, "", null, null); + OperateResultExOne result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.维护检查, ""); if (!result.IsSuccess) { MessageShow(result.ToMessageShowString()); return; @@ -226,7 +228,7 @@ public void run() { jsonObject.addProperty(FrameworkVersion, UserClient.FrameworkVersion.toString()); LogUtil.LogD("loginSystem",jsonObject.toString()); - result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.账户检查, jsonObject.toString(), null, null); + result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.账户检查, jsonObject.toString()); if (!result.IsSuccess) { MessageShow(result.ToMessageShowString()); return; @@ -249,7 +251,7 @@ public void run() { LogUtil.LogD("loginSystem","开始请求版本检查"); // 第三步检查版本 - result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.更新检查, "", null, null); + result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.更新检查, ""); if (!result.IsSuccess) { MessageShow(result.ToMessageShowString()); return; @@ -276,7 +278,7 @@ public void run() { LogUtil.LogD("loginSystem","开始请求数据下载"); // 下载服务器数据 - result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.参数下载,"",null,null); + result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.参数下载,""); if (result.IsSuccess) { // 服务器返回初始化的数据,此处进行数据的提取,有可能包含了多个数据 JsonBeanPara para = new Gson().fromJson(result.Content, JsonBeanPara.class); diff --git a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/SplashActivity.java b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/SplashActivity.java index 14fde53..eabeb1e 100644 --- a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/SplashActivity.java +++ b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/LoginSupport/SplashActivity.java @@ -10,17 +10,18 @@ import android.widget.TextView; import android.widget.Toast; -import com.example.HslCommunication.BasicFramework.SystemVersion; -import com.example.HslCommunication.Core.Types.OperateResultString; -import com.example.HslCommunication.Log.LogUtil; import com.example.UserSoftwareAndroidTemplate.CommonLibrary.SimplifyHeadCode; import com.example.UserSoftwareAndroidTemplate.CommonLibrary.UserAccount; +import com.example.UserSoftwareAndroidTemplate.LogUtil; import com.example.UserSoftwareAndroidTemplate.MainActivity; import com.example.UserSoftwareAndroidTemplate.R; import com.example.UserSoftwareAndroidTemplate.UserClient; import com.google.gson.Gson; import com.google.gson.JsonObject; +import HslCommunication.BasicFramework.SystemVersion; +import HslCommunication.Core.Types.OperateResultExOne; + import static com.example.UserSoftwareAndroidTemplate.CommonLibrary.UserAccount.FrameworkVersion; @@ -139,7 +140,7 @@ private int loadingCache() { // 第一步请求维护状态 - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.维护检查, "", null, null); + OperateResultExOne result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.维护检查, ""); if (!result.IsSuccess) { MessageShow(result.ToMessageShowString()); return FAILURE; @@ -167,7 +168,7 @@ private int loadingCache() { jsonObject.addProperty(FrameworkVersion, UserClient.FrameworkVersion.toString()); LogUtil.LogD("loginSystem",jsonObject.toString()); - result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.账户检查, jsonObject.toString(), null, null); + result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.账户检查, jsonObject.toString()); if (!result.IsSuccess) { MessageShow(result.ToMessageShowString()); return FAILURE; @@ -184,7 +185,7 @@ private int loadingCache() { LogUtil.LogD("loginSystem","开始请求版本检查"); // 第三步检查版本 - result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.更新检查, "", null, null); + result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.更新检查, ""); if (!result.IsSuccess) { MessageShow(result.ToMessageShowString()); return FAILURE; @@ -211,7 +212,7 @@ private int loadingCache() { LogUtil.LogD("loginSystem","开始请求数据下载"); // 下载服务器数据 - result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.参数下载,"",null,null); + result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.参数下载,""); if (result.IsSuccess) { // 服务器返回初始化的数据,此处进行数据的提取,有可能包含了多个数据 JsonBeanPara para = new Gson().fromJson(result.Content, JsonBeanPara.class); diff --git a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/MainActivity.java b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/MainActivity.java index cae796b..49f6b5c 100644 --- a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/MainActivity.java +++ b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/MainActivity.java @@ -13,9 +13,7 @@ import android.widget.TextView; import android.widget.Toast; -import com.example.HslCommunication.Core.Types.NetHandle; -import com.example.HslCommunication.Core.Types.OperateResultString; -import com.example.HslCommunication.Enthernet.NetSimplifyClient; +import com.example.UserSoftwareAndroidTemplate.CommonLibrary.SimplifyHeadCode; import com.example.UserSoftwareAndroidTemplate.CommonLibrary.UserAccount; import com.example.UserSoftwareAndroidTemplate.LoginSupport.LoginActivity; import com.example.UserSoftwareAndroidTemplate.LoginSupport.SplashActivity; @@ -23,6 +21,9 @@ import java.util.UUID; +import HslCommunication.Core.Net.NetHandle; +import HslCommunication.Core.Types.OperateResultExOne; + public class MainActivity extends AppCompatActivity { public MainActivity() @@ -39,7 +40,7 @@ public void handleMessage(Message msg) { if (msg.arg1 == 1) { // 说明是一个网络的请求访问 - OperateResultString result = (OperateResultString) msg.obj; + OperateResultExOne result = (OperateResultExOne) msg.obj; if (result.IsSuccess) { TextView textView = (TextView) findViewById(R.id.textViewMain); textView.setText(result.Content); @@ -60,9 +61,10 @@ public void handleMessage(Message msg) { public void run() { // 在这里进行网络请求相关操作 Message msg = new Message(); - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer(new NetHandle(1,2, 15),"",null,null); + OperateResultExOne result = UserClient.Net_simplify_client.ReadFromServer(SimplifyHeadCode.获取账户,""); + + msg.obj = result; msg.arg1=1; - msg.obj = result; handler.sendMessage(msg); } }; diff --git a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/UserClient.java b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/UserClient.java index 2fad12c..491bcc0 100644 --- a/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/UserClient.java +++ b/AndroidTemplate/app/src/main/java/com/example/UserSoftwareAndroidTemplate/UserClient.java @@ -1,9 +1,12 @@ package com.example.UserSoftwareAndroidTemplate; -import com.example.HslCommunication.BasicFramework.SystemVersion; -import com.example.HslCommunication.Enthernet.NetSimplifyClient; + import com.example.UserSoftwareAndroidTemplate.CommonLibrary.UserAccount; +import HslCommunication.BasicFramework.SystemVersion; +import HslCommunication.Enthernet.SimplifyNet.NetSimplifyClient; + + import java.util.List; import java.util.UUID; @@ -13,18 +16,19 @@ public class UserClient { + public static SystemVersion FrameworkVersion = new SystemVersion("1.7.5"); public static SystemVersion CurrentVersion = new SystemVersion("1.0.0.171026"); public static String SettingsFileName = "Settings"; - public static String ServerIp = "117.48.203.204"; + public static String ServerIp = "192.168.1.110"; public static int PortSecondary = 14568; public static UUID Token = UUID.fromString("1275BB9A-14B2-4A96-9673-B0AF0463D474"); public static List SystemFactories = null; // 分厂 public static String Announcement = ""; // 公告 - public static NetSimplifyClient Net_simplify_client = new NetSimplifyClient(ServerIp, PortSecondary, Token); + public static NetSimplifyClient Net_simplify_client = new NetSimplifyClient(ServerIp, PortSecondary,Token); public static UserAccount UserAccount = null; } diff --git a/AndroidTemplate/build.gradle b/AndroidTemplate/build.gradle index 020eae2..43c0708 100644 --- a/AndroidTemplate/build.gradle +++ b/AndroidTemplate/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.1.3' // NOTE: Do not place your application dependencies here; they belong diff --git a/AndroidTemplate/gradle/wrapper/gradle-wrapper.properties b/AndroidTemplate/gradle/wrapper/gradle-wrapper.properties index 3a32211..c89bbd7 100644 --- a/AndroidTemplate/gradle/wrapper/gradle-wrapper.properties +++ b/AndroidTemplate/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Oct 29 15:00:29 CST 2017 +#Sun Jul 29 09:58:11 CST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https://services.gradle.org/distributions/gradle-4.3-rc-4-all.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip