瀏覽代碼

串口通讯

压力锅
pry 7 月之前
父節點
當前提交
325f387716
共有 79 個文件被更改,包括 4186 次插入1336 次删除
  1. +6
    -0
      app/build.gradle
  2. +535
    -0
      app/src/main/java/com/bonait/bnframework/HBL/API/APIHelper.java
  3. +21
    -0
      app/src/main/java/com/bonait/bnframework/HBL/API/APIResult.java
  4. +21
    -0
      app/src/main/java/com/bonait/bnframework/HBL/API/APIResultT.java
  5. +57
    -0
      app/src/main/java/com/bonait/bnframework/HBL/API/Utils.java
  6. +44
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/CommBase.java
  7. +89
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/ExceptionServer.java
  8. +15
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IExceptionHandling.java
  9. +10
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IModbusMaster.java
  10. +23
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IRead.java
  11. +24
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IWrite.java
  12. +622
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/ModbusMaster.java
  13. +157
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Siemens/CommHelper.java
  14. +360
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Communication/Siemens/SiemensHelper.java
  15. +1
    -2
      app/src/main/java/com/bonait/bnframework/HBL/CustomView/ShadowContainer.java
  16. +81
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/ByteLib.java
  17. +51
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/ByteTransDataFormat.java
  18. +108
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/Convert.java
  19. +244
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/DataConvertLib.java
  20. +31
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/FloatLib.java
  21. +51
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/IntLib.java
  22. +37
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/NotifyPropVar.java
  23. +51
    -0
      app/src/main/java/com/bonait/bnframework/HBL/DataUtil/ShortLib.java
  24. +8
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Dialog/AlertDialogButton.java
  25. +15
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogActivity.java
  26. +309
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogManager.java
  27. +7
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogType.java
  28. +35
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogView.java
  29. +6
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Dialog/IDialogAction.java
  30. +1
    -1
      app/src/main/java/com/bonait/bnframework/HBL/Enum/DataFormat.java
  31. +43
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Executor.java
  32. +5
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Interface/IRun.java
  33. +1
    -1
      app/src/main/java/com/bonait/bnframework/HBL/Interface/IRunT.java
  34. +7
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Logs/IMessageLogNotify.java
  35. +62
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Logs/MessageLog.java
  36. +230
    -0
      app/src/main/java/com/bonait/bnframework/HBL/NetworkUtils.java
  37. +30
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Result/IResult.java
  38. +78
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Result/OperateResult.java
  39. +88
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Result/OperateResultT.java
  40. +38
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Result/ResultCode.java
  41. +5
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Thread/IThread.java
  42. +7
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Thread/IThreadComplete.java
  43. +110
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Thread/ThreadManager.java
  44. +8
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Thread/ThreadModel.java
  45. +44
    -0
      app/src/main/java/com/bonait/bnframework/HBL/Trig/RTrig.java
  46. +19
    -9
      app/src/main/java/com/bonait/bnframework/MainActivity.java
  47. +0
    -2
      app/src/main/java/com/bonait/bnframework/MainApplication.java
  48. +3
    -6
      app/src/main/java/com/bonait/bnframework/business/ConfigData.java
  49. +91
    -115
      app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java
  50. +66
    -69
      app/src/main/java/com/bonait/bnframework/business/MainInit.java
  51. +7
    -20
      app/src/main/java/com/bonait/bnframework/business/OrderServer.java
  52. +1
    -1
      app/src/main/java/com/bonait/bnframework/common/constant/DataBus.java
  53. +0
    -13
      app/src/main/java/com/bonait/bnframework/common/helper/I/IMessageLogNotify.java
  54. +0
    -5
      app/src/main/java/com/bonait/bnframework/common/helper/I/IRun.java
  55. +0
    -7
      app/src/main/java/com/bonait/bnframework/common/helper/I/IThread.java
  56. +2
    -1
      app/src/main/java/com/bonait/bnframework/common/helper/MQTT.java
  57. +0
    -89
      app/src/main/java/com/bonait/bnframework/common/helper/MessageLog.java
  58. +20
    -0
      app/src/main/java/com/bonait/bnframework/common/helper/ModbusHelper.java
  59. +1
    -1
      app/src/main/java/com/bonait/bnframework/common/helper/RTrig.java
  60. +0
    -75
      app/src/main/java/com/bonait/bnframework/common/helper/ThreadManager.java
  61. +0
    -9
      app/src/main/java/com/bonait/bnframework/common/helper/mode/ThreadModel.java
  62. +0
    -44
      app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpHelper.java
  63. +0
    -812
      app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpServer.java
  64. +1
    -2
      app/src/main/java/com/bonait/bnframework/common/oss/OssHelper.java
  65. +43
    -40
      app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigationMainActivity.java
  66. +0
    -1
      app/src/main/java/com/bonait/bnframework/modules/home/adapter/wdsz_adapter.java
  67. +2
    -5
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/MakeGoodFragment.java
  68. +0
    -1
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/GoodPeiFangActivity.java
  69. +1
    -1
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/ZdqxActivity.java
  70. +1
    -1
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/Silos_item_jiaoyan_fragment.java
  71. +1
    -1
      app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/silos_jiaoyan.java
  72. +2
    -2
      app/src/main/java/com/bonait/bnframework/modules/welcome/activity/LoginActivity.java
  73. +27
    -0
      app/src/main/res/drawable/bg_btn_cancel.xml
  74. +5
    -0
      app/src/main/res/drawable/dialog_back.xml
  75. +5
    -0
      app/src/main/res/drawable/dialog_error_title_back.xml
  76. +5
    -0
      app/src/main/res/drawable/dialog_info_title_back.xml
  77. +5
    -0
      app/src/main/res/drawable/dialog_warn_title_back.xml
  78. +84
    -0
      app/src/main/res/layout/activity_dialog.xml
  79. +18
    -0
      app/src/main/res/values/styles.xml

+ 6
- 0
app/build.gradle 查看文件

@@ -34,6 +34,8 @@ android {
}

compileOptions {
//启用对新语言API的支持的标志
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
@@ -151,4 +153,8 @@ dependencies {
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'

implementation 'com.contrarywind:Android-PickerView:3.2.6'

implementation 'com.github.xingshuangs:iot-communication:1.5.0'

coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6'
}

+ 535
- 0
app/src/main/java/com/bonait/bnframework/HBL/API/APIHelper.java 查看文件

@@ -0,0 +1,535 @@
package com.bonait.bnframework.HBL.API;

import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

public class APIHelper {

private static String key="64059261-1599-472c-b418-3c18b4e3883e";

/**
* 获取加密后的签名
* @param t
* @return
*/
public static String GetSign(Object t,String key){
AtomicReference<String> retstr = new AtomicReference<>("");
List<Field> fields = Arrays.asList(t.getClass().getFields());
Collections.sort(fields, Comparator.comparing(Field::getName));
fields.forEach(item->{
if( item.getName().toUpperCase()!="sign".toUpperCase()){
try {
if(item.get(t)!=null&&!item.get(t).toString().isEmpty()){
Type type = item.getGenericType();
String typeName = type.toString();
switch(typeName){
case "class java.util.Date":
case "class java.lang.String":
case "byte":
case "int":
case "float":
case "double":
case "long":
case "short":
case "boolean":
retstr.set(retstr.get() + item.getName() + "=" + item.get(t) + "&");
break;
default:
// String a= new GsonBuilder().serializeNulls().create().toJson(item.get(t));//保留为空的属性
String a= new Gson().toJson(item.get(t));
retstr.set(retstr.get() + item.getName() + "=" + a + "&");
break;
}
}
} catch (Exception e) {
}
}
});
String tempSign="&key="+key;
if(retstr.get().length()>0){
tempSign=retstr.get().substring(0, retstr.get().length()-1)+"&key="+key;
}
// String tempSign=retstr.get().substring(0, retstr.get().length()-1)+"&key="+key;
StringBuilder sb = new StringBuilder();
try{
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(tempSign.toUpperCase().getBytes());
for (byte b : digest) {
sb.append(Integer.toHexString((b & 0xFF) | 0x100).substring(1,3));
}
}catch (Exception e){

}
return sb.toString().toUpperCase();
}

public static String Post(String url, Map<String, String> parameters, Map<String, String> headers) throws IOException {
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);
// 设置header
if (headers != null) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
// 设置参数
if (parameters != null) {
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : parameters.entrySet()) {
stringBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");
}
String params = stringBuilder.toString();
byte[] postData = params.getBytes("UTF-8");
connection.setRequestProperty("Content-Length", Integer.toString(postData.length));
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(postData);
}
}
// 获取响应结果
int statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} else {
throw new IOException("服务器返回错误,状态码:" + statusCode);
}
}catch (Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
}finally {
// 关闭连接和流
if (reader != null) {
reader.close();
}
if (inputStream != null) {
inputStream.close();
}
if (connection != null) {
connection.disconnect();
}
}
return buffer.toString();
}
public static String Post(String url, String body, Map<String, String> headers) throws IOException {
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Charset", "UTF-8");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);
// 设置header
if (headers != null) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
// 设置参数
if (!body .isEmpty()) {
connection.setRequestProperty("Content-Length", Integer.toString(body.getBytes().length));
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(body.getBytes());
}
}
// 获取响应结果
int statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} else {
throw new IOException("服务器返回错误,状态码:" + statusCode);
}
}catch (Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
}finally {
// 关闭连接和流
if (reader != null) {
reader.close();
}
if (inputStream != null) {
inputStream.close();
}
if (connection != null) {
connection.disconnect();
}
}
return buffer.toString();
}
public static String Post(String url, Object body, Map<String, String> headers) throws IOException {
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Charset", "UTF-8");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);
// 设置header
if (headers != null) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
}
// 设置参数
if (body !=null) {
byte[] bytes = new Gson().toJson(body).getBytes();
connection.setRequestProperty("Content-Length", Integer.toString(bytes.length));
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(bytes);
}
}
// 获取响应结果
int statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} else {
throw new IOException("服务器返回错误,状态码:" + statusCode);
}
}catch (Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
}finally {
// 关闭连接和流
if (reader != null) {
reader.close();
}
if (inputStream != null) {
inputStream.close();
}
if (connection != null) {
connection.disconnect();
}
}
return buffer.toString();
}
public static void Post(String url, Object body, IRunT<APIResult> callback) {
new Thread(()->{
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Charset", "UTF-8");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);

if(body!=null){
//获取签名信息
String sign = GetSign(body,key);

//设置请求头
connection.setRequestProperty("key", key);
connection.setRequestProperty("sign", sign);


//设置请求 body
byte[] bytes = new Gson().toJson(body).getBytes();
connection.setRequestProperty("Content-Length", Integer.toString(bytes.length));
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(bytes);
}
}

// 获取响应结果
int statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} else {
throw new IOException("服务器返回错误,状态码:" + statusCode);
}
}catch (Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
return;
}finally {
try{
// 关闭连接和流
if (reader != null) reader.close();

if (inputStream != null) inputStream.close();

if (connection != null) connection.disconnect();

}catch(Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
return;
}
}

try{
APIResult res = new GsonBuilder().serializeNulls().create().fromJson(buffer.toString(), APIResult.class);
if(res!=null)if(callback!=null) callback.Run(res);
}catch(Exception e){

}
}).start();

}
public static void Post(String url, Object body,String signkey, IRunT<APIResult> callback) {
new Thread(()->{
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Charset", "UTF-8");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);

if(body!=null){
//获取签名信息
String sign = GetSign(body,signkey);

MessageLog.ShowInfo("签名信息:"+sign);

//设置请求头
connection.setRequestProperty("key", signkey);
// connection.setRequestProperty("sign", sign);


//设置请求 body
byte[] bytes = new Gson().toJson(body).getBytes();
connection.setRequestProperty("Content-Length", Integer.toString(bytes.length));
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(bytes);
}
}

// 获取响应结果
int statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} else {
throw new IOException("服务器返回错误,状态码:" + statusCode);
}
}catch (Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
return;
}finally {
try{
// 关闭连接和流
if (reader != null) reader.close();

if (inputStream != null) inputStream.close();

if (connection != null) connection.disconnect();

}catch(Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
return;
}
}

try{
APIResult res = new GsonBuilder().serializeNulls().create().fromJson(buffer.toString(), APIResult.class);
if(res!=null)if(callback!=null) callback.Run(res);
}catch(Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
}
}).start();

}

public static <T> void PostT(String url, Object body,String signkey ,IRunT<APIResultT<T>> callback) {
new Thread(()->{
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");// "Fiddler"
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Charset", "UTF-8");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);

if(body!=null){
//获取签名信息
String sign = GetSign(body,signkey);

//设置请求头
connection.setRequestProperty("key", signkey);
connection.setRequestProperty("sign", sign);


//设置请求 body
byte[] bytes = new Gson().toJson(body).getBytes();
connection.setRequestProperty("Content-Length", Integer.toString(bytes.length));
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(bytes);
}
}

// 获取响应结果
int statusCode = connection.getResponseCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} else {
throw new IOException("服务器返回错误,状态码:" + statusCode);
}
}catch (Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
return;
}finally {
try{
// 关闭连接和流
if (reader != null) reader.close();
if (inputStream != null) inputStream.close();
if (connection != null) connection.disconnect();
}catch(Exception e){
MessageLog.ShowError("POST 请求异常:"+e.toString());
return;
}
}
try{

APIResultT<T> res = new GsonBuilder().serializeNulls().create().fromJson(buffer.toString(), APIResultT.class);
if(res!=null)if(callback!=null) callback.Run(res);
}catch(Exception e){
MessageLog.ShowError("POST请求返回值解析异常,"+e.toString());
}
}).start();

}
public static void get(String urlAdd,Map<String,String> params,IRunT<String> callback) {
new Thread(()->{
try {
String ResponseAdd = BuildUrlWithParams(urlAdd,params);//请求地址和参数
URL url = new URL(ResponseAdd);
HttpURLConnection Connection = (HttpURLConnection) url.openConnection();
Connection.setRequestMethod("GET");
Connection.setConnectTimeout(3000);
Connection.setReadTimeout(3000);
int responseCode = Connection.getResponseCode();
if (responseCode == Connection.HTTP_OK) {
InputStream inputStream = Connection.getInputStream();
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int length = 0;
while ((length = inputStream.read(bytes)) != -1) {
arrayOutputStream.write(bytes, 0, length);
arrayOutputStream.flush();//强制释放缓冲区
}
String s = arrayOutputStream.toString();
if(callback!=null)callback.Run(s);
} else {
MessageLog.ShowError("get 请求失败");
}
} catch (Exception e) {
MessageLog.ShowError(e);
}
}).start();
}

/**
* 请求参数拼接
* @param Url 请求地址
* @param params 请求参数
* @return
*/
public static String BuildUrlWithParams(String Url,Map<String,String> params){
StringBuilder sb = new StringBuilder(Url);
if(params!=null&&!params.isEmpty()){
sb.append("?");

params.forEach((key,value)->{
sb.append(key).append("=").append(value).append("&");
});

sb.deleteCharAt(sb.length()-1);
}
return sb.toString();
}

}

+ 21
- 0
app/src/main/java/com/bonait/bnframework/HBL/API/APIResult.java 查看文件

@@ -0,0 +1,21 @@
package com.bonait.bnframework.HBL.API;

import com.google.gson.GsonBuilder;

public class APIResult {
public int statusCode ;

public Object data ;

public String succeeded ;

public String errors ;

public String extras ;

public int timestamp ;

public String toString(){
return new GsonBuilder().serializeNulls().create().toJson(this);//保留为空的属性
}
}

+ 21
- 0
app/src/main/java/com/bonait/bnframework/HBL/API/APIResultT.java 查看文件

@@ -0,0 +1,21 @@
package com.bonait.bnframework.HBL.API;

import com.google.gson.GsonBuilder;

public class APIResultT<T> {
public int statusCode ;

public T data ;

public String succeeded ;

public String errors ;

public String extras ;

public int timestamp ;

public String toString(){
return new GsonBuilder().serializeNulls().create().toJson(this);//保留为空的属性
}
}

+ 57
- 0
app/src/main/java/com/bonait/bnframework/HBL/API/Utils.java 查看文件

@@ -0,0 +1,57 @@
package com.bonait.bnframework.HBL.API;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class Utils {

/**
* 禁用SSL验证
*/
public static void disableSSLCertChecking() {
try {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}

@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}

@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};

// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
}

+ 44
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/CommBase.java 查看文件

@@ -0,0 +1,44 @@
package com.bonait.bnframework.HBL.Communication;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class CommBase {
/**
* Ping PLC地址是否通畅
* @param address
* @param pingTimes ping的次数
* @param timeOut 超时时间 10
* @return
*/
public boolean NetPing(String address, int pingTimes, int timeOut) {
Process process = null;
try {
process = Runtime.getRuntime().exec( "ping " + "-c " + pingTimes + " -w " + timeOut+ " "+address);
InputStreamReader r = new InputStreamReader(process.getInputStream());
LineNumberReader returnData = new LineNumberReader(r);
String returnMsg="";
String line = "";
while ((line = returnData.readLine()) != null) {
System.out.println(line);
returnMsg += line;
}

if(returnMsg.indexOf("100% packet loss")!=-1){
System.out.println("与 " +address +" 连接不畅通.");
//ToastUtils.info("与 " +address +" 连接不畅通.");
return false;
} else{
System.out.println("与 " +address +" 连接畅通.");
//ToastUtils.info("与 " +address +" 连接不畅通.");
return true;
}
} catch (IOException e) {
// e.printStackTrace();
}
return false;

}

}

+ 89
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/ExceptionServer.java 查看文件

@@ -0,0 +1,89 @@
package com.bonait.bnframework.HBL.Communication.Modbus;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.HBL.Result.OperateResultT;
import com.licheedev.modbus4android.ModbusRespException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;

import java.util.concurrent.ExecutionException;

public class ExceptionServer {

public ExceptionServer(String Address, int length,IExceptionHandling excpet)
{
try {
int add = GetAddress(Address);
if (add < 0) {
MessageLog.ShowError("地址解析失败=" + Address);
return;
}
if (excpet!=null) excpet.onSuccess(add);
} catch (InterruptedException e) {
MessageLog.ShowError("onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (excpet!=null) excpet.onFailure(e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (excpet!=null) excpet.onFailure(e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (excpet!=null) excpet.onFailure(e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (excpet!=null) excpet.onFailure(e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (excpet!=null) excpet.onFailure(e.toString());
}
}

public int GetAddress(String address) {
if (address == null) return -1;
if (address.length() > 0) {
address = address.trim();
try{
if (address.toUpperCase().contains("M") &&address.toUpperCase().contains(".")&& address.length() >= 4) {
String[] res = address.substring(1).split("[.]");
if (res != null && res.length == 2) {
int firstAdd = Integer.parseInt(res[0]);
int endAdd = Integer.parseInt(res[1]);
if (endAdd >= 0 && endAdd <= 7) {
return (firstAdd * 8) + 320 + endAdd;
}
}
} else if (address.toUpperCase().contains("I") && address.length() >= 4) {
String[] res = address.substring(1).split("[.]");
if (res != null && res.length == 2) {
int firstAdd = Integer.parseInt(res[0]);
int endAdd = Integer.parseInt(res[1]);
if (endAdd >= 0 && endAdd <= 7) {
return (firstAdd * 8) + endAdd;
}
}
} else if ((address.toUpperCase().contains("VW") || address.toUpperCase().contains("VD")) && address.length() >= 3) {
String res = address.substring(2);
if (res != null) {
int tempAdd = Integer.parseInt(res);
return (tempAdd / 2) + 100;
}
}else if (address.toUpperCase().contains("M")&&address.length() >=2){
return Integer.parseInt(address.substring(1))+4000;
}else if (address.toUpperCase().contains("X")&&address.length() >=2){
int xadd = Integer.parseInt( address.substring(1));
return (xadd / 10 * 8) + xadd % 10;
}else if (address.toUpperCase().contains("Y")&&address.length() >=2){
int yadd = Integer.parseInt( address.substring(1));
return ((yadd / 10 * 8) + yadd % 10) + 300;
}else if (address.toUpperCase().contains("D")&&address.length() >=2){
return Integer.parseInt( address.substring(1));
}
else {
return Integer.parseInt(address);
}
}catch (Exception e){
MessageLog.ShowError(e);
}
}
return -1;
}
}

+ 15
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IExceptionHandling.java 查看文件

@@ -0,0 +1,15 @@
package com.bonait.bnframework.HBL.Communication.Modbus;

import com.licheedev.modbus4android.ModbusRespException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;

import java.util.concurrent.ExecutionException;

public interface IExceptionHandling {
void onSuccess(int add)throws InterruptedException, ExecutionException, ModbusTransportException,
ModbusInitException, ModbusRespException;


void onFailure(String error);
}

+ 10
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IModbusMaster.java 查看文件

@@ -0,0 +1,10 @@
package com.bonait.bnframework.HBL.Communication.Modbus;

import com.bonait.bnframework.HBL.Result.OperateResult;

public interface IModbusMaster {
OperateResult TcpConnect(String ip, int port);
OperateResult RtuConnect(String com, int baudRate);
boolean getConnected();

}

+ 23
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IRead.java 查看文件

@@ -0,0 +1,23 @@
package com.bonait.bnframework.HBL.Communication.Modbus;

import com.bonait.bnframework.HBL.Enum.DataFormat;
import com.bonait.bnframework.HBL.Result.OperateResultT;

public interface IRead {

OperateResultT<boolean[]> ReadBool(String address, int length);
OperateResultT<Boolean> ReadBool(String address);

OperateResultT<short[]> ReadShort(String address, int length);
OperateResultT<Short> ReadShort(String address);

OperateResultT<int[]> ReadInt(String address, int length);
OperateResultT<Integer> ReadInt(String address);

OperateResultT<byte[]> ReadByte(String address, int length);

OperateResultT<String> ReadString(String address, int length);

OperateResultT<float[]> ReadFloat(String address, int length);
OperateResultT<Float> ReadFloat(String address);
}

+ 24
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/IWrite.java 查看文件

@@ -0,0 +1,24 @@
package com.bonait.bnframework.HBL.Communication.Modbus;

import com.bonait.bnframework.HBL.Result.OperateResult;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;

public interface IWrite {
OperateResult WriteBool(String address, boolean value);
OperateResult WriteBool(String address, boolean[] value);
OperateResult WriteBool(String address, boolean[] value, int slaveId);

OperateResult WriteShort(String address, short value);
OperateResult WriteShort(String address, short[] value);
OperateResult WriteShort(String address, short[] value, int slaveId);

OperateResult WriteInt(String address, int value);
OperateResult WriteInt(String address, int[] value);
OperateResult WriteInt(String address, int[] value, int slaveId);

OperateResult WriteString(String address, String value, int slaveId);

OperateResult WriteFloat(String address, float value);
OperateResult WriteFloat(String address, float[] value);
OperateResult WriteFloat(String address, float[] value, int slaveId);
}

+ 622
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Modbus/ModbusMaster.java 查看文件

@@ -0,0 +1,622 @@
package com.bonait.bnframework.HBL.Communication.Modbus;

import static com.bonait.bnframework.HBL.DataUtil.DataConvertLib.ByteToShort;

import com.bonait.bnframework.HBL.Communication.CommBase;
import com.bonait.bnframework.HBL.DataUtil.FloatLib;
import com.bonait.bnframework.HBL.DataUtil.IntLib;
import com.bonait.bnframework.HBL.DataUtil.ShortLib;
import com.bonait.bnframework.HBL.Enum.DataFormat;
import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.HBL.Result.OperateResult;
import com.bonait.bnframework.HBL.Result.OperateResultT;
import com.licheedev.modbus4android.ModbusCallback;
import com.licheedev.modbus4android.ModbusParam;
import com.licheedev.modbus4android.ModbusRespException;
import com.licheedev.modbus4android.ModbusWorker;
import com.licheedev.modbus4android.param.SerialParam;
import com.licheedev.modbus4android.param.TcpParam;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.msg.ReadCoilsResponse;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicReference;

public class ModbusMaster implements IRead,IWrite ,IModbusMaster{

private boolean IsConnected=false;

private ModbusWorker mw = new ModbusWorker();
public boolean IsReconnection=true;
public DataFormat WriteDataFormat= DataFormat.ABCD;

public DataFormat ReadDataFormat= DataFormat.BADC;

public int SlaveId=1;

@Override
public OperateResult TcpConnect(String ip, int port) {
try{
MessageLog.ShowInfo("开始验证网络:"+ip );
boolean status = false;
while (!status&&IsReconnection) {
try {
status =new CommBase().NetPing(ip,1,1);//status为0则代表通,为1则代表不通。
Thread.sleep(1000);
} catch (Exception e) {
MessageLog.ShowInfo("设备 " + ip + " 网络验证失败");
}
}
MessageLog.ShowInfo("开始连接Modbus TCP" );
ModbusParam param= TcpParam.create(ip, port).setTimeout(1000).setRetries(0).setEncapsulated(false).setKeepAlive(true);
AtomicReference<String> errorInfo=new AtomicReference<>("");
while (IsConnected==false)
{
errorInfo.set("");
mw.init(param, new ModbusCallback<com.serotonin.modbus4j.ModbusMaster>() {
@Override
public void onSuccess(com.serotonin.modbus4j.ModbusMaster modbusMaster) {
IsConnected=true;
MessageLog.ShowInfo("Modbus TCP 连接成功" );
}
@Override
public void onFailure(Throwable tr) {
IsConnected = false;
errorInfo.set(tr.getMessage());
MessageLog.ShowInfo("Modbus TCP 连接失败" );
}
@Override
public void onFinally() {

}
});
if(!IsReconnection)break;
if(IsConnected==false) Thread.sleep(5000);
}
if(IsConnected)return OperateResult.CreateSuccess();
else return OperateResult.CreateFailed(errorInfo.get());
}catch(Exception ex){
return OperateResult.CreateFailed(ex);
}
}

@Override
public OperateResult RtuConnect(String com, int baudRate) {
try{
MessageLog.ShowInfo("开始连接Modbus RTU" );
ModbusParam param= SerialParam.create(com, baudRate) // 串口地址和波特率
.setDataBits(8) // 数据位
.setParity(0) // 校验位
.setStopBits(1) // 停止位
.setTimeout(500).setRetries(0); // 不重试
AtomicReference<String> errorInfo=new AtomicReference<>("");
while (IsConnected==false)
{
mw.init(param, new ModbusCallback<com.serotonin.modbus4j.ModbusMaster>() {
@Override
public void onSuccess(com.serotonin.modbus4j.ModbusMaster modbusMaster) {
IsConnected=true;
MessageLog.ShowInfo("Modbus RTU 连接成功" );
}
@Override
public void onFailure(Throwable tr) {
IsConnected = false;
errorInfo.set(tr.getMessage());
MessageLog.ShowInfo("Modbus RTU 连接失败" );
}
@Override
public void onFinally() {

}
});
if(!IsReconnection)break;
if(IsConnected==false) Thread.sleep(5000);
}
if(IsConnected)return OperateResult.CreateSuccess();
else return OperateResult.CreateFailed(errorInfo.get());
}catch(Exception ex){
return OperateResult.CreateFailed(ex);
}
}

@Override
public boolean getConnected() {
return IsConnected;
}

public <T> OperateResultT<T> Read(String address, int length){
// if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<T>>resultValue=new AtomicReference<OperateResultT<T>>();
try{
String typeName= resultValue.get().Content.getClass().getCanonicalName();
switch(typeName){
case "java.lang.String":
resultValue.set((OperateResultT<T>)ReadString(address,length));
break;
case "java.lang.Byte":
resultValue.set((OperateResultT<T>)ReadByte(address,1));
break;
case "java.lang.Integer":
resultValue.set((OperateResultT<T>)ReadInt(address));
break;
case "java.lang.Float":
resultValue.set((OperateResultT<T>)ReadFloat(address));
break;
case "java.lang.Short":
resultValue.set((OperateResultT<T>)ReadShort(address));
break;
case "java.lang.Boolean":
resultValue.set((OperateResultT<T>)ReadBool(address));
break;
case "int[]":
resultValue.set((OperateResultT<T>)ReadInt(address,length));
break;
case "float[]":
resultValue.set((OperateResultT<T>)ReadFloat(address,length));
break;
case "short[]":
resultValue.set((OperateResultT<T>)ReadShort(address,length));
break;
case "boolean[]":
resultValue.set((OperateResultT<T>)ReadBool(address,length));
break;
default:
resultValue.set(OperateResultT.CreateFailedT("不匹配的数据类型:"+typeName));
break;
}
}catch(Exception ex){
resultValue.set(OperateResultT.CreateFailedT(ex));
}
// if(result!=null)result.Run(resultValue.get());
return resultValue.get();
}

public <T> OperateResultT<T> Read(String address){
// if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<T>>resultValue=new AtomicReference<>();
resultValue.set(Read(address,1));
return resultValue.get();
}
public <T> OperateResult Write(String address,T value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
try{
String typeName= value.getClass().getCanonicalName();
switch(typeName){
case "java.lang.String":
resultValue.set(WriteString(address,value.toString(),SlaveId));
break;
case "java.lang.Integer":
resultValue.set(WriteInt(address,Integer.parseInt(value.toString())));
break;
case "java.lang.Float":
resultValue.set(WriteFloat(address,Float.parseFloat(value.toString())));
break;
case "java.lang.Short":
resultValue.set(WriteShort(address,Short.parseShort(value.toString())));
break;
case "java.lang.Boolean":
resultValue.set(WriteBool(address,Boolean.parseBoolean(value.toString())));
break;
case "int[]":
resultValue.set(WriteInt(address,(int[])value));
break;
case "float[]":
resultValue.set(WriteFloat(address,(float[])value));
break;
case "short[]":
resultValue.set(WriteShort(address,(short[])value));
break;
case "boolean[]":
resultValue.set(WriteBool(address,(boolean[])value));
break;
default:
resultValue.set(OperateResult.CreateFailed("不匹配的数据类型:"+typeName));
break;
}
}catch(Exception ex){
resultValue.set(OperateResult.CreateFailed(ex));
}
return resultValue.get();
}

@Override
public OperateResultT<boolean[]> ReadBool(String address, int length) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<boolean[]>>resultValue=new AtomicReference<>();
new ExceptionServer(address, length, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
ReadCoilsResponse res = mw.syncReadCoil(SlaveId, add, length);
boolean[] data = res.getBooleanData();
boolean[] result = Arrays.copyOfRange(data, 0, length);
resultValue.set(OperateResultT.CreateSuccess(result));
}

@Override
public void onFailure(String error){
resultValue.set(OperateResultT.CreateFailedT(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResultT<Boolean> ReadBool(String address) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<Boolean>>resultValue=new AtomicReference<>();
ReadBool(address,1).OnSource((s)->{
resultValue.set(OperateResultT.CreateSuccess(s.Content[0]));
}).OnFailed(s->{
resultValue.set(OperateResultT.CreateFailedT(s.message));
});
return resultValue.get();
}

@Override
public OperateResultT<short[]> ReadShort(String address, int length) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<short[]>>resultValue=new AtomicReference<>();
new ExceptionServer(address, length, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(SlaveId, add, length);
short[] data = res.getShortData();
if (data.length == length) {
resultValue.set(OperateResultT.CreateSuccess(data));
}
}

@Override
public void onFailure(String error){
resultValue.set(OperateResultT.CreateFailedT(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResultT<Short> ReadShort(String address) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<Short>>resultValue=new AtomicReference<>();
ReadShort(address,1).OnSource((s)->{
resultValue.set(OperateResultT.CreateSuccess(s.Content[0]));
}).OnFailed(s->{
resultValue.set(OperateResultT.CreateFailedT(s.message));
});
return resultValue.get();
}
@Override
public OperateResultT<int[]> ReadInt(String address, int length) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<int[]>>resultValue=new AtomicReference<>();
new ExceptionServer(address, length, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(SlaveId, add, length * 2);
int[] tempValues= IntLib.ToInts(res.getData(),ReadDataFormat);
if(tempValues.length==length){
resultValue.set(OperateResultT.CreateSuccess(tempValues));
}else{
resultValue.set(OperateResultT.CreateFailedT(address+",读取失败,返回长度和实际读取长度不匹配"));
}
}

@Override
public void onFailure(String error){
resultValue.set(OperateResultT.CreateFailedT(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResultT<Integer> ReadInt(String address) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<Integer>>resultValue=new AtomicReference<>();
ReadInt(address,1).OnSource((s)->{
resultValue.set(OperateResultT.CreateSuccess(s.Content[0]));
}).OnFailed(s->{
resultValue.set(OperateResultT.CreateFailedT(s.message));
});
return resultValue.get();
}

@Override
public OperateResultT<byte[]> ReadByte(String address, int length) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<byte[]>>resultValue=new AtomicReference<>();
new ExceptionServer(address, length, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
int tempLength=length;
if (length%2!=0){
tempLength++;
}
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(SlaveId, add, tempLength );
byte[] data = res.getData();
if(data.length==tempLength){
byte[] result = Arrays.copyOfRange(data, 0, length);
resultValue.set(OperateResultT.CreateSuccess(result));
}else{
resultValue.set(OperateResultT.CreateFailedT(address+",读取失败,返回长度和实际读取长度不匹配"));
}
}

@Override
public void onFailure(String error){
resultValue.set(OperateResultT.CreateFailedT(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResultT<String> ReadString(String address, int length) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<String>>resultValue=new AtomicReference<>();
new ExceptionServer(address, length, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(SlaveId, add, length);
byte[] data = res.getData();
try {
if (data.length ==length*2) {
resultValue.set(OperateResultT.CreateSuccess(new String(data, "UTF-8").trim()));
}
} catch (UnsupportedEncodingException ex) {
resultValue.set(OperateResultT.CreateFailedT(address+",读取失败,字符串解析失败:"+ex.toString()));
}
}

@Override
public void onFailure(String error){
resultValue.set(OperateResultT.CreateFailedT(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResultT<float[]> ReadFloat(String address, int length) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<float[]>>resultValue=new AtomicReference<>();
new ExceptionServer(address, length, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
ReadHoldingRegistersResponse res = mw.syncReadHoldingRegisters(SlaveId, add, length*2);
float[] tempValues = FloatLib.ToFloats(res.getData(),ReadDataFormat);
if (tempValues.length == length) {
resultValue.set(OperateResultT.CreateSuccess(tempValues));
}else{
resultValue.set(OperateResultT.CreateFailedT(address+",读取失败,返回长度和实际读取长度不匹配"));
}
}

@Override
public void onFailure(String error){
resultValue.set(OperateResultT.CreateFailedT(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResultT<Float> ReadFloat(String address) {
if(!getConnected()){ return OperateResultT.CreateFailedT("设备未连接");}
AtomicReference<OperateResultT<Float>>resultValue=new AtomicReference<>();
ReadFloat(address,1).OnSource((s)->{
resultValue.set(OperateResultT.CreateSuccess(s.Content[0]));
}).OnFailed(s->{
resultValue.set(OperateResultT.CreateFailedT(s.message));
});
return resultValue.get();
}

@Override
public OperateResult WriteBool(String address, boolean value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
return WriteBool(address,new boolean[]{value});
}

@Override
public OperateResult WriteBool(String address, boolean[] value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
mw.syncWriteCoils(SlaveId, add, value);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteBool(String address, boolean[] value, int slaveId) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
mw.syncWriteCoils(slaveId, add, value);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteShort(String address, short value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
return WriteShort(address, new short[]{value});
}

@Override
public OperateResult WriteShort(String address, short[] value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
mw.syncWriteRegisters(SlaveId, add, value);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteShort(String address, short[] value, int slaveId) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
mw.syncWriteRegisters(slaveId, add, value);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteInt(String address, int value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
return WriteInt(address, new int[]{value});
}

@Override
public OperateResult WriteInt(String address, int[] value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
short[] send=ShortLib.ToShorts(value,WriteDataFormat);
mw.syncWriteRegisters(SlaveId, add,send);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteInt(String address, int[] value, int slaveId) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
short[] send=ShortLib.ToShorts(value,WriteDataFormat);
mw. syncWriteRegisters(slaveId, add,send);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteString(String address, String value, int slaveId) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
byte[] bytes= value.getBytes();
short[] send =ByteToShort(bytes);
mw.syncWriteRegisters(slaveId, add, send);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteFloat(String address, float value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
return WriteFloat(address, new float[]{value});
}

@Override
public OperateResult WriteFloat(String address, float[] value) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
short[] send=ShortLib.ToShorts(value,WriteDataFormat);
mw.syncWriteRegisters(SlaveId, add, send);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

@Override
public OperateResult WriteFloat(String address, float[] value, int slaveId) {
if(!getConnected()){ return OperateResult.CreateFailed("设备未连接");}
AtomicReference<OperateResult>resultValue=new AtomicReference<>();
new ExceptionServer(address, 1, new IExceptionHandling() {
@Override
public void onSuccess(int add) throws InterruptedException, ExecutionException, ModbusTransportException, ModbusInitException, ModbusRespException {
short[] send=ShortLib.ToShorts(value,WriteDataFormat);
mw.syncWriteRegisters(slaveId, add, send);
resultValue.set(OperateResult.CreateSuccess());
}

@Override
public void onFailure(String error){
resultValue.set(OperateResult.CreateFailed(address+",读取异常:"+error));
}
});
return resultValue.get();
}

}

+ 157
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Siemens/CommHelper.java 查看文件

@@ -0,0 +1,157 @@
package com.bonait.bnframework.HBL.Communication.Siemens;

import com.bonait.bnframework.HBL.DataUtil.Convert;
import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.HBL.Result.OperateResult;
import com.bonait.bnframework.HBL.Result.OperateResultT;
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;

public class CommHelper {

private static CommHelper mInstance; //实例变量设置私有,防止直接通过类名访问

private CommHelper() { //默认构造函数私有,防止类外直接new创建对象
}

public static synchronized CommHelper get() { //静态同步方法作为唯一的实例对象获取方式
if (mInstance == null) {
mInstance = new CommHelper();
}
return mInstance;
}
private String IPAddress="127.0.0.1";
public boolean IsConnected(){
return siemens.IsConnected;
}
public IRun ConnectOk;

public SiemensHelper siemens=new SiemensHelper(EPlcType.S200_SMART, IPAddress);

public void Connect(){
new Thread(new Runnable() {
@Override
public void run() {
MessageLog.ShowInfo("开始连接PLC");
int tempFlag=0;
while (!siemens.checkConnected()){
try{
tempFlag++;
siemens=new SiemensHelper(EPlcType.S200_SMART, IPAddress);
siemens.connect();
siemens.Delay(1000);
}catch (Exception e){
if(tempFlag==1)MessageLog.ShowInfo("PLC连接失败:"+e.getMessage());
siemens.Delay(1000);
}
}
if(ConnectOk!=null)ConnectOk.Run();
siemens.IsConnected=true;
MessageLog.ShowInfo("PLC连接成功");
}
}).start();
}



public void writePLC(String add,Object value){
if(!IsConnected()) {
MessageLog.ShowInfo(add+":写入数据失败,连接已断开");
return;
}
if(value==null) {
MessageLog.ShowInfo("writePLC:写入值为空");
return;
}
try{
if(add.toUpperCase().contains("VD")){
Float tempVD= Float.parseFloat(value.toString());
siemens.WriteFloat32(add,tempVD);
}
else if (add.toUpperCase().contains("VW")){
Integer tempVW= Integer.parseInt(value.toString());
siemens.WriteUInt16(add,tempVW);
}
else if (add.toUpperCase().contains("V")){
Boolean tempV= Boolean.parseBoolean(value.toString());
siemens.WriteBoolean(add,tempV);
}
}catch (Exception e){
MessageLog.ShowInfo("writePLC:写入失败,"+e.getMessage());
}

}

public Object readPLC(String add){
try{
if(add.toUpperCase().contains("VD")){
return siemens.ReadFloat32(add);
}
else if (add.toUpperCase().contains("VW")||add.toUpperCase().contains("IW")||add.toUpperCase().contains("QW")){
return siemens.ReadUInt16(add);
}
else if (add.toUpperCase().contains("V")){
return siemens.ReadBoolean(add);
}
}catch (Exception e){
MessageLog.ShowInfo("readPLC:读取失败,"+e.getMessage());
}
return new Object();
}

public <T> OperateResultT<T> Read(String add){
if(!IsConnected()) return OperateResultT.CreateFailedT(add+":读取数据失败,连接已断开");
OperateResultT<T> result = new OperateResultT<>();
String typeName=result.Content.getClass() .getName();
try{
if(typeName.contains("Boolean")){
return Convert.TryToGenericity(siemens.ReadBoolean(add));
}else if(typeName.contains("Integer")){
if(add.toUpperCase().contains("VD")){
return Convert.TryToGenericity(siemens.ReadInt32(add));
}
else if (add.toUpperCase().contains("VW")||add.toUpperCase().contains("IW")||add.toUpperCase().contains("QW")){
return Convert.TryToGenericity(siemens.ReadUInt16(add));
}
}else if(typeName.contains("Short")){
return Convert.TryToGenericity(siemens.ReadInt16(add));
}else if(typeName.contains("Float")){
return Convert.TryToGenericity(siemens.ReadFloat32(add));
}else{
return OperateResultT.CreateFailedT(typeName+" 暂不支持的数据类型");
}
}catch (Exception e){
return OperateResultT.CreateFailedT(e);
}
return result;
}

public <T> OperateResult Write(String add, T value){
if(!IsConnected()) return OperateResult.CreateFailed(add+":读取数据失败,连接已断开");
if(value ==null) return OperateResult.CreateFailed(add+":写入值无效");
String typeName=value.getClass() .getName();
try{

if(typeName.contains("Boolean")){
Convert.<Boolean>TryToGenericity(value).OnSource(s->{ siemens.WriteBoolean(add,s.Content);});
}else if(typeName.contains("Integer")){
if(add.toUpperCase().contains("VD")){
Convert.<Integer>TryToGenericity(value).OnSource(s->{ siemens.WriteInt32(add,s.Content);});
}
else if (add.toUpperCase().contains("VW")){
Convert.<Integer>TryToGenericity(value).OnSource(s->{ siemens.WriteUInt16(add,s.Content);});
}
}else if(typeName.contains("Short")){
Convert.<Short>TryToGenericity(value).OnSource(s->{ siemens.WriteInt16(add,s.Content);});
}else if(typeName.contains("Float")){
Convert.<Float>TryToGenericity(value).OnSource(s->{ siemens.WriteFloat32(add,s.Content);});
}else{
return OperateResult.CreateFailed(typeName+" 暂不支持的数据类型");
}
return OperateResult.CreateSuccess();
}catch (Exception e){
return OperateResult.CreateFailed(e);
}
}

}

+ 360
- 0
app/src/main/java/com/bonait/bnframework/HBL/Communication/Siemens/SiemensHelper.java 查看文件

@@ -0,0 +1,360 @@
package com.bonait.bnframework.HBL.Communication.Siemens;

import android.util.Log;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.github.xingshuangs.iot.exceptions.SocketRuntimeException;
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType;
import com.github.xingshuangs.iot.protocol.s7.model.DataItem;
import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
import com.github.xingshuangs.iot.protocol.s7.utils.AddressUtil;
import com.github.xingshuangs.iot.utils.FloatUtil;
import com.github.xingshuangs.iot.utils.IntegerUtil;
import com.github.xingshuangs.iot.utils.ShortUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class SiemensHelper extends S7PLC {
public Boolean IsConnected=false;

public boolean CancelWrite=false;


public void Delay(long millis){
try{
Thread.sleep(millis);
}catch(InterruptedException e){

}
}

public boolean ReadBoolean(String address){
boolean result=false;
while(true){
try {
result=this.readBoolean(address);
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public List<Boolean> ReadBoolean(String... address) {
List<Boolean> result=new ArrayList<>();
while(true){
try {
result=this.readBoolean(Arrays.asList(address));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public short ReadInt16(String address) {
short result=0;
while(true){
try {
DataItem dataItem = this.readS7Data(AddressUtil.parseByte(address, 2));
result= ShortUtil.toInt16(dataItem.getData());
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;

}

public List<Short> ReadInt16(String... address) {
List<Short> result=new ArrayList<>();
while(true){
try {
result=this.readInt16(Arrays.asList(address));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}

return result;
}

public int ReadUInt16(String address) {
int result=0;
while(true){
try {
DataItem dataItem = this.readS7Data(AddressUtil.parseByte(address, 2));
result= ShortUtil.toUInt16(dataItem.getData());
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public List<Integer> ReadUInt16(String... address) {
List<Integer> result=new ArrayList<>();
while(true){
try {
result=this.readUInt16(Arrays.asList(address));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public int ReadInt32(String address) {
int result=0;
while(true){
try {
DataItem dataItem = this.readS7Data(AddressUtil.parseByte(address, 4));
result= IntegerUtil.toInt32(dataItem.getData());
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public List<Integer> ReadInt32(String... address) {
List<Integer> result=new ArrayList<>();
while(true){
try {
result=this.readInt32(Arrays.asList(address));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public float ReadFloat32(String address) {
float result=0f;
while(true){
try {
DataItem dataItem = this.readS7Data(AddressUtil.parseByte(address, 4));
result= FloatUtil.toFloat32(dataItem.getData());

IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public List<Float> ReadFloat32(String... address) {
List<Float> result=new ArrayList<>();
while(true){
try {
result=this.readFloat32(Arrays.asList(address));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(1000);
}
}
return result;
}

public void WriteBoolean(String address, boolean data) {
if(!IsConnected){
MessageLog.ShowInfo(address+":写入数据失败,连接已断开");
return;
}
while (true) {
try {
this.writeS7Data(AddressUtil.parseBit(address), DataItem.createReqByBoolean(data));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(100);
if(CancelWrite)break;
}
catch (Exception e){
MessageLog.ShowError("WriteBoolean 写入异常:"+e.toString());
break;
}
}
}

public void WriteUInt16(String address, int data) {
if(!IsConnected){
MessageLog.ShowInfo(address+":写入数据失败,连接已断开");
return;
}
while (true) {
try {
this.writeByte(address, ShortUtil.toByteArray(data));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(100);
if(CancelWrite)break;
}
catch (Exception e){
MessageLog.ShowError("WriteUInt16 写入异常:"+e.toString());
break;
}
}
}

public void WriteInt16(String address, short data) {
if(!IsConnected){
MessageLog.ShowInfo(address+":写入数据失败,连接已断开");
return;
}
while (true) {
try {
Log.e("info","准备写入数据:"+data);
this.writeByte(address, ShortUtil.toByteArray(data));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
Log.e("socketException","写入:"+data+"失败");
this.close();
IsConnected=false;
Delay(100);
if(CancelWrite)break;
}
catch (Exception e){
MessageLog.ShowError("WriteInt16 写入异常:"+e.toString());
break;
}
}
}

public void WriteUInt32(String address, long data) {
if(!IsConnected){
MessageLog.ShowInfo(address+":写入数据失败,连接已断开");
return;
}
while (true) {
try {
this.writeByte(address, IntegerUtil.toByteArray(data));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(100);
if(CancelWrite)break;
}
catch (Exception e){
MessageLog.ShowError("WriteUInt32 写入异常:"+e.toString());
break;
}
}
}

public void WriteInt32(String address, int data) {
if(!IsConnected){
MessageLog.ShowInfo(address+":写入数据失败,连接已断开");
return;
}
while (true) {
try {
this.writeByte(address, IntegerUtil.toByteArray(data));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(100);
if(CancelWrite)break;
}
catch (Exception e){
MessageLog.ShowError("WriteInt32 写入异常:"+e.toString());
break;
}
}
}

public void WriteFloat32(String address, float data) {
if(!IsConnected){
MessageLog.ShowInfo(address+":写入数据失败,连接已断开");
return;
}
while (true) {
try {
this.writeByte(address, FloatUtil.toByteArray(data));
IsConnected=true;
break;
}
catch(SocketRuntimeException ex){
this.close();
IsConnected=false;
Delay(100);
if(CancelWrite)break;
}
catch (Exception e){
MessageLog.ShowError("WriteFloat32 写入异常:"+e.toString());
break;
}
}
}

public SiemensHelper(EPlcType PlcType, String ip){
super(PlcType, ip);
}

}

app/src/main/java/com/bonait/bnframework/common/ShadowContainer.java → app/src/main/java/com/bonait/bnframework/HBL/CustomView/ShadowContainer.java 查看文件

@@ -1,4 +1,4 @@
package com.bonait.bnframework.common;
package com.bonait.bnframework.HBL.CustomView;

import android.content.Context;
import android.content.res.TypedArray;
@@ -211,4 +211,3 @@ public class ShadowContainer extends ViewGroup {

}



+ 81
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/ByteLib.java 查看文件

@@ -0,0 +1,81 @@
package com.bonait.bnframework.HBL.DataUtil;


import com.bonait.bnframework.HBL.Enum.DataFormat;

public class ByteLib {

public static byte[] ToBytes(short value, DataFormat df) {
byte[] b = new byte[2];
b[0]=(byte)((value>>8)&0xff);
b[1]=(byte)((value>>0)&0xff);
return new ByteTransDataFormat().ByteTransDataFormat2(b,df,0);
}

public static byte[] ToBytes(short[] value,DataFormat df) {
byte[] b = new byte[value.length*2];
for (int i = 0; i < value.length; i++)
{
b[i*2]=(byte)((value[i]>>8)&0xff);
b[i*2+1]=(byte)((value[i]>>0)&0xff);
}
return new ByteTransDataFormat().ByteTransDataFormat2(b,df,0);
}

public static byte[] ToBytes(float value,DataFormat df) {
int tempValue = Float.floatToRawIntBits(value);
byte[] b = new byte[4];
b[0]=(byte)((tempValue>>24)&0xff);
b[1]=(byte)((tempValue>>16)&0xff);
b[2]=(byte)((tempValue>>8)&0xff);
b[3]=(byte)((tempValue>>0)&0xff);
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0);
}

public static byte[] ToBytes(float[] value,DataFormat df) {
byte[] b = new byte[value.length*4];
for (int i=0;i<value.length;i++)
{
int tempValue = Float.floatToRawIntBits(value[i]);
b[i*4]=(byte)((tempValue>>24)&0xff);
b[i*4+1]=(byte)((tempValue>>16)&0xff);
b[i*4+2]=(byte)((tempValue>>8)&0xff);
b[i*4+3]=(byte)((tempValue>>0)&0xff);
}
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0);
}

public static byte[] ToBytes(int value,DataFormat df) {
byte[] b = new byte[4];
b[0]=(byte)((value>>24)&0xff);
b[1]=(byte)((value>>16)&0xff);
b[2]=(byte)((value>>8)&0xff);
b[3]=(byte)((value>>0)&0xff);
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0);
}

public static byte[] ToBytes(int[] value,DataFormat df) {
byte[] b = new byte[value.length*4];
for (int i=0;i<value.length;i++)
{
b[i*4]=(byte)((value[i]>>24)&0xff);
b[i*4+1]=(byte)((value[i]>>16)&0xff);
b[i*4+2]=(byte)((value[i]>>8)&0xff);
b[i*4+3]=(byte)((value[i]>>0)&0xff);
}
return new ByteTransDataFormat().ByteTransDataFormat4(b,df,0);
}

public static boolean GetBit(byte value,int offset)
{
if (offset > 8 || offset < 1) return false;
return (value & 1 << offset - 1) == 0 ? false : true;
}

public static byte SetBit(byte value,int offset, boolean val)
{
if (offset > 8 || offset < 1) return value;
int ConvertValue = 1 << offset - 1;
return (byte)(val ? value | ConvertValue : value & ~ConvertValue);
}
}

+ 51
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/ByteTransDataFormat.java 查看文件

@@ -0,0 +1,51 @@
package com.bonait.bnframework.HBL.DataUtil;


import com.bonait.bnframework.HBL.Enum.DataFormat;

public class ByteTransDataFormat {
public byte[] ByteTransDataFormat2(byte[] data, DataFormat df, int offset ){
if (offset+2<2) return new byte[2];
byte[] numArray = new byte[2];
if (df==DataFormat.ABCD||df==DataFormat.BADC){
numArray[0] = data[offset+1];
numArray[1] = data[offset];
}
else {
numArray[0] = data[offset];
numArray[1] = data[offset+1];
}
return numArray;
}

public byte[] ByteTransDataFormat4(byte[] data, DataFormat df,int offset ){
if (offset+4<4) return new byte[4];
byte[] numArray = new byte[4];
if (df==DataFormat.ABCD){
numArray[0] = data[offset+3];
numArray[1] = data[offset+2];
numArray[2] = data[offset+1];
numArray[3] = data[offset];
}
else if (df==DataFormat.BADC){
numArray[0] = data[offset+2];
numArray[1] = data[offset+3];
numArray[2] = data[offset];
numArray[3] = data[offset+1];
}
else if(df==DataFormat.CDAB){
numArray[0] = data[offset+1];
numArray[1] = data[offset];
numArray[2] = data[offset+3];
numArray[3] = data[offset+2];
}
else if(df==DataFormat.DCBA){
numArray[0] = data[offset];
numArray[1] = data[offset+1];
numArray[2] = data[offset+2];
numArray[3] = data[offset+3];
}
return numArray;
}
}


+ 108
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/Convert.java 查看文件

@@ -0,0 +1,108 @@
package com.bonait.bnframework.HBL.DataUtil;


import com.alibaba.fastjson.TypeReference;
import com.bonait.bnframework.HBL.Result.OperateResultT;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Convert {
public static OperateResultT<Boolean> TryToBoolean(Object value){
if(value==null) return OperateResultT.CreateFailedT("TryToBoolean:转换对象为空");
try{
return OperateResultT.CreateSuccess(Boolean.parseBoolean(value.toString()));
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}

public static OperateResultT<Integer> TryToInt(Object value){
if(value==null) return OperateResultT.CreateFailedT("TryToInt:转换对象为空");
try{
return OperateResultT.CreateSuccess(Integer.parseInt(value.toString()));
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}

public static OperateResultT<Short> TryToShort(Object value){
if(value==null) return OperateResultT.CreateFailedT("TryToShort:转换对象为空");
try{
return OperateResultT.CreateSuccess(Short.parseShort(value.toString()));
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}

public static OperateResultT<Float> TryToFloat(Object value){
if(value==null) return OperateResultT.CreateFailedT("TryToFloat:转换对象为空");
try{
return OperateResultT.CreateSuccess(Float.parseFloat(value.toString()));
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}

public static <T> OperateResultT<T> TryToGenericity( Object value){
if(value==null) return OperateResultT.CreateFailedT("TryToGenericity:转换对象为空");
try{
return OperateResultT.CreateSuccess((T)value);
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}

// public static <T extends Number> OperateResultT<T> TryToNumber(Object value,Class<T> type){
// if(value==null) return OperateResultT.CreateFailedT("TryToGenericity:转换对象为空");
// try{
// String temp = value.toString();
// if(type==Integer.TYPE){
// return OperateResultT.CreateSuccess((T)Integer.valueOf(temp));
// }else if (type==Short.TYPE){
// return OperateResultT.CreateSuccess((T)Short.valueOf(temp));
// }else if (type==Byte.TYPE){
// return OperateResultT.CreateSuccess((T)Byte.valueOf(temp));
// }else if (type==Float.TYPE){
// return OperateResultT.CreateSuccess((T)Float.valueOf(temp));
// }else if (type==Long.TYPE){
// return OperateResultT.CreateSuccess((T)Long.valueOf(temp));
// }else if (type==Double.TYPE){
// return OperateResultT.CreateSuccess((T)Double.valueOf(temp));
// }else if (type.getName().contains(Boolean.TYPE.getName())){
// return OperateResultT.CreateSuccess((T)Boolean.valueOf(temp));
// }else if (type.getName().contains(String.class.getName())){
// return OperateResultT.CreateSuccess((T)temp);
// }
// return OperateResultT.CreateSuccess((T)value);
// }catch (Exception e) {
// return OperateResultT.CreateFailedT(e);
// }
// }

public static <T> OperateResultT<T> fromJson(Object value, Class<T> clazz) {
if(value==null) return OperateResultT.CreateFailedT("TryToBoolean:转换对象为空");
try{
Gson gson = new GsonBuilder().create();
String temp = gson.toJson(value);
T arr = gson.fromJson(temp, clazz);
if(arr!=null)return OperateResultT.CreateSuccess( arr );
else return OperateResultT.CreateFailedT("返回对象为空");
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}

public static <T> OperateResultT<T> fromJson(String value, Class<T> clazz) {
if(value==null||value.isEmpty()) return OperateResultT.CreateFailedT("TryToBoolean:转换对象为空");
try{
Gson gson = new GsonBuilder().create();
T arr = gson.fromJson(value, clazz);
if(arr!=null)return OperateResultT.CreateSuccess( arr);
else return OperateResultT.CreateFailedT("返回对象为空");
}catch (Exception e) {
return OperateResultT.CreateFailedT(e);
}
}


}

+ 244
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/DataConvertLib.java 查看文件

@@ -0,0 +1,244 @@
package com.bonait.bnframework.HBL.DataUtil;




import com.bonait.bnframework.HBL.Enum.DataFormat;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;

public class DataConvertLib {

/***
* 字节数组转换成浮点数
* @param ,需要转换的字节
* @param ,转换的数据格式
* @return
*/
public static Float BytesToFloat(byte[] buffers, DataFormat df) {
if (buffers.length == 4) {
byte[] bytes = new byte[4];
if (df == DataFormat.ABCD) {
bytes[0] = buffers[3];
bytes[1] = buffers[2];
bytes[2] = buffers[1];
bytes[3] = buffers[0];
} else if (df == DataFormat.CDAB) {
bytes[0] = buffers[1];
bytes[1] = buffers[0];
bytes[2] = buffers[3];
bytes[3] = buffers[2];
} else if (df == DataFormat.BADC) {
bytes[0] = buffers[2];
bytes[1] = buffers[3];
bytes[2] = buffers[0];
bytes[3] = buffers[1];
} else if (df == DataFormat.DCBA) {
bytes[0] = buffers[0];
bytes[1] = buffers[1];
bytes[2] = buffers[2];
bytes[3] = buffers[3];
}
return ByteBuffer.wrap(bytes).getFloat();
}
return 0.0f;
}

/**
* 字节数组转换成整形
* @param ,需要转换的字节数组
* @param ,转换的数据格式
* @return
*/
public static Integer BytesToInt(byte[] buffers, DataFormat df) {
if (buffers.length == 4) {
byte[] bytes = new byte[4];
if (df == DataFormat.ABCD) {
bytes[0] = buffers[3];
bytes[1] = buffers[2];
bytes[2] = buffers[1];
bytes[3] = buffers[0];
} else if (df == DataFormat.CDAB) {
bytes[0] = buffers[1];
bytes[1] = buffers[0];
bytes[2] = buffers[3];
bytes[3] = buffers[2];
} else if (df == DataFormat.BADC) {
bytes[0] = buffers[2];
bytes[1] = buffers[3];
bytes[2] = buffers[0];
bytes[3] = buffers[1];
} else if (df == DataFormat.DCBA) {
bytes[0] = buffers[0];
bytes[1] = buffers[1];
bytes[2] = buffers[2];
bytes[3] = buffers[3];
}
return ByteBuffer.wrap(bytes).getInt();
}
return 0;
}

/**
* 32位整数转换成字节
* @param ,number
* @return
*/
public static byte[] IntToByte(int number) {
int temp = number;
byte[] b = new byte[4];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位
temp = temp >> 8; // 向右移8位
}
return b;
}

/**
* 32位整形转换成16位整数数组
* @param ,value
* @return
*/
public static short[] IntToShorts(int value) {
short[] res = new short[2];
int temp = value;
byte[] b = new byte[4];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位
temp = temp >> 8; // 向右移8位
}
for (int i = 0; i < res.length; i++) {
short s0 = (short) (b[i * 2] & 0xff);// 最低位
short s1 = (short) (b[i * 2 + 1] & 0xff);
s1 <<= 8;
res[i] = (short) (s0 | s1);
}
return res;
}

public static String GetString(short[] src, int start, int len) throws UnsupportedEncodingException {
short[] temp = new short[len];
for (int i = 0; i < len; i++) {
temp[i] = src[i + start];
}
byte[] bytesTemp = shorts2Bytes(temp);
for (int i = 0; i < bytesTemp.length; i++) {
byte b = bytesTemp[i];
}
String str = new String(bytesTemp, "UTF-8");
return str;
}

public static short[] ByteToShort(byte[] bytes) {

int len=bytes.length;
if (bytes.length%2!=0) len++;
byte[] tempBytes=new byte[len];
short[] result = new short[len/2];
for (int i=0;i<len;i++){
if (i<bytes.length)tempBytes[i]=bytes[i];
}
for(int m=0;m<result.length;m++) {
result[m] = (short) ((tempBytes[m * 2] & 0xff) | ((tempBytes[m * 2 + 1] & 0xff) << 8));
}
return result;
}


public static byte[] shorts2Bytes(short[] data) {
byte[] byteValue = new byte[data.length * 2];
for (int i = 0; i < data.length; i++) {
byteValue[i * 2] = (byte) (data[i] & 0xff);
byteValue[i * 2 + 1] = (byte) ((data[i] & 0xff00) >> 8);
}
return byteValue;
}

public static int GetAddress(String address) {
if (address == null) return -1;
if (address.length() > 0) {
address = address.trim();
if (address.toUpperCase().contains("M") && address.length() >= 4) {
String[] res = address.substring(1).split("[.]");
if (res != null && res.length == 2) {
try {
int firstAdd = Integer.parseInt(res[0]);
int endAdd = Integer.parseInt(res[1]);
if (endAdd >= 0 && endAdd <= 7) {
return (firstAdd * 8) + 320 + endAdd;
}
} catch (NumberFormatException e) {
return -1;
}
}
} else if (address.toUpperCase().contains("I") && address.length() >= 4) {
String[] res = address.substring(1).split("[.]");
if (res != null && res.length == 2) {
try {
int firstAdd = Integer.parseInt(res[0]);
int endAdd = Integer.parseInt(res[1]);
if (endAdd >= 0 && endAdd <= 7) {
return (firstAdd * 8) + endAdd;
}
} catch (NumberFormatException e) {
return -1;
}
}
} else if ((address.toUpperCase().contains("VW") || address.toUpperCase().contains("VD")) && address.length() >= 3) {
String res = address.substring(2);
if (res != null) {
try {
int tempAdd = Integer.parseInt(res);
return (tempAdd / 2) + 100;
} catch (NumberFormatException e) {
return -1;
}
}
}else if (address.toUpperCase().contains("GI") &&address.length() >=3){
String res = address.substring(2);
if (res != null) {
try {
return Integer.parseInt(res);
} catch (NumberFormatException e) {
return -1;
}
}
}
else {
try {
return Integer.parseInt(address);
} catch (NumberFormatException e) {
return -1;
}
}
}
return -1;
}


/**
* 获取布尔位地址信息
* 列:M2.5 = getBitSingleAdd("M",2,5);
*
* @param Prefix 地址标头
* @param startAdd 起始地址编号
* @param num 要获取的第几位数量
* @return
*/
public static String getBitSingleAdd(String Prefix, int startAdd, int num) {
if (num > 0) {
int FirstAdd = num / 8;
int EndAdd = num % 8;
if (EndAdd == 0) {
FirstAdd--;
EndAdd = 7;
} else {
EndAdd--;
}
return Prefix + FirstAdd + startAdd + "." + EndAdd;
}
return "";
}

}

+ 31
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/FloatLib.java 查看文件

@@ -0,0 +1,31 @@
package com.bonait.bnframework.HBL.DataUtil;




import com.bonait.bnframework.HBL.Enum.DataFormat;

import java.nio.ByteBuffer;

public class FloatLib {
public static float ToFloat(byte[] bytes, DataFormat df) {
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(bytes,df,0);
return ByteBuffer.wrap(res).getFloat();
}

public static float[] ToFloats(byte[] bytes, DataFormat df) {
byte[] tempBytes=new byte[bytes.length];
if (bytes.length%4!=0)
{
int offset=4-bytes.length%4;
tempBytes=new byte[bytes.length+offset];
}
for (int i=0;i<bytes.length;i++){tempBytes[i]=bytes[i];}
float[] result = new float[tempBytes.length/4];
for (int i=0; i<result.length; i++){
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(tempBytes,df,i*4);
result[i]=ByteBuffer.wrap(res).getFloat();
}
return result;
}
}

+ 51
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/IntLib.java 查看文件

@@ -0,0 +1,51 @@
package com.bonait.bnframework.HBL.DataUtil;




import com.bonait.bnframework.HBL.Enum.DataFormat;

import java.nio.ByteBuffer;

public class IntLib {
public static int ToInt(byte[] bytes, DataFormat df) {
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(bytes,df,0);
return ByteBuffer.wrap(res).getInt();
}

public static int ToInt(short[] shorts, DataFormat df) {
if (shorts.length<2) return 0;
byte[] bytes= ByteLib.ToBytes(shorts,df);
if (bytes.length!=4) return 0;
return ByteBuffer.wrap(bytes).getInt();
}

public static int[] ToInts(byte[] bytes, DataFormat df) {
byte[] tempBytes=new byte[bytes.length];
if (bytes.length%4!=0)
{
int offset=4-bytes.length%4;
tempBytes=new byte[bytes.length+offset];
}
for (int i=0;i<bytes.length;i++){tempBytes[i]=bytes[i];}
int[] result = new int[tempBytes.length/4];
for (int i=0; i<result.length; i++){
byte[] res= new ByteTransDataFormat().ByteTransDataFormat4(tempBytes,df,i*4);
result[i]=ByteBuffer.wrap(res).getInt();
}
return result;
}

public static boolean GetBit(int value,int offset)
{
if (offset > 32 || offset < 1) return false;
return (value & 1 << offset - 1) == 0 ? false : true;
}

public static int SetBit(int value,int offset, boolean val)
{
if (offset > 32 || offset < 1) return value;
int ConvertValue =1 << offset - 1;
return val ? value | ConvertValue : value & ~ConvertValue;
}
}

+ 37
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/NotifyPropVar.java 查看文件

@@ -0,0 +1,37 @@
package com.bonait.bnframework.HBL.DataUtil;



import com.bonait.bnframework.HBL.Interface.IRunT;

import java.io.Serializable;
import java.util.LinkedHashMap;

public class NotifyPropVar<T extends Serializable> {

public NotifyPropVar(T defaultValue){
_value=defaultValue;
}
public IRunT<T> ChangeNotify;

private boolean IsFirst=false;
private LinkedHashMap<String,IRunT<T>> changedNotifys=new LinkedHashMap<>();

public void Register(String key,IRunT<T> notify){
if(changedNotifys.containsKey(key))changedNotifys.remove(key);
changedNotifys.put(key,notify);
}

private T _value;
public T getValue(){ return _value; }
public void setValue(T value){
if (value != null && !value.equals(_value) || !IsFirst)
{
_value=value;
if(ChangeNotify!=null) ChangeNotify.Run(value);
changedNotifys.values().forEach(item->{item.Run(value);});
IsFirst = true;
}
}
}


+ 51
- 0
app/src/main/java/com/bonait/bnframework/HBL/DataUtil/ShortLib.java 查看文件

@@ -0,0 +1,51 @@
package com.bonait.bnframework.HBL.DataUtil;




import com.bonait.bnframework.HBL.Enum.DataFormat;

import java.nio.ByteBuffer;

public class ShortLib {
public static short ToShort(byte[] bytes, DataFormat df) {
byte[] res= new ByteTransDataFormat().ByteTransDataFormat2(bytes,df,0);
short result= ByteBuffer.wrap(res).getShort();
return result;
}

public static short[] ToShorts(byte[] bytes, DataFormat df) {
byte[] tempBytes=new byte[bytes.length];
if (bytes.length%2!=0){ tempBytes=new byte[bytes.length+1]; }
for (int i=0; i<bytes.length; i++){tempBytes[i]=bytes[i];}
short[] result = new short[tempBytes.length/2];
for (int i=0; i<result.length; i++){
byte[] res= new ByteTransDataFormat().ByteTransDataFormat2(tempBytes,df,i*2);
result[i]=ByteBuffer.wrap(res).getShort();
}
return result;
}

public static short[] ToShorts(float[] floats, DataFormat df) {
byte[] bytes = ByteLib.ToBytes(floats,df);
return ShortLib.ToShorts(bytes,df);
}

public static short[] ToShorts(int[] floats, DataFormat df) {
byte[] bytes = ByteLib.ToBytes(floats,df);
return ShortLib.ToShorts(bytes,df);
}

public static boolean GetBit(short value,int offset)
{
if (offset > 16 || offset < 1) return false;
return (value & 1 << offset - 1) == 0 ? false : true;
}

public static short SetBit(short value,int offset, boolean val)
{
if (offset > 16 || offset < 1) return value;
short ConvertValue = (short)(1 << offset - 1);
return (short)(val ? value | ConvertValue : value & ~ConvertValue);
}
}

+ 8
- 0
app/src/main/java/com/bonait/bnframework/HBL/Dialog/AlertDialogButton.java 查看文件

@@ -0,0 +1,8 @@
package com.bonait.bnframework.HBL.Dialog;

public enum AlertDialogButton {
OK ,
OKCancel,
YesNoCancel,
YesNo,
}

+ 15
- 0
app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogActivity.java 查看文件

@@ -0,0 +1,15 @@
package com.bonait.bnframework.HBL.Dialog;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import com.bonait.bnframework.R;

public class DialogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
}

+ 309
- 0
app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogManager.java 查看文件

@@ -0,0 +1,309 @@
package com.bonait.bnframework.HBL.Dialog;

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.R;

/**
* 自定义弹框
* 需要在 res->values->styles.xml中添加 custom_dialog2样式
* 需要在layout中添加dialog布局页面
*/
public class DialogManager {

// private static DialogView dview;

private static Context mContext;

private static Activity mActivity;

public static void Init(Context context,Activity activity){
mContext = context;
mActivity=activity;
}

/**
* 对话框,自定义按钮,非阻塞
* */
private static void showDialog(String message, AlertDialogButton btn,DialogType dt, IDialogAction action) {
if(mContext==null) return;
try{
DialogView dview=new DialogView(mContext, R.layout.activity_dialog, R.style.custom_dialog2);
if (dview != null) {
if (!dview.isShowing()) {

String btnName1="确定";
String btnName2="取消";
if(btn==AlertDialogButton.YesNoCancel||btn==AlertDialogButton.YesNo){
btnName1="是";
btnName2="否";
}

dview.setCanceledOnTouchOutside(false);//禁用触摸其它区域关闭弹框
RelativeLayout rlTitle = (RelativeLayout) dview.findViewById(R.id.rl_title);
if(dt== DialogType.提示)rlTitle.setBackgroundResource(R.drawable.dialog_info_title_back);
if(dt== DialogType.警告)rlTitle.setBackgroundResource(R.drawable.dialog_warn_title_back);
if(dt== DialogType.错误)rlTitle.setBackgroundResource(R.drawable.dialog_error_title_back);
TextView Tv=(TextView)dview.findViewById(R.id.tv_Title);
TextView Info=(TextView)dview.findViewById(R.id.tv_Info);
Button ok = (Button)dview.findViewById(R.id.btn_ok);
Button cancel = (Button)dview.findViewById(R.id.btn_cancel);

Tv.setText(dt.toString());
Info.setText(message);
ok.setText(btnName1);
cancel.setText(btnName2);

if(btn==AlertDialogButton.OK)cancel.setVisibility(View.GONE);

ok.setOnClickListener(view->{
if(action!=null)action.ExitDialog(true);
hide(dview);
});

cancel.setOnClickListener(view->{
if(action!=null)action.ExitDialog(false);
hide(dview);
});
dview.show();
}
}
}catch(Exception e){
MessageLog.ShowError("打开弹框异常:"+e.toString());
}
}

/**
* 对话框,自定义按钮,非阻塞
* */
private static void showDialog(Context ct,String message, AlertDialogButton btn,DialogType dt, IDialogAction action) {
if(ct==null) return;
try{
DialogView dview=new DialogView(ct, R.layout.activity_dialog, R.style.custom_dialog2);
if (dview != null) {
if (!dview.isShowing()) {

String btnName1="确定";
String btnName2="取消";
if(btn==AlertDialogButton.YesNoCancel||btn==AlertDialogButton.YesNo){
btnName1="是";
btnName2="否";
}

dview.setCanceledOnTouchOutside(false);//禁用触摸其它区域关闭弹框
RelativeLayout rlTitle = (RelativeLayout) dview.findViewById(R.id.rl_title);
if(dt== DialogType.提示)rlTitle.setBackgroundResource(R.drawable.dialog_info_title_back);
if(dt== DialogType.警告)rlTitle.setBackgroundResource(R.drawable.dialog_warn_title_back);
if(dt== DialogType.错误)rlTitle.setBackgroundResource(R.drawable.dialog_error_title_back);
TextView Tv=(TextView)dview.findViewById(R.id.tv_Title);
TextView Info=(TextView)dview.findViewById(R.id.tv_Info);
Button ok = (Button)dview.findViewById(R.id.btn_ok);
Button cancel = (Button)dview.findViewById(R.id.btn_cancel);

Tv.setText(dt.toString());
Info.setText(message);
ok.setText(btnName1);
cancel.setText(btnName2);

if(btn==AlertDialogButton.OK)cancel.setVisibility(View.GONE);

ok.setOnClickListener(view->{
if(action!=null)action.ExitDialog(true);
hide(dview);
});

cancel.setOnClickListener(view->{
if(action!=null)action.ExitDialog(false);
hide(dview);
});
dview.show();
}
}
}catch(Exception e){
MessageLog.ShowError("打开弹框异常:"+e.toString());
}
}

/**
* 对话框,自定义按钮,非阻塞
* */
private static void showDialog(Activity activity,String message, AlertDialogButton btn,DialogType dt, IDialogAction action) {
if(activity==null) return;
try{
DialogView dview1=new DialogView(activity, R.layout.activity_dialog, R.style.custom_dialog2);
if (dview1 != null) {
if (!dview1.isShowing()) {

String btnName1="确定";
String btnName2="取消";
if(btn==AlertDialogButton.YesNoCancel||btn==AlertDialogButton.YesNo){
btnName1="是";
btnName2="否";
}

dview1.setCanceledOnTouchOutside(false);//禁用触摸其它区域关闭弹框
RelativeLayout rlTitle = (RelativeLayout) dview1.findViewById(R.id.rl_title);
if(dt== DialogType.提示)rlTitle.setBackgroundResource(R.drawable.dialog_info_title_back);
if(dt== DialogType.警告)rlTitle.setBackgroundResource(R.drawable.dialog_warn_title_back);
if(dt== DialogType.错误)rlTitle.setBackgroundResource(R.drawable.dialog_error_title_back);
TextView Tv=(TextView)dview1.findViewById(R.id.tv_Title);
TextView Info=(TextView)dview1.findViewById(R.id.tv_Info);
Button ok = (Button)dview1.findViewById(R.id.btn_ok);
Button cancel = (Button)dview1.findViewById(R.id.btn_cancel);

Tv.setText(dt.toString());
Info.setText(message);
ok.setText(btnName1);
cancel.setText(btnName2);

if(btn==AlertDialogButton.OK)cancel.setVisibility(View.GONE);

ok.setOnClickListener(view->{
if(action!=null)action.ExitDialog(true);
hide(dview1);
});

cancel.setOnClickListener(view->{
if(action!=null)action.ExitDialog(false);
hide(dview1);
});
dview1.show();
}
}
}catch(Exception e){
MessageLog.ShowError("打开弹框异常:"+e.toString());
}
}

/**
* 隐藏弹框
* @param view
*/
private static void hide(DialogView view) {
if (view != null) {
if (view.isShowing()) {
view.dismiss();
}
}
}

/**
* 信息提示框
* @param message 提示信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showInfo(String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(message,btn,DialogType.提示,action);});
else showDialog(message,btn,DialogType.提示,action);
}

/**
* 警告提示框
* @param message 警告信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showWarn(String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(message,btn,DialogType.警告,action);});
else showDialog(message,btn,DialogType.警告,action);
}

/**
* 错误提示框
* @param message 错误信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showError(String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(message,btn,DialogType.错误,action);});
else showDialog(message,btn,DialogType.错误,action);
}



/**
* 信息提示框
* @param message 提示信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showInfo( Context ct,String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(ct,message,btn,DialogType.提示,action);});
else showDialog(ct,message,btn,DialogType.提示,action);
}

/**
* 警告提示框
* @param message 警告信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showWarn( Context ct,String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(ct,message,btn,DialogType.警告,action);});
else showDialog(ct,message,btn,DialogType.警告,action);
}

/**
* 错误提示框
* @param message 错误信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showError( Context ct,String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(ct,message,btn,DialogType.错误,action);});
else showDialog(ct,message,btn,DialogType.错误,action);
}



/**
* 信息提示框
* @param message 提示信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showInfo( Activity activity,String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(activity,message,btn,DialogType.提示,action);});
else showDialog(activity,message,btn,DialogType.提示,action);
}

/**
* 警告提示框
* @param message 警告信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showWarn(Activity activity,String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(activity,message,btn,DialogType.警告,action);});
else showDialog(activity,message,btn,DialogType.警告,action);
}

/**
* 错误提示框
* @param message 错误信息
* @param btn 显示按钮
* @param action 执行回调
*/
public static void showError( Activity activity,String message, AlertDialogButton btn, IDialogAction action) {
if(mActivity!=null)
mActivity.runOnUiThread(()->{showDialog(activity,message,btn,DialogType.错误,action);});
else showDialog(activity,message,btn,DialogType.错误,action);
}

}


+ 7
- 0
app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogType.java 查看文件

@@ -0,0 +1,7 @@
package com.bonait.bnframework.HBL.Dialog;

public enum DialogType {
警告,
提示,
错误
}

+ 35
- 0
app/src/main/java/com/bonait/bnframework/HBL/Dialog/DialogView.java 查看文件

@@ -0,0 +1,35 @@
package com.bonait.bnframework.HBL.Dialog;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.view.Window;

import androidx.annotation.NonNull;

public class DialogView extends Dialog {

public DialogView(@NonNull Context context, int layout, int style, int gravity) {
super(context, style);
setContentView(layout);
Window mWindow = getWindow();
// WindowManager.LayoutParams params = mWindow.getAttributes();
// params.width = WindowManager.LayoutParams.MATCH_PARENT;
// params.height = WindowManager.LayoutParams.WRAP_CONTENT;
// params.gravity = gravity;
// mWindow.setAttributes(params);
}

public DialogView(@NonNull Context context, int layout, int style) {
super(context, style);
setContentView(layout);
Window mWindow = getWindow();
}

public DialogView(@NonNull Activity activity, int layout, int style) {
super(activity, style);
setContentView(layout);
Window mWindow = getWindow();
}

}

+ 6
- 0
app/src/main/java/com/bonait/bnframework/HBL/Dialog/IDialogAction.java 查看文件

@@ -0,0 +1,6 @@
package com.bonait.bnframework.HBL.Dialog;

public interface IDialogAction {
void ExitDialog(boolean status);

}

app/src/main/java/com/bonait/bnframework/common/helper/DataFormat.java → app/src/main/java/com/bonait/bnframework/HBL/Enum/DataFormat.java 查看文件

@@ -1,4 +1,4 @@
package com.bonait.bnframework.common.helper;
package com.bonait.bnframework.HBL.Enum;

public enum DataFormat {
ABCD,

+ 43
- 0
app/src/main/java/com/bonait/bnframework/HBL/Executor.java 查看文件

@@ -0,0 +1,43 @@
package com.bonait.bnframework.HBL;



import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Logs.MessageLog;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 异步方法
*/
public class Executor {

private static Executor mInstance; //实例变量设置私有,防止直接通过类名访问

private Executor() { //默认构造函数私有,防止类外直接new创建对象
}

public static synchronized Executor get() { //静态同步方法作为唯一的实例对象获取方式
if (mInstance == null) {
mInstance = new Executor();
}
return mInstance;
}
private ExecutorService executor= Executors.newCachedThreadPool() ;

public void runThread(IRun run) {
executor.submit(new Runnable(){
@Override
public void run() {
try {
if(run!=null)run.Run();
}catch(Exception ex) {
MessageLog.ShowError("runThread 异常:"+ex.getMessage());
}
}
});
}


}

+ 5
- 0
app/src/main/java/com/bonait/bnframework/HBL/Interface/IRun.java 查看文件

@@ -0,0 +1,5 @@
package com.bonait.bnframework.HBL.Interface;

public interface IRun {
void Run();
}

app/src/main/java/com/bonait/bnframework/common/helper/I/IRunT.java → app/src/main/java/com/bonait/bnframework/HBL/Interface/IRunT.java 查看文件

@@ -1,4 +1,4 @@
package com.bonait.bnframework.common.helper.I;
package com.bonait.bnframework.HBL.Interface;

public interface IRunT<T> {
void Run(T t);

+ 7
- 0
app/src/main/java/com/bonait/bnframework/HBL/Logs/IMessageLogNotify.java 查看文件

@@ -0,0 +1,7 @@
package com.bonait.bnframework.HBL.Logs;

public interface IMessageLogNotify {
void ErrorMsg(String msg);
void InfoMsg(String msg);
void WarnMsg(String msg);
}

+ 62
- 0
app/src/main/java/com/bonait/bnframework/HBL/Logs/MessageLog.java 查看文件

@@ -0,0 +1,62 @@
package com.bonait.bnframework.HBL.Logs;

import android.util.Log;

import com.bonait.bnframework.HBL.Thread.ThreadManager;
import com.bonait.bnframework.common.db.QueryDB;
import com.bonait.bnframework.common.db.mode.BPA_ALERTLOG;

import java.util.concurrent.ConcurrentLinkedQueue;

public class MessageLog {
private static IMessageLogNotify MsgNotify;
private static ConcurrentLinkedQueue<String> msgQueue=new ConcurrentLinkedQueue<String>();
private static void Init(){
MsgNotify = new IMessageLogNotify() {
@Override
public void ErrorMsg(String msg) {
Log.e("错误日志",msg);
}

@Override
public void InfoMsg(String msg) {
Log.i("信息日志",msg);
}

@Override
public void WarnMsg(String msg) {
Log.w("警告日志",msg);
}
};
ThreadManager.get().StartLong("日志信息保存",true,()->{
while(msgQueue.size()>0){
String msg= msgQueue.poll();
BPA_ALERTLOG log= new BPA_ALERTLOG();
log.text=msg;
QueryDB.AddAlertlog(log);
}
Thread.sleep(2000);
});
}

public static void ShowInfo(String msg) {
if (MsgNotify == null)Init();
MsgNotify.InfoMsg(msg);
}

public static void ShowWarning(String msg) {
if (MsgNotify == null)Init();
MsgNotify.WarnMsg(msg);
}

public static void ShowError(String msg) {
if (MsgNotify == null)Init();
MsgNotify.ErrorMsg(msg);
}

public static void ShowError(Exception e) {
if (MsgNotify == null)Init();
MsgNotify.ErrorMsg(e.toString());
}

}

+ 230
- 0
app/src/main/java/com/bonait/bnframework/HBL/NetworkUtils.java 查看文件

@@ -0,0 +1,230 @@
package com.bonait.bnframework.HBL;


import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.Build;
import android.util.Log;

import java.io.DataOutputStream;

/**
* Created by LY on 2019/1/4.
*/
public class NetworkUtils {
//判断网络连接是否可用(返回true表示网络可用,false为不可用)
public static boolean checkNetworkAvailable(Context context) {
//获取手机所有链接管理对象(包括对Wi-Fi,net等连接的管理)
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
} else {
//获取NetworkInfo对象
NetworkInfo[] info = manager.getAllNetworkInfo();
if (info != null && info.length > 0) {
for (int i = 0; i < info.length; i++) {
System.out.println(i + "状态" + info[i].getState());
System.out.println(i + "类型" + info[i].getTypeName());
// 判断当前网络状态是否为连接状态
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
/**
* 检测当的网络(WLAN、4G/3G/2G)状态,兼容Android 6.0以下
* @param context Context
* @return true 表示网络可用
*/
public static boolean isNetworkConnected(Context context) {
boolean result = false;
try {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (cm != null) {
NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
result = true;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
result = true;
}
}
}
} else {
if (cm != null) {
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
// connected to the internet
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
result = true;
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
result = true;
}
}
}
}

} catch (Exception e) {
return false;
}

return result;
}

/**
* 判断是否是移动网络连接
* */
public static boolean isActiveNetworkMobile(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
return false;
}

/**
* 判断是否是wifi
* */
public static boolean isActiveNetworkWifi(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
return false;
}

/**
* @deprecated 请先使用 {@link NetworkUtils#isNetworkConnected(Context)} 方法
*
* 检测当的网络(WLAN、4G/3G/2G)状态
*
* @param context Context
* @return true 表示网络可用
*/
@Deprecated
public static boolean checkNet(Context context) {

try {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {

NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected()) {

/*if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}*/
NetworkCapabilities networkCapabilities = connectivity.getNetworkCapabilities(connectivity.getActiveNetwork());
return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}
}
} catch (Exception e) {
return false;
}
return false;
}

/**
* 绑定有线网络
* @param context
*/
public static void connetEnternet(Context context)
{
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
//builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
NetworkRequest networkRequest = builder.build();
connManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
connManager.bindProcessToNetwork(network); // 绑定应用程序到有线网络
}
});
}

/**
* 绑定有线网络
* @param context
*/
public static void connetWifi(Context context)
{
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
NetworkRequest networkRequest = builder.build();
connManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
connManager.bindProcessToNetwork(network); // 绑定应用程序到有线网络
}
});
}

/**
* 同步时间
*/
public static void SynchronizationTime()
{
new Thread(new Runnable() {
@Override
public void run() {
try {
exec3("settings put global auto_time 0");
Thread.sleep(500);
exec3("settings put global auto_time 1");
} catch (InterruptedException e) {

}
}
}).start();
}
/**
* 发送
* @param cmds
*/
public static void exec3(String... cmds) {
StringBuffer command = new StringBuffer();
if (cmds.length <= 0) {
return;
}
for (String cmd : cmds) {
command.append(cmd).append("\n");
}
Process process = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec("su");
// process = Runtime.getRuntime().exec("system/bin/su");
os = new DataOutputStream(process.getOutputStream());
os.write(command.toString().getBytes());
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
Log.e("eeee",""+e.toString());
} finally {
try {
os.close();
} catch (Exception e) {
e.printStackTrace();
}
if(process!=null){
process.destroy();
}
}
}
}

+ 30
- 0
app/src/main/java/com/bonait/bnframework/HBL/Result/IResult.java 查看文件

@@ -0,0 +1,30 @@
package com.bonait.bnframework.HBL.Result;


public abstract class IResult {
/**
* 是否成功
*/
public boolean isSuccess ;

/**
* 返回消息
*/
public String message;

/**
* 操作代码
*/
public ResultCode resultCode = ResultCode.Default ;

abstract void setErrorMsg(String msg);

public boolean getIsSuccess(){
return resultCode==ResultCode.Success;
}

public void setIsSuccess(boolean tempSuccess){
isSuccess= tempSuccess;
resultCode = tempSuccess ? ResultCode.Success : ResultCode.Fail;
}
}

+ 78
- 0
app/src/main/java/com/bonait/bnframework/HBL/Result/OperateResult.java 查看文件

@@ -0,0 +1,78 @@
package com.bonait.bnframework.HBL.Result;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Logs.MessageLog;

public class OperateResult extends IResult {

public OperateResult(){

}

public OperateResult(Exception ex){
message = ex.getMessage()+"\rException:"+ex.toString();
resultCode = ResultCode.Exception;
isSuccess=false;
}

public OperateResult(String msg, ResultCode rc)
{
message = msg;
resultCode = rc;
isSuccess=false;
}

public OperateResult(ResultCode rc)
{
resultCode = rc;
isSuccess=true;
}


@Override
public void setErrorMsg(String msg) {
message =message+ msg;
isSuccess=false;
resultCode = ResultCode.Fail;
}

public OperateResult OnSource(IRun action){
if(action!=null&&getIsSuccess())action.Run();
return this;
}

public OperateResult OnFailed(IRun action){
try{
if(action!=null&&!getIsSuccess())action.Run();
}catch(Exception e){
MessageLog.ShowError(e);
}
return this;
}

public OperateResult OnFinally(IRun action){
try{
if(action!=null)action.Run();
}catch(Exception e){
MessageLog.ShowError(e);
}
return this;
}

public static OperateResult CreateSuccess()
{
return new OperateResult(ResultCode.Success);
}

public static OperateResult CreateFailed(String msg)
{
MessageLog.ShowError(msg);
return new OperateResult(msg, ResultCode.Fail);
}

public static OperateResult CreateFailed(Exception ex)
{
MessageLog.ShowError(ex.toString());
return new OperateResult(ex);
}
}

+ 88
- 0
app/src/main/java/com/bonait/bnframework/HBL/Result/OperateResultT.java 查看文件

@@ -0,0 +1,88 @@
package com.bonait.bnframework.HBL.Result;


import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.HBL.Logs.MessageLog;

public class OperateResultT<T> extends IResult
{
public OperateResultT(){}
public OperateResultT(Exception ex) {
message = ex.getMessage()+"\rException:"+ex.toString();
resultCode = ResultCode.Exception;
isSuccess=false;
}

public OperateResultT(String msg, ResultCode rc ){
message = msg;
resultCode = rc;
isSuccess=false;
}

public OperateResultT(ResultCode rc){
resultCode = rc;
isSuccess=true;
}

@Override
public void setErrorMsg(String msg) {
message =message+ msg;
isSuccess=false;
resultCode = ResultCode.Fail;
}

public OperateResultT(T content, String msg, ResultCode rc){
Content = content;
message = msg;
resultCode = rc;
isSuccess=getIsSuccess();
}

public T Content ;

public void setContent(T value){
Content = value;
resultCode = ResultCode.Success;
isSuccess=true;
}

public OperateResultT<T> OnSource(IRunT<OperateResultT<T>> action){
try{
if(action!=null&&getIsSuccess())action.Run(this);
}catch(Exception e){
MessageLog.ShowError(e);
}
return this;
}

public OperateResultT<T> OnFailed(IRunT<OperateResultT<T>> action){
try{
if(action!=null&&!getIsSuccess())action.Run(this);
}catch(Exception e){
MessageLog.ShowError(e);
}
return this;
}

public OperateResultT<T> OnFinally(IRunT<OperateResultT<T>> action){
if(action!=null)action.Run(this);
return this;
}

public static <T> OperateResultT<T> CreateSuccess(T value)
{
return new OperateResultT<T>(value,"", ResultCode.Success);
}

public static <T> OperateResultT<T> CreateFailedT(String msg)
{
MessageLog.ShowError(msg);
return new OperateResultT<T>( msg, ResultCode.Fail);
}

public static <T> OperateResultT<T> CreateFailedT(Exception ex)
{
MessageLog.ShowError(ex.toString());
return new OperateResultT<T>(ex);
}
}

+ 38
- 0
app/src/main/java/com/bonait/bnframework/HBL/Result/ResultCode.java 查看文件

@@ -0,0 +1,38 @@
package com.bonait.bnframework.HBL.Result;

public enum ResultCode {
/**
* 默认
*/
Default,

/**
* 错误
*/
Error,

/**
* 异常
*/
Exception,

/**
* 成功
*/
Success,

/**
* 失败
*/
Fail,

/**
* 操作超时
*/
Overtime,

/**
* 操作取消
*/
Canceled
}

+ 5
- 0
app/src/main/java/com/bonait/bnframework/HBL/Thread/IThread.java 查看文件

@@ -0,0 +1,5 @@
package com.bonait.bnframework.HBL.Thread;

public interface IThread {
void Run() throws Exception;
}

+ 7
- 0
app/src/main/java/com/bonait/bnframework/HBL/Thread/IThreadComplete.java 查看文件

@@ -0,0 +1,7 @@
package com.bonait.bnframework.HBL.Thread;

public interface IThreadComplete {
void Run() throws Exception;

void RunComplete() throws Exception;
}

+ 110
- 0
app/src/main/java/com/bonait/bnframework/HBL/Thread/ThreadManager.java 查看文件

@@ -0,0 +1,110 @@
package com.bonait.bnframework.HBL.Thread;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import java.util.concurrent.ConcurrentHashMap;

public class ThreadManager {
private static volatile ThreadManager _Instance;

public static ThreadManager get() {
if (_Instance == null)
_Instance = new ThreadManager();
return _Instance;
}

private ThreadManager() {

}

public long RestartInterval = 2000;
ConcurrentHashMap<String, ThreadModel> tm = new ConcurrentHashMap<>();

private void Sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

public void StartLong(String Key, boolean IsRestart, IThreadComplete _thread) {
if (!tm.containsKey(Key)) {
tm.put(Key, new ThreadModel());
tm.get(Key).RunThread = _thread;
tm.get(Key).ThreadObj = new Thread(() -> {
MessageLog.ShowInfo("启动线程:" + Key);
while (!tm.get(Key).IsCancel) {
if (IsRestart) {
try {
tm.get(Key).RunThread.Run();
} catch (Exception ex) {
MessageLog.ShowError("多线程:" + Key + "运行发生异常,已重启,errorMsg:" + ex.toString());
Sleep(RestartInterval);
}
} else {
try {
tm.get(Key).RunThread.Run();
} catch (Exception e) {
MessageLog.ShowError("多线程:" + Key + "运行发生异常,已退出,errorMsg:" + e.toString());
}
}
}
try {
tm.get(Key).RunThread.RunComplete();
MessageLog.ShowInfo("线程:[" + Key + "]--执行完成");
} catch (Exception e) {
MessageLog.ShowError("多线程:" + Key + "执行完成任务发生异常,已退出,errorMsg:" + e.toString());
}
tm.remove(Key);
});
tm.get(Key).ThreadObj.setName(Key);
tm.get(Key).ThreadObj.start();
} else {
MessageLog.ShowWarning("任务-[" + Key + "]-已存在");
}
}

public void StartLong(String Key, boolean IsRestart, IThread _thread) {
if (!tm.containsKey(Key)) {
tm.put(Key, new ThreadModel());
tm.get(Key).Task = _thread;
tm.get(Key).ThreadObj = new Thread(() -> {
MessageLog.ShowInfo("启动线程:" + Key);
while (!tm.get(Key).IsCancel) {
if (IsRestart) {
try {
tm.get(Key).RunThread.Run();
} catch (Exception ex) {
MessageLog.ShowError("多线程:" + Key + "运行发生异常,已重启,errorMsg:" + ex.toString());
Sleep(RestartInterval);
}
} else {
try {
tm.get(Key).RunThread.Run();
} catch (Exception e) {
MessageLog.ShowError("多线程:" + Key + "运行发生异常,已退出,errorMsg:" + e.toString());
}
}
}
try {
tm.get(Key).RunThread.RunComplete();
MessageLog.ShowInfo("线程:[" + Key + "]--执行完成");
} catch (Exception e) {
MessageLog.ShowError("多线程:" + Key + "执行完成任务发生异常,已退出,errorMsg:" + e.toString());
}
tm.remove(Key);
});
tm.get(Key).ThreadObj.setName(Key);
tm.get(Key).ThreadObj.start();
} else {
MessageLog.ShowWarning("任务-[" + Key + "]-已存在");
}
}

public void Stop(String Key) {
if (tm.containsKey(Key)) {
tm.get(Key).IsCancel = true;
}
}

}

+ 8
- 0
app/src/main/java/com/bonait/bnframework/HBL/Thread/ThreadModel.java 查看文件

@@ -0,0 +1,8 @@
package com.bonait.bnframework.HBL.Thread;

public class ThreadModel {
public IThreadComplete RunThread;
public IThread Task;
public boolean IsCancel;
public Thread ThreadObj;
}

+ 44
- 0
app/src/main/java/com/bonait/bnframework/HBL/Trig/RTrig.java 查看文件

@@ -0,0 +1,44 @@
package com.bonait.bnframework.HBL.Trig;



import com.bonait.bnframework.HBL.Interface.IRun;

import java.util.concurrent.ConcurrentHashMap;

/**
* 上升沿操作
*/
public class RTrig {
private static volatile ConcurrentHashMap<String, RTrig> _Instance;

public static RTrig get(String name) {
if (_Instance == null)
_Instance = new ConcurrentHashMap<String, RTrig>();
if (!_Instance.containsKey(name))
_Instance.put(name, new RTrig());
return _Instance.get(name);
}

private RTrig() {
}

private boolean flag=false;
private boolean Q=false;

public boolean getQ() {
return Q;
}

private void setIN(boolean falag) {
Q = falag && !flag;
flag = falag;
}

public void Start(boolean IN, IRun callback) {
setIN(IN);
if (Q)
callback.Run();
}

}

+ 19
- 9
app/src/main/java/com/bonait/bnframework/MainActivity.java 查看文件

@@ -4,26 +4,36 @@ package com.bonait.bnframework;

import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;

import com.bonait.bnframework.HBL.DataUtil.Convert;
import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.HBL.Result.OperateResultT;
import com.bonait.bnframework.common.DashboardView;
import com.bonait.bnframework.common.base.BaseActivity;
import com.bonait.bnframework.common.helper.ModbusHelper;

public class MainActivity extends BaseActivity {
import java.util.ArrayList;
import java.util.List;

// DashboardView dv;
public class MainActivity extends BaseActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// dv=findViewById(R.id.dv);
Init();
test();
}

public void Init(){
// dv.setMaxValue(400);
// dv.setHeaderText("锅体压力");
// dv.setUnity(" pa");
// dv.setBackgroundColor(Color.TRANSPARENT);

private void test(){
String a = "123";
// Convert.TryToNumber(a,ArrayList<Integer>.class.getClass()).OnSource(s->{
// Log.i("test",s.Content.toString());
// }).OnFailed(s->{
//
// });
}


}

+ 0
- 2
app/src/main/java/com/bonait/bnframework/MainApplication.java 查看文件

@@ -29,8 +29,6 @@ import com.bonait.bnframework.common.db.mode.BPA_USER;
import com.bonait.bnframework.common.db.res.AlertLogEnum;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.CrashHandler;
import com.bonait.bnframework.common.helper.I.IMessageLogNotify;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.SdCart;
import com.bonait.bnframework.common.utils.NetworkUtils;
import com.bonait.bnframework.common.utils.ToastUtils;


+ 3
- 6
app/src/main/java/com/bonait/bnframework/business/ConfigData.java 查看文件

@@ -8,6 +8,7 @@ import android.os.Message;

import androidx.annotation.NonNull;

import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.R;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.constant.DataBus;
@@ -25,14 +26,10 @@ import com.bonait.bnframework.common.db.mode.BPA_SILOSANDMATERIAL;
import com.bonait.bnframework.common.db.mode.BPA_SYSTEMSET;
import com.bonait.bnframework.common.db.mode.Res_PLCADDRESS;
import com.bonait.bnframework.common.helper.ConfigUtil;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IRunT;
import com.bonait.bnframework.common.helper.Json;
import com.bonait.bnframework.common.http.callback.json.JsonDialogCallback;
import com.bonait.bnframework.common.image.utils.LocalCacheUtils;
import com.bonait.bnframework.common.message.MessageManager;
import com.bonait.bnframework.common.modbus.ModbusTcpHelper;
import com.bonait.bnframework.common.modbus.ModbusTcpServer;
import com.bonait.bnframework.common.model.ResAPI;
import com.bonait.bnframework.common.model.mode.ActionJsonMode;
import com.bonait.bnframework.common.model.mode.BomTechnologyActionInfo;
@@ -974,7 +971,7 @@ public class ConfigData {
@Override
public void run() {
try {
ModbusTcpServer.get().Connect();
// ModbusTcpServer.get().Connect();
} catch (Exception e) {

}
@@ -985,7 +982,7 @@ public class ConfigData {
* 关闭PLC
*/
public void ColsePLC() {
ModbusTcpHelper.get().release();//释放modbus
// ModbusTcpHelper.get().release();//释放modbus
ConfigName.getInstance().PlcIsConnect=false;
}
/**


+ 91
- 115
app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java 查看文件

@@ -10,6 +10,12 @@ import android.util.Log;

import androidx.annotation.NonNull;

import com.bonait.bnframework.HBL.DataUtil.ShortLib;
import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.HBL.Thread.IThread;
import com.bonait.bnframework.HBL.Thread.ThreadManager;
import com.bonait.bnframework.R;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.constant.DataBus;
@@ -24,17 +30,11 @@ import com.bonait.bnframework.common.db.res.ResGoodsRecipe;
import com.bonait.bnframework.common.db.res.SilosLsjyMode;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.ByteHelper;
import com.bonait.bnframework.common.helper.DataFormat;
import com.bonait.bnframework.common.helper.I.IReadCallBack;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IRunT;
import com.bonait.bnframework.common.helper.I.IThread;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.helper.MediaPlayerHelper;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.ModbusHelper;
import com.bonait.bnframework.common.helper.RTrig;
import com.bonait.bnframework.common.helper.ThreadManager;
import com.bonait.bnframework.common.modbus.ModbusTcpServer;
import com.bonait.bnframework.common.utils.AlertDialogUtils;
import com.bonait.bnframework.common.utils.ToastUtils;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
@@ -243,7 +243,7 @@ public class ExecuteTheRecipe {
}
}).start();

ThreadManager.Get().StartLong("PLC设备数据监听", true, new IThread() {
ThreadManager.get().StartLong("PLC设备数据监听", true, new IThread() {
@Override
public void Run() throws InterruptedException {
try {
@@ -271,13 +271,10 @@ public class ExecuteTheRecipe {
Thread.sleep(500);
}

@Override
public void RunComplete() throws InterruptedException {

}
});

ThreadManager.Get().StartLong("PLC设备-温度重量", true, new IThread() {
ThreadManager.get().StartLong("PLC设备-温度重量", true, new IThread() {
@Override
public void Run() throws InterruptedException {
try {
@@ -317,13 +314,9 @@ public class ExecuteTheRecipe {
}
Thread.sleep(200);
}
@Override
public void RunComplete() throws InterruptedException {

}
});

ThreadManager.Get().StartLong("PLC设备-自动加热补水", true, new IThread() {
ThreadManager.get().StartLong("PLC设备-自动加热补水", true, new IThread() {
@Override
public void Run() throws InterruptedException {
try {
@@ -336,14 +329,9 @@ public class ExecuteTheRecipe {
}
Thread.sleep(5000);
}

@Override
public void RunComplete() throws InterruptedException {

}
});

ThreadManager.Get().StartLong("PLC设备数据监听-信号检测", true, new IThread() {
ThreadManager.get().StartLong("PLC设备数据监听-信号检测", true, new IThread() {
@Override
public void Run() throws InterruptedException {
try {
@@ -353,13 +341,9 @@ public class ExecuteTheRecipe {
}
Thread.sleep(100);
}
@Override
public void RunComplete() throws InterruptedException {

}
});

ThreadManager.Get().StartLong("商品制作线程", true, new IThread() {
ThreadManager.get().StartLong("商品制作线程", true, new IThread() {
@Override
public void Run() throws InterruptedException {
try {
@@ -405,7 +389,7 @@ public class ExecuteTheRecipe {
silos = item;
}
if (silos == null) {
MessageLog.ShowUserMessage(UserLogEnum.订单处理日志, message + "下发失败!物料没有管理料仓!");
MessageLog.ShowInfo(message + "下发失败!物料没有管理料仓!");
} else {
//MessageLog.ShowUserMessage(UserLogEnum.订单处理日志, message + "准备下发【" + silos.num + "】号料仓PLC控制命令,需求量:=" + recipe.value);
int _val = (int)Math.round((Double.parseDouble(recipe.value) * 10));
@@ -425,7 +409,7 @@ public class ExecuteTheRecipe {
@Override
public void Run() {
IsComplete[0] = true;
MessageLog.ShowUserMessage(UserLogEnum.订单处理日志, "[" + GoodMake.good.name + "]步骤【" + key + "】配料完成!");
MessageLog.ShowInfo( "[" + GoodMake.good.name + "]步骤【" + key + "】配料完成!");
}
};

@@ -439,7 +423,7 @@ public class ExecuteTheRecipe {
@Override
public void onFailure(String ErrorMsg) {
MessageLog.ShowInfo("[" + GoodMake.good.name + "]步骤【" + key + "】启动配料失败!");
MessageLog.ShowAlertMessage(AlertLogEnum.异常订单未制作日志, "[" + GoodMake.good.name + "]步骤【" + key + "】启动配料失败!");
// MessageLog.ShowAlertMessage(AlertLogEnum.异常订单未制作日志, "[" + GoodMake.good.name + "]步骤【" + key + "】启动配料失败!");
}
});

@@ -453,11 +437,11 @@ public class ExecuteTheRecipe {
//更新缓存商品制作列表状态
count += goodsRecipes.size();
DataBus.getInstance().UpdateGoodsMake(GoodMake.subOrder.id, "步骤【" + key + "】:" + RecipesNames + "-配料完成!", count, key, true);
MessageLog.ShowUserMessage(UserLogEnum.订单处理日志, "[" + GoodMake.good.name + "]步骤【" + key + "】下发" + RecipesNames + "执行完成!");
MessageLog.ShowInfo( "[" + GoodMake.good.name + "]步骤【" + key + "】下发" + RecipesNames + "执行完成!");
}

DataBus.getInstance().DeleteGoodsMake(GoodMake.subOrder.id);
MessageLog.ShowUserMessage(UserLogEnum.订单处理日志, "[" + GoodMake.good.name + "]-订单执行完成,请取餐!");
MessageLog.ShowInfo( "[" + GoodMake.good.name + "]-订单执行完成,请取餐!");

GoodMake=null;
IsMakeGood=false;
@@ -468,10 +452,6 @@ public class ExecuteTheRecipe {
}
Thread.sleep(500);
}
@Override
public void RunComplete() throws InterruptedException {

}
});
}
//endregion
@@ -491,10 +471,10 @@ public class ExecuteTheRecipe {
if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
if (plcaddress.address.toUpperCase().startsWith("VD"))//int
{
ModbusTcpServer.get().WriteInt(plcaddress.address, (int) value, callback);
ModbusHelper.get().WriteInt(plcaddress.address, (int) value);
} else if (plcaddress.address.toUpperCase().startsWith("M"))//bool
{
ModbusTcpServer.get().WriteBool(plcaddress.address, (boolean) value, callback);
ModbusHelper.get().WriteBool(plcaddress.address, (boolean) value);
} else if (plcaddress.address.toUpperCase().startsWith("VW"))//short
{
if(plcaddress.address.contains("."))
@@ -502,21 +482,17 @@ public class ExecuteTheRecipe {
String[] res = plcaddress.address.split("[.]");
String firstAdd = res[0]; //VW100
int endAdd = Integer.parseInt(res[1]); //1 //第几位
ModbusTcpServer.get().ReadShort(firstAdd, 1, new IReadCallBack<short[]>() {
@Override
public void onSuccess(short[] shorts) {
Short val=shorts[0];
Short valk= ByteHelper.setBit(val,endAdd,(boolean) value);
ModbusTcpServer.get().WriteShort(firstAdd, valk, null);
}
ModbusHelper.get().ReadShort(firstAdd).OnSource(s->{
Short valk= ShortLib.SetBit(s.Content,endAdd,(boolean)value) ;
ModbusHelper.get().WriteShort(firstAdd, valk);
});
}else
{
ModbusTcpServer.get().WriteShort(plcaddress.address, Short.parseShort(value.toString()), callback);
ModbusHelper.get().WriteShort(plcaddress.address, Short.parseShort(value.toString()));
}
}else if (plcaddress.address.toUpperCase().startsWith("VR"))//float
{
ModbusTcpServer.get().WriteFloat(plcaddress.address, Float.parseFloat(value.toString()), callback);
ModbusHelper.get().WriteFloat(plcaddress.address, Float.parseFloat(value.toString()));
}
}
}
@@ -541,13 +517,13 @@ public class ExecuteTheRecipe {
if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
if (plcaddress.address.toUpperCase().startsWith("VD"))//int
{
ModbusTcpServer.get().ReadInt(plcaddress.address, 1, ints -> {
ReturnsVariable[0] = ints[0];
ModbusHelper.get().ReadInt(plcaddress.address).OnSource(s->{
ReturnsVariable[0] = s.Content;
});
} else if (plcaddress.address.toUpperCase().startsWith("M"))//bool
{
ModbusTcpServer.get().ReadBool(plcaddress.address, 1, val -> {
ReturnsVariable[0] = val[0];
ModbusHelper.get().ReadBool(plcaddress.address).OnSource(s->{
ReturnsVariable[0] = s.Content;
});
} else if (plcaddress.address.toUpperCase().startsWith("VW"))//short
{
@@ -556,21 +532,21 @@ public class ExecuteTheRecipe {
String[] res = plcaddress.address.split("[.]");
String firstAdd = res[0].replace("V","VW"); //VW194
int endAdd = Integer.parseInt(res[1]); //1 //第几位
ModbusTcpServer.get().ReadbcStatus(firstAdd, 1, data -> {
byte status=data[0];//0x92
ReturnsVariable[0] = ByteHelper.getBit(status,endAdd)==1;
});
// ModbusHelper.get().ReadbcStatus(firstAdd, 1, data -> {
// byte status=data[0];//0x92
// ReturnsVariable[0] = ByteHelper.getBit(status,endAdd)==1;
// });
}else
{
ModbusTcpServer.get().ReadShort(plcaddress.address, 1, val -> {
ReturnsVariable[0] = val[0];
});
// ModbusHelper.get().ReadShort(plcaddress.address, 1, val -> {
// ReturnsVariable[0] = val[0];
// });
}
} else if (plcaddress.address.toUpperCase().startsWith("VR"))//float
{
ModbusTcpServer.get().ReadFloat(plcaddress.address, 1, val -> {
ReturnsVariable[0] = val[0];
});
// ModbusHelper.get().ReadFloat(plcaddress.address, 1, val -> {
// ReturnsVariable[0] = val[0];
// });
}
}
}
@@ -595,32 +571,32 @@ public class ExecuteTheRecipe {
if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
if (plcaddress.address.toUpperCase().startsWith("VD"))//int
{
ModbusTcpServer.get().ReadInt(plcaddress.address, length, val -> {
for (int i = 0; i < length; i++) {
ReturnsVariable[i] = val[i];
}
});
// ModbusHelper.get().ReadInt(plcaddress.address, length, val -> {
// for (int i = 0; i < length; i++) {
// ReturnsVariable[i] = val[i];
// }
// });
} else if (plcaddress.address.toUpperCase().startsWith("M"))//bool
{
ModbusTcpServer.get().ReadBool(plcaddress.address, length, val -> {
for (int i = 0; i < length; i++) {
ReturnsVariable[i] = val[i];
}
});
// ModbusHelper.get().ReadBool(plcaddress.address, length, val -> {
// for (int i = 0; i < length; i++) {
// ReturnsVariable[i] = val[i];
// }
// });
} else if (plcaddress.address.toUpperCase().startsWith("VW"))//short
{
ModbusTcpServer.get().ReadShort(plcaddress.address, length, val -> {
for (int i = 0; i < length; i++) {
ReturnsVariable[i] = val[i];
}
});
// ModbusHelper.get().ReadShort(plcaddress.address, length, val -> {
// for (int i = 0; i < length; i++) {
// ReturnsVariable[i] = val[i];
// }
// });
} else if (plcaddress.address.toUpperCase().startsWith("VR"))//float
{
ModbusTcpServer.get().ReadFloat(plcaddress.address, length, val -> {
for (int i = 0; i < length; i++) {
ReturnsVariable[i] = val[i];
}
});
// ModbusHelper.get().ReadFloat(plcaddress.address, length, val -> {
// for (int i = 0; i < length; i++) {
// ReturnsVariable[i] = val[i];
// }
// });
}
}
}
@@ -639,7 +615,7 @@ public class ExecuteTheRecipe {
public static void WritePLCSD(String address ,boolean value, IWriteCallBack callback) {
try {
if (ConfigName.getInstance().PlcIsConnect) {
ModbusTcpServer.get().WriteBool(address, (boolean) value, callback);
// ModbusHelper.get().WriteBool(address, (boolean) value, callback);
}
} catch (Exception ex) {
ToastUtils.error("异常信息:" + ex.getMessage());
@@ -681,19 +657,19 @@ public class ExecuteTheRecipe {
if (ConfigName.getInstance().PLC_Address.containsKey("实时状态")) {
BPA_PLCADDRESS plcaddress = ConfigName.getInstance().PLC_Address.get("实时状态");
if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
ModbusTcpServer.get().ReadStatus(plcaddress.address, 4, (data) -> {
for (int i = 0; i < data.length; i++) {
byte status=data[i];//0x92
IoStatus.put(i*8+0, ByteHelper.getBit(status,0)==1);
IoStatus.put(i*8+1, ByteHelper.getBit(status,1)==1);
IoStatus.put(i*8+2, ByteHelper.getBit(status,2)==1);
IoStatus.put(i*8+3, ByteHelper.getBit(status,3)==1);
IoStatus.put(i*8+4, ByteHelper.getBit(status,4)==1);
IoStatus.put(i*8+5, ByteHelper.getBit(status,5)==1);
IoStatus.put(i*8+6, ByteHelper.getBit(status,6)==1);
IoStatus.put(i*8+7, ByteHelper.getBit(status,7)==1);
}
});
// ModbusHelper.get().ReadStatus(plcaddress.address, 4, (data) -> {
// for (int i = 0; i < data.length; i++) {
// byte status=data[i];//0x92
// IoStatus.put(i*8+0, ByteHelper.getBit(status,0)==1);
// IoStatus.put(i*8+1, ByteHelper.getBit(status,1)==1);
// IoStatus.put(i*8+2, ByteHelper.getBit(status,2)==1);
// IoStatus.put(i*8+3, ByteHelper.getBit(status,3)==1);
// IoStatus.put(i*8+4, ByteHelper.getBit(status,4)==1);
// IoStatus.put(i*8+5, ByteHelper.getBit(status,5)==1);
// IoStatus.put(i*8+6, ByteHelper.getBit(status,6)==1);
// IoStatus.put(i*8+7, ByteHelper.getBit(status,7)==1);
// }
// });
}
}
} catch (Exception ex) {
@@ -710,25 +686,25 @@ public class ExecuteTheRecipe {
if (ConfigName.getInstance().PLC_Address.containsKey("扫码数据")) {
BPA_PLCADDRESS plcaddress = ConfigName.getInstance().PLC_Address.get("扫码数据");
if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
ModbusTcpServer.get().ReadString(plcaddress.address, 40, (data) -> {
if(!data.isEmpty() && !Code.equals(data) && OnScanTheCodeInformationT != null)
{
Log.d("信息", "扫码数据: "+data);
OnScanTheCodeInformationT.Run(data);
ModbusTcpServer.get().WriteString(plcaddress.address, 40, null);
}
//记录上一次读取PLC 扫码数据
Code = data;
});
// ModbusHelper.get().ReadString(plcaddress.address, 40, (data) -> {
//
// if(!data.isEmpty() && !Code.equals(data) && OnScanTheCodeInformationT != null)
// {
// Log.d("信息", "扫码数据: "+data);
// OnScanTheCodeInformationT.Run(data);
// ModbusHelper.get().WriteString(plcaddress.address, 40, null);
// }
//
// //记录上一次读取PLC 扫码数据
// Code = data;
// });
}
}

// if (ConfigName.getInstance().PLC_Address.containsKey("配料次数")) {
// BPA_PLCADDRESS plcaddress = ConfigName.getInstance().PLC_Address.get("配料次数");
// if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
// ModbusTcpServer.get().ReadInt(plcaddress.address, 1, (data) -> {
// ModbusHelper.get().ReadInt(plcaddress.address, 1, (data) -> {
// MakeGoodCount=data[0] ;
// });
// }
@@ -851,12 +827,12 @@ public class ExecuteTheRecipe {
if (ConfigName.getInstance().PLC_Address.containsKey(name)) {
BPA_PLCADDRESS plcaddress = ConfigName.getInstance().PLC_Address.get(name);
if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) {
ModbusTcpServer.get().ReadBool(plcaddress.address, 1, booleans -> {
RTrig.get(name).Start(booleans[0], () -> {
if (callback != null)
callback.Run();
});
});
// ModbusHelper.get().ReadBool(plcaddress.address, 1, booleans -> {
// RTrig.get(name).Start(booleans[0], () -> {
// if (callback != null)
// callback.Run();
// });
// });
}
}
}


+ 66
- 69
app/src/main/java/com/bonait/bnframework/business/MainInit.java 查看文件

@@ -24,10 +24,7 @@ import com.bonait.bnframework.common.db.res.AlertLogEnum;
import com.bonait.bnframework.common.db.res.ResGoodsRecipe;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.CrashHandler;
import com.bonait.bnframework.common.helper.I.IMessageLogNotify;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.SdCart;
import com.bonait.bnframework.common.modbus.ModbusTcpHelper;
import com.bonait.bnframework.common.notification.MainNotification;
import com.bonait.bnframework.common.utils.AppUtils;
import com.bonait.bnframework.common.utils.NetworkUtils;
@@ -210,72 +207,72 @@ public class MainInit {
* 初始化消息日志接收打印
*/
public static void InitMsgLog(){
MessageLog.MsgNotify = new IMessageLogNotify() {
@Override
public void ErrorMsg(String msg) {
if(msg.contains("msg:com.serotonin.modbus4j.exception"))
{
ModbusTcpHelper.get().release();//释放modbus
ConfigName.getInstance().PlcIsConnect=false;
BPA_ALERTLOG log = new BPA_ALERTLOG();
log.userID = ConfigName.getInstance().user.userID;
log.type=4;
log.text = msg+"程序断开PLC,准备重连机制...";
QueryDB.AddAlertlog(log);
}
}
@Override
public void InfoMsg(String msg) {
Log.i("Info", msg);
}
@Override
public void WarnMsg(String msg) {
Log.w("Warn", msg);
}
@Override
public void UserMsg(UserLogEnum type, String msg) {
BPA_LOG log = new BPA_LOG();
log.userID = ConfigName.getInstance().user.userID;
ToastUtils.info(msg);
switch (type.toString())
{
case "登录日志":log.type=1;
break;
case "角色操作日志":log.type=2;
break;
case "数据接收":log.type=3;
break;
case "上传日志":log.type=4;
break;
case "订单处理日志":log.type=5;
break;
}
log.text = msg;
QueryDB.Addlog(log);
}
@Override
public void AlertMsg(AlertLogEnum type, String msg) {
BPA_ALERTLOG log = new BPA_ALERTLOG();
log.userID = ConfigName.getInstance().user.userID;
switch (type.toString())
{
case "异常订单未制作日志":log.type=1;
break;
case "料仓缺料日志":log.type=2;
break;
case "传感器异常日志":log.type=3;
break;
case "其他":log.type=4;
break;
}
log.text = msg;
QueryDB.AddAlertlog(log);
}
};
// MessageLog.MsgNotify = new IMessageLogNotify() {
// @Override
// public void ErrorMsg(String msg) {
// if(msg.contains("msg:com.serotonin.modbus4j.exception"))
// {
// ModbusTcpHelper.get().release();//释放modbus
// ConfigName.getInstance().PlcIsConnect=false;
//
// BPA_ALERTLOG log = new BPA_ALERTLOG();
// log.userID = ConfigName.getInstance().user.userID;
// log.type=4;
// log.text = msg+"程序断开PLC,准备重连机制...";
// QueryDB.AddAlertlog(log);
// }
// }
// @Override
// public void InfoMsg(String msg) {
// Log.i("Info", msg);
//
// }
// @Override
// public void WarnMsg(String msg) {
// Log.w("Warn", msg);
// }
// @Override
// public void UserMsg(UserLogEnum type, String msg) {
// BPA_LOG log = new BPA_LOG();
// log.userID = ConfigName.getInstance().user.userID;
// ToastUtils.info(msg);
// switch (type.toString())
// {
// case "登录日志":log.type=1;
// break;
// case "角色操作日志":log.type=2;
// break;
// case "数据接收":log.type=3;
// break;
// case "上传日志":log.type=4;
// break;
// case "订单处理日志":log.type=5;
// break;
// }
// log.text = msg;
// QueryDB.Addlog(log);
// }
//
// @Override
// public void AlertMsg(AlertLogEnum type, String msg) {
// BPA_ALERTLOG log = new BPA_ALERTLOG();
// log.userID = ConfigName.getInstance().user.userID;
// switch (type.toString())
// {
// case "异常订单未制作日志":log.type=1;
// break;
// case "料仓缺料日志":log.type=2;
// break;
// case "传感器异常日志":log.type=3;
// break;
// case "其他":log.type=4;
// break;
// }
// log.text = msg;
//
// QueryDB.AddAlertlog(log);
// }
// };
}
/**
* 内存泄漏检测,根据flag来判断要不要初始化


+ 7
- 20
app/src/main/java/com/bonait/bnframework/business/OrderServer.java 查看文件

@@ -2,6 +2,9 @@ package com.bonait.bnframework.business;

import android.util.Log;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.HBL.Thread.ThreadManager;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.db.QueryDB;
import com.bonait.bnframework.common.db.mode.BPA_GOODPROPERTY;
@@ -14,12 +17,8 @@ import com.bonait.bnframework.common.db.mode.BPA_MENU;
import com.bonait.bnframework.common.db.mode.BPA_SILOSANDMATERIAL;
import com.bonait.bnframework.common.helper.AES;
import com.bonait.bnframework.common.helper.I.IMessage;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IThread;
import com.bonait.bnframework.common.helper.Json;
import com.bonait.bnframework.common.helper.MQTT;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.ThreadManager;
import com.bonait.bnframework.common.helper.mode.BPAPackage;
import com.bonait.bnframework.common.helper.mode.BPA_GoodsInfo;
import com.bonait.bnframework.common.helper.mode.BPA_HeartPackage;
@@ -119,23 +118,11 @@ public class OrderServer {
ConfigName.getInstance().mqtt_ip,
ConfigName.getInstance().mqtt_post);

ThreadManager.Get().StartLong("心跳服务", true, new IThread() {
@Override
public void Run() throws InterruptedException {

if(MQTT.get().IsConnect)
{
try {
PushHeart();
} catch (Exception e) {

}
}
Thread.sleep(1000);
}
@Override
public void RunComplete() throws InterruptedException {
ThreadManager.get().StartLong("心跳服务",true,()->{
if(MQTT.get().IsConnect){
PushHeart();
}
Thread.sleep(1000);
});
}



+ 1
- 1
app/src/main/java/com/bonait/bnframework/common/constant/DataBus.java 查看文件

@@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.Intent;
import android.widget.LinearLayout;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ExecuteTheRecipe;
import com.bonait.bnframework.common.db.QueryDB;
@@ -26,7 +27,6 @@ import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.db.res.lcMode;
import com.bonait.bnframework.common.db.res.wdszMode;
import com.bonait.bnframework.common.helper.I.MyClickListener;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.mode.OrderA;
import com.bonait.bnframework.common.helper.mode.ResultA;
import com.bonait.bnframework.common.linktab.LinkMode;


+ 0
- 13
app/src/main/java/com/bonait/bnframework/common/helper/I/IMessageLogNotify.java 查看文件

@@ -1,13 +0,0 @@
package com.bonait.bnframework.common.helper.I;

import com.bonait.bnframework.common.db.res.AlertLogEnum;
import com.bonait.bnframework.common.db.res.UserLogEnum;

public interface IMessageLogNotify {
void ErrorMsg(String msg);
void InfoMsg(String msg);
void WarnMsg(String msg);
void UserMsg(UserLogEnum type, String msg);
void AlertMsg(AlertLogEnum type, String msg);

}

+ 0
- 5
app/src/main/java/com/bonait/bnframework/common/helper/I/IRun.java 查看文件

@@ -1,5 +0,0 @@
package com.bonait.bnframework.common.helper.I;

public interface IRun {
void Run();
}

+ 0
- 7
app/src/main/java/com/bonait/bnframework/common/helper/I/IThread.java 查看文件

@@ -1,7 +0,0 @@
package com.bonait.bnframework.common.helper.I;

public interface IThread {
void Run() throws InterruptedException;

void RunComplete() throws InterruptedException;
}

+ 2
- 1
app/src/main/java/com/bonait/bnframework/common/helper/MQTT.java 查看文件

@@ -5,9 +5,10 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.helper.I.IMessage;
import com.bonait.bnframework.common.helper.I.IRun;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;


+ 0
- 89
app/src/main/java/com/bonait/bnframework/common/helper/MessageLog.java 查看文件

@@ -1,89 +0,0 @@
package com.bonait.bnframework.common.helper;

import com.bonait.bnframework.common.db.res.AlertLogEnum;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.I.IMessageLogNotify;
import com.bonait.bnframework.common.helper.I.IRun;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MessageLog {
public static IMessageLogNotify MsgNotify;

/**
* 日志触发通知
*/
public static IRun AddNotify;

public static String MsgInfo = "";

public static void ShowInfo(String msg) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String tempMsg = formatter.format(date) + ":" + msg;
if(MsgInfo.length()>=8000)MsgInfo="";
MsgInfo = tempMsg + "\r\n" + MsgInfo;
if (MsgNotify != null)
MsgNotify.InfoMsg(tempMsg);
if (AddNotify != null) AddNotify.Run();
}

public static void ShowWarning(String msg) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String tempMsg = formatter.format(date) + ":" + msg;
if(MsgInfo.length()>=8000)MsgInfo="";
MsgInfo = tempMsg + "\r\n" + MsgInfo;
if (MsgNotify != null)
MsgNotify.WarnMsg(tempMsg);
if (AddNotify != null) AddNotify.Run();
}

public static void ShowError(String msg) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String tempMsg = formatter.format(date) + ":" + msg;
if(MsgInfo.length()>=8000)MsgInfo="";
MsgInfo = tempMsg + "\r\n" + MsgInfo;
if (MsgNotify != null)
MsgNotify.ErrorMsg(tempMsg);
if (AddNotify != null) AddNotify.Run();
}

/**
* 用户操作日志
* @param type
* @param msg
*/
public static void ShowUserMessage(UserLogEnum type, String msg)
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String tempMsg = formatter.format(date) + ":" + msg;
if(MsgInfo.length()>=8000)MsgInfo="";
MsgInfo = tempMsg + "\r\n" + MsgInfo;
if (MsgNotify != null)
MsgNotify.UserMsg(type,tempMsg);
if (AddNotify != null) AddNotify.Run();
}

/**
* 预警日志
* @param type
* @param msg
*/
public static void ShowAlertMessage(AlertLogEnum type, String msg)
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String tempMsg = formatter.format(date) + ":" + msg;
if(MsgInfo.length()>=8000)MsgInfo="";
MsgInfo = tempMsg + "\r\n" + MsgInfo;
if (MsgNotify != null)
MsgNotify.AlertMsg(type,tempMsg);
if (AddNotify != null) AddNotify.Run();
}


}

+ 20
- 0
app/src/main/java/com/bonait/bnframework/common/helper/ModbusHelper.java 查看文件

@@ -0,0 +1,20 @@
package com.bonait.bnframework.common.helper;

import com.bonait.bnframework.HBL.Communication.Modbus.ModbusMaster;

public class ModbusHelper extends ModbusMaster {
private static volatile ModbusHelper instance = null;
public synchronized static ModbusHelper get(){
if(instance==null)instance=new ModbusHelper();
return instance;
}
private ModbusHelper(){}

public void RtuInit(String comName,int baudRate){
new Thread(()->{ RtuConnect(comName,baudRate);}).start();
}

public void TcpInit(String ip,int port){
new Thread(()->{ TcpConnect(ip,port);}).start();
}
}

+ 1
- 1
app/src/main/java/com/bonait/bnframework/common/helper/RTrig.java 查看文件

@@ -1,6 +1,6 @@
package com.bonait.bnframework.common.helper;

import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.HBL.Interface.IRun;

import java.util.concurrent.ConcurrentHashMap;



+ 0
- 75
app/src/main/java/com/bonait/bnframework/common/helper/ThreadManager.java 查看文件

@@ -1,75 +0,0 @@
package com.bonait.bnframework.common.helper;

import com.bonait.bnframework.common.helper.I.IThread;
import com.bonait.bnframework.common.helper.mode.ThreadModel;
import java.util.concurrent.ConcurrentHashMap;

public class ThreadManager {
private static volatile ThreadManager _Instance;

public static ThreadManager Get() {
if (_Instance == null)
_Instance = new ThreadManager();
return _Instance;
}

private ThreadManager() {

}

public long RestartInterval = 2000;
ConcurrentHashMap<String, ThreadModel> ts = new ConcurrentHashMap<>();

private void Sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

public void StartLong(String Key, boolean IsRestart, IThread _thread) {
if (!ts.containsKey(Key)) {
ts.put(Key, new ThreadModel());
ts.get(Key).RunThread = _thread;
ts.get(Key).ThreadObj = new Thread(() -> {
MessageLog.ShowInfo("启动线程:" + Key);
while (!ts.get(Key).IsCancel) {
if (IsRestart) {
try {
ts.get(Key).RunThread.Run();
} catch (Exception ex) {
MessageLog.ShowError("多线程:" + Key + "运行发生异常,已重启,errorMsg:" + ex.toString());
Sleep(RestartInterval);
}
} else {
try {
ts.get(Key).RunThread.Run();
} catch (InterruptedException e) {
MessageLog.ShowError("多线程:" + Key + "运行发生异常,已退出,errorMsg:" + e.toString());
}
}
}
try {
ts.get(Key).RunThread.RunComplete();
MessageLog.ShowInfo("线程:[" + Key + "]--执行完成");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
ts.remove(Key);
});
ts.get(Key).ThreadObj.setName(Key);
ts.get(Key).ThreadObj.start();
} else {
MessageLog.ShowWarning("任务-[" + Key + "]-已存在");
}
}


public void Stop(String Key) {
if (ts.containsKey(Key)) {
ts.get(Key).IsCancel = true;
}
}

}

+ 0
- 9
app/src/main/java/com/bonait/bnframework/common/helper/mode/ThreadModel.java 查看文件

@@ -1,9 +0,0 @@
package com.bonait.bnframework.common.helper.mode;

import com.bonait.bnframework.common.helper.I.IThread;

public class ThreadModel {
public IThread RunThread;
public boolean IsCancel;
public Thread ThreadObj;
}

+ 0
- 44
app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpHelper.java 查看文件

@@ -1,44 +0,0 @@
package com.bonait.bnframework.common.modbus;

import com.licheedev.modbus4android.ModbusWorker;
import com.serotonin.modbus4j.ModbusMaster;


public class ModbusTcpHelper extends ModbusWorker {
private static volatile ModbusTcpHelper instance = null;

public static ModbusTcpHelper get() {
ModbusTcpHelper manager = instance;
if (manager == null) {
synchronized (ModbusTcpHelper.class) {
manager = instance;
if (manager == null) {
manager = new ModbusTcpHelper();
instance = manager;
}
}
}
return manager;
}

private ModbusTcpHelper() {
}

/**
* 释放整个ModbusManager,单例会被置null
*/
public synchronized void release() {
super.release();
instance = null;
}

/**
* 获取
* @return
*/
public synchronized ModbusMaster getModbusMaster()
{
return super.getModbusMaster();
}

}

+ 0
- 812
app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpServer.java 查看文件

@@ -1,812 +0,0 @@
package com.bonait.bnframework.common.modbus;


import android.os.Looper;

import com.bonait.bnframework.MainApplication;
import com.bonait.bnframework.business.ConfigData;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.constant.DataBus;
import com.bonait.bnframework.common.helper.DataFormat;
import com.bonait.bnframework.common.helper.I.IReadCallBack;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.utils.ToastUtils;
import com.licheedev.modbus4android.ModbusCallback;
import com.licheedev.modbus4android.ModbusParam;
import com.licheedev.modbus4android.ModbusRespException;
import com.licheedev.modbus4android.param.TcpParam;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.msg.ReadCoilsResponse;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;


public class ModbusTcpServer {
private static volatile ModbusTcpServer instance = null;

public static ModbusTcpServer get() {
ModbusTcpServer manager = instance;
if (manager == null) {
synchronized (ModbusTcpServer.class) {
manager = instance;
if (manager == null) {
manager = new ModbusTcpServer();
instance = manager;
}
}
}
return manager;
}

private ModbusTcpServer() {
}

static ModbusParam param;

private int GetAddress(String address) {
if (address == null) return -1;
if (address.length() > 0) {
address = address.trim();
if (address.toUpperCase().contains("M") && address.length() >= 4) {
String[] res = address.substring(1).split("[.]");
if (res != null && res.length == 2) {
try {
int firstAdd = Integer.parseInt(res[0]);
int endAdd = Integer.parseInt(res[1]);
if (endAdd >= 0 && endAdd <= 7) {
return (firstAdd * 8) + 320 + endAdd;
}
} catch (NumberFormatException e) {
return -1;
}
}
} else if (address.toUpperCase().contains("I") && address.length() >= 4) {
String[] res = address.substring(1).split("[.]");
if (res != null && res.length == 2) {
try {
int firstAdd = Integer.parseInt(res[0]);
int endAdd = Integer.parseInt(res[1]);
if (endAdd >= 0 && endAdd <= 7) {
return (firstAdd * 8) + endAdd;
}
} catch (NumberFormatException e) {
return -1;
}
}
} else if ((address.toUpperCase().contains("VW") || address.toUpperCase().contains("VD")) && address.length() >= 3) {
String res = address.substring(2);
if (res != null) {
try {
int tempAdd = Integer.parseInt(res);
return (tempAdd / 2) + 100;
} catch (NumberFormatException e) {
return -1;
}
}
} else {
try {
return Integer.parseInt(address);
} catch (NumberFormatException e) {
return -1;
}
}
}
return -1;
}

/**
* 获取布尔位地址信息
* 列:M2.5 = getBitSingleAdd("M",2,5);
*
* @param Prefix 地址标头
* @param startAdd 起始地址编号
* @param num 要获取的第几位数量
* @return
*/
public String getBitSingleAdd(String Prefix, int startAdd, int num) {
if (num > 0) {
int FirstAdd = num / 8;
int EndAdd = num % 8;
if (EndAdd == 0) {
FirstAdd--;
EndAdd = 7;
} else {
EndAdd--;
}
return Prefix + FirstAdd + startAdd + "." + EndAdd;
}
return "";
}

/**
* Ping PLC地址是否通畅
* @param address
* @param pingTimes ping的次数
* @param timeOut 超时时间 10
* @return
*/
public static boolean ping2(String address, int pingTimes, int timeOut) {
Process process = null;
try {
process = Runtime.getRuntime().exec( "ping " + "-c " + pingTimes + " -w " + timeOut+ " "+address);
InputStreamReader r = new InputStreamReader(process.getInputStream());

LineNumberReader returnData = new LineNumberReader(r);

String returnMsg="";

String line = "";

while ((line = returnData.readLine()) != null) {

System.out.println(line);

returnMsg += line;

}

if(returnMsg.indexOf("100% packet loss")!=-1){
System.out.println("与 " +address +" 连接不畅通.");
//ToastUtils.info("与 " +address +" 连接不畅通.");
return false;
} else{
System.out.println("与 " +address +" 连接畅通.");
//ToastUtils.info("与 " +address +" 连接不畅通.");
return true;
}
} catch (IOException e) {
// e.printStackTrace();
}
return false;

}


/**
* 连接
*/
public void Connect() throws InterruptedException {
boolean status = false;
while (!status) {
try {
//status为0则代表通,为1则代表不通。
status =ping2(ConfigName.getInstance().Address,1,1);
Thread.sleep(1000);
} catch (InterruptedException e) {
MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " 网络验证失败");
} catch (Exception e) {
MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " 网络验证失败");
}
}
MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " PLC通讯正常,准备连接!");

while (ConfigName.getInstance().PlcIsConnect==false)
{
ConnectPLC();
Thread.sleep(5000);
}
}

/**
* 连接PLC
*/
public static void ConnectPLC()
{
String host=ConfigName.getInstance().Address;
int port=ConfigName.getInstance().Post;
param = TcpParam.create(host, port)
.setTimeout(1000)
.setRetries(0)
.setEncapsulated(false)
.setKeepAlive(true);
ModbusTcpHelper.get().init(param, new ModbusCallback<ModbusMaster>() {
@Override
public void onSuccess(ModbusMaster modbusMaster) {
ToastUtils.info("设备 " + ConfigName.getInstance().Address + " 连接成功");

MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " 连接成功");
ConfigName.getInstance().PlcIsConnect = true;
ConfigData.getInstance().PLC_Init();
}

@Override
public void onFailure(Throwable tr) {
ConfigName.getInstance().PlcIsConnect = false;
ToastUtils.info("设备 " + ConfigName.getInstance().Address + " 连接失败:" + tr.getMessage());
MessageLog.ShowError("设备 " + ConfigName.getInstance().Address + " 连接失败:" + tr.getMessage());
}
@Override
public void onFinally() {

}
});
}

// /**
// * 重新连接Modbus
// */
// public void ReconnectModbus()
// {
// try {
//
// ThreadManager.Get().StartLong("PLC断线重连线程", true, new IThread() {
// @Override
// public void Run() throws InterruptedException {
// try {
// boolean status =ping2(ConfigName.getInstance().Address,1,1);
// if(status)
// {
// ModbusMaster master= ModbusTcpHelper.get().getModbusMaster();
// if (master==null || master.isConnected() == false) {
// ConnectPLC();
// }
// Thread.sleep(20000);
// }
// } catch (Exception e) {
// Log.i("PLC", "PLC重连接失败!"+e.getMessage());
// }
// }
// @Override
// public void RunComplete() throws InterruptedException {
// }
// });
// }catch (Exception e) {
// MessageLog.ShowInfo("重新连接Modbus异常," +e.getMessage());
// }
// }

private Float BytesToFloat(byte[] buffers, DataFormat df) {
if (buffers.length == 4) {
byte[] bytes = new byte[4];
if (df == DataFormat.ABCD) {
bytes[0] = buffers[3];
bytes[1] = buffers[2];
bytes[2] = buffers[1];
bytes[3] = buffers[0];
} else if (df == DataFormat.CDAB) {
bytes[0] = buffers[1];
bytes[1] = buffers[0];
bytes[2] = buffers[3];
bytes[3] = buffers[2];
} else if (df == DataFormat.BADC) {
bytes[0] = buffers[2];
bytes[1] = buffers[3];
bytes[2] = buffers[0];
bytes[3] = buffers[1];
} else if (df == DataFormat.DCBA) {
bytes[0] = buffers[0];
bytes[1] = buffers[1];
bytes[2] = buffers[2];
bytes[3] = buffers[3];
}
return ByteBuffer.wrap(bytes).getFloat();
}
return 0.0f;
}

private Integer BytesToInt(byte[] buffers, DataFormat df) {
if (buffers.length == 4) {
byte[] bytes = new byte[4];
if (df == DataFormat.ABCD) {
bytes[0] = buffers[3];
bytes[1] = buffers[2];
bytes[2] = buffers[1];
bytes[3] = buffers[0];
} else if (df == DataFormat.CDAB) {
bytes[0] = buffers[1];
bytes[1] = buffers[0];
bytes[2] = buffers[3];
bytes[3] = buffers[2];
} else if (df == DataFormat.BADC) {
bytes[0] = buffers[2];
bytes[1] = buffers[3];
bytes[2] = buffers[0];
bytes[3] = buffers[1];
} else if (df == DataFormat.DCBA) {
bytes[0] = buffers[0];
bytes[1] = buffers[1];
bytes[2] = buffers[2];
bytes[3] = buffers[3];
}
return ByteBuffer.wrap(bytes).getInt();
}
return 0;
}

private byte[] IntToByte(int number) {
int temp = number;
byte[] b = new byte[4];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位
temp = temp >> 8; // 向右移8位
}
return b;
}

private short[] IntToShorts(int value) {
short[] res = new short[2];
int temp = value;
byte[] b = new byte[4];
for (int i = 0; i < b.length; i++) {
b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位
temp = temp >> 8; // 向右移8位
}
for (int i = 0; i < res.length; i++) {
short s0 = (short) (b[i * 2] & 0xff);// 最低位
short s1 = (short) (b[i * 2 + 1] & 0xff);
s1 <<= 8;
res[i] = (short) (s0 | s1);
}
return res;
}

public static String GetString(short[] src, int start, int len) throws UnsupportedEncodingException {
short[] temp = new short[len];
for (int i = 0; i < len; i++) {
temp[i] = src[i + start];
}
byte[] bytesTemp = shorts2Bytes(temp);
for (int i = 0; i < bytesTemp.length; i++) {
byte b = bytesTemp[i];
}
String str = new String(bytesTemp, "UTF-8");
return str;
}

public static byte[] shorts2Bytes(short[] data) {
byte[] byteValue = new byte[data.length * 2];
for (int i = 0; i < data.length; i++) {
byteValue[i * 2] = (byte) (data[i] & 0xff);
byteValue[i * 2 + 1] = (byte) ((data[i] & 0xff00) >> 8);
}
return byteValue;
}

/***
*读取实时状态
* @param Address the address
* @param length 读取的长度 3
* @param callback 读取成功的回调
*/
public void ReadStatus(String Address, int length, IReadCallBack<byte[]> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadHoldingRegistersResponse res = ModbusTcpHelper.get().syncReadHoldingRegisters(1, add, length);
byte[] data = res.getData();
byte[] tempData = new byte[8];
tempData[0] = data[1];
tempData[1] = data[0];
tempData[2] = data[3];
tempData[3] = data[2];
tempData[4] = data[5];
tempData[5] = data[4];
tempData[6] = data[7];
tempData[7] = data[6];
if (callback != null) callback.onSuccess(tempData);
} catch (InterruptedException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}
/**
* 读取补偿算法
* @param Address
* @param length
* @param callback
*/
public void ReadbcStatus(String Address, int length, IReadCallBack<byte[]> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadHoldingRegistersResponse res = ModbusTcpHelper.get().syncReadHoldingRegisters(1, add, length);
byte[] data = res.getData();
byte[] tempData = new byte[1];
tempData[0] = data[1];
if (callback != null) callback.onSuccess(tempData);
} catch (InterruptedException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}


/***
*读取扫码数据
* @param Address the address
* @param length 读取的长度
* @param callback 读取成功的回调
*/
public void ReadString(String Address, int length, IReadCallBack<String> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadHoldingRegistersResponse res = ModbusTcpHelper.get().syncReadHoldingRegisters(1, add, length);
byte[] data = res.getData();
byte[] data1 = Arrays.copyOfRange(data, 0, data.length);
//36 GUID 18 Number
String id = "";
try {
byte[] tempdata = new byte[data.length];
int index=0;
for (int i = 0; i < data1.length; i++) {
if (i % 2 == 0) {

tempdata[i + 1] = data1[i];
} else {
tempdata[i - 1] = data1[i];
}

if (data1[i]==0 && index==0)
{
index=i;
}
}

id = new String(tempdata, "UTF-8").trim();
} catch (UnsupportedEncodingException ex) {
}
if (callback != null) callback.onSuccess(id);
} catch (InterruptedException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}

public void WriteString(String Address, int length, IWriteCallBack callback) {
int add = GetAddress(Address);
if (add < 0) return;
short[] send = new short[length];
for (short item : send) {
item = 0;
}
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);
if (callback != null)
callback.onSuccess();
} catch (InterruptedException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
}
}

public void ReadShort(String Address, int length, IReadCallBack<short[]> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadHoldingRegistersResponse res = ModbusTcpHelper.get().syncReadHoldingRegisters(1, add, length);
short[] data = res.getShortData();
if (data.length == length) {
if (callback != null) callback.onSuccess(data);
}
} catch (InterruptedException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}

public void ReadBool(String Address, int length, IReadCallBack<boolean[]> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadCoilsResponse res = ModbusTcpHelper.get().syncReadCoil(1, add, length);
boolean[] data = res.getBooleanData();
boolean[] result = Arrays.copyOfRange(data, 0, length);
if (result.length == length) {
if (callback != null) callback.onSuccess(result);
}
} catch (InterruptedException e) {
MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}

public void ReadFloat(String Address, int length, IReadCallBack<float[]> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadHoldingRegistersResponse res = ModbusTcpHelper.get().syncReadHoldingRegisters(1, add, length*2);
byte[] data = res.getData();
float[] tempValues = new float[length];
for (int i = 0; i < length; i++) {
byte[] tempData = new byte[4];
for (int m = 0; m < 4; m++) {
tempData[m] = data[i * 4 + m];
}
tempValues[i] = BytesToFloat(tempData, DataFormat.BADC);
}
if (tempValues.length == length) {
if (callback != null) callback.onSuccess(tempValues);
}
} catch (InterruptedException e) {
MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}

public void ReadInt(String Address, int length, IReadCallBack<int[]> callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ReadHoldingRegistersResponse res = ModbusTcpHelper.get().syncReadHoldingRegisters(1, add, length * 2);
byte[] data = res.getData();
int[] tempValues = new int[length];
if(data.length>=4)
{
for (int i = 0; i < length; i++) {
byte[] tempData = new byte[4];
for (int m = 0; m < 4; m++) {
tempData[m] = data[i * 4 + m];
}
// Integer a1 = tempValues[i] = BytesToInt(tempData, DataFormat.ABCD);
// Integer a2 = tempValues[i] = BytesToInt(tempData, DataFormat.BADC);
// Integer a3 = tempValues[i] = BytesToInt(tempData, DataFormat.CDAB);
// Integer a4 = tempValues[i] = BytesToInt(tempData, DataFormat.DCBA);
tempValues[i] = BytesToInt(tempData, DataFormat.BADC);
}
}else
{
MessageLog.ShowError("ReadInt onFailure,Address=" );

}
if (callback != null) callback.onSuccess(tempValues);
} catch (InterruptedException e) {
MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString());
}
}

public void WriteShort(String Address, short Value, IWriteCallBack callback) {
int add = GetAddress(Address);
if (add < 0) return;
short[] send = new short[1];
send[0] = Value;
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);
if (callback != null)
callback.onSuccess();
} catch (InterruptedException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
}
}

public void WriteBool(String Address, boolean Value, IWriteCallBack callback) {
int add = GetAddress(Address);
if (add < 0) return;
try {
ModbusTcpHelper.get().syncWriteCoil(1, add, Value);
if (callback != null)
callback.onSuccess();
} catch (InterruptedException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
}
}

public void WriteFloat(String Address, float Value, IWriteCallBack callback) {
int add = GetAddress(Address);
if (add < 0) return;
int intBits = Float.floatToRawIntBits(Value);
short[] send = IntToShorts(intBits);
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);

if (callback != null) callback.onSuccess();
} catch (InterruptedException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
}
}

public void WriteInt(String Address, int Value, IWriteCallBack callback) {
int add = GetAddress(Address);
if (add < 0) return;
short[] send = IntToShorts(Value);
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);
if (callback != null) callback.onSuccess();
} catch (InterruptedException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
if (callback != null) callback.onFailure(e.toString());
}
}

public void WriteShort(String Address, short Value) {
int add = GetAddress(Address);
if (add < 0) return;
short[] send = new short[1];
send[0] = Value;
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);
} catch (InterruptedException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
}
}

public void WriteBool(String Address, boolean Value) {
int add = GetAddress(Address);
if (add < 0) return;

try {
ModbusTcpHelper.get().syncWriteCoil(1, add, Value);
} catch (InterruptedException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
}
}

public void WriteFloat(String Address, float Value) {
int add = GetAddress(Address);
if (add < 0) return;
int intBits = Float.floatToRawIntBits(Value);
short[] send = new short[]{(short) ((intBits >> 16) & 0xffff), (short) (intBits & 0xffff)};
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);
} catch (InterruptedException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
}
}

public void WriteInt(String Address, int Value) {
int add = GetAddress(Address);
if (add < 0) return;
short[] send = IntToShorts(Value);
try {
ModbusTcpHelper.get().syncWriteRegisters(1, add, send);
} catch (InterruptedException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ExecutionException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusTransportException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusInitException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
} catch (ModbusRespException e) {
MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString());
}
}

}

+ 1
- 2
app/src/main/java/com/bonait/bnframework/common/oss/OssHelper.java 查看文件

@@ -17,10 +17,9 @@ import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvide
import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;
import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.business.ConfigData;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IRunT;
import com.bonait.bnframework.common.image.utils.LocalCacheUtils;
import com.bonait.bnframework.common.model.ResAPI;



+ 43
- 40
app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigationMainActivity.java 查看文件

@@ -10,18 +10,18 @@ import android.util.Log;
import android.view.MenuItem;
import android.widget.RelativeLayout;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.HBL.Thread.IThread;
import com.bonait.bnframework.HBL.Thread.ThreadManager;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ConfigData;
import com.bonait.bnframework.business.OrderServer;
import com.bonait.bnframework.common.base.BaseActivity;
import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.helper.I.IThread;
import com.bonait.bnframework.common.helper.MQTT;
import com.bonait.bnframework.common.helper.MediaPlayerHelper;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.ThreadManager;
import com.bonait.bnframework.common.helper.ModbusHelper;
import com.bonait.bnframework.common.image.utils.LocalCacheUtils;
import com.bonait.bnframework.common.modbus.ModbusTcpServer;
import com.bonait.bnframework.common.tabbar.MainNavigateTabBar;
import com.bonait.bnframework.common.utils.NetworkUtils;
import com.bonait.bnframework.modules.home.adapter.FragmentAdapter;
@@ -112,52 +112,55 @@ public class BottomNavigationMainActivity extends BaseActivity {
//判断连接环境
ConfigData.getInstance().ToggleEnvironment();
//2.初始化PLC
ReconnectModbus();
ModbusHelper.get().RtuInit("/dev/ttyCOM0",9600);
// ReconnectModbus();
//MQTT数据监听
OrderServer.Get().MqttInit();
}



/**
* 重新连接plc
*/
public void ReconnectModbus() {
try {

ThreadManager.Get().StartLong("PLC断线重连线程", true, new IThread() {
@Override
public void Run() throws InterruptedException {
try {
if (ConfigName.getInstance().PlcIsConnect) {
//ping 不通
boolean status = ModbusTcpServer.ping2(ConfigName.getInstance().Address, 1, 1);
if (!status) //ping 不通 连接
{
MessageLog.ShowInfo("PLC状态断开,尝试连接...");
ConfigName.getInstance().PlcIsConnect = false;
}
} else {
boolean status = ModbusTcpServer.ping2(ConfigName.getInstance().Address, 1, 1);
if (status) {
MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " PLC通讯正常,准备连接!");
ModbusTcpServer.ConnectPLC();
} else {
MessageLog.ShowInfo("PLC状态断开,尝试连接...");
ConfigName.getInstance().PlcIsConnect = false;
}
}
LocalCacheUtils.Get().RunCPUOrMemory();
Thread.sleep(5000);
} catch (Exception e) {
Log.i("PLC", "PLC重连接失败!" + e.getMessage());
}
}
@Override
public void RunComplete() throws InterruptedException {
}
});
// ThreadManager.get().StartLong("PLC断线重连线程", true, new IThread() {
// @Override
// public void Run() throws InterruptedException {
// try {
//// if (ConfigName.getInstance().PlcIsConnect) {
//// //ping 不通
//// boolean status = ModbusTcpServer.ping2(ConfigName.getInstance().Address, 1, 1);
//// if (!status) //ping 不通 连接
//// {
//// MessageLog.ShowInfo("PLC状态断开,尝试连接...");
//// ConfigName.getInstance().PlcIsConnect = false;
//// }
//// } else {
//// boolean status = ModbusTcpServer.ping2(ConfigName.getInstance().Address, 1, 1);
//// if (status) {
//// MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " PLC通讯正常,准备连接!");
//// ModbusTcpServer.ConnectPLC();
//// } else {
//// MessageLog.ShowInfo("PLC状态断开,尝试连接...");
//// ConfigName.getInstance().PlcIsConnect = false;
//// }
//// }
//
// LocalCacheUtils.Get().RunCPUOrMemory();
//
// Thread.sleep(5000);
// } catch (Exception e) {
// Log.i("PLC", "PLC重连接失败!" + e.getMessage());
// }
// }
//
//
// });
} catch (Exception e) {
MessageLog.ShowInfo("重新连接Modbus异常," + e.getMessage());
}


+ 0
- 1
app/src/main/java/com/bonait/bnframework/modules/home/adapter/wdsz_adapter.java 查看文件

@@ -25,7 +25,6 @@ import com.bonait.bnframework.common.constant.ConfigName;
import com.bonait.bnframework.common.constant.DataBus;
import com.bonait.bnframework.common.db.res.SilosLsjyMode;
import com.bonait.bnframework.common.db.res.wdszMode;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.helper.InputFilterMinMax;
import com.bonait.bnframework.common.utils.ToastUtils;


+ 2
- 5
app/src/main/java/com/bonait/bnframework/modules/home/fragment/MakeGoodFragment.java 查看文件

@@ -26,6 +26,8 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.HBL.Interface.IRunT;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ConfigData;
import com.bonait.bnframework.business.ExecuteTheRecipe;
@@ -51,13 +53,8 @@ import com.bonait.bnframework.common.db.res.ResGoodsRecipe;
import com.bonait.bnframework.common.db.res.SilosLsjyMode;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.db.res.lcMode;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IRunT;
import com.bonait.bnframework.common.helper.I.IThread;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.helper.I.MyClickListener;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.helper.ThreadManager;
import com.bonait.bnframework.common.helper.WrapContentLinearLayoutManager;
import com.bonait.bnframework.common.linktab.LinkMode;
import com.bonait.bnframework.common.linktab.TopItemDecoration;


+ 0
- 1
app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/GoodPeiFangActivity.java 查看文件

@@ -33,7 +33,6 @@ import com.bonait.bnframework.common.db.mode.BPA_MATERIAL;
import com.bonait.bnframework.common.db.res.ResGoodProperty;
import com.bonait.bnframework.common.db.res.ResGoodsRecipe;
import com.bonait.bnframework.common.db.res.lcMode;
import com.bonait.bnframework.common.helper.I.IRunT;
import com.bonait.bnframework.common.helper.I.MyClickListener;
import com.bonait.bnframework.common.http.callback.json.JsonDialogCallback;
import com.bonait.bnframework.common.image.MyBitmapUtils;


+ 1
- 1
app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/ZdqxActivity.java 查看文件

@@ -11,13 +11,13 @@ import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ExecuteTheRecipe;
import com.bonait.bnframework.common.base.BaseActivity;
import com.bonait.bnframework.common.constant.DataBus;
import com.bonait.bnframework.common.db.QueryDB;
import com.bonait.bnframework.common.db.mode.BPA_SUGAR;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.helper.WrapContentLinearLayoutManager;
import com.bonait.bnframework.common.utils.AlertDialogUtils;


+ 1
- 1
app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/Silos_item_jiaoyan_fragment.java 查看文件

@@ -18,6 +18,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ExecuteTheRecipe;
import com.bonait.bnframework.common.base.BaseFragment;
@@ -26,7 +27,6 @@ import com.bonait.bnframework.common.constant.DataBus;
import com.bonait.bnframework.common.db.QueryDB;
import com.bonait.bnframework.common.db.res.SilosLsjyMode;
import com.bonait.bnframework.common.db.res.lcMode;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.utils.ToastUtils;
import com.bonait.bnframework.modules.home.fragment.from.LogActivity;


+ 1
- 1
app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/silos_jiaoyan.java 查看文件

@@ -26,6 +26,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentManager;

import com.bonait.bnframework.HBL.Interface.IRun;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ExecuteTheRecipe;
import com.bonait.bnframework.common.constant.ConfigName;
@@ -34,7 +35,6 @@ import com.bonait.bnframework.common.db.mode.BPA_MATERIAL;
import com.bonait.bnframework.common.db.mode.BPA_SILOS;
import com.bonait.bnframework.common.db.mode.BPA_SILOSANDMATERIAL;
import com.bonait.bnframework.common.db.res.lcMode;
import com.bonait.bnframework.common.helper.I.IRun;
import com.bonait.bnframework.common.helper.I.IWriteCallBack;
import com.bonait.bnframework.common.helper.I.MyClickListener;
import com.bonait.bnframework.common.model.mode.ResMenuLeft;


+ 2
- 2
app/src/main/java/com/bonait/bnframework/modules/welcome/activity/LoginActivity.java 查看文件

@@ -22,6 +22,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.bonait.bnframework.HBL.Logs.MessageLog;
import com.bonait.bnframework.R;
import com.bonait.bnframework.business.ConfigData;
import com.bonait.bnframework.common.base.BaseActivity;
@@ -32,7 +33,6 @@ import com.bonait.bnframework.common.db.QueryDB;
import com.bonait.bnframework.common.db.mode.BPA_USER;
import com.bonait.bnframework.common.db.res.UserLogEnum;
import com.bonait.bnframework.common.helper.ActiveMax;
import com.bonait.bnframework.common.helper.MessageLog;
import com.bonait.bnframework.common.utils.AlertDialogUtils;
import com.bonait.bnframework.common.utils.AnimationToolUtils;
import com.bonait.bnframework.common.utils.AppUtils;
@@ -212,7 +212,7 @@ public class LoginActivity extends BaseActivity implements Validator.ValidationL
BPA_USER user= QueryDB.UserLogin(userAccount,password);
if(user!=null)
{
MessageLog.ShowUserMessage(UserLogEnum.登录日志,user.name+"-登录成功");
MessageLog.ShowInfo(user.name+"-登录成功");
ConfigName.getInstance().user=user;
ConfigData.getInstance().SavePZ();
//跳转到主页


+ 27
- 0
app/src/main/res/drawable/bg_btn_cancel.xml 查看文件

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#7FEF5362"
android:radius="-1dp">

<item android:state_pressed="true">
<shape>
<solid android:color="#999999" />
<corners android:radius="6dp" />
</shape>
</item>

<item android:state_enabled="false">
<shape>
<solid android:color="#cccccc" />
<corners android:radius="6dp" />
</shape>
</item>


<item>
<shape>
<solid android:color="#c1c1c1" />
<corners android:radius="6dp" />
</shape>
</item>
</ripple>

+ 5
- 0
app/src/main/res/drawable/dialog_back.xml 查看文件

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp"/>
<solid android:color="#ffffff"/>
</shape>

+ 5
- 0
app/src/main/res/drawable/dialog_error_title_back.xml 查看文件

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp"/>
<solid android:color="#ff6d61"/>
</shape>

+ 5
- 0
app/src/main/res/drawable/dialog_info_title_back.xml 查看文件

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp"/>
<solid android:color="#00a8b3"/>
</shape>

+ 5
- 0
app/src/main/res/drawable/dialog_warn_title_back.xml 查看文件

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topLeftRadius="10dp" android:topRightRadius="10dp"/>
<solid android:color="#feb322"/>
</shape>

+ 84
- 0
app/src/main/res/layout/activity_dialog.xml 查看文件

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="500dp"
android:layout_height="300dp"
android:columnCount="1"
android:rowCount="3"
android:orientation="vertical"
android:background="@drawable/dialog_back"
tools:context=".HBL.Dialog.DialogActivity">

<RelativeLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_row="0"
android:background="@drawable/dialog_info_title_back"
android:layout_height="50dp">

<TextView
android:id="@+id/tv_Title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:gravity="center"
android:textColor="@color/white"
android:text="标题"
android:textSize="30sp"/>

</RelativeLayout>

<TextView
android:id="@+id/tv_Info"
android:layout_margin="10dp"
android:layout_row="1"
android:layout_rowWeight="1"
android:lineSpacingExtra="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#666666"
android:text="提示信息"
android:textSize="25sp"/>

<RelativeLayout
android:layout_width="match_parent"
android:layout_row="2"
android:layout_marginBottom="20dp"
android:layout_height="50dp">

<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_marginRight="20dp"
android:gravity="right"
android:layout_height="match_parent">

<Button
android:id="@+id/btn_ok"
android:layout_width="120dp"
android:layout_marginRight="10dp"
android:textColor="@color/white"
android:background="@drawable/bg_btn_login_selected"
android:text="确认"
android:textSize="25sp"
android:layout_height="match_parent"/>

<Button
android:id="@+id/btn_cancel"
android:layout_width="120dp"
android:text="取消"
android:layout_marginLeft="10dp"
android:background="@drawable/bg_btn_cancel"
android:textColor="@color/white"
android:padding="0dp"
android:textSize="25sp"
android:layout_height="match_parent"/>

</LinearLayout>

</RelativeLayout>



</GridLayout>

+ 18
- 0
app/src/main/res/values/styles.xml 查看文件

@@ -126,4 +126,22 @@
<!--是否模糊-->
<item name="android:backgroundDimEnabled">false</item>
</style>

<style name="custom_dialog2" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<!-- Dialog的windowFrame框为无 -->
<item name="android:windowIsFloating">true</item>
<!-- 是否漂现在activity上 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 是否半透明 -->
<item name="android:windowNoTitle">true</item>
<item name="android:background">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<!-- 去除黑色边框的关键设置项 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 屏幕背景是否变暗 -->
<item name="android:backgroundDimAmount">0.3</item>
</style>

</resources>

Loading…
取消
儲存