diff --git a/app/build.gradle b/app/build.gradle index 76ac3d3..012425d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { // 设置支持的SO库架构 - abiFilters 'armeabi' , 'armeabi-v7a' + abiFilters 'arm64-v8a' , 'armeabi' , 'armeabi-v7a' } } @@ -41,8 +41,14 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation files('libs\\uhflonger_v1.3.jar') + implementation files('libs\\App_Demo_API.jar') + implementation files('libs\\DeviceAPIver20150204.jar') + implementation files('libs\\logutil-1.5.1.1.jar') implementation files('libs\\ModuleAPI_J.jar') + implementation files('libs\\reader(1).jar') + implementation files('libs\\UHF67_v3.6.jar') +// implementation files('libs\\uhflonger_v1.3.jar') +// implementation files('libs\\ModuleAPI_J.jar') testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/libs/App_Demo_API.jar b/app/libs/App_Demo_API.jar new file mode 100644 index 0000000..86e2275 Binary files /dev/null and b/app/libs/App_Demo_API.jar differ diff --git a/app/libs/DeviceAPIver20150204.jar b/app/libs/DeviceAPIver20150204.jar new file mode 100644 index 0000000..defdeb1 Binary files /dev/null and b/app/libs/DeviceAPIver20150204.jar differ diff --git a/app/libs/ModuleAPI_J.jar b/app/libs/ModuleAPI_J.jar index c0e80a5..81c554f 100644 Binary files a/app/libs/ModuleAPI_J.jar and b/app/libs/ModuleAPI_J.jar differ diff --git a/app/libs/UHF67_v3.6.jar b/app/libs/UHF67_v3.6.jar new file mode 100644 index 0000000..d88dc29 Binary files /dev/null and b/app/libs/UHF67_v3.6.jar differ diff --git a/app/libs/logutil-1.5.1.1.jar b/app/libs/logutil-1.5.1.1.jar new file mode 100644 index 0000000..59b3c16 Binary files /dev/null and b/app/libs/logutil-1.5.1.1.jar differ diff --git a/app/libs/reader(1).jar b/app/libs/reader(1).jar new file mode 100644 index 0000000..8179d15 Binary files /dev/null and b/app/libs/reader(1).jar differ diff --git a/app/libs/uhflonger_v1.3.jar b/app/libs/uhflonger_v1.3.jar deleted file mode 100644 index a3dbdd1..0000000 Binary files a/app/libs/uhflonger_v1.3.jar and /dev/null differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 480121a..829fef8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,9 +1,10 @@ - - - + + + + + + + - - - - + + + + diff --git a/app/src/main/java/com/example/beijing_daxing/BFActivity.java b/app/src/main/java/com/example/beijing_daxing/BFActivity.java index 0a8722d..ffd8eb5 100644 --- a/app/src/main/java/com/example/beijing_daxing/BFActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/BFActivity.java @@ -17,9 +17,12 @@ import com.example.beijing_daxing.uitls.SharedPreferencesUtils; import com.example.beijing_daxing.vm.BFWm; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.List; +import cn.pda.serialport.Tools; + public class BFActivity extends BaseActivity { private BFWm wm; @Override @@ -31,12 +34,14 @@ public class BFActivity extends BaseActivity { } @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { var epc = epcs.get(0); - wm.setEpc(epc); + byte[] epcId = epc.EpcId; + String epc1 = Tools.Bytes2HexString(epcId, epcId.length); + wm.setEpc(epc1); OkGo.post(url+"/bf/select") .tag(this) - .params("epc",epc) + .params("epc",epc1) .execute(new MyRecultCall(dialog,this){ @Override public void onSuccess(Response response) { diff --git a/app/src/main/java/com/example/beijing_daxing/CheckActivity.java b/app/src/main/java/com/example/beijing_daxing/CheckActivity.java index 3e88f87..d450c1a 100644 --- a/app/src/main/java/com/example/beijing_daxing/CheckActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/CheckActivity.java @@ -24,12 +24,15 @@ import com.example.beijing_daxing.uitls.SharedPreferencesUtils; import com.google.gson.reflect.TypeToken; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import cn.pda.serialport.Tools; + public class CheckActivity extends BaseActivity implements AdapterClickCall, InPutDialog.InPutDialogCall { private ActivityCheckBinding binding; @@ -48,7 +51,6 @@ public class CheckActivity extends BaseActivity implements AdapterClickCall, InP adapter = new CheckAdapter(this, this); state = new ObservableBoolean(); checkState = new ObservableBoolean(); - binding.setAdapter(adapter); binding.setState(state); binding.setCheckState(checkState); @@ -99,7 +101,7 @@ public class CheckActivity extends BaseActivity implements AdapterClickCall, InP // 扫描到返回数据 @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { // var text = epcs.get(0); // binding.checkEpc.setText(text); @@ -113,13 +115,14 @@ public class CheckActivity extends BaseActivity implements AdapterClickCall, InP // subIndex = index; epcs.forEach(t -> { + var epc= Tools.Bytes2HexString(t.EpcId,t.EpcId.length); if (tagList.contains(t)) { return; } - tagList.add(t); + tagList.add(epc); var stock = new Stock(); - stock.setEpcCode(t); + stock.setEpcCode(epc); var index = list.indexOf(stock); if (index != -1) { list.get(index).setState("正常"); @@ -196,7 +199,8 @@ public class CheckActivity extends BaseActivity implements AdapterClickCall, InP private Runnable runnable = new Runnable() { @Override public void run() { - sendBroadcast(broadcastIntent); + // sendBroadcast(broadcastIntent); + sanEpc(); handler.postDelayed(runnable, 1000); } }; diff --git a/app/src/main/java/com/example/beijing_daxing/FpInActivity.java b/app/src/main/java/com/example/beijing_daxing/FpInActivity.java index c746133..ac67fea 100644 --- a/app/src/main/java/com/example/beijing_daxing/FpInActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/FpInActivity.java @@ -17,9 +17,12 @@ import com.example.beijing_daxing.uitls.SharedPreferencesUtils; import com.example.beijing_daxing.vm.FpInVm; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.List; +import cn.pda.serialport.Tools; + public class FpInActivity extends BaseActivity { private FpInVm vm; @@ -32,8 +35,9 @@ public class FpInActivity extends BaseActivity { } @Override - protected void sanRfid(List epcs) { - var epc = epcs.get(0); + protected void sanRfid(List epcs) { + Reader.TAGINFO taginfo = epcs.get(0); + var epc = Tools.Bytes2HexString(taginfo.EpcId,taginfo.EpcId.length); vm.setEpc(epc); OkGo.post(url+"/fpin/select") .tag(this).params("epc",epc) diff --git a/app/src/main/java/com/example/beijing_daxing/FpOutActivity.java b/app/src/main/java/com/example/beijing_daxing/FpOutActivity.java index 12f359e..55e34b8 100644 --- a/app/src/main/java/com/example/beijing_daxing/FpOutActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/FpOutActivity.java @@ -23,10 +23,13 @@ import com.example.beijing_daxing.uitls.SharedPreferencesUtils; import com.google.gson.reflect.TypeToken; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.ArrayList; import java.util.List; +import cn.pda.serialport.Tools; + public class FpOutActivity extends BaseActivity { private ObservableBoolean checkState; private List list; @@ -44,14 +47,16 @@ public class FpOutActivity extends BaseActivity { private List tagList; @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { + if (tagList==null) return; epcs.forEach(t -> { - if (tagList.contains(t)){ - tagList.add(t); + var epc = Tools.Bytes2HexString(t.EpcId,t.EpcId.length); + if (tagList.contains(epc)){ + tagList.add(epc); return; } var stock = new Stock(); - stock.setEpcCode(t); + stock.setEpcCode(epc); var index = list.indexOf(stock); if (index != -1) { list.get(index).setState("Y"); @@ -122,7 +127,8 @@ public class FpOutActivity extends BaseActivity { private Runnable runnable = new Runnable() { @Override public void run() { - sendBroadcast(broadcastIntent); + // sendBroadcast(broadcastIntent); + sanEpc(); handler.postDelayed(runnable, 1000); } }; diff --git a/app/src/main/java/com/example/beijing_daxing/HomePageActivity.java b/app/src/main/java/com/example/beijing_daxing/HomePageActivity.java index f7b16c0..d336b33 100644 --- a/app/src/main/java/com/example/beijing_daxing/HomePageActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/HomePageActivity.java @@ -61,6 +61,7 @@ public class HomePageActivity extends AppCompatActivity { protected void onDestroy() { super.onDestroy(); var uhfLongerManager = MyApplication.getUhfLongerManager(); + uhfLongerManager.asyncStopReading(); uhfLongerManager.close(); MyApplication.uhfLongerManager = null; // unregisterReceiver(myNetWorkReceiver); diff --git a/app/src/main/java/com/example/beijing_daxing/InActivity.java b/app/src/main/java/com/example/beijing_daxing/InActivity.java index 2a5fb82..e8e399a 100644 --- a/app/src/main/java/com/example/beijing_daxing/InActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/InActivity.java @@ -19,10 +19,12 @@ import com.example.beijing_daxing.uitls.SharedPreferencesUtils; import com.example.beijing_daxing.vm.InStoreVM; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.ArrayList; import java.util.List; +import cn.pda.serialport.Tools; import okhttp3.RequestBody; public class InActivity extends BaseActivity implements AdapterClickCall { @@ -47,12 +49,13 @@ public class InActivity extends BaseActivity implements AdapterClickCall { } @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { // Log.e("TAG", "sanRfid:" + epcs); epcs.stream().forEach(t -> { - if (!epcList.contains(t)) { - epcList.add(t); + var epc = Tools.Bytes2HexString(t.EpcId,t.EpcId.length); + if (!epcList.contains(epc)) { + epcList.add(epc); } }); vm.setSanLength(epcList.size()); diff --git a/app/src/main/java/com/example/beijing_daxing/MainActivity.java b/app/src/main/java/com/example/beijing_daxing/MainActivity.java index 2ee1e70..2fa0fad 100644 --- a/app/src/main/java/com/example/beijing_daxing/MainActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/MainActivity.java @@ -17,6 +17,7 @@ import com.example.beijing_daxing.vm.LoginVm; import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.StringCallback; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.List; @@ -38,7 +39,7 @@ public class MainActivity extends BaseActivity { } @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { } diff --git a/app/src/main/java/com/example/beijing_daxing/OffLineCheckActivity.java b/app/src/main/java/com/example/beijing_daxing/OffLineCheckActivity.java index 15e7dc9..db1f329 100644 --- a/app/src/main/java/com/example/beijing_daxing/OffLineCheckActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/OffLineCheckActivity.java @@ -18,6 +18,7 @@ import com.example.beijing_daxing.base.BaseActivity; import com.example.beijing_daxing.been.RFIDLocation; import com.example.beijing_daxing.been.Stock; import com.example.beijing_daxing.databinding.ActivityOffLineCheckBinding; +import com.uhf.api.cls.Reader; import org.litepal.LitePal; @@ -55,7 +56,7 @@ public class OffLineCheckActivity extends BaseActivity { } @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { } @@ -79,7 +80,8 @@ public class OffLineCheckActivity extends BaseActivity { private Runnable runnable = new Runnable() { @Override public void run() { - sendBroadcast(broadcastIntent); + // sendBroadcast(broadcastIntent); + sanEpc(); handler.postDelayed(runnable, 1000); } }; diff --git a/app/src/main/java/com/example/beijing_daxing/OutActivity.java b/app/src/main/java/com/example/beijing_daxing/OutActivity.java index 511f03c..ffe7ece 100644 --- a/app/src/main/java/com/example/beijing_daxing/OutActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/OutActivity.java @@ -16,8 +16,12 @@ import com.example.beijing_daxing.vm.OutStoreVm; import com.google.gson.reflect.TypeToken; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; + import java.util.ArrayList; import java.util.List; + +import cn.pda.serialport.Tools; import okhttp3.RequestBody; public class OutActivity extends BaseActivity implements AdapterClickCall { @@ -39,10 +43,11 @@ public class OutActivity extends BaseActivity implements AdapterClickCall { } @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { epcs.stream().forEach(t -> { - if (!epcList.contains(t)) { - epcList.add(t); + var epc = Tools.Bytes2HexString(t.EpcId,t.EpcId.length); + if (!epcList.contains(epc)) { + epcList.add(epc); } }); adapter.notifyDataSetChanged(); diff --git a/app/src/main/java/com/example/beijing_daxing/StoreCheckActivity.java b/app/src/main/java/com/example/beijing_daxing/StoreCheckActivity.java index e5d6ed0..9d977a3 100644 --- a/app/src/main/java/com/example/beijing_daxing/StoreCheckActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/StoreCheckActivity.java @@ -25,10 +25,12 @@ import com.example.beijing_daxing.uitls.SharedPreferencesUtils; import com.google.gson.reflect.TypeToken; import com.lzy.okgo.OkGo; import com.lzy.okgo.model.Response; +import com.uhf.api.cls.Reader; import java.util.ArrayList; import java.util.List; +import cn.pda.serialport.Tools; import okhttp3.RequestBody; public class StoreCheckActivity extends BaseActivity { @@ -48,16 +50,20 @@ public class StoreCheckActivity extends BaseActivity { binding.setAdapter(checkAdapter); initRequest(); } + private List tagList; + @Override - protected void sanRfid(List epcs) { + protected void sanRfid(List epcs) { + if (tagList == null) return; epcs.forEach(t -> { - if (tagList.contains(t)){ - tagList.add(t); - return; - } + var epc = Tools.Bytes2HexString(t.EpcId, t.EpcId.length); + if (tagList.contains(epc)) { + tagList.add(epc); + return; + } var stock = new Stock(); - stock.setEpcCode(t); + stock.setEpcCode(epc); var index = list.indexOf(stock); if (index != -1) { list.get(index).setState("Y"); @@ -75,7 +81,7 @@ public class StoreCheckActivity extends BaseActivity { if (body.getCode() == 0) { list = gson.fromJson(body.getData().toString(), new TypeToken>() { }.getType()); - tagList=new ArrayList<>(); + tagList = new ArrayList<>(); checkAdapter.setList(list); checkAdapter.notifyDataSetChanged(); } else { @@ -97,20 +103,20 @@ public class StoreCheckActivity extends BaseActivity { public void store_check_submit(View view) { handler.removeCallbacks(runnable); - OkGo.post(url+"/storecheck/submit") + OkGo.post(url + "/storecheck/submit") .tag(this) - .params("user", SharedPreferencesUtils.getstring("user","test")) - .params("json",gson.toJson(list)) + .params("user", SharedPreferencesUtils.getstring("user", "test")) + .params("json", gson.toJson(list)) // .upRequestBody(RequestBody.create(JSON, gson.toJson(list))) - .execute(new MyRecultCall(dialog,this){ + .execute(new MyRecultCall(dialog, this) { @Override public void onSuccess(Response response) { super.onSuccess(response); var body = response.body(); - if (body.getCode()==0){ + if (body.getCode() == 0) { finish(); Toast.makeText(StoreCheckActivity.this, "提交成功", Toast.LENGTH_SHORT).show(); - }else { + } else { Toast.makeText(StoreCheckActivity.this, body.getMsg(), Toast.LENGTH_SHORT).show(); } } @@ -127,7 +133,9 @@ public class StoreCheckActivity extends BaseActivity { private Runnable runnable = new Runnable() { @Override public void run() { - sendBroadcast(broadcastIntent); + Log.e("TAG", "发送广播,读取RFID"); + // sendBroadcast(broadcastIntent); + sanEpc(); handler.postDelayed(runnable, 1000); } }; @@ -136,7 +144,7 @@ public class StoreCheckActivity extends BaseActivity { protected void onDestroy() { super.onDestroy(); handler.removeCallbacks(runnable); - handler=null; - runnable=null; + handler = null; + runnable = null; } } \ No newline at end of file diff --git a/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java b/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java index 8e5b659..af8c690 100644 --- a/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java +++ b/app/src/main/java/com/example/beijing_daxing/base/BaseActivity.java @@ -18,7 +18,8 @@ import androidx.appcompat.app.AppCompatActivity; import com.example.beijing_daxing.R; import com.google.gson.Gson; -import com.handheld.UHFLonger.UHFLongerManager; +import com.handheld.uhfr.*; +import com.uhf.api.cls.Reader; import java.util.List; @@ -26,15 +27,14 @@ import okhttp3.MediaType; public abstract class BaseActivity extends AppCompatActivity { // public static String url = "http://192.168.0.102:8090/api"; - public static String url = "http://175.27.215.92:8090/api"; + public static String url = "http://119.45.202.115:8090/api"; public ProgressDialog dialog; public Gson gson; public MediaType JSON = MediaType.parse("application/json; charset=utf-8"); - public UHFLongerManager uhfLongerManager; + public UHFRManager uhfLongerManager; private MediaPlayer mediaPlayer; - public MyReceiver myReceiver; - - public Intent broadcastIntent; + public MyReceiver myReceiver; + public Intent broadcastIntent; @SuppressLint("UnspecifiedRegisterReceiverFlag") @Override @@ -43,9 +43,9 @@ public abstract class BaseActivity extends AppCompatActivity { gson = new Gson(); initDialog(); initSan(); - Intent intent = new Intent(); broadcastIntent = new Intent("android.rfid.FUN_KEY"); broadcastIntent.putExtra("keydown", false); + // broadcastIntent.setComponent(new ComponentName("com.example.beijing_daxing",".base.BaseActivity$MyReceiver")); } // private long readTime = 0; @@ -55,19 +55,24 @@ public abstract class BaseActivity extends AppCompatActivity { public void onReceive(Context context, Intent intent) { var keydown = intent.getBooleanExtra("keydown", false); - if (!keydown ) { + + Log.e("TAG", "接收到广播:" + keydown); + if (!keydown) { // readTime = System.currentTimeMillis(); - List strings = uhfLongerManager.inventoryRealTime(); - Log.e("TAG", "驱动"+(uhfLongerManager==null) ); - if (strings == null || strings.isEmpty()) { - return; - } - mediaPlayer.start(); - sanRfid(strings); + sanEpc(); } } } + public void sanEpc(){ + List strings = uhfLongerManager.tagInventoryRealTime(); + Log.e("TAG", "驱动" + (uhfLongerManager == null)); + if (strings == null || strings.isEmpty()) { + return; + } + mediaPlayer.start(); + sanRfid(strings); + } private void initDialog() { dialog = new ProgressDialog(this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -75,15 +80,20 @@ public abstract class BaseActivity extends AppCompatActivity { dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage("请求网络..."); } - private void initSan(){ + + private void initSan() { uhfLongerManager = MyApplication.getUhfLongerManager(); // intentFilter.addAction("android.intent.action.FUN_KEY"); + + uhfLongerManager.asyncStartReading(); + myReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.rfid.FUN_KEY"); registerReceiver(myReceiver, intentFilter); mediaPlayer = MediaPlayer.create(this, R.raw.msg); } + @Override protected void onDestroy() { super.onDestroy(); @@ -91,6 +101,5 @@ public abstract class BaseActivity extends AppCompatActivity { } - - protected abstract void sanRfid(List epcs); + protected abstract void sanRfid(List epcs); } \ No newline at end of file diff --git a/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java b/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java index 4514e19..a48e2f6 100644 --- a/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java +++ b/app/src/main/java/com/example/beijing_daxing/base/MyApplication.java @@ -1,9 +1,11 @@ package com.example.beijing_daxing.base; import android.app.Application; +import android.util.Log; import com.example.beijing_daxing.uitls.SharedPreferencesUtils; -import com.handheld.UHFLonger.UHFLongerManager; + +import com.handheld.uhfr.UHFRManager; import com.lzy.okgo.OkGo; import com.lzy.okgo.cache.CacheEntity; import com.lzy.okgo.cache.CacheMode; @@ -28,7 +30,7 @@ import okhttp3.OkHttpClient; public class MyApplication extends Application { MyApplication application; - public static UHFLongerManager uhfLongerManager; + public static UHFRManager uhfLongerManager; @Override public void onCreate() { super.onCreate(); @@ -39,15 +41,16 @@ public class MyApplication extends Application { getUhfLongerManager(); } - public static UHFLongerManager getUhfLongerManager() { + public static UHFRManager getUhfLongerManager() { if (uhfLongerManager==null){ try { - uhfLongerManager = UHFLongerManager.getInstance(); - uhfLongerManager.setOutPower((short) 30); + uhfLongerManager = UHFRManager.getInstance(); + uhfLongerManager.setPower(33,33); } catch (Exception e) { e.printStackTrace(); } } + return uhfLongerManager; } // OKGO 初始化 diff --git a/app/src/main/jniLibs/armeabi-v7a/libdevapi.so b/app/src/main/jniLibs/armeabi-v7a/libdevapi.so index 5b7e0c7..8a0ba8a 100644 Binary files a/app/src/main/jniLibs/armeabi-v7a/libdevapi.so and b/app/src/main/jniLibs/armeabi-v7a/libdevapi.so differ diff --git a/app/src/main/res/layout/activity_bfactivity.xml b/app/src/main/res/layout/activity_bfactivity.xml index be21825..518e9c1 100644 --- a/app/src/main/res/layout/activity_bfactivity.xml +++ b/app/src/main/res/layout/activity_bfactivity.xml @@ -107,12 +107,12 @@