[FEAT] 實作機器連線環境切換功能 (Demo vs 正式站)

1. 在 activity_setting.xml 新增環境切換單選鈕 (RadioGroup)。
2. 修改 SettingActivity.java 處理環境切換邏輯與 UI 初始化。
3. 修改 MachineStructure.java 新增 mqttEnv 欄位以儲存環境狀態。
4. 修改 MyApp.java 在啟動時從資料庫載入環境設定。
5. 修改 StarCloudAPI.java 使 API BASE_URL 根據環境設定動態切換。
6. 修改 MqttManager.java 使 MQTT Broker Host 根據環境設定動態切換。
7. 更新正式站 API (starcloud.taiwan-star.com.tw) 與 MQTT (emqx.taiwan-star.com.tw) 位址。
This commit is contained in:
sky121113 2026-05-15 12:55:15 +08:00
parent 43b1a8b3e3
commit 65dd123d0c
6 changed files with 68 additions and 11 deletions

View File

@ -440,6 +440,9 @@ public class MyApp extends Application {
logs.info("initialSettingData Machine:" + setting.toString());
MyApp.getInstance().getMachine().setApiKey(setting.getData(0));
MyApp.getInstance().getMachine().setMachineID(setting.getData(1));
if (setting.getDataCount() >= 3 && setting.getData(2) != null && !setting.getData(2).isEmpty()) {
MyApp.getInstance().getMachine().setMqttEnv(setting.getData(2));
}
}
}

View File

@ -35,8 +35,13 @@ import java.util.ArrayList;
public class StarCloudAPI {
private static final String TAG = "StarCloudAPI";
// Star-Cloud API 基礎路徑
private static final String BASE_URL = "https://demo-cloud.setdomains.work/api/v1/app/";
private String getBaseUrl() {
if ("prod".equals(MyApp.getInstance().getMachine().getMqttEnv())) {
return "https://starcloud.taiwan-star.com.tw/api/v1/app/";
} else {
return "https://demo-cloud.setdomains.work/api/v1/app/";
}
}
private HandlerMain handlerMain;
private HandlerMain srcHandlerMain;
@ -51,7 +56,7 @@ public class StarCloudAPI {
*/
public void login(final String account, final String password) {
Log.i(TAG, "login() called for account: " + account);
final String url = BASE_URL + "admin/login/B000";
final String url = getBaseUrl() + "admin/login/B000";
Log.i(TAG, "Starting B000 request to: " + url);
// 不依賴 FormPostMainScheduler (會靜默吞掉 IO exception)
@ -156,7 +161,7 @@ public class StarCloudAPI {
return;
}
final String url = BASE_URL + "machine/setting/B014?machine=" + machineId;
final String url = getBaseUrl() + "machine/setting/B014?machine=" + machineId;
Log.i(TAG, "Starting B014 request to: " + url);
new Thread(new Runnable() {
@ -242,7 +247,7 @@ public class StarCloudAPI {
* 需要 Bearer Token 認證
*/
public void downloadProductInfo() {
final String url = BASE_URL + "machine/products/B012";
final String url = getBaseUrl() + "machine/products/B012";
Log.i(TAG, "Starting B012 request to: " + url);
new Thread(new Runnable() {
@ -336,7 +341,7 @@ public class StarCloudAPI {
* 需要 Bearer Token 認證
*/
public void reportSlotList(final ReportSlotListStructure data) {
final String url = BASE_URL + "products/supplementary/B009";
final String url = getBaseUrl() + "products/supplementary/B009";
Log.i(TAG, "Starting B009 request to: " + url);
new Thread(new Runnable() {
@ -449,7 +454,7 @@ public class StarCloudAPI {
*/
public void verifyStaffCard(final String cardNo, final VerificationCallback callback) {
final String machineId = MyApp.getInstance().getMachine().getMachineID();
final String url = BASE_URL + "machine/staff/verify/B680";
final String url = getBaseUrl() + "machine/staff/verify/B680";
Log.i(TAG, "Starting B680 request for card: " + cardNo);
new Thread(new Runnable() {
@ -595,7 +600,8 @@ public class StarCloudAPI {
settingsDao.insertOne(new SettingStructure(MyApp.getInstance().getMachine().getClass().getSimpleName(),
new String[] {
MyApp.getInstance().getMachine().getApiKey(),
MyApp.getInstance().getMachine().getMachineID()
MyApp.getInstance().getMachine().getMachineID(),
MyApp.getInstance().getMachine().getMqttEnv()
}));
settingsDao.insertOne(new SettingStructure(MyApp.getInstance().getEsunpay().getClass().getSimpleName(),
@ -689,7 +695,7 @@ public class StarCloudAPI {
}
public void downloadAdvertisement(final Runnable onComplete) {
final String url = BASE_URL + "machine/ad/B005";
final String url = getBaseUrl() + "machine/ad/B005";
Log.i(TAG, "Starting B005 request to: " + url);
new Thread(new Runnable() {

View File

@ -78,10 +78,15 @@ public class MqttManager {
}
}
String serverHost = "mqtt.setdomains.work";
if ("prod".equals(MyApp.getInstance().getMachine().getMqttEnv())) {
serverHost = "emqx.taiwan-star.com.tw";
}
client = MqttClient.builder()
.useMqttVersion3()
.identifier(clientId)
.serverHost("mqtt.setdomains.work")
.serverHost(serverHost)
.serverPort(443)
.useSslWithDefaultConfig()
.webSocketConfig()

View File

@ -3,6 +3,7 @@ package com.unibuy.smartdevice.structure;
public class MachineStructure {
private String apiKey = "KahnEwjhfDBHUYS7";
private String machineID;
private String mqttEnv = "demo";
public MachineStructure(String machineID) {
this.machineID = machineID;
}
@ -27,4 +28,12 @@ public class MachineStructure {
public void setMachineID(String machineID) {
this.machineID = machineID;
}
public String getMqttEnv() {
return mqttEnv;
}
public void setMqttEnv(String mqttEnv) {
this.mqttEnv = mqttEnv;
}
}

View File

@ -96,6 +96,11 @@ public class SettingActivity extends AppCompatActivityAbstract {
case DATA_RELOAD:
binding.buttonBack.setVisibility(View.INVISIBLE);
MyApp.getInstance().getMachine().setMachineID(binding.editMachineID.getText().toString());
if (binding.radioProd.isChecked()) {
MyApp.getInstance().getMachine().setMqttEnv("prod");
} else {
MyApp.getInstance().getMachine().setMqttEnv("demo");
}
binding.progressLayout.setVisibility(View.VISIBLE); // 確保進度條顯示
try {
starCloudAPI.downloadSetting();
@ -167,6 +172,12 @@ public class SettingActivity extends AppCompatActivityAbstract {
binding.buttonReload.setText("重新綁定");
}
if ("prod".equals(MyApp.getInstance().getMachine().getMqttEnv())) {
binding.radioProd.setChecked(true);
} else {
binding.radioDemo.setChecked(true);
}
if (statusList.isEmpty()) {
SettinglogsDao settinglogsDao = new SettinglogsDao(this);
for (String data : settinglogsDao.getAll()) {

View File

@ -29,13 +29,36 @@
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<RadioGroup
android:id="@+id/radioGroupMqttEnv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout">
<RadioButton
android:id="@+id/radioDemo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Demo 站"
android:textSize="20sp"
android:checked="true"/>
<RadioButton
android:id="@+id/radioProd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正式站"
android:textSize="20sp"
android:layout_marginStart="20dp"/>
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout">
app:layout_constraintTop_toBottomOf="@+id/radioGroupMqttEnv">
<androidx.recyclerview.widget.RecyclerView
android:layout_marginStart="10dp"