diff --git a/src/Logistics/app/build.gradle b/src/Logistics/app/build.gradle index ef99642..bd44a64 100644 --- a/src/Logistics/app/build.gradle +++ b/src/Logistics/app/build.gradle @@ -43,4 +43,5 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation "org.java-websocket:Java-WebSocket:1.4.0" } \ No newline at end of file diff --git a/src/Logistics/app/libs/java_websocket.jar b/src/Logistics/app/libs/java_websocket.jar deleted file mode 100644 index bb5caeb..0000000 Binary files a/src/Logistics/app/libs/java_websocket.jar and /dev/null differ diff --git a/src/Logistics/app/src/main/assets/js.html b/src/Logistics/app/src/main/assets/js.html index 113324c..7fd022d 100644 --- a/src/Logistics/app/src/main/assets/js.html +++ b/src/Logistics/app/src/main/assets/js.html @@ -8,7 +8,7 @@ function callJS(){ var ros = new ROSLIB.Ros({ - url : 'ws://192.168.43.164:9090' + url : 'ws://192.168.43.20:9090' }); ros.on('connection', function() { @@ -86,11 +86,11 @@ console.log('Connection to websocket server closed.'); }); - goal.send(); + //goal.send(); - /*var cmdVel = new ROSLIB.Topic({ + var cmdVel = new ROSLIB.Topic({ ros : ros, - name : '/cmd_vel_mux/input/navi', + name : '/cmd_vel', messageType : 'geometry_msgs/Twist' }); @@ -106,7 +106,7 @@ z : 0.0 } }); - cmdVel.publish(twist);*/ + cmdVel.publish(twist); } diff --git a/src/Logistics/app/src/main/java/com/example/logistics/dao/goodDao.java b/src/Logistics/app/src/main/java/com/example/logistics/manager/goodManager.java similarity index 72% rename from src/Logistics/app/src/main/java/com/example/logistics/dao/goodDao.java rename to src/Logistics/app/src/main/java/com/example/logistics/manager/goodManager.java index ffde8d0..e5ec254 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/dao/goodDao.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/manager/goodManager.java @@ -1,4 +1,4 @@ -package com.example.logistics.dao; +package com.example.logistics.manager; import android.app.AlertDialog; import android.content.Context; @@ -7,8 +7,6 @@ import android.util.Log; import com.example.logistics.tools.DBOpenHelper; import com.example.logistics.tools.MD5Utils; -import com.example.logistics.ui.MainActivity; -import com.example.logistics.ui.MenuActivity; import java.sql.Connection; import java.sql.PreparedStatement; @@ -18,7 +16,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class goodDao { +public class goodManager { private static final String TAG = "goodDao"; @@ -165,5 +163,61 @@ public class goodDao { return datalist; } + public int pickup(String pickupcode, String phonenum){ + HashMap map = new HashMap<>(); + + Connection connection = DBOpenHelper.getConn(); + + int msg = 0; + try{ + String sql = "select * from goods where id=?"; + + if(connection != null){ + PreparedStatement ps = connection.prepareStatement(sql); + if(ps != null){ + Log.e(TAG, "pickupcode: " + pickupcode); + ps.setInt(1,Integer.parseInt(pickupcode)); + ResultSet rs = ps.executeQuery(); + + int count = rs.getMetaData().getColumnCount(); + while(rs.next()){ + for(int i = 1; i <= count; i++){ + String field = rs.getMetaData().getColumnName(i); + map.put(field, rs.getString(field)); + } + } + connection.close(); + ps.close(); + if(map.size() != 0){ + StringBuilder s = new StringBuilder(); + for(String key:map.keySet()){ + if(key.equals("phonenum")){ + if(phonenum.equals(map.get(key).toString().substring(7,11))){ + msg = 1; //password correct + }else{ + msg = 2; //password incorrect + } + break; + } + } + }else{ + Log.e(TAG, "result is null"); + msg = 3; //result is null + } + }else{ + Log.e(TAG, "ps is null"); + msg = 0; + } + }else{ + Log.e(TAG, "connection is null"); + msg = 0; + } + }catch (Exception e){ + e.printStackTrace(); + Log.d(TAG, "login bug: " + e.getMessage()); + msg = 0; + } + return msg; + } } diff --git a/src/Logistics/app/src/main/java/com/example/logistics/dao/operationDao.java b/src/Logistics/app/src/main/java/com/example/logistics/manager/operationManager.java similarity index 95% rename from src/Logistics/app/src/main/java/com/example/logistics/dao/operationDao.java rename to src/Logistics/app/src/main/java/com/example/logistics/manager/operationManager.java index e6800ee..415034b 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/dao/operationDao.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/manager/operationManager.java @@ -1,10 +1,8 @@ -package com.example.logistics.dao; +package com.example.logistics.manager; import android.util.Log; -import com.example.logistics.entity.User; import com.example.logistics.tools.DBOpenHelper; -import com.example.logistics.tools.MD5Utils; import java.sql.Connection; import java.sql.PreparedStatement; @@ -16,7 +14,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class operationDao { +public class operationManager { private static final String TAG = "operationDao"; public boolean add(String pickupcode, String phonenum){ diff --git a/src/Logistics/app/src/main/java/com/example/logistics/dao/userDao.java b/src/Logistics/app/src/main/java/com/example/logistics/manager/userManager.java similarity index 98% rename from src/Logistics/app/src/main/java/com/example/logistics/dao/userDao.java rename to src/Logistics/app/src/main/java/com/example/logistics/manager/userManager.java index bd3bd0d..0f50cf0 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/dao/userDao.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/manager/userManager.java @@ -1,4 +1,4 @@ -package com.example.logistics.dao; +package com.example.logistics.manager; import android.util.Log; @@ -12,7 +12,7 @@ import java.util.HashMap; import java.sql.ResultSet; import java.sql.Connection; -public class userDao { +public class userManager { private static final String TAG = "userDao"; @@ -46,6 +46,7 @@ public class userDao { StringBuilder s = new StringBuilder(); for(String key:map.keySet()){ if(key.equals("password")){ + if(password.equals(map.get(key))){ msg = 1; //password correct }else{ diff --git a/src/Logistics/app/src/main/java/com/example/logistics/tools/DBOpenHelper.java b/src/Logistics/app/src/main/java/com/example/logistics/tools/DBOpenHelper.java index c561dbb..73f0b02 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/tools/DBOpenHelper.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/tools/DBOpenHelper.java @@ -7,9 +7,9 @@ import java.sql.SQLException; public class DBOpenHelper { private static String diver = "com.mysql.jdbc.Driver"; //加入utf-8是为了后面往表中输入中文,表中不会出现乱码的情况 - private static String url = "jdbc:mysql://49.235.83.73:3306/logistics?characterEncoding=utf-8"; + private static String url = "jdbc:mysql://192.168.43.203:3306/logistics?characterEncoding=utf-8"; private static String user = "root";//用户名 - private static String password = "123";//密码 + private static String password = "";//密码 /* * 连接数据库 * */ diff --git a/src/Logistics/app/src/main/java/com/example/logistics/tools/JWebSocketClient.java b/src/Logistics/app/src/main/java/com/example/logistics/tools/JWebSocketClient.java new file mode 100644 index 0000000..4236ecf --- /dev/null +++ b/src/Logistics/app/src/main/java/com/example/logistics/tools/JWebSocketClient.java @@ -0,0 +1,35 @@ +package com.example.logistics.tools; + +import android.util.Log; + +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.drafts.Draft_6455; +import org.java_websocket.handshake.ServerHandshake; + +import java.net.URI; + +public class JWebSocketClient extends WebSocketClient { + public JWebSocketClient(URI serverUri) { + super(serverUri, new Draft_6455()); + } + + @Override + public void onOpen(ServerHandshake handshakedata) { + Log.e("JWebSocketClient", "onOpen()"); + } + + @Override + public void onMessage(String message) { + Log.e("JWebSocketClient", "onMessage()"); + } + + @Override + public void onClose(int code, String reason, boolean remote) { + Log.e("JWebSocketClient", "onClose()"); + } + + @Override + public void onError(Exception ex) { + Log.e("JWebSocketClient", "onError()"); + } +} diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/HistoryActivity.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/HistoryActivity.java index 4cc6c2e..3a89a44 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/HistoryActivity.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/HistoryActivity.java @@ -1,11 +1,8 @@ package com.example.logistics.ui; -import androidx.appcompat.app.AppCompatActivity; - import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; -import android.media.Image; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -22,8 +19,7 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; import com.example.logistics.R; -import com.example.logistics.dao.goodDao; -import com.example.logistics.dao.operationDao; +import com.example.logistics.manager.operationManager; import java.util.ArrayList; import java.util.List; @@ -101,8 +97,8 @@ public class HistoryActivity extends Activity implements OnItemClickListener, On new Thread(){ @Override public void run(){ - operationDao operationDao = new operationDao(); - dataList = operationDao.history(phonenum); + operationManager operationManager = new operationManager(); + dataList = operationManager.history(phonenum); int msg = 1; hand1.sendEmptyMessage(msg); diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/MainActivity.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/MainActivity.java index fc419de..b2e3517 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/MainActivity.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/MainActivity.java @@ -1,9 +1,8 @@ package com.example.logistics.ui; import com.example.logistics.R; -import com.example.logistics.dao.userDao; +import com.example.logistics.manager.userManager; import com.example.logistics.entity.User; -import com.example.logistics.tools.MD5Utils; import android.annotation.SuppressLint; import android.app.Activity; @@ -17,9 +16,6 @@ import android.widget.Button; import android.widget.EditText; import android.widget.Toast; -import java.text.SimpleDateFormat; -import java.util.Date; - public class MainActivity extends Activity { @@ -60,12 +56,12 @@ public class MainActivity extends Activity { new Thread(){ @Override public void run(){ - userDao userDao = new userDao(); - int msg = userDao.login(userName.getText().toString().trim(), passWord.getText().toString().trim()); + userManager userManager = new userManager(); + int msg = userManager.login(userName.getText().toString().trim(), passWord.getText().toString().trim()); Log.e("MAin", "msg"); hand1.sendEmptyMessage(msg); if(msg == 1){ - User owner = userDao.findUser(userName.getText().toString().trim()); + User owner = userManager.findUser(userName.getText().toString().trim()); Intent intent = new Intent(MainActivity.this, MenuActivity.class); intent.putExtra("user", owner.getPhoneNum()); startActivity(intent); diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment3.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/MeUI.java similarity index 95% rename from src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment3.java rename to src/Logistics/app/src/main/java/com/example/logistics/ui/MeUI.java index 2ff01f4..84e6ba6 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment3.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/MeUI.java @@ -18,14 +18,14 @@ import com.example.logistics.R; import org.w3c.dom.Text; -public class MyFragment3 extends Fragment implements View.OnClickListener{ +public class MeUI extends Fragment implements View.OnClickListener{ private LinearLayout ll_waiting; private LinearLayout ll_history; private LinearLayout ll_exit; private Context mContext; private String user; - public MyFragment3(){ + public MeUI(){ } @Nullable diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/MenuActivity.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/MenuActivity.java index c366436..95ed844 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/MenuActivity.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/MenuActivity.java @@ -93,7 +93,7 @@ public class MenuActivity extends AppCompatActivity implements View.OnClickListe mTextView1.setSelected(true); mTextNum1.setVisibility(View.INVISIBLE); if (mFrag1 == null) { - mFrag1 = new MyFragment1(); + mFrag1 = new SearchUI(); transaction.add(R.id.fragment_container, mFrag1); @@ -106,7 +106,7 @@ public class MenuActivity extends AppCompatActivity implements View.OnClickListe mTextView2.setSelected(true); mTextNum2.setVisibility(View.INVISIBLE); if (mFrag2 == null) { - mFrag2 = new MyFragment2(); + mFrag2 = new PickUpUI(); Bundle bundle = new Bundle(); bundle.putString("user", owner); mFrag2.setArguments(bundle); @@ -120,7 +120,7 @@ public class MenuActivity extends AppCompatActivity implements View.OnClickListe mTextView3.setSelected(true); mTextNum3.setVisibility(View.INVISIBLE); if (mFrag3 == null) { - mFrag3 = new MyFragment3(); + mFrag3 = new MeUI(); Bundle bundle = new Bundle(); bundle.putString("user", owner); mFrag3.setArguments(bundle); diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment2.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment2.java deleted file mode 100644 index 8f28860..0000000 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment2.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.example.logistics.ui; - -import androidx.fragment.app.Fragment; - -import android.annotation.SuppressLint; -import android.app.AlertDialog; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.webkit.WebViewClient; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.Nullable; - -import com.example.logistics.R; -import com.example.logistics.dao.goodDao; -import com.example.logistics.dao.operationDao; -import com.example.logistics.dao.userDao; -import com.example.logistics.entity.User; -import com.google.zxing.integration.android.IntentIntegrator; -import com.google.zxing.integration.android.IntentResult; -import com.journeyapps.barcodescanner.CaptureActivity; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -public class MyFragment2 extends Fragment implements View.OnClickListener{ - - private Button mButton; - private Context mContext; - - private WebView mWebView; - - public MyFragment2(){ - - } - @Nullable - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.my_fragment2,container,false); - mWebView = (WebView) view.findViewById(R.id.webview); - - WebSettings webSettings = mWebView.getSettings(); - mButton = (Button)view.findViewById(R.id.Pick_Button); - mButton.setOnClickListener(this); - mContext = getActivity(); - - webSettings.setJavaScriptEnabled(true); - mWebView.loadUrl("file:///android_asset/js.html"); - - Log.i("set", "listner"); - - mWebView.setWebViewClient(new WebViewClient(){ - @Override - public void onPageFinished(WebView view, String url){ - super.onPageFinished(view, url); - String jsStr1 = ""; - try{ - InputStream in1 = mContext.getAssets().open("em.js"); - byte buff[] = new byte[1024]; - ByteArrayOutputStream fromFile = new ByteArrayOutputStream(); - do { - int numRead = in1.read(buff); - if (numRead <= 0) { - break; - } - fromFile.write(buff, 0, numRead); - } while (true); - jsStr1 = fromFile.toString(); - in1.close(); - fromFile.close(); - } catch (IOException e) { - e.printStackTrace(); - } - mWebView.loadUrl("javascript:" + jsStr1); - - String jsStr2 = ""; - try{ - InputStream in2 = mContext.getAssets().open("roslib.min.js"); - byte buff[] = new byte[1024]; - ByteArrayOutputStream fromFile = new ByteArrayOutputStream(); - do { - int numRead = in2.read(buff); - if (numRead <= 0) { - break; - } - fromFile.write(buff, 0, numRead); - } while (true); - jsStr2 = fromFile.toString(); - in2.close(); - fromFile.close(); - } catch (IOException e) { - e.printStackTrace(); - } - mWebView.loadUrl("javascript:" + jsStr2); - } - - }); - - - return view; - } - - @Override - public void onClick(View view) { - switch(view.getId()){ - case R.id.Pick_Button: - /*new IntentIntegrator(getActivity()) - .setDesiredBarcodeFormats(IntentIntegrator.QR_CODE)// 扫码的类型,一维码,二维码,一/二维码,默认为一/二维码 - .setPrompt("请对准摄像头") - .setCameraId(0) - .setBeepEnabled(false) - .setCaptureActivity(CaptureActivity.class) - .initiateScan();*/ - pickup("abnc"); - - } - } - - public void test(){ - mWebView.loadUrl("javascript:callJS()"); - Log.i("abc", "bcd"); - } - - - @Override - @SuppressLint("MissingSuperCall") - public void onActivityResult(int requestCode, int resultCode, Intent data) { - IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); - if(result != null) { - if(result.getContents() != null) { - //Toast.makeText(mContext, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show(); - pickup(result.getContents()); - } - } - } - - public void pickup(String result){ - AlertDialog.Builder builder = new AlertDialog.Builder(mContext); - - View view2 = View.inflate(mContext, R.layout.pickup, null); - - EditText PickUpCode = (EditText) view2.findViewById(R.id.pk_PickUp); - EditText PhoneNum = (EditText) view2.findViewById(R.id.pk_PhoneNum); - Button button = (Button) view2.findViewById(R.id.pk_button); - - builder.setTitle("取件").setView(view2); - - builder.create().show(); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - String pickupcode = PickUpCode.getText().toString().trim(); - String phonenum = PhoneNum.getText().toString().trim(); - Log.d("onclick", "123"); - //String QR_pickup = result.split(" ")[0]; - //String QR_phone = result.split(" ")[1]; - - if(true){ - //if (pickupcode.equals(QR_pickup) && phonenum.equals(QR_phone)) { - /*new Thread() { - @Override - public void run() { - int msg = 0; - - operationDao operationDao = new operationDao(); - goodDao goodDao = new goodDao(); - Bundle bundle = getArguments(); - - String user = bundle.getString("user"); - - boolean flag1 = operationDao.add(pickupcode, user); - boolean flag2 = goodDao.delete(pickupcode); - - boolean flag = flag1 & flag2; - if (flag) { - msg = 1; - } - int msg = 1; - test(); - hand1.sendEmptyMessage(msg); - } - }.start();*/ - Toast.makeText(mContext, "取件成功", Toast.LENGTH_LONG).show(); - test(); - - } else { - Toast.makeText(mContext, "取件失败", Toast.LENGTH_LONG).show(); - } - } - - - }); - } - - @SuppressLint("HandlerLeak") - final Handler hand1 = new Handler() { - @Override - public void handleMessage(Message msg) { - if (msg.what == 1) { - Toast.makeText(mContext, "取件成功", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(mContext, "取件失败", Toast.LENGTH_SHORT); - } - } - }; -} \ No newline at end of file diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/NoPickActivity.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/NoPickActivity.java index d23a064..104bee1 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/NoPickActivity.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/NoPickActivity.java @@ -1,9 +1,5 @@ package com.example.logistics.ui; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; @@ -19,21 +15,14 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ListView; -import android.widget.NumberPicker; import android.widget.SimpleAdapter; import android.widget.Toast; import com.example.logistics.R; -import com.example.logistics.dao.goodDao; -import com.example.logistics.dao.userDao; -import com.example.logistics.entity.User; +import com.example.logistics.manager.goodManager; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Map; public class NoPickActivity extends Activity implements OnItemClickListener, OnScrollListener, View.OnClickListener { @@ -110,8 +99,8 @@ public class NoPickActivity extends Activity implements OnItemClickListener, OnS new Thread(){ @Override public void run(){ - goodDao goodDao = new goodDao(); - dataList = goodDao.nopick(phonenum); + goodManager goodManager = new goodManager(); + dataList = goodManager.nopick(phonenum); int msg = 1; hand1.sendEmptyMessage(msg); diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/PickUpUI.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/PickUpUI.java new file mode 100644 index 0000000..d0d0912 --- /dev/null +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/PickUpUI.java @@ -0,0 +1,306 @@ +package com.example.logistics.ui; + +import androidx.fragment.app.Fragment; + +import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebSettings; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import com.example.logistics.R; +import com.example.logistics.manager.goodManager; +import com.example.logistics.manager.operationManager; +import com.example.logistics.tools.JWebSocketClient; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; + +import org.java_websocket.handshake.ServerHandshake; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; + +public class PickUpUI extends Fragment implements View.OnClickListener{ + + private Button mButton; + private Context mContext; + private JWebSocketClient client; + private AlertDialog alert; + private AlertDialog alert2; + private EditText PickUpCode; + private EditText PhoneNum; + private String pickupcode; + private String phonenum; + private int shelfnum = 1; + private int floornum = 1; + + private String ws = "ws://192.168.43.203:8080/result"; + + private String TAG = "PickUpUI"; + + int flag = 0; //flag=0:chushi + + public PickUpUI(){ + + } + @Nullable + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.my_fragment2,container,false); + + mButton = (Button)view.findViewById(R.id.Pick_Button); + mButton.setOnClickListener(this); + mContext = getActivity(); + + Log.i("set", "listner"); + + setAlert(); + return view; + } + + + void setAlert(){ + alert = new android.app.AlertDialog.Builder(mContext) + .setTitle("提醒") + .setMessage("是否确认取件") + .setPositiveButton("确认", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Log.d("alert","yes"); + //add(operation); + JSONObject js = new JSONObject(); + try { + js.put("content", "yes"); + js.put("op", "confirm"); + } catch (JSONException e) { + e.printStackTrace(); + } + flag = 1; + + mButton.setText("确认"); + + client.send(js.toString()); + Log.d("alert", "send"); + } + }) + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Log.d("alert","no"); + + JSONObject js = new JSONObject(); + try { + js.put("confirm", "no"); + js.put("op", "confirm"); + } catch (JSONException e) { + e.printStackTrace(); + } + + client.send(js.toString()); + } + }) + .create(); + Log.d(TAG, "setAlert"); + } + + void setWebsocket(){ + URI uri = URI.create(ws); + client = new JWebSocketClient(uri){ + @Override + public void onMessage(String message) { + Log.e("JWebSocketClientService", "收到的消息:" + message); + Log.e("alert",message); + if(message.equals("confirm")){ + alert.dismiss(); + hand2.sendEmptyMessage(3); + Log.e("alert","show"); + } + } + + @Override + public void onOpen(ServerHandshake handshakedata) { + super.onOpen(handshakedata); + Log.e("JWebSocketClientService", "websocket连接成功"); + }; + }; + connect(); + } + + private void connect() { + new Thread() { + @Override + public void run() { + try { + //connectBlocking多出一个等待操作,会先连接再发送,否则未连接发送会报错 + client.connectBlocking(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }.start(); + + } + + @SuppressLint("HandlerLeak") + final Handler hand2 = new Handler(){ + @Override + public void handleMessage(Message msg){ + alert.show(); + } + }; + + @Override + public void onClick(View view) { + switch(view.getId()){ + case R.id.Pick_Button: + Log.e(TAG, "onclick"); + if(flag == 1){ + confirm(); + }else{ + pickup(); + } + + + } + } + + void confirm(){ + JSONObject js = new JSONObject(); + try { + js.put("op","finish"); + client.send(js.toString()); + + flag = 0; + mButton.setText("取件"); + client.onClose(1,"close",true); + Log.d("finish", "over"); + + } catch (JSONException jsonException) { + jsonException.printStackTrace(); + } + } + + + public void pickup(){ + AlertDialog.Builder builder = new AlertDialog.Builder(mContext); + + View view2 = View.inflate(mContext, R.layout.pickup, null); + + PickUpCode = (EditText) view2.findViewById(R.id.pk_PickUp); + PhoneNum = (EditText) view2.findViewById(R.id.pk_PhoneNum); + Button button = (Button) view2.findViewById(R.id.pk_button); + + builder.setTitle("取件").setView(view2); + + + alert2 = builder.create(); + alert2.show(); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Log.e(TAG,"onclick"); + setWebsocket(); + pickupcode = PickUpCode.getText().toString().trim(); + phonenum = PhoneNum.getText().toString().trim(); + Log.d("onclick", "123"); + new Thread() { + @Override + public void run() { + int msg = 0; + + operationManager operationManager = new operationManager(); + goodManager goodManager = new goodManager(); + Bundle bundle = getArguments(); + + String user = bundle.getString("user"); + + msg = goodManager.pickup(pickupcode,phonenum); + + Log.d(TAG, "pickup"); + if(msg != 1){ + Log.d(TAG, "pickup,failed"); + hand1.sendEmptyMessage(msg); + return; + } + + Log.d(TAG, "pickup,success"); + + boolean flag1 = operationManager.add(pickupcode, user); + boolean flag2 = goodManager.delete(pickupcode); + + boolean flag = flag1 & flag2; + if (flag) { + msg = 1; + } + + hand1.sendEmptyMessage(msg); + } + }.start(); + } + }); + } + + @SuppressLint("HandlerLeak") + final Handler hand1 = new Handler() { + @Override + public void handleMessage(Message msg) { + if(msg.what == 0){ + Toast.makeText(mContext, "取件失败", Toast.LENGTH_SHORT).show(); + }else if(msg.what == 1){ + Toast.makeText(mContext, "加入队列成功", Toast.LENGTH_SHORT).show(); + joinQueue(); + }else if(msg.what == 2){ + Toast.makeText(mContext, "手机号错误", Toast.LENGTH_SHORT).show(); + }else if(msg.what == 3){ + Toast.makeText(mContext, "取件码不存在", Toast.LENGTH_SHORT).show(); + } + } + }; + + void joinQueue(){ + alert2.dismiss(); + if (client != null && client.isOpen()) { + + JSONObject js = new JSONObject(); + JSONObject con = new JSONObject(); + try { + Log.d(TAG, pickupcode); + Log.d(TAG, phonenum); + + con.put("code", Integer.parseInt(pickupcode)); + con.put("shelf", shelfnum); + con.put("floor", floornum); + con.put("user", "xcr"); + js.put("content", con); + js.put("op", "connect"); + } catch (JSONException jsonException) { + jsonException.printStackTrace(); + } + + if (null != client) { + Log.e("JWebSocketClientService", "发送的消息:" + js.toString()); + client.send(js.toString()); + //暂时将发送的消息加入消息列表,实际以发送成功为准(也就是服务器返回你发的消息时) + } + } + } +} \ No newline at end of file diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment1.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/SearchUI.java similarity index 81% rename from src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment1.java rename to src/Logistics/app/src/main/java/com/example/logistics/ui/SearchUI.java index 46caef0..e9bf32b 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/MyFragment1.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/SearchUI.java @@ -2,9 +2,7 @@ package com.example.logistics.ui; import android.annotation.SuppressLint; -import android.app.AlertDialog; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -14,23 +12,21 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.example.logistics.R; -import com.example.logistics.dao.goodDao; -import com.example.logistics.dao.userDao; +import com.example.logistics.manager.goodManager; -public class MyFragment1 extends Fragment implements View.OnClickListener{ +public class SearchUI extends Fragment implements View.OnClickListener{ private Context mContext; private Button mButton; private EditText mPickUpCode; private EditText mPhoneNum; - public MyFragment1(){ + public SearchUI(){ } @Nullable @@ -60,8 +56,8 @@ public class MyFragment1 extends Fragment implements View.OnClickListener{ new Thread(){ @Override public void run(){ - goodDao goodDao = new goodDao(); - int msg = goodDao.search(mPickUpCode.getText().toString().trim(), mPhoneNum.getText().toString().trim(), getActivity()); + goodManager goodManager = new goodManager(); + int msg = goodManager.search(mPickUpCode.getText().toString().trim(), mPhoneNum.getText().toString().trim(), getActivity()); Log.e("Main", "msg"); hand1.sendEmptyMessage(msg); } diff --git a/src/Logistics/app/src/main/java/com/example/logistics/ui/SignUpActivity.java b/src/Logistics/app/src/main/java/com/example/logistics/ui/SignUpActivity.java index f927349..d63254a 100644 --- a/src/Logistics/app/src/main/java/com/example/logistics/ui/SignUpActivity.java +++ b/src/Logistics/app/src/main/java/com/example/logistics/ui/SignUpActivity.java @@ -12,7 +12,7 @@ import android.widget.EditText; import android.widget.Toast; import com.example.logistics.R; -import com.example.logistics.dao.userDao; +import com.example.logistics.manager.userManager; import com.example.logistics.entity.User; public class SignUpActivity extends Activity { @@ -79,14 +79,14 @@ public class SignUpActivity extends Activity { @Override public void run(){ int msg = 0; - userDao userDao = new userDao(); + userManager userManager = new userManager(); - User uu = userDao.findUser(user.getUserName()); + User uu = userManager.findUser(user.getUserName()); if(uu != null){ msg = 1; //have this account }else{ - boolean flag = userDao.register(user); + boolean flag = userManager.register(user); if(flag){ msg = 2; } diff --git a/src/server/.gitignore b/src/server/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/src/server/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/src/server/.mvn/wrapper/maven-wrapper.jar b/src/server/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..c1dd12f Binary files /dev/null and b/src/server/.mvn/wrapper/maven-wrapper.jar differ diff --git a/src/server/.mvn/wrapper/maven-wrapper.properties b/src/server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..b7cb93e --- /dev/null +++ b/src/server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/src/server/mvnw b/src/server/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/src/server/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/src/server/mvnw.cmd b/src/server/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/src/server/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/src/server/pom.xml b/src/server/pom.xml new file mode 100644 index 0000000..ab4f8f1 --- /dev/null +++ b/src/server/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.4 + + + com.example + testdemo + 0.0.1-SNAPSHOT + testdemo + testdemo + + 1.8 + + + + org.springframework.boot + spring-boot-starter-websocket + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + 1.2.73 + + + org.seleniumhq.selenium + selenium-java + 3.141.59 + + + + + + sonar + + true + + + http://127.0.0.1:9000/ + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.sonarsource.scanner.maven + sonar-maven-plugin + 3.6.0.1398 + + + org.apache.maven.plugins + maven-compiler-plugin + + 7 + 7 + + + + + + diff --git a/src/server/src/main/java/com/example/testdemo/TestdemoApplication.java b/src/server/src/main/java/com/example/testdemo/TestdemoApplication.java new file mode 100644 index 0000000..5b0706c --- /dev/null +++ b/src/server/src/main/java/com/example/testdemo/TestdemoApplication.java @@ -0,0 +1,42 @@ +package com.example.testdemo; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.sun.javafx.webkit.EventLoopImpl; +import org.openqa.selenium.*; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.sql.Driver; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ConcurrentLinkedQueue; + + +@SpringBootApplication +public class TestdemoApplication { + + public static void main(String[] args) { + + SpringApplication.run(TestdemoApplication.class, args); + } + + +} + + diff --git a/src/server/src/main/java/com/example/testdemo/config/SendObjectMessage.java b/src/server/src/main/java/com/example/testdemo/config/SendObjectMessage.java new file mode 100644 index 0000000..1b84ae8 --- /dev/null +++ b/src/server/src/main/java/com/example/testdemo/config/SendObjectMessage.java @@ -0,0 +1,176 @@ +package com.example.testdemo.config; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import jdk.nashorn.internal.scripts.JS; +import lombok.extern.slf4j.Slf4j; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; +import org.springframework.stereotype.Component; +import sun.rmi.runtime.Log; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import javax.websocket.*; +import javax.websocket.server.ServerEndpoint; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @Description : 群发消息 //描述 + */ +@Slf4j +@ServerEndpoint("/result") +@Component +public class SendObjectMessage { + + /** 记录当前在线连接数 */ + private static AtomicInteger onlineCount = new AtomicInteger(0); + private static ConcurrentLinkedQueue socket = new ConcurrentLinkedQueue(); + /** + * 与某个客户端的连接会话,需要通过它来给客户端发送数据 + */ + private Session session; + private SendObjectMessage mObject = null; + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session) { + this.session = session; + socket.add(this); + onlineCount.incrementAndGet(); // 在线数加1 + if(mObject == null){ + mObject = socket.peek(); + } + /*try { + sendMessage("连接成功!"); + } catch (IOException e) { + e.printStackTrace(); + }*/ + log.info("有新连接加入,当前在线人数为:{}", onlineCount.get()); + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose(Session session) { + socket.remove(this); + // 在线数减1 + onlineCount.decrementAndGet(); + log.info("用户退出,当前在线人数为:{}", onlineCount.get()); + } + + /** + * 收到客户端消息后调用的方法 + * + * @param message + * 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String message, Session session) throws IOException { + if (message != null && !message.isEmpty()) { + //socket.peek().sendMessage(message); + JSONObject js = JSONObject.parseObject(message); + String op = js.getString("op"); + + if(op.equals("connect")){ + JSONObject content = js.getJSONObject("content"); + String user = content.getString("user"); + //JSONArray note = content.getJSONArray("note"); + Integer code = content.getInteger("code"); + Integer shelf = content.getInteger("shelf"); + Integer floor = content.getInteger("floor"); + + System.out.println(content); + mObject.sendMessage("confirm"); + + }else if(op.equals("confirm")){ + String con = js.getString("content"); + if(con.equals("yes")){ + try { + testSelenium1(); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("robot"); + }else if(con.equals("no")){ + System.out.println("no"); + } + }else if(op.equals("finish")){ + System.out.println("fin"); + mObject.onClose(mObject.session); + socket.poll(); + + if(socket.peek() != null){ + mObject = socket.peek(); + mObject.sendMessage("confirm"); + }else{ + mObject = null; + } + } + } + log.info("服务端收到客户端的消息:{}", message); + } + + @OnError + public void onError(Throwable error) { + log.error("发生错误"); + error.printStackTrace(); + } + + /** + * 服务端发送消息给客户端 + */ + public void sendMessage(String message) throws IOException { + //如果开启@Async异步需要加锁,否则就会报错 + synchronized (session){ + this.session.getBasicRemote().sendText(message); + } + } + + /** + * 自定义群发 + */ + + public static void testSelenium1() throws Exception { + // 使用HtmlUnitDriver 是不需要 安装 浏览器 和 驱动支持\ + System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe"); + ChromeOptions chromeOptions = new ChromeOptions(); + chromeOptions.setHeadless(true); + + WebDriver driver = new ChromeDriver(chromeOptions); + //ChromeDriver driver = new ChromeDriver(); + + JavascriptExecutor executor = (JavascriptExecutor) driver; + String strFile = Thread.currentThread().getClass().getResource("/").getPath(); + //driver.get(strFile + "/test.html"); + driver.get("file://" + strFile + "/test.html"); + + + } + private static String readJsFile(String url) throws Exception { + StringBuffer script = new StringBuffer(); + + File file = new File(url); + FileReader filereader = new FileReader(file); + BufferedReader bufferedReader = new BufferedReader(filereader); + String tempString = null; + while ((tempString = bufferedReader.readLine()) != null) { + script.append(tempString).append("\n"); + } + bufferedReader.close(); + filereader.close(); + return script.toString(); + } + +} diff --git a/src/server/src/main/java/com/example/testdemo/config/WebSocketConfig.java b/src/server/src/main/java/com/example/testdemo/config/WebSocketConfig.java new file mode 100644 index 0000000..dc62fa8 --- /dev/null +++ b/src/server/src/main/java/com/example/testdemo/config/WebSocketConfig.java @@ -0,0 +1,17 @@ +package com.example.testdemo.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * @Description : websocket配置 //描述 + */ +@Configuration +public class WebSocketConfig { + + @Bean + public ServerEndpointExporter serverEndpointExporter(){ + return new ServerEndpointExporter(); + } +} diff --git a/src/server/src/main/resources/a.js b/src/server/src/main/resources/a.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/server/src/main/resources/a.js @@ -0,0 +1 @@ + diff --git a/src/server/src/main/resources/application.yml b/src/server/src/main/resources/application.yml new file mode 100644 index 0000000..5b63b17 --- /dev/null +++ b/src/server/src/main/resources/application.yml @@ -0,0 +1,18 @@ +server: + port: 8080 + servlet: + contest-path: / +spring: + application: + name: springboot websocket + mvc: + static-path-pattern: /** + thymeleaf: + mode: HTML5 + suffix: .html + encoding: UTF-8 + prefix: + classpath: /template + cache: false + + diff --git a/src/server/src/main/resources/em.js b/src/server/src/main/resources/em.js new file mode 100644 index 0000000..a5af1ed --- /dev/null +++ b/src/server/src/main/resources/em.js @@ -0,0 +1 @@ +!function(e){function t(){this._events={},this._conf&&i.call(this,this._conf)}function i(e){e&&(this._conf=e,e.delimiter&&(this.delimiter=e.delimiter),e.maxListeners&&(this._events.maxListeners=e.maxListeners),e.wildcard&&(this.wildcard=e.wildcard),e.newListener&&(this.newListener=e.newListener),this.wildcard&&(this.listenerTree={}))}function s(e){this._events={},this.newListener=!1,i.call(this,e)}function n(e,t,i,s){if(!i)return[];var r,l,o,h,a,f,c,_=[],p=t.length,u=t[s],v=t[s+1];if(s===p&&i._listeners){if("function"==typeof i._listeners)return e&&e.push(i._listeners),[i];for(r=0,l=i._listeners.length;r0&&n._listeners.length>h&&(n._listeners.warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",n._listeners.length),console.trace())}}else n._listeners=t;return!0}r=e.shift()}return!0}var l=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},o=10;s.prototype.delimiter=".",s.prototype.setMaxListeners=function(e){this._events||t.call(this),this._events.maxListeners=e,this._conf||(this._conf={}),this._conf.maxListeners=e},s.prototype.event="",s.prototype.once=function(e,t){return this.many(e,1,t),this},s.prototype.many=function(e,t,i){function s(){0==--t&&n.off(e,s),i.apply(this,arguments)}var n=this;if("function"!=typeof i)throw new Error("many only accepts instances of Function");return s._origin=i,this.on(e,s),n},s.prototype.emit=function(){this._events||t.call(this);var e=arguments[0];if("newListener"===e&&!this.newListener&&!this._events.newListener)return!1;if(this._all){for(var i=arguments.length,s=new Array(i-1),r=1;r1)switch(arguments.length){case 2:l.call(this,arguments[1]);break;case 3:l.call(this,arguments[1],arguments[2]);break;default:for(var i=arguments.length,s=new Array(i-1),r=1;r0||!!this._all}return!!this._all},s.prototype.on=function(e,i){if("function"==typeof e)return this.onAny(e),this;if("function"!=typeof i)throw new Error("on only accepts instances of Function");if(this._events||t.call(this),this.emit("newListener",e,i),this.wildcard)return r.call(this,e,i),this;if(this._events[e]){if("function"==typeof this._events[e])this._events[e]=[this._events[e],i];else if(l(this._events[e])&&(this._events[e].push(i),!this._events[e].warned)){var s=o;void 0!==this._events.maxListeners&&(s=this._events.maxListeners),s>0&&this._events[e].length>s&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),console.trace())}}else this._events[e]=i;return this},s.prototype.onAny=function(e){if("function"!=typeof e)throw new Error("onAny only accepts instances of Function");return this._all||(this._all=[]),this._all.push(e),this},s.prototype.addListener=s.prototype.on,s.prototype.off=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");var i,s=[];if(this.wildcard){var r="string"==typeof e?e.split(this.delimiter):e.slice();s=n.call(this,null,r,this.listenerTree,0)}else{if(!this._events[e])return this;i=this._events[e],s.push({_listeners:i})}for(var o=0;o0){for(i=0,s=(t=this._all).length;i>2),s=0;s>6):(s<55296?n.push(224|s>>12):(s=65536+((s=(1023&s)<<10)|1023&t.charCodeAt(++r)),n.push(240|s>>18),n.push(128|s>>12&63)),n.push(128|s>>6&63)),n.push(128|63&s))}return m(3,n.length),p(n);default:if(Array.isArray(t))for(m(4,o=t.length),r=0;r>5!==e)throw"Invalid indefinite length element";return i}function M(e,t){for(var i=0;i>10),e.push(56320|1023&n))}}"function"!=typeof d&&(d=function(e){return e}),"function"!=typeof y&&(y=function(){return A});var e=function e(){var t,i,n=x(),r=n>>5,n=31&n;if(7==r)switch(n){case 25:var s=new ArrayBuffer(4),s=new DataView(s),o=T(),a=31744&o,c=1023&o;if(31744===a)a=261120;else if(0!==a)a+=114688;else if(0!=c)return c*U;return s.setUint32(0,(32768&o)<<16|a<<13|c<<13),s.getFloat32(0);case 26:return w(g.getFloat32(b),4);case 27:return w(g.getFloat64(b),8)}if((t=S(n))<0&&(r<2||6this._maxListeners&&(l._listeners.warned=!0,f.call(this,l._listeners.length,c))):l._listeners=t,!0;return!0}.call(this,e,t,i):this._events[e]?("function"==typeof this._events[e]&&(this._events[e]=[this._events[e]]),i?this._events[e].unshift(t):this._events[e].push(t),!this._events[e].warned&&0this._maxListeners&&(this._events[e].warned=!0,f.call(this,this._events[e].length,e))):this._events[e]=t,r},r.prototype.off=function(e,t){if("function"!=typeof t)throw new Error("removeListener only takes instances of Function");var i=[];if(this.wildcard){var n="string"==typeof e?e.split(this.delimiter):e.slice();if(!(i=_.call(this,null,n,this.listenerTree,0)))return this}else{if(!this._events[e])return this;o=this._events[e],i.push({_listeners:o})}for(var r=0;rt.secs)&&(e.secs + + + + + + + + + + + +

Simple roslib Example

+

Check your Web Console for output.

+ + diff --git a/src/server/src/main/resources/test.js b/src/server/src/main/resources/test.js new file mode 100644 index 0000000..0bf1978 --- /dev/null +++ b/src/server/src/main/resources/test.js @@ -0,0 +1,97 @@ + + // document.write('\n'); + // document.write('\n'); + + var ros = new ROSLIB.Ros({ + url : 'ws://192.168.43.20:9090' +}); + + ros.on('connection', function() { + console.log('Connected to websocket server.'); +}); + + ros.on('error', function(error) { + console.log('Error connecting to websocket server: ', error); +}); + + ros.on('close', function() { + console.log('Connection to websocket server closed.'); +}); + var move_base= new ROSLIB.ActionClient({ + ros : ros, + serverName : '/move_base', + actionName : 'move_base_msgs/MoveBaseAction' + }); + + var currentTime = new Date(); + var secs = Math.floor(currentTime.getTime()/1000) + var nsecs = Math.round(1000000000*(currentTime.getTime()/1000-secs)) + + var goal = new ROSLIB.Goal({ + actionClient: move_base, + goalMessage:{ + target_pose:{ + header:{ + frame_id:'map', + stamp:{ + secs: secs, + nsecs:nsecs + } + }, + pose:{ + position:{ + x:-3.97, //-0.743 -0.0273 取件点 + y:1.68, //3.00 -0.09 + z:0.000 + }, + orientation:{ + x:0.000, + y:0.000, + z:0.000, + w:1.000 + } + } + } + } + }); + goal.on('feedback', function(feedback) { + console.log('Feedback: ' + feedback.sequence); + }); + + goal.on('result', function(result) { + console.log('Final Result: ' + result.sequence); + }); + + ros.on('connection', function() { + console.log('Connected to websocket server.'); + }); + + ros.on('error', function(error) { + console.log('Error connecting to websocket server: ', error); + }); + + ros.on('close', function() { + console.log('Connection to websocket server closed.'); + }); + + //goal.send(); + var cmdVel = new ROSLIB.Topic({ + ros : ros, + name : '/cmd_vel', + messageType : 'geometry_msgs/Twist' + }); + + var twist = new ROSLIB.Message({ + linear : { + x : 0.1, + y : 0.2, + z : 0.3 + }, + angular : { + x : -0.1, + y : -0.2, + z : -0.3 + } + }); + cmdVel.publish(twist); + diff --git a/src/server/src/test/java/com/example/testdemo/TestdemoApplicationTests.java b/src/server/src/test/java/com/example/testdemo/TestdemoApplicationTests.java new file mode 100644 index 0000000..7558b00 --- /dev/null +++ b/src/server/src/test/java/com/example/testdemo/TestdemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.testdemo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TestdemoApplicationTests { + + @Test + void contextLoads() { + } + +}