app/build.gradle
@@ -66,6 +66,9 @@ implementation 'com.github.huangyanbin:SmartTable:2.2.0' //下拉选择框控件 implementation 'com.github.arcadefire:nice-spinner:1.3.4' //支持MQTT协议 implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' app/src/main/AndroidManifest.xml
@@ -24,6 +24,7 @@ </activity> <activity android:name=".TakeActivity"/> <activity android:name="ManageActivity"/> <activity android:name=".AdminLoginActivity"/> <service android:name=".device.service.CanGuiService" app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java
New file @@ -0,0 +1,60 @@ package com.lotaai.canguiayw; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import com.blankj.utilcode.util.LogUtils; import com.lotaai.canguiayw.device.service.CanGuiService; public class AdminLoginActivity extends AppCompatActivity { private Context context; private EditText loginName; private EditText loginPwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_admin_login); context = AdminLoginActivity.this; loginName = findViewById(R.id.loginName); loginPwd = findViewById(R.id.loginpwd); } public void confirmLogin(View view){ Intent intent = new Intent(); intent.setClass(AdminLoginActivity.this, ManageActivity.class); startActivity(intent); } public void cancelLogin(View view){ Intent intent = new Intent(); intent.setClass(AdminLoginActivity.this, MainActivity.class); startActivity(intent); } @Override public void finish(){ } @Override public boolean onTouchEvent(MotionEvent event) { if(null != this.getCurrentFocus()){ /** * 点击空白位置 隐藏软键盘 */ InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); assert mInputMethodManager != null; return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); } return super .onTouchEvent(event); } } app/src/main/java/com/lotaai/canguiayw/MainActivity.java
@@ -9,6 +9,8 @@ import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import com.blankj.utilcode.util.LogUtils; import com.lotaai.canguiayw.device.CanGuiCommand; import com.lotaai.canguiayw.device.CanguiStatus; @@ -20,19 +22,30 @@ public class MainActivity extends AppCompatActivity { private Context context; private ImageView logoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LogUtils.i("VERSION.SDK_INT:" +VERSION.SDK_INT); logoView = findViewById(R.id.logo); context = MainActivity.this; Intent startIntent = new Intent(context, CanGuiService.class); startService(startIntent); logoView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { Intent intent = new Intent(); intent.setClass(MainActivity.this, AdminLoginActivity.class); startActivity(intent); return true; } }); } public void gotoSetting(View view){ Intent intent = new Intent(); intent.setClass(MainActivity.this, ManageActivity.class); intent.setClass(MainActivity.this, AdminLoginActivity.class); startActivity(intent); } app/src/main/java/com/lotaai/canguiayw/ManageActivity.java
@@ -3,8 +3,10 @@ import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; @@ -205,4 +207,37 @@ finish(); } public interface MyTouchListener { public void onTouchEvent(MotionEvent event); } // 保存MyTouchListener接口的列表 private ArrayList<MyTouchListener> myTouchListeners = new ArrayList<ManageActivity.MyTouchListener>(); /** * 提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法 * @param listener */ public void registerMyTouchListener(MyTouchListener listener) { myTouchListeners.add(listener); } /** * 提供给Fragment通过getActivity()方法来取消注册自己的触摸事件的方法 * @param listener */ public void unRegisterMyTouchListener(MyTouchListener listener) { myTouchListeners.remove( listener ); } /** * 分发触摸事件给所有注册了MyTouchListener的接口 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { for (MyTouchListener listener : myTouchListeners) { listener.onTouchEvent(ev); } return super.dispatchTouchEvent(ev); } } app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java
@@ -100,7 +100,6 @@ try { Thread.sleep(1000); showHandler.sendEmptyMessage(1); Log.i(TAG,"在运行"); } catch (InterruptedException e) { e.printStackTrace(); }catch (Exception e){ app/src/main/java/com/lotaai/canguiayw/SettingFragment.java
@@ -10,8 +10,10 @@ import android.os.Message; import android.text.Spannable; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; @@ -52,6 +54,20 @@ } context = container.getContext(); initSpinner(); /* Fragment中,注册 * 接收MainActivity的Touch回调的对象 * 重写其中的onTouchEvent函数,并进行该Fragment的逻辑处理 */ ManageActivity.MyTouchListener myTouchListener = new ManageActivity.MyTouchListener() { @Override public void onTouchEvent(MotionEvent event) { System.out.println("23333333333333333"); } }; // 将myTouchListener注册到分发列表 ((ManageActivity)this.getActivity()).registerMyTouchListener(myTouchListener); return root; } @@ -73,4 +89,5 @@ } }); } } app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java
@@ -189,15 +189,19 @@ List<CanguiStatus> list = new ArrayList<>(); if (recv.length > 0) { int guiHao = recv[3] & 0xff; for (int i = 1; i <= 9; i++) { //开始解析8个格子的状态 int num = 9; if (guiHao == 0){ num = 8; } for (int i = 1; i <= num; i++) { //开始解析格子的状态 CanguiStatus status = new CanguiStatus(); //柜号 status.setGuiHao(guiHao); //格子号 status.setGridNo(i); //温度 int site = i * 2 + 5;//温度 int site = (i-1) * 2 + 5;//温度 int wendu = recv[site] & 0xff; status.setWendu(wendu); site = site + 1; app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java
@@ -105,8 +105,8 @@ for (int i = 0; i < statuses.size(); i++){ CanguiStatus s = statuses.get(i); SettingConfig.getInstance().addStatusInList(s); // LogUtils.i("柜:" + s.getGuiHao(),"格:" + s.getGridNo(),"温度:" + s.getWendu(), // "门:"+s.isDoorIsOpen(),"加热:"+s.isJiareIsOpen(),"灯光:" + s.isDengGuangIsOpen(),"消毒:" + s.isXiaoDuIsOpen()); LogUtils.i("柜:" + s.getGuiHao(),"格:" + s.getGridNo(),"温度:" + s.getWendu(), "门:"+s.isDoorIsOpen(),"加热:"+s.isJiareIsOpen(),"灯光:" + s.isDengGuangIsOpen(),"消毒:" + s.isXiaoDuIsOpen()); } } } app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java
New file @@ -0,0 +1,181 @@ package com.lotaai.canguiayw.mqtt; import android.app.Service; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.IBinder; import android.util.Log; import androidx.annotation.Nullable; import org.eclipse.paho.android.service.MqttAndroidClient; import org.eclipse.paho.client.mqttv3.IMqttActionListener; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; public class MQTTService extends Service { public static final String TAG = MQTTService.class.getSimpleName(); private static MqttAndroidClient client; private MqttConnectOptions conOpt; private String host = "tcp://xxx"; //服务器地址 private String userName = "xxx"; //账号 private String passWord = " xxx"; //密码 private static String myTopic = "topic"; //频道名 private String clientId = "mqtt_client"; //客户端ID @Override public int onStartCommand(Intent intent, int flags, int startId) { init(); return super.onStartCommand(intent, flags, startId); } public static void publish(String msg) { String topic = myTopic; Integer qos = 2; Boolean retained = false; try { client.publish(topic, msg.getBytes(), qos.intValue(), retained.booleanValue()); } catch (MqttException e) { e.printStackTrace(); } } private void init() { // 服务器地址(协议+地址+端口号) String uri = host; client = new MqttAndroidClient(this, uri, clientId); // 设置MQTT监听并且接受消息 client.setCallback(mqttCallback); conOpt = new MqttConnectOptions(); // 清除缓存 conOpt.setCleanSession(true); // 设置超时时间,单位:秒 conOpt.setConnectionTimeout(10); // 心跳包发送间隔,单位:秒 conOpt.setKeepAliveInterval(20); // 用户名 conOpt.setUserName(userName); // 密码 conOpt.setPassword(passWord.toCharArray()); // last will message boolean doConnect = true; String message =""; String topic = myTopic; Integer qos = 2; Boolean retained = false; if ((!message.equals("")) || (!topic.equals(""))) { // 最后 try { conOpt.setWill(topic, message.getBytes(), qos.intValue(), retained.booleanValue()); } catch (Exception e) { Log.i(TAG, "Exception Occured", e); doConnect = false; iMqttActionListener.onFailure(null, e); } } if (doConnect) { doClientConnection(); } } @Override public void onDestroy() { try { client.disconnect(); //服务销毁,断开连接 } catch (MqttException e) { e.printStackTrace(); } super.onDestroy(); } /** * 连接MQTT服务器 */ private void doClientConnection() { if (!client.isConnected() && isConnectIsNomarl()) { try { client.connect(conOpt, null, iMqttActionListener); } catch (MqttException e) { e.printStackTrace(); } } } // MQTT是否连接成功 private IMqttActionListener iMqttActionListener = new IMqttActionListener() { @Override public void onSuccess(IMqttToken arg0) { Log.i(TAG, "连接成功 "); try { // 订阅myTopic话题,当订阅多条频道,需要遍历逐条订阅,否则有可能订阅失败 client.subscribe(myTopic, 1); } catch (MqttException e) { e.printStackTrace(); } } @Override public void onFailure(IMqttToken arg0, Throwable arg1) { arg1.printStackTrace(); // 连接失败,重连 } }; // MQTT监听并且接受消息 private MqttCallback mqttCallback = new MqttCallback() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { String str1 = new String(message.getPayload()); String str2 = topic + ";qos:" + message.getQos() + ";retained:" + message.isRetained(); Log.i(TAG, "messageArrived:" + str1); Log.i(TAG, str2); } @Override public void deliveryComplete(IMqttDeliveryToken arg0) { } @Override public void connectionLost(Throwable arg0) { // 失去连接,重连 } }; /** * 判断网络是否连接 */ private boolean isConnectIsNomarl() { ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = connectivityManager.getActiveNetworkInfo(); if (info != null && info.isAvailable()) { String name = info.getTypeName(); Log.i(TAG, "MQTT当前网络名称:" + name); return true; } else { Log.i(TAG, "MQTT 没有可用网络"); return false; } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java
@@ -22,12 +22,14 @@ /** Creates underlying database table using DAOs. */ public static void createAllTables(Database db, boolean ifNotExists) { OrderDao.createTable(db, ifNotExists); OrderDetailDao.createTable(db, ifNotExists); TestDao.createTable(db, ifNotExists); } /** Drops underlying database table using DAOs. */ public static void dropAllTables(Database db, boolean ifExists) { OrderDao.dropTable(db, ifExists); OrderDetailDao.dropTable(db, ifExists); TestDao.dropTable(db, ifExists); } @@ -48,6 +50,7 @@ public DaoMaster(Database db) { super(db, SCHEMA_VERSION); registerDaoClass(OrderDao.class); registerDaoClass(OrderDetailDao.class); registerDaoClass(TestDao.class); } app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java
@@ -9,9 +9,11 @@ import org.greenrobot.greendao.internal.DaoConfig; import com.lotaai.canguiayw.sqllitedb.Order; import com.lotaai.canguiayw.sqllitedb.OrderDetail; import com.lotaai.canguiayw.sqllitedb.Test; import com.lotaai.canguiayw.sqllitedb.OrderDao; import com.lotaai.canguiayw.sqllitedb.OrderDetailDao; import com.lotaai.canguiayw.sqllitedb.TestDao; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. @@ -24,9 +26,11 @@ public class DaoSession extends AbstractDaoSession { private final DaoConfig orderDaoConfig; private final DaoConfig orderDetailDaoConfig; private final DaoConfig testDaoConfig; private final OrderDao orderDao; private final OrderDetailDao orderDetailDao; private final TestDao testDao; public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig> @@ -36,18 +40,24 @@ orderDaoConfig = daoConfigMap.get(OrderDao.class).clone(); orderDaoConfig.initIdentityScope(type); orderDetailDaoConfig = daoConfigMap.get(OrderDetailDao.class).clone(); orderDetailDaoConfig.initIdentityScope(type); testDaoConfig = daoConfigMap.get(TestDao.class).clone(); testDaoConfig.initIdentityScope(type); orderDao = new OrderDao(orderDaoConfig, this); orderDetailDao = new OrderDetailDao(orderDetailDaoConfig, this); testDao = new TestDao(testDaoConfig, this); registerDao(Order.class, orderDao); registerDao(OrderDetail.class, orderDetailDao); registerDao(Test.class, testDao); } public void clear() { orderDaoConfig.clearIdentityScope(); orderDetailDaoConfig.clearIdentityScope(); testDaoConfig.clearIdentityScope(); } @@ -55,6 +65,10 @@ return orderDao; } public OrderDetailDao getOrderDetailDao() { return orderDetailDao; } public TestDao getTestDao() { return testDao; } app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java
@@ -13,7 +13,7 @@ @NotNull private String gridNo; @NotNull private int state;//0--空闲 1-占用 2-锁定 private int state;//状态;0-未存餐 1-已存餐 2-已取餐 3-取消 private long putInDate; private String takeCode; @Generated(hash = 2118332125) app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java
New file @@ -0,0 +1,50 @@ package com.lotaai.canguiayw.sqllitedb; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.NotNull; import org.greenrobot.greendao.annotation.Generated; @Entity public class OrderDetail { @Id private long id; @NotNull private String orderNo; private String itemName; private int num; @Generated(hash = 1442626585) public OrderDetail(long id, @NotNull String orderNo, String itemName, int num) { this.id = id; this.orderNo = orderNo; this.itemName = itemName; this.num = num; } @Generated(hash = 268085433) public OrderDetail() { } public long getId() { return this.id; } public void setId(long id) { this.id = id; } public String getOrderNo() { return this.orderNo; } public void setOrderNo(String orderNo) { this.orderNo = orderNo; } public String getItemName() { return this.itemName; } public void setItemName(String itemName) { this.itemName = itemName; } public int getNum() { return this.num; } public void setNum(int num) { this.num = num; } } app/src/main/res/layout/activity_admin_login.xml
New file @@ -0,0 +1,94 @@ <LinearLayout 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="match_parent" android:layout_height="match_parent" android:background="@color/bgcolor" android:layout_gravity="center" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="120dp" android:layout_gravity="center" android:layout_marginTop="200dp" android:orientation="horizontal"> <TextView android:layout_width="150dp" android:layout_height="80dp" android:gravity="right|center_vertical" android:text="账号:" android:layout_margin="10dp" android:textColor="@color/white" android:textSize="30dp" /> <EditText android:id="@+id/loginName" android:layout_width="300dp" android:layout_height="80dp" android:layout_margin="10dp" android:gravity="center" android:background="@drawable/round_editstyle" android:hint="账号" android:textColorHint="@color/white" android:textAlignment="center" android:textColor="@color/white" android:textSize="30dp" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="120dp" android:layout_gravity="center" android:orientation="horizontal"> <TextView android:layout_width="150dp" android:layout_height="80dp" android:layout_margin="10dp" android:gravity="right|center_vertical" android:text="密码:" android:textColor="@color/white" android:textSize="30dp" /> <EditText android:id="@+id/loginpwd" android:layout_width="300dp" android:layout_height="80dp" android:layout_margin="10dp" android:gravity="center" android:background="@drawable/round_editstyle" android:hint="密码" android:textColorHint="@color/white" android:textAlignment="center" android:inputType="textPassword" android:textColor="@color/white" android:textSize="30dp" /> </LinearLayout> <LinearLayout android:layout_width="540dp" android:layout_height="120dp" android:layout_gravity="center" android:layout_marginTop="50dp" android:orientation="horizontal"> <Button android:id="@+id/jihuo" android:layout_width="250dp" android:layout_height="80dp" android:textSize="30dp" android:layout_margin="10dp" android:layout_gravity="center" android:gravity="center" android:onClick="confirmLogin" android:background="@drawable/circular_button" android:text="登录"/> <Button android:id="@+id/save" android:layout_width="250dp" android:layout_height="80dp" android:textSize="30dp" android:layout_margin="10dp" android:layout_gravity="center" android:gravity="center" android:onClick="cancelLogin" android:background="@drawable/circular_button_blue" android:text="返回"/> </LinearLayout> </LinearLayout> app/src/main/res/layout/activity_main.xml
@@ -9,6 +9,7 @@ <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab" android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" @@ -24,6 +25,15 @@ app:pressedTranslationZ="5dp" app:rippleColor="@color/DarkGray" /> <ImageView android:id="@+id/logo" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="center" android:layout_marginTop="50dp" android:layout_marginLeft="50dp" android:src="@mipmap/logo"/> <LinearLayout android:layout_width="450dp" android:layout_height="450dp" app/src/main/res/mipmap-hdpi/logo.png