2020-06-24 1.增加手动添加生成设备接口方法。 2.增加通用开关和安防模块支持。
18个文件已添加
9个文件已修改
2815 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/AddDevicesActivity.java 413 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/AppliancesActivity.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/CtrlCommonSwitchActivity.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/CtrlSecurityActivity.java 318 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/MainActivity.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_add_devices.xml 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_ctrl_common_switch.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_ctrl_security.xml 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_sensor.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/dimens.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/Config/Configuration.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/Config/HDLApConfig.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLCommonSwitch/CommonSwitchBackInfo.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLSecurity/Parser/SecurityParser.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLSecurity/SecurityArmingStateBackInfo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLSecurity/SecurityBackInfo.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Bean/SecurityStateBean.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLCommand.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLDeviceManager.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLSDK.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLUdpCore.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/CommonSwitchCtrlBackEvent.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/CommonSwitchStateBackEvent.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/SecurityAlarmFeedBackEvent.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/SecurityArmingFeedBackEvent.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Parser/DeviceParser.java 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -18,7 +18,8 @@
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.SettingActivity"></activity>
        <activity android:name=".activity.AddDevicesActivity"></activity>
        <activity android:name=".activity.SettingActivity" />
        <activity android:name=".activity.AddDevicesManuallyActivity" />
        <activity android:name=".activity.MainActivity">
            <intent-filter>
@@ -32,6 +33,8 @@
        <activity android:name=".activity.AudioActivity" />
        <activity android:name=".activity.FreshAirActivity" />
        <activity android:name=".activity.GeothermalActivity" />
        <activity android:name=".activity.CtrlCommonSwitchActivity" />
        <activity android:name=".activity.CtrlSecurityActivity" />
        <receiver android:name=".activity.BootComplete">
            <intent-filter>
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/AddDevicesActivity.java
New file
@@ -0,0 +1,413 @@
package com.hdl.sdk.hdl_sdk.activity;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.hdl.sdk.hdl_core.Config.Configuration;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.DevicesData;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Parser.DeviceParser;
import com.hdl.sdk.hdl_sdk.R;
import java.util.ArrayList;
/** SDK目前支持的大类:小类
 * 灯光类:调光回路、开关回路、混合调光类、混合开关类
 * 窗帘类:开合帘电机、卷帘电机、窗帘模块
 * 空调功能:HVAC 模块、通用空调面板
 * 背景音乐功能:背景音乐模块 2018新背景音乐模块小类3
 * 传感器:干结点0 到 功率24
 * 逻辑功能:逻辑模块
 * 全局场景:
 * 地热功能:地热模块
 * 新风:新风系统
 * 灯光类1:0 ,1,9,10
 * 窗帘类2:0,1,2
 * 传感器5:0~24
 * 空调类7:0,3
 * 地热模块8:0
 * 背景音乐功能9:0
 * 逻辑功能12:0
 * 全局场景17:0
 * 新风模块19:0
 * 通用开关100:0
 *
 * 该方法应用于提供项目交付前的提取批量数据生成好数据。
 * 模拟生成设备回路数据,在项目不支持简易编程搜索情况下,可以通过该方法,先快捷生成目标数据 得到 List<DevicesData> 格式的设备列表数据
 *
 * 上层做本地保存或者云端备份,App启动时读取恢复
 * 每次启动时先加载生成好的设备列表数据,然后在 SDK 初始化后,赋值给 HDLDeviceManager.devicesDataList
 */
public class AddDevicesActivity extends Activity {
    private int bigType;
    private int littleType;
    private int mSubnetID;
    private int mDeviceID;
    private int mChannelNum;
    private int port = 6000;
    private String parentRemarks;
    private ArrayList<String> parentRemarksList = new ArrayList();
    private EditText et_subnetID, et_deviceID, et_bitType, et_littleType, et_remarks, et_remarks_mk, et_mChannelNum,et_scene,et_mPort;
    private Button btn_add,btn_scene,btn_addAll;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_devices);
        et_subnetID = findViewById(R.id.et_subnetID);
        et_deviceID = findViewById(R.id.et_deviceID);
        et_bitType = findViewById(R.id.et_bitType);
        et_littleType = findViewById(R.id.et_littleType);
        et_remarks = findViewById(R.id.et_remarks);
//        et_port = findViewById(R.id.et_port);
        et_remarks_mk = findViewById(R.id.et_remarks_mk);
        et_mChannelNum = findViewById(R.id.et_mChannelNum);
        et_mPort = findViewById(R.id.et_mPort);
        et_scene = findViewById(R.id.et_scene);
        btn_add = findViewById(R.id.btn_add);
        btn_scene = findViewById(R.id.btn_scene);
        btn_addAll= findViewById(R.id.btn_addAll);
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addDevicesManuallyWithoutSearchingAll();
            }
        });
        btn_scene.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addScene();
            }
        });
        btn_addAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addMultipleDevices();
            }
        });
    }
    private void addDevicesManuallyWithoutSearchingAll() {
//        parentRemarksList.clear();
        String subnetIDStr = et_subnetID.getText().toString();
        if (TextUtils.isEmpty(subnetIDStr)) {
            showToast("子网号不能为空");
            return;
        }
        String deviceIDStr = et_deviceID.getText().toString();
        if (TextUtils.isEmpty(deviceIDStr)) {
            showToast("设备号不能为空");
            return;
        }
        String bitTypeStr = et_bitType.getText().toString();
        if (TextUtils.isEmpty(bitTypeStr)) {
            showToast("大类不能为空");
            return;
        }
        String littleTypeStr = et_littleType.getText().toString();
        if (TextUtils.isEmpty(littleTypeStr)) {
            showToast("小类不能为空");
            return;
        }
        String mChannelNumStr = et_mChannelNum.getText().toString();
        if (TextUtils.isEmpty(littleTypeStr)) {
            showToast("回路号不能为空");
            return;
        }
        String mPortStr = et_mPort.getText().toString();
        if (TextUtils.isEmpty(mPortStr)) {
            showToast("端口号不能为空");
            return;
        }
        String remarksMkString = et_remarks_mk.getText().toString();
        if (TextUtils.isEmpty(remarksMkString)) {
            showToast("模块备注不能为空");
            return;
        }
        String remarksString = et_remarks.getText().toString();
        if (TextUtils.isEmpty(remarksString)) {
            showToast("备注不能为空");
            return;
        }
//        String et_portString = et_port.getText().toString();
//        if (TextUtils.isEmpty(et_portString)) {
//            showToast("端口不能为空");
//            return;
//        }
        mSubnetID = Integer.parseInt(subnetIDStr);
        mDeviceID = Integer.parseInt(deviceIDStr);
        bigType = Integer.parseInt(bitTypeStr);
        littleType = Integer.parseInt(littleTypeStr);
        mChannelNum = Integer.parseInt(mChannelNumStr);
        parentRemarks = remarksMkString;
        port =  Integer.parseInt(mPortStr);
        /**
         * 添加设备回路
         * 如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
         * @param bigType 回路大类
         * @param littleType 回路小类
         * @param mSubnetID  回路子网ID
         * @param mDeviceID  回路设备ID
         * @param mChannelNum  回路号
         * @param mChannelRemark 回路备注 例如:窗帘、吊灯、厕所灯、电视
         * @param parentRemarks  当前回路模块的备注 例如: 酒店RCU模块
         * @return
         */
        //如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
        DevicesData mDevicesData = DeviceParser.addDevicesListWithoutSearching(port, bigType, littleType, mSubnetID, mDeviceID, mChannelNum, remarksString, parentRemarks,true);
        if (mDevicesData != null) {
            showToast("添加成功");
        } else {
            showToast("添加失败");
        }
    }
    /**
     * 添加场景设备回路 需指定 场景区号 和 场景号
     * 如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
     *
     * @param mSubnetID
     * @param mDeviceID
     * @param mAreaNum       //场景 区域号
     * @param mAreaSceneNum  //场景 当前区域场景号
     * @param mChannelRemark 读取场景的备注名称 例如: 入住、起床模式、阅读模式
     * @param parentRemarks  当前回路模块的备注 例如: 酒店RCU模块
     * @param bSaveAndCallBack 是否马上保存本地并且推送DevicesInfoEvent 事件
     * @return
     */
    private void AddScenesDevices(int mSubnetID, int mDeviceID, int mAreaNum, int mAreaSceneNum, String mChannelRemark, String parentRemarks, boolean bSaveAndCallBack) {
        //添加场景
        DevicesData mScenesData = DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, mAreaNum, mAreaSceneNum, mChannelRemark, parentRemarks,true);
    }
    /**
     * 添加场景回路
     */
    private void addScene(){
        String subnetIDStr = et_subnetID.getText().toString();
        if (TextUtils.isEmpty(subnetIDStr)) {
            showToast("子网号不能为空");
            return;
        }
        String deviceIDStr = et_deviceID.getText().toString();
        if (TextUtils.isEmpty(deviceIDStr)) {
            showToast("设备号不能为空");
            return;
        }
        String mPortStr = et_mPort.getText().toString();
        if (TextUtils.isEmpty(mPortStr)) {
            showToast("端口号不能为空");
            return;
        }
//        String bitTypeStr = et_bitType.getText().toString();
//        if (TextUtils.isEmpty(bitTypeStr)) {
//            showToast("大类不能为空");
//            return;
//        }
//
//        String littleTypeStr = et_littleType.getText().toString();
//        if (TextUtils.isEmpty(littleTypeStr)) {
//            showToast("小类不能为空");
//            return;
//        }
//        String mChannelNumStr = et_mChannelNum.getText().toString();
//        if (TextUtils.isEmpty(littleTypeStr)) {
//            showToast("回路号不能为空");
//            return;
//        }
        String remarksMkString = et_remarks_mk.getText().toString();
        if (TextUtils.isEmpty(remarksMkString)) {
            showToast("模块备注不能为空");
            return;
        }
        String remarksString = et_remarks.getText().toString();
        if (TextUtils.isEmpty(remarksString)) {
            showToast("备注不能为空");
            return;
        }
        String et_sceneString = et_scene.getText().toString();
        if (TextUtils.isEmpty(et_sceneString)) {
            showToast("场景ID不能为空");
            return;
        }
        mSubnetID = Integer.parseInt(subnetIDStr);
        mDeviceID = Integer.parseInt(deviceIDStr);
        port =  Integer.parseInt(mPortStr);
//        bigType = Integer.parseInt(bitTypeStr);
//        littleType = Integer.parseInt(littleTypeStr);
//        mChannelNum = Integer.parseInt(mChannelNumStr);
        parentRemarks = remarksMkString;
        int sceneID = Integer.parseInt(et_sceneString);
        DevicesData mScenesData = DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, sceneID, sceneID, remarksString, parentRemarks,true);
        if (mScenesData != null) {
            showToast("添加成功");
        } else {
            showToast("添加失败");
        }
    }
    /**
     * 批量添加
     * 仅做演示用
     */
    private void addMultipleDevices(){
        String subnetIDStr = et_subnetID.getText().toString();
        if (TextUtils.isEmpty(subnetIDStr)) {
            showToast("子网号不能为空");
            return;
        }
        String deviceIDStr = et_deviceID.getText().toString();
        if (TextUtils.isEmpty(deviceIDStr)) {
            showToast("设备号不能为空");
            return;
        }
        String remarksMkString = et_remarks_mk.getText().toString();
        if (TextUtils.isEmpty(remarksMkString)) {
            showToast("模块备注不能为空");
            return;
        }
        mSubnetID = Integer.parseInt(subnetIDStr);
        mDeviceID = Integer.parseInt(deviceIDStr);
        parentRemarks = remarksMkString;
//        //添加一个灯
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, mSubnetID, mDeviceID, 1, "吧台灯", parentRemarks,false);
//        //添加一个灯
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, mSubnetID, mDeviceID, 2, "休闲灯", parentRemarks,false);
//        //添加一个灯
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, mSubnetID, mDeviceID, 3, "电视灯", parentRemarks,false);
//        //添加一个灯
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, mSubnetID, mDeviceID, 6, "廊灯", parentRemarks,false);
//
//        //添加一个窗帘
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.CURTAIN_BIG_TYPE, 2, mSubnetID, mDeviceID, 1, "窗帘", parentRemarks,false);
//        //添加一个窗帘
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.CURTAIN_BIG_TYPE, 2, mSubnetID, mDeviceID, 2, "纱窗", parentRemarks,false);
//
//        //添加一个空调
//        DeviceParser.addDevicesListWithoutSearching(port, Configuration.AIR_BIG_TYPE, 0, mSubnetID, mDeviceID, 1, "房间空调", parentRemarks,false);
//
////        //添加通用开关 清理
////        DeviceParser.addDevicesListWithoutSearching(port, Configuration.COMMON_SWITCH_BIG_TYPE, 0, mSubnetID, mDeviceID, 15, "清理", parentRemarks,false);
////        //添加通用开关 入住
////        DeviceParser.addDevicesListWithoutSearching(port, Configuration.COMMON_SWITCH_BIG_TYPE, 0, mSubnetID, mDeviceID, 16, "入住", parentRemarks,false);
////        //添加通用开关 稍后
////        DeviceParser.addDevicesListWithoutSearching(port, Configuration.COMMON_SWITCH_BIG_TYPE, 0, mSubnetID, mDeviceID, 13, "稍后", parentRemarks,false);
////        //添加通用开关 勿扰
////        DeviceParser.addDevicesListWithoutSearching(port, Configuration.COMMON_SWITCH_BIG_TYPE, 0, mSubnetID, mDeviceID, 14, "勿扰", parentRemarks,false);
////        //添加一个安防模块
////        DeviceParser.addDevicesListWithoutSearching(port, Configuration.SECURITY_BIG_TYPE, 0, 12, 1, 1, "安防模块", "安防模块",false);
//
//        //添加一个场景 这里场景号和区号 默认一样
//        DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, 2, 2, "空置无卡", parentRemarks,false);
//        //添加一个场景
//        DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, 3, 3, "插卡场景", parentRemarks,false);
//        //添加一个场景
//        DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, 4, 4, "房灯", parentRemarks,false);
//        //添加一个场景 最后一个bSaveAndCallBack 设置为true
//        DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, 5, 5, "会客模式", parentRemarks,true);
        //添加一个4路继电器
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 1, "吧台灯", "4路继电器",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 2, "休闲灯", "4路继电器",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 3, "电视灯", "4路继电器",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 4, "廊灯", "4路继电器",false);
        //添加一个4路继电器
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 1, "吧台灯", "4路继电器",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 2, "休闲灯", "4路继电器",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 3, "电视灯", "4路继电器",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.LIGTH_BIG_TYPE, 0, 111, 3, 4, "廊灯", "4路继电器",false);
        //添加一个2路窗帘
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.CURTAIN_BIG_TYPE, 2, 111, 8, 1, "窗帘", "2路窗帘",false);
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.CURTAIN_BIG_TYPE, 2, 111, 8, 2, "纱窗", "2路窗帘",false);
        //添加一个开合帘
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.CURTAIN_BIG_TYPE, 1, 111, 92, 1, "开合帘", "开合帘",false);
        //添加一个空调
        DeviceParser.addDevicesListWithoutSearching(port, Configuration.AIR_BIG_TYPE, 0, 111, 9, 1, "房间空调", "HVAC空调模块",false);
        //添加一个场景 最后一个bSaveAndCallBack 设置为true
        DeviceParser.addScenesDevicesListWithoutSearching(port, mSubnetID, mDeviceID, 5, 5, "会客模式", parentRemarks,true);
    }
    private void showToast(String text) {
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }
}
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/AppliancesActivity.java
@@ -57,7 +57,16 @@
                }else  if (appliancesInfos.get(position).getBigType() == Configuration.GEOTHERMAL_BIG_TYPE) {
                    //大类是地热模块则跳转到GeothermalActivity
                    intent.setClass(AppliancesActivity.this, GeothermalActivity.class);
                }else {
                }else  if (appliancesInfos.get(position).getBigType() == Configuration.COMMON_SWITCH_BIG_TYPE) {
                    //大类是通用开关则跳转到CtrlCommonSwitchActivity
                    intent.setClass(AppliancesActivity.this, CtrlCommonSwitchActivity.class);
                }else  if (appliancesInfos.get(position).getBigType() == Configuration.SECURITY_BIG_TYPE) {
                    //大类是安防模块则跳转到CtrlSecurityActivity
                    intent.setClass(AppliancesActivity.this, CtrlSecurityActivity.class);
                }
                else {
                    intent.setClass(AppliancesActivity.this, CtrlActivity.class);
                }
                Bundle bundle = new Bundle();
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/CtrlCommonSwitchActivity.java
New file
@@ -0,0 +1,189 @@
package com.hdl.sdk.hdl_sdk.activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.hdl.sdk.hdl_core.HDLAppliances.Config.HDLApConfig;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLCommand;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CommonSwitchCtrlBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CommonSwitchStateBackEvent;
import com.hdl.sdk.hdl_sdk.R;
import com.hdl.sdk.hdl_sdk.base.BaseActivity;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
 * 通用开关设备演示
 */
public class CtrlCommonSwitchActivity extends BaseActivity {
    /**Topbar*/
    private RelativeLayout topBarBack;
    private TextView topBarTitle;
    private Button btnOpen,btnClose;
    private TextView switchText;
    private AppliancesInfo appliancesInfo;
    private int switchState = 0;
    /**
     * 复写isRegisterEventBus()  要注册使用EventBus,这里要设置返回true
     *
     * @return true
     */
    @Override
    protected boolean isRegisterEventBus() {
        return true;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ctrl_common_switch);
        initToolbar();
        initcurState();
        initView();
        initOnClick();
        displayStateView();
        //从网络上查询刷新一次设备状态,待调试
//        HDLCommand.getCommonSwitchStateFromNetwork(appliancesInfo);
    }
    /**
     * 初始化Toolbar
     */
    private void initToolbar() {
//        topBarBack = findViewById(R.id.ll_top_b_left);
//        setViewVisible(topBarBack);
//        topBarTitle = findViewById(R.id.tv_top_b_header_title);
//        topBarBack.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                finish();
//            }
//        });
    }
    private void initcurState() {
        appliancesInfo = (AppliancesInfo) getIntent().getSerializableExtra("hdl");
//        String titleStr = appliancesInfo.getRemarks();
//        topBarTitle.setText(titleStr);
    }
    private void initView() {
        btnOpen = findViewById(R.id.btnOpen);
        btnClose = findViewById(R.id.btnClose);
        switchText = findViewById(R.id.switchText);
    }
    private void initOnClick() {
        btnOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //0=关 255=开
                HDLCommand.commonSwitchCtrl(appliancesInfo, 255);
            }
        });
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                HDLCommand.commonSwitchCtrl(appliancesInfo,0);
            }
        });
    }
    private void displayStateView(){
        switch (appliancesInfo.getDeviceType()) {
            case HDLApConfig.TYPE_COMMON_SWITCH:
                break;
            default:
                finish();//设备类型不对结束页面
                break;
        }
        /**根据需求是否发送一次获取刷新状态请求*/
    }
    /**
     * 通用开关控制回调Event
     *
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onCommonSwitchCtrlEventMain(CommonSwitchCtrlBackEvent event) {
        if (event.getCommonSwitchBackInfo().getAppliancesInfo().getDeviceDeviceID() == appliancesInfo.getDeviceDeviceID()
                && event.getCommonSwitchBackInfo().getAppliancesInfo().getDeviceSubnetID() == appliancesInfo.getDeviceSubnetID()
                && event.getCommonSwitchBackInfo().getAppliancesInfo().getChannelNum() == appliancesInfo.getChannelNum()
        ) {
            if (!event.isSuccess()) {
                showToast("通用开关控制超时,请重新再试");
                return;
            }
            showToast("通用开关控制成功");
            switchState =  event.getCommonSwitchBackInfo().getSwitchState();
            if(switchState>0){
                 switchText.setText("当前状态:开");
            }else{
                switchText.setText("当前状态:关");
            }
        }
    }
    /**
     * 通用开关 回调Event
     *
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onCommonSwitchStateEventMain(CommonSwitchStateBackEvent event) {
        if (event.getCommonSwitchBackInfo().getAppliancesInfo().getDeviceDeviceID() == appliancesInfo.getDeviceDeviceID()
                && event.getCommonSwitchBackInfo().getAppliancesInfo().getDeviceSubnetID() == appliancesInfo.getDeviceSubnetID()
                && event.getCommonSwitchBackInfo().getAppliancesInfo().getChannelNum() == appliancesInfo.getChannelNum()
        ) {
            if (!event.isSuccess()) {
                showToast("通用开关读取状态超时,请重新再试");
                return;
            }
//            showToast("通用开关控制成功");
            switchState =  event.getCommonSwitchBackInfo().getSwitchState();
            if(switchState>0){
                switchText.setText("当前状态:开");
            }else{
                switchText.setText("当前状态:关");
            }
        }
    }
    // 读取指定RCU房间门铃状态
    // HDLCommand.getHotelRoomDoorbellStatus(100,100);
}
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/CtrlSecurityActivity.java
New file
@@ -0,0 +1,318 @@
package com.hdl.sdk.hdl_sdk.activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;
import com.hdl.sdk.hdl_core.HDLAppliances.Config.HDLApConfig;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.Parser.SecurityParser;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.SecurityArmingStateBackInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.SecurityStateBean;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLCommand;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.DeviceStateEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.SecurityAlarmFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.SecurityArmingFeedBackEvent;
import com.hdl.sdk.hdl_sdk.R;
import com.hdl.sdk.hdl_sdk.base.BaseActivity;
import com.hdl.sdk.hdl_sdk.utlis.HDLLog;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
 * 安防模块控制页面
 */
public class CtrlSecurityActivity extends BaseActivity {
    /**
     * Topbar
     */
//    private RelativeLayout topBarBack;
//    private TextView topBarTitle;
    private AppliancesInfo appliancesInfo;
    private Button btn_read_config, btn_set_arming, btn_send_alarm;
    private Spinner spinner_arming;
    //    private TextView tv_alarmFire, tv_alarmGas, tv_alarmSudden, tv_alarmEmergency, tv_alarmCurrent, tv_alarmSilent, tv_alarmPower, tv_alarmTemperature;
    private TextView tv_mes;
    private static final String[] armingTypeItems = {"假期布防", "离开布防", "夜间布防", "晚上有客布防", "白天布防", "撤防"};
    private int armingState;//布防状态  6 = 撤防 5 = 白天布防 4 = 晚上有客布防 3 = 夜间布防 2 = 离开布防 1 = 假期布防
    private SecurityStateBean mSecurityStateBean;
    private int alarmSendState;//发送测试报警
    /**
     * 复写isRegisterEventBus()  要注册使用EventBus,这里要设置返回true
     *
     * @return true
     */
    @Override
    protected boolean isRegisterEventBus() {
        return true;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ctrl_security);
        initToolbar();
        initView();
        initOnClick();
        initcurState();
        //读布防状态
        HDLCommand.getSecurityStateFromNetwork(appliancesInfo);
    }
    /**
     * 初始化Toolbar
     */
    private void initToolbar() {
//        topBarBack = findViewById(R.id.ll_top_b_left);
//        setViewVisible(topBarBack);
//        topBarTitle = findViewById(R.id.tv_top_b_header_title);
//        topBarBack.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                finish();
//            }
//        });
//        topBarTitle.setText("安防模块演示");
    }
    /**
     * initView
     */
    private void initView() {
        btn_read_config = findViewById(R.id.btn_read_config);
        btn_set_arming = findViewById(R.id.btn_set_arming);
        btn_send_alarm = findViewById(R.id.btn_send_alarm);
        spinner_arming = findViewById(R.id.spinner_arming);
//        tv_alarmFire = findViewById(R.id.tv_alarmFire);
//        tv_alarmGas = findViewById(R.id.tv_alarmGas);
//        tv_alarmSudden = findViewById(R.id.tv_alarmSudden);
//
//        tv_alarmEmergency = findViewById(R.id.tv_alarmEmergency);
//        tv_alarmCurrent = findViewById(R.id.tv_alarmCurrent);
//        tv_alarmSilent = findViewById(R.id.tv_alarmSilent);
//        tv_alarmPower = findViewById(R.id.tv_alarmPower);
//        tv_alarmTemperature = findViewById(R.id.tv_alarmTemperature);
        tv_mes = findViewById(R.id.tv_mes);
    }
    /**
     * initOnClick
     */
    private void initOnClick() {
        /**
         * 读布防状态
         */
        btn_read_config.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                HDLCommand.getSecurityStateFromNetwork(appliancesInfo);
            }
        });
        /**
         * 布防
         */
        btn_set_arming.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /**
                 * 要先撤防后布防
                 */
                HDLCommand.securityArmingCtrl(appliancesInfo, armingState);
            }
        });
//        btn_send_alarm.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                alarmSendState++;
//                if (alarmSendState > 7) {
//                    alarmSendState = 0;
//                }
//                HDLCommand.securitySendAlarm(appliancesInfo, alarmSendState);
//            }
//        });
        ArrayAdapter<String> sp_CheckBitAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, armingTypeItems);
        sp_CheckBitAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner_arming.setAdapter(sp_CheckBitAdapter);
        spinner_arming.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                armingState = arg2 + 1;
            }
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });
    }
    /**
     * initcurState
     */
    private void initcurState() {
        appliancesInfo = (AppliancesInfo) getIntent().getSerializableExtra("hdl");
//        String titleStr = "";
//        try {
//            titleStr = appliancesInfo.getRemarks();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        if (titleStr != null) {
//            topBarTitle.setText(titleStr);
//        }
        mSecurityStateBean = new SecurityStateBean();
    }
    /**
     * 布防设置回调Event
     *
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onSecurityArmingFeedBackEventMain(SecurityArmingFeedBackEvent event) {
        if (event.getAppliancesInfo().getDeviceSubnetID() == appliancesInfo.getDeviceSubnetID()
                && event.getAppliancesInfo().getDeviceDeviceID() == appliancesInfo.getDeviceDeviceID()
                && event.getAppliancesInfo().getChannelNum() == appliancesInfo.getChannelNum()
        ) {
            //先判断是否超时
            if (!event.isSuccess()) {
                tv_mesSetText("布防设置超时,请重新再试");
                return;
            }
            int armingStateGet = event.getArmingState();
            if (armingStateGet >= 1 && armingStateGet <= 6) {
                armingState = armingStateGet;
                spinner_arming.setSelection(armingState - 1, true);
                tv_mesSetText("布防成功,当前状态:" + armingTypeItems[armingState - 1]);
            } else if (armingState == SecurityParser.ARMING_FAIL) {
                tv_mesSetText("布防失败");
            } else {
                tv_mesSetText("未知布防状态");
            }
        }
    }
    /**
     * 查询布防状态 回调Event
     *
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onDeviceStateEventMain(DeviceStateEvent event) {
        if (event.getAppliancesInfo().getDeviceSubnetID() == appliancesInfo.getDeviceSubnetID()
                && event.getAppliancesInfo().getDeviceDeviceID() == appliancesInfo.getDeviceDeviceID()
        ) {
            //这个返回的信息是当前状态的
            switch (event.getAppliancesInfo().getDeviceType()) {
                case HDLApConfig.TYPE_SECURITY_MODULE:
                    if (appliancesInfo.getChannelNum() == event.getAppliancesInfo().getChannelNum()) {
                        if (!event.isSuccess()) {
                            tv_mesSetText("获取布防状态失败,请重新再试");
                            return;
                        }
                        SecurityArmingStateBackInfo mSecurityArmingStateBackInfo = new SecurityArmingStateBackInfo(event.getAppliancesInfo().getArrCurState());
                        if (mSecurityArmingStateBackInfo == null) {
                            tv_mesSetText("获取布防状态失败,请重新再试");
                            return;
                        }
                        int armingStateBack = mSecurityArmingStateBackInfo.getArmingState();
                        if (armingStateBack == 0) {   //读取返回0为撤防
                            armingState = SecurityParser.ARMING_DISARMING;
                            spinner_arming.setSelection(armingState - 1, true);
                            tv_mesSetText("获取成功,当前状态:" + armingTypeItems[armingState - 1]);
                        } else if (armingStateBack >= 1 && armingStateBack <= 6) {
                            armingState = armingStateBack;//更新状态值
                            spinner_arming.setSelection(armingState - 1, true);
                            tv_mesSetText("获取成功,当前状态:" + armingTypeItems[armingState - 1]);
                        } else {
                            tv_mesSetText("获取成功,未知布防状态");
                        }
                    }
                    break;
            }
        }
    }
    /**
     * 报警回调Event
     *
     * @param event
     */
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onSecurityAlarmFeedBackEventMain(SecurityAlarmFeedBackEvent event) {
        if (event.getSecurityBackInfo().getAppliancesInfo().getDeviceSubnetID() == appliancesInfo.getDeviceSubnetID()
                && event.getSecurityBackInfo().getAppliancesInfo().getDeviceDeviceID() == appliancesInfo.getDeviceDeviceID()
                && event.getSecurityBackInfo().getAppliancesInfo().getChannelNum() == appliancesInfo.getChannelNum()
        ) {
//            //先判断是否超时
//            if (!event.isSuccess()) {
//                tv_mesSetText("报警设置超时,请重新再试");
//                return;
//            }
            mSecurityStateBean = event.getSecurityBackInfo().getSecurityStateBean();
            if (mSecurityStateBean != null) {
                setAllAlarmStateTextView();
            }
        }
    }
    /**
     * TextView 显示信息并且showToast提示
     *
     * @param mes
     */
    private void tv_mesSetText(String mes) {
        tv_mes.setText(mes);
        showToast(mes);
    }
    private String getAlarmStateString(int state, String alarmName) {
        if (state == 0) {
            return "正常";
        } else {
            HDLLog.I(alarmName + ", 报警状态!");
            return "警告,报警状态!";
        }
    }
    private void setAllAlarmStateTextView() {
//        tv_alarmFire.setText(getAlarmStateString(mSecurityStateBean.getAlarmFire(), "火警"));
//        tv_alarmGas.setText(getAlarmStateString(mSecurityStateBean.getAlarmGas(), "煤气报警"));
//        tv_alarmSudden.setText(getAlarmStateString(mSecurityStateBean.getAlarmSudden(), "突发报警"));
//        tv_alarmEmergency.setText(getAlarmStateString(mSecurityStateBean.getAlarmEmergency(), "紧急报警"));
//        tv_alarmCurrent.setText(getAlarmStateString(mSecurityStateBean.getAlarmCurrent(), "电流报警"));
//        tv_alarmSilent.setText(getAlarmStateString(mSecurityStateBean.getAlarmSilent(), "无声报警"));
//        tv_alarmPower.setText(getAlarmStateString(mSecurityStateBean.getAlarmPower(), "功率报警"));
//        tv_alarmTemperature.setText(getAlarmStateString(mSecurityStateBean.getAlarmTemperature(), "温度报警"));
    }
}
app/src/main/java/com/hdl/sdk/hdl_sdk/activity/MainActivity.java
@@ -57,7 +57,12 @@
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NetWorkUtil.setIsGetWifiBroadCast(true);
//        HDLSDK.init(this);
//        HDLSDK.startHomeMode(this);
        HDLCommand.init(this);
        HDLCommand.startHomeMode(this);
//        /**配置是否开启SDK打印日志,默认为打开*/
//        HDLCommand.setHDLLogOpen(false);//
@@ -169,7 +174,7 @@
        btn_getlocal_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(AddDevicesManuallyActivity.class);
                startActivity(AddDevicesActivity.class);
            }
        });
app/src/main/res/layout/activity_add_devices.xml
New file
@@ -0,0 +1,274 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="20dp"
            android:layout_marginRight="10dp"
            android:orientation="vertical">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:gravity="center|left"
                android:text="手动添加"
                android:textColor="@android:color/black"
                android:textSize="24sp" />
            <TextView
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:gravity="center|left"
                android:text="设备参数"
                android:textColor="@android:color/black"
                android:textSize="18sp" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="子网号:"></TextView>
                <EditText
                    android:id="@+id/et_subnetID"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:hint="子网号(范围0 - 254)"
                    android:inputType="number"
                    android:maxLength="3"
                    android:gravity="center|left"
                    android:text="100" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="设备号:"></TextView>
                <EditText
                    android:id="@+id/et_deviceID"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:hint="设备号(范围0 - 254)"
                    android:gravity="center|left"
                    android:inputType="number"
                    android:maxLength="3"
                    android:text="100" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="大类:"></TextView>
                <EditText
                    android:id="@+id/et_bitType"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:hint="大类"
                    android:inputType="number"
                    android:maxLength="3"
                    android:gravity="center|left"
                    android:text="1" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="小类:"></TextView>
                <EditText
                    android:id="@+id/et_littleType"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:hint="小类"
                    android:inputType="number"
                    android:maxLength="3"
                    android:text="0"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="回路号:"></TextView>
                <EditText
                    android:id="@+id/et_mChannelNum"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:hint="回路号"
                    android:inputType="number"
                    android:maxLength="3"
                    android:gravity="center|left"
                    android:text="1"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="端口号:"></TextView>
                <EditText
                    android:id="@+id/et_mPort"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:hint="请输入端口号"
                    android:inputType="number"
                    android:maxLength="4"
                    android:gravity="center|left"
                    android:text="6000"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="12sp"
                    android:text="模块备注:"></TextView>
                <EditText
                    android:id="@+id/et_remarks_mk"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:hint="请输入模块备注"
                    android:text="酒店RCU" />
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="70dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="12sp"
                    android:text="回路备注:"></TextView>
                <EditText
                    android:id="@+id/et_remarks"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:hint="请输入回路备注" />
            </LinearLayout>
            <Button
                android:id="@+id/btn_add"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp"
                android:text="添加" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp">
                <TextView
                    android:layout_width="80dp"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:textSize="16sp"
                    android:text="场景号:"></TextView>
                <EditText
                    android:id="@+id/et_scene"
                    android:layout_width="match_parent"
                    android:layout_height="50dp"
                    android:gravity="center|left"
                    android:hint="区号和场景号" />
            </LinearLayout>
            <Button
                android:id="@+id/btn_scene"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp"
                android:text="添加场景" />
            <Button
                android:id="@+id/btn_addAll"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:layout_marginTop="10dp"
                android:text="添加测试" />
        </LinearLayout>
    </ScrollView>
</RelativeLayout>
app/src/main/res/layout/activity_ctrl_common_switch.xml
New file
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_ctrl"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<!--    <include-->
<!--        android:id="@+id/hdl_top_bar_layout"-->
<!--        layout="@layout/hdl_toolbar_top_view_b"/>-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:text="通用开关设备"
            android:gravity="center|left"
            android:textSize="@dimen/ts_24"
            />
        <TextView
            android:id="@+id/switchText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:textSize="@dimen/ts_20"
            android:text="这个按钮做通用开关设备的演示" />
        <Button
            android:id="@+id/btnOpen"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开" />
        <Button
            android:id="@+id/btnClose"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="关" />
    </LinearLayout>
</RelativeLayout>
app/src/main/res/layout/activity_ctrl_security.xml
New file
@@ -0,0 +1,254 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_ctrl"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:orientation="vertical">
            <!--<TextView-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="40dp"-->
            <!--android:gravity="center|left"-->
            <!--android:text="MCU 协议调试"-->
            <!--android:textColor="@color/black"-->
            <!--android:textSize="@dimen/ts_24" />-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:gravity="center|left"
                android:text="安防模块"
                android:textSize="@dimen/ts_20" />
            <TextView
                android:layout_width="match_parent"
                android:layout_height="30dp"
                android:gravity="center|left"
                android:text="布防前,要先撤防后布防"
                android:textSize="@dimen/ts_18" />
            <LinearLayout
                android:id="@+id/air"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="火警状态:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmFire"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="煤气报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmGas"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="突发报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmSudden"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="紧急报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmEmergency"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="电流报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmCurrent"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="无声报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmSilent"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="功率报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmPower"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <!--<LinearLayout-->
                    <!--android:layout_width="match_parent"-->
                    <!--android:layout_height="30dp">-->
                    <!--<TextView-->
                        <!--android:layout_width="100dp"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center"-->
                        <!--android:textColor="@color/black"-->
                        <!--android:textSize="@dimen/ts_18"-->
                        <!--android:text="温度报警:" />-->
                    <!--<TextView-->
                        <!--android:id="@+id/tv_alarmTemperature"-->
                        <!--android:layout_width="wrap_content"-->
                        <!--android:layout_height="match_parent"-->
                        <!--android:gravity="center|left"-->
                        <!--android:text="正常" />-->
                <!--</LinearLayout>-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="40dp">
                    <TextView
                        android:layout_width="100dp"
                        android:layout_height="match_parent"
                        android:gravity="center"
                        android:textSize="@dimen/ts_18"
                        android:text="布防状态:" />
                    <Spinner
                        android:id="@+id/spinner_arming"
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:minWidth="120dp"></Spinner>
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="40dp">
                    <Button
                        android:id="@+id/btn_read_config"
                        android:layout_width="wrap_content"
                        android:layout_height="40dp"
                        android:textSize="@dimen/ts_18"
                        android:text="读取安防设置 " />
                    <Button
                        android:id="@+id/btn_set_arming"
                        android:layout_width="wrap_content"
                        android:layout_height="40dp"
                        android:textSize="@dimen/ts_18"
                        android:text="修改布防状态" />
                </LinearLayout>
                <Button
                    android:id="@+id/btn_send_alarm"
                    android:layout_width="wrap_content"
                    android:layout_height="40dp"
                    android:textSize="@dimen/ts_18"
                    android:visibility="gone"
                    android:text="发送报警指令" />
                <TextView
                    android:id="@+id/tv_mes"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="5dp"
                    android:text="安防模块布防演示"
                    android:textSize="@dimen/ts_20" />
            </LinearLayout>
        </LinearLayout>
</RelativeLayout>
app/src/main/res/layout/activity_sensor.xml
New file
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_ctrl"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--<include-->
<!--    android:id="@+id/hdl_top_bar_layout"-->
<!--    layout="@layout/hdl_toolbar_top_view_b" />-->
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:orientation="vertical">
    <TextView
        android:id="@+id/sensorText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这个按钮做传感器演示" />
    <Button
        android:id="@+id/sensorbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取传感器状态" />
</LinearLayout>
</RelativeLayout>
app/src/main/res/values/dimens.xml
New file
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 默认字体大小 -->
    <dimen name="textSize_title">20sp</dimen>
    <dimen name="ts_44">44sp</dimen>
    <dimen name="ts_40">40sp</dimen>
    <dimen name="ts_32">32sp</dimen>
    <dimen name="ts_24">24sp</dimen>
    <dimen name="ts_22">22sp</dimen>
    <dimen name="ts_20">20sp</dimen>
    <dimen name="ts_18">18sp</dimen>
    <dimen name="ts_16">16sp</dimen>
    <dimen name="ts_15">15sp</dimen>
    <dimen name="ts_14">14sp</dimen>
    <dimen name="ts_13">13sp</dimen>
    <dimen name="ts_12">12sp</dimen>
    <dimen name="ts_11">11sp</dimen>
    <dimen name="ts_10">10sp</dimen>
    <dimen name="toolbar_height">56dp</dimen>
</resources>
hdl_core/src/main/java/com/hdl/sdk/hdl_core/Config/Configuration.java
@@ -15,6 +15,8 @@
    public static final int GEOTHERMAL_BIG_TYPE = 8;
    public static final int AIR_BIG_TYPE = 7;
    public static final int AUDIO_BIG_TYPE = 9;
    /**安防功能*/
    public static final int SECURITY_BIG_TYPE = 10;
    public static final int LOGIC_BIG_TYPE = 12;
    public static final int GLOBAL_LOGIC_BIG_TYPE = 17;
    /**
@@ -25,6 +27,9 @@
    //支持的小类
    public static final int FRESH_AIR_LITTLE_TYPE_0 = 0;
    public static final int GEOTHERMAL_LITTLE_TYPE_0 = 0;
    /**通用开关*/
    public static final int COMMON_SWITCH_BIG_TYPE = 100;
    //小类 先不做分类
@@ -148,6 +153,24 @@
    public static final int FRESH_AIR_STATE_COMMAND = 0x144C;
    public static final int FRESH_AIR_STATE_BACK_COMMAND = 0x144D;
    /**
     * 2020-06-23 安防功能模块操作码、状态读取码  ARMING布防 ALARM报警
     */
    public static final int SECURITY_ARMING_CTRL_COMMAND = 0x0104;//布防设置
    public static final int SECURITY_ARMING_CTRL_BACK_COMMAND = 0x0105;//布防设置反馈
    public static final int SECURITY_STATE_COMMAND = 0x011E;//读取安防设置
    public static final int SECURITY_STATE_BACK_COMMAND = 0x011F;//读取安防设置反馈
    public static final int SECURITY_ALARM_CTRL_COMMAND = 0x010C;//报警设置
    public static final int SECURITY_ALARM_CTRL_BACK_COMMAND = 0x010D;//报警设置反馈
    /**
     * 2020-06-23 通用开关
     */
    public static final int COMMON_SWITCH_CTRL_COMMAND = 0xE01C;//通用开关控制
    public static final int COMMON_SWITCH_CTRL_BACK_COMMAND = 0xE01D;//通用开关控制反馈
    public static final int COMMON_SWITCH_STATE_COMMAND = 0xE018;//读通用开关状态
    public static final int COMMON_SWITCH_STATE_BACK_COMMAND = 0xE019;//读通用开关状态反馈
    /**
     * RCU 配置数据
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/Config/HDLApConfig.java
@@ -54,16 +54,21 @@
    public static final int TYPE_SENSOR_ELECTRICITY = 624;
    public static final int TYPE_SENSOR_POWER = 625;
    public static final int TYPE_SENSOR_FLOODING = 626;   //水浸//2019-11-4 新增
    public static final int TYPE_SENSOR_DOOR_MAGNET= 627;   //门磁、窗磁
    public static final int TYPE_SENSOR_EMERGENCY_BUTTON = 628;    //紧急按钮
    //2019-07
    public static final int TYPE_GEOTHERMAL_MODULE = 801;       //地热模块(0)    回路号,备注,地热状态
//    public static final int TYPE_GEOTHERMAL_MODULE_PANEL = 802; //常规地热面板(1)    面板号,备注,服务器模式,地热状态
//    public static final int TYPE_GEOTHERMAL_MODULE_PI = 803;    //带PI运算的地热面板(2)    面板号,备注,地热状态
    //安防功能模块
    public static final int TYPE_SECURITY_MODULE = 1001;
    public static final int TYPE_FRESH_AIR = 1901;              //新风系统
    public static final int TYPE_COMMON_SWITCH = 10001;//通用开关
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLCommonSwitch/CommonSwitchBackInfo.java
New file
@@ -0,0 +1,39 @@
package com.hdl.sdk.hdl_core.HDLAppliances.HDLCommonSwitch;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
/**
 * Created by jlchen on 2020-04-01.
 */
public class CommonSwitchBackInfo {
    private AppliancesInfo appliancesInfo;
    private int switchNum;  //回路号
    private int switchState;  //开关状态
    public AppliancesInfo getAppliancesInfo() {
        return appliancesInfo;
    }
    public void setAppliancesInfo(AppliancesInfo appliancesInfo) {
        this.appliancesInfo = appliancesInfo;
    }
    public int getSwitchNum() {
        return switchNum;
    }
    public void setSwitchNum(int switchNum) {
        this.switchNum = switchNum;
    }
    public int getSwitchState() {
        return switchState;
    }
    public void setSwitchState(int switchState) {
        this.switchState = switchState;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLSecurity/Parser/SecurityParser.java
New file
@@ -0,0 +1,117 @@
package com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.Parser;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
/**
 * Created by JLChen on 2019/7/29
 */
public class SecurityParser {
    public static final int fail = 0;
    /**
     * 布防设置
     */
    //布防类型   6 =撤防 5 = 白天布防 4 = 晚上有客布防 3 = 夜间布防 2 = 离开布防 1 = 假期布防
    public static final int ARMING_HOLIDAY = 1;
    public static final int ARMING_LEAVE = 2;
    public static final int ARMING_AT_NIGHT = 3;
    public static final int ARMING_AT_NIGHT_WITH_GUEST = 4;
    public static final int ARMING_DURING_THE_DAY = 5;
    public static final int ARMING_DISARMING = 6;
    public static final int ARMING_FAIL = 7;//布防失败
//    public static final int ARMING_UNKNOWM = -1;//未知状态
    //获取布防 bytes数据
    public static byte[] getArmingByte(AppliancesInfo appliancesInfo, int state) {
        try {
            if (state < 0 || state > 6) {//参数错误默认撤防
                state = 6;
            }
            byte[] addBytes = new byte[2];
            addBytes[0] = (byte) appliancesInfo.getChannelNum();
            addBytes[1] = (byte) state;
            return addBytes;
        } catch (Exception e) {
            e.printStackTrace();
            return new byte[]{fail};
        }
    }
//        Bit 4 0 = 正常状态 , 1 = 电流报警
//        Bit 3 0 =正常状态, 1 = 紧急报警
//        Bit 2 0 =正常状态, 1 = 突发报警
//        Bit 1 0 =正常状态, 1 =煤气报警
//        Bit 0 0 =正常状态, 1 = 火警 3
//
// Encode Bit Value
//        Bit 7 0 =正常状态, 1 = 温度报警
//        Bit 6 0 =正常状态, 1 = 功率报警
//        Bit 5 0 =正常状态, 1 = 无声报警
//private int CurrentAlarm;   //电流报警
//    private int EmergencyAlarm; //紧急报警
//    private int SuddenAlarm;    //突发报警
//    private int FireAlarm;      //火警 3
//
//    private int TemperatureAlarm;//温度报警
//    private int PowerAlarm;     //功率报警
//    private int SilentAlarm;    //无声报警
    /**
     * 报警设置 ALARM
     */
    public static final int ALARM_CURRENT = 4;      //电流报警
    public static final int ALARM_EMERGENCY = 3;    //紧急报警
    public static final int ALARM_SUDDEN = 2;       //突发报警
    public static final int ALARM_GAS = 1;          //煤气报警
    public static final int ALARM_FIRE = 0;         //火警 3
    public static final int ALARM_TEMPERATURE = 7;  //温度报警
    public static final int ALARM_POWER = 6;        //功率报警
    public static final int ALARM_SILENT = 5;       //无声报警
    //获取报警设置 bytes数据 只报警一种情况
    public static byte[] getAlarmByte(AppliancesInfo appliancesInfo, int state) {
        try {
            byte[] addBytes = new byte[3];
            addBytes[0] = (byte) appliancesInfo.getChannelNum();
            switch (state) {
                case ALARM_FIRE:
                    addBytes[1] = 0x01;
                    break;
                case ALARM_GAS:
                    addBytes[1] = (byte) (1 << 1);
                    break;
                case ALARM_SUDDEN:
                    addBytes[1] = (byte) (1 << 2);
                    break;
                case ALARM_EMERGENCY:
                    addBytes[1] = (byte) (1 << 3);
                    break;
                case ALARM_CURRENT:
                    addBytes[1] = (byte) (1 << 4);
                    break;
                case ALARM_SILENT:
                    addBytes[2] = (byte) (1 << 5);
                    break;
                case ALARM_POWER:
                    addBytes[2] = (byte) (1 << 6);
                    break;
                case ALARM_TEMPERATURE:
                    addBytes[2] = (byte) (1 << 7);
                    break;
                default:
                    break;
            }
            return addBytes;
        } catch (Exception e) {
            e.printStackTrace();
            return new byte[]{fail};
        }
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLSecurity/SecurityArmingStateBackInfo.java
New file
@@ -0,0 +1,24 @@
package com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity;
/**
 * Created by JLChen on 2019/8/9
 */
public class SecurityArmingStateBackInfo {
    private int armingState;    //布防状态  6 = 撤防 5 = 白天布防 4 = 晚上有客布防 3 = 夜间布防 2 = 离开布防 1 = 假期布防
    public SecurityArmingStateBackInfo(byte[] curState) {
        armingState = -1;
        if (curState == null) return;
        if (curState.length >= 2) {
            armingState = curState[1] & 0xFF;
        }
    }
    public int getArmingState() {
        return armingState;
    }
    public void setArmingState(int armingState) {
        this.armingState = armingState;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLAppliances/HDLSecurity/SecurityBackInfo.java
New file
@@ -0,0 +1,132 @@
package com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.Parser.SecurityParser;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.SecurityStateBean;
/**
 * Created by JLChen on 2019/7/29
 * 安防模块
 */
public class SecurityBackInfo {
    private AppliancesInfo appliancesInfo;
    private String remarks;
    private int channelNum;  //回路号
    private SecurityStateBean mSecurityStateBean;
    private byte[] curState;    //返回信息
    public SecurityBackInfo() {
    }
    public SecurityBackInfo(AppliancesInfo mAppliancesInfo) {
        this.appliancesInfo = mAppliancesInfo;
        this.remarks = mAppliancesInfo.getRemarks();
        this.curState = mAppliancesInfo.getArrCurState();
        this.mSecurityStateBean = new SecurityStateBean();
        if (this.curState == null) return;
        if (this.curState.length >= 3) {
            this.channelNum = this.curState[0] & 0xFF;
            this.mSecurityStateBean.alarmCurrent = this.curState[1] & 0x10;
            this.mSecurityStateBean.alarmEmergency = this.curState[1] & 0x08;
            this.mSecurityStateBean.alarmSudden = this.curState[1] & 0x04;
            this.mSecurityStateBean.alarmGas = this.curState[1] & 0x02;
            this.mSecurityStateBean.alarmFire = this.curState[1] & 0x01;
            this.mSecurityStateBean.alarmTemperature = this.curState[2] & 0x80;
            this.mSecurityStateBean.alarmPower = this.curState[2] & 0x40;
            this.mSecurityStateBean.alarmSilent = this.curState[2] & 0x20;
            int mCurState = this.curState[2] & 0x1F;
            switch (mCurState) {
                case 0:
                    this.mSecurityStateBean.armingState = SecurityParser.ARMING_DISARMING;//撤防状态
                    break;
                case 1:
                    this.mSecurityStateBean.armingState = SecurityParser.ARMING_HOLIDAY;//假期布防
                    break;
                case 2:
                    this.mSecurityStateBean.armingState = SecurityParser.ARMING_LEAVE;//离开布防
                    break;
                case 4:
                    this.mSecurityStateBean.armingState = SecurityParser.ARMING_AT_NIGHT;//夜间布防
                    break;
                case 8:
                    this.mSecurityStateBean.armingState = SecurityParser.ARMING_AT_NIGHT_WITH_GUEST;//晚上有客布防
                    break;
                case 10:
                    this.mSecurityStateBean.armingState = SecurityParser.ARMING_DURING_THE_DAY;//白天布防
                    break;
                default:
//                    this.armingState = SecurityParser.ARMING_DISARMING;//撤防状态
                    this.mSecurityStateBean.armingState = -1;  //未知状态
                    break;
            }
        }
    }
    public AppliancesInfo getAppliancesInfo() {
        return appliancesInfo;
    }
    public void setAppliancesInfo(AppliancesInfo appliancesInfo) {
        this.appliancesInfo = appliancesInfo;
    }
    public String getRemarks() {
        return remarks;
    }
    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }
    public int getChannelNum() {
        return channelNum;
    }
    public void setChannelNum(int channelNum) {
        this.channelNum = channelNum;
    }
    public SecurityStateBean getSecurityStateBean() {
        return mSecurityStateBean;
    }
    public void setSecurityStateBean(SecurityStateBean securityStateBean) {
        mSecurityStateBean = securityStateBean;
    }
    public byte[] getCurState() {
        return curState;
    }
    public void setCurState(byte[] curState) {
        this.curState = curState;
    }
}
//        Bit 4 0 = 正常状态 , 1 = 电流报警
//        Bit 3 0 =正常状态, 1 = 紧急报警
//        Bit 2 0 =正常状态, 1 = 突发报警
//        Bit 1 0 =正常状态, 1 = 煤气报警
//        Bit 0 0 =正常状态, 1 = 火警 3
//
// Encode Bit Value
//        Bit 7 0 =正常状态, 1 = 温度报警
//        Bit 6 0 =正常状态, 1 = 功率报警
//        Bit 5 0 =正常状态, 1 = 无声报警
//        Bit 4 0 =正常状态, 1 = 白天布防状态
//        Bit 3 0 =正常状态, 1 = 晚上有客布防
//        Bit 2 0 =正常状态, 1 = 夜间布防
//        Bit 1 0 =正常状态, 1 = 离开布防
//        Bit 0 0 =正常状态, 1 = 假期布防
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Bean/SecurityStateBean.java
New file
@@ -0,0 +1,90 @@
package com.hdl.sdk.hdl_core.HDLDeviceManger.Bean;
/**
 * Created by JLChen on 2019/7/29
 */
public class SecurityStateBean {
    public int alarmCurrent;   //电流报警
    public int alarmEmergency; //紧急报警
    public int alarmSudden;    //突发报警
    public int alarmGas;       //煤气报警
    public int alarmFire;      //火警 3
    public int alarmTemperature;//温度报警
    public int alarmPower;     //功率报警
    public int alarmSilent;    //无声报警
    public int armingState;    //布防状态  6 = 撤防 5 = 白天布防 4 = 晚上有客布防 3 = 夜间布防 2 = 离开布防 1 = 假期布防
    public int getAlarmCurrent() {
        return alarmCurrent;
    }
    public void setAlarmCurrent(int alarmCurrent) {
        this.alarmCurrent = alarmCurrent;
    }
    public int getAlarmEmergency() {
        return alarmEmergency;
    }
    public void setAlarmEmergency(int alarmEmergency) {
        this.alarmEmergency = alarmEmergency;
    }
    public int getAlarmSudden() {
        return alarmSudden;
    }
    public void setAlarmSudden(int alarmSudden) {
        this.alarmSudden = alarmSudden;
    }
    public int getAlarmGas() {
        return alarmGas;
    }
    public void setAlarmGas(int alarmGas) {
        this.alarmGas = alarmGas;
    }
    public int getAlarmFire() {
        return alarmFire;
    }
    public void setAlarmFire(int alarmFire) {
        this.alarmFire = alarmFire;
    }
    public int getAlarmTemperature() {
        return alarmTemperature;
    }
    public void setAlarmTemperature(int alarmTemperature) {
        this.alarmTemperature = alarmTemperature;
    }
    public int getAlarmPower() {
        return alarmPower;
    }
    public void setAlarmPower(int alarmPower) {
        this.alarmPower = alarmPower;
    }
    public int getAlarmSilent() {
        return alarmSilent;
    }
    public void setAlarmSilent(int alarmSilent) {
        this.alarmSilent = alarmSilent;
    }
    public int getArmingState() {
        return armingState;
    }
    public void setArmingState(int armingState) {
        this.armingState = armingState;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLCommand.java
@@ -8,6 +8,7 @@
import com.hdl.sdk.hdl_core.HDLAppliances.HDLAirCondition.AirCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLAirCondition.Parser.AirCtrlParser;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLAudio.HDLAudio;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCommonSwitch.CommonSwitchBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCurtain.CurtainCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCurtain.Parser.CurtainCtrlParser;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLFreshAir.FreshAirBackInfo;
@@ -16,9 +17,11 @@
import com.hdl.sdk.hdl_core.HDLAppliances.HDLGeothermal.Parser.GeothermalParser;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLight.LightCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLogic.LogicCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.Parser.SecurityParser;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.DeviceStateBean;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.AirFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CommonSwitchCtrlBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CurtainFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.DeviceStateEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.EventCode;
@@ -26,6 +29,7 @@
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.GeothermalFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.LightFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.LogicFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.SecurityArmingFeedBackEvent;
import com.hdl.sdk.hdl_core.Util.LogUtil.HDLLog;
import com.hdl.sdk.hdl_core.Util.NetUtil.NetWorkUtil;
import com.hdl.sdk.hdl_core.Util.SPUtil.SPUtils;
@@ -44,7 +48,7 @@
 */
public class HDLCommand {
    public static int mRequestTimeout = 5000;//默认请求超时时间
    private static Timer getStateFailTimer = null;//获取设备状态失败Timer
    private static Timer lightCtrlFailTimer = null;//控制灯光失败Timer
@@ -54,6 +58,8 @@
    private static Timer freshAirCtrlFailTimer = null;//控制新风失败Timer 2019-07-09
    private static Timer geothermalCtrlFailTimer = null;//控制地热失败Timer 2019-07-10
    private static Timer securityCtrlFailTimer = null;//安防模块操作失败Timer
    private static Timer commonSwitchCtrlFailTimer = null;//通用开关失败Timer
    /**
     * 初始化
@@ -64,7 +70,32 @@
        HDLDeviceManager.init(context);
    }
    /**
     * 开启bus模式
     * 启用6000端口
     * @param context
     */
    public static void startHomeMode(Context context) {
        SPUtils.setParam(context, SPUtils.KEY_RCU_IP_, "");
        HandleSearch.curSearchMode = HandleSearch.GET_BUS_DEVICES;
        HandleSearch.rcuIp = "";
        HDLUdpCore.closeSocket6008();
        HDLUdpCore.init6000();
    }
    /**
     * 开启RCU模式
     * 启用6008端口
     * @param context
     * @param newRcuIp RCU的IP地址
     */
    public static void startRcuMode(Context context, String newRcuIp) {
        HandleSearch.curSearchMode = HandleSearch.GET_RCU_DEVICES;
        HandleSearch.rcuIp = newRcuIp;
        SPUtils.setParam(context, SPUtils.KEY_RCU_IP_, newRcuIp);
        HDLUdpCore.closeSocket6000();
        HDLUdpCore.init6008();
    }
//    /**
//     * 获取本地广播IP
@@ -1066,6 +1097,135 @@
    }
    /**************************************2020-06-23新增***************************************/
    /**
     * 控制通用开关
     *
     * @param info
     */
    public static void commonSwitchCtrl(final AppliancesInfo info, int state) {
        HDLDeviceManager.setDeviceCtrlSuccessStateWithInfo(info, false);
        if (info.getBigType() == Configuration.COMMON_SWITCH_BIG_TYPE) {
            if (commonSwitchCtrlFailTimer != null) {
                commonSwitchCtrlFailTimer.cancel();
                commonSwitchCtrlFailTimer = null;
            }
            byte[] bytes = new byte[]{(byte) info.getChannelNum(), (byte) state};
            addSendData(info, bytes, Configuration.CONTROL);
            commonSwitchCtrlFailTimer = new Timer();
            commonSwitchCtrlFailTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if (!HDLDeviceManager.getDeviceCtrlSuccessStateWithInfo(info)) {
                        HDLLog.info("通用开关控制失败");
                        CommonSwitchBackInfo mCommonSwitchBackInfo = new CommonSwitchBackInfo();
                        mCommonSwitchBackInfo.setAppliancesInfo(info);
                        EventBus.getDefault().post(new CommonSwitchCtrlBackEvent(mCommonSwitchBackInfo, false));
                    }
                }
            }, mRequestTimeout);
        } else {
            HDLLog.info("djlCtrl: 通用开关设备控制不在范围内"
                    + " LittleType = " + info.getLittleType()
                    + " BigType = " + info.getBigType()
            );
        }
    }
    /**
     * 获取通用开关状态
     * @param info
     */
    public static void getCommonSwitchStateFromNetwork(final AppliancesInfo info) {
        if (info == null) {
            return;
        }
        HDLDeviceManager.isGetDeviceStateSuccess = false;
        switch (info.getDeviceType()) {
            case HDLApConfig.TYPE_COMMON_SWITCH:
                addSendData(info, new byte[0], Configuration.STATE);
                break;
            default:
                HDLLog.info("不是通用开关设备");
                break;
        }
    }
    /**
     * 获取安防模块状态
     * @param info
     */
    public static void getSecurityStateFromNetwork(final AppliancesInfo info) {
        if (info == null) {
            return;
        }
        HDLDeviceManager.isGetDeviceStateSuccess = false;
        switch (info.getDeviceType()) {
            case HDLApConfig.TYPE_SECURITY_MODULE:
                //发送获安防模块状态数据
                addSendData(info, new byte[]{(byte) info.getChannelNum()}, Configuration.STATE);
                break;
            default:
                HDLLog.info("不是安防模块");
                break;
        }
    }
    /**
     * 安防模块 布防设置
     * 2020-06-23
     * @param info
     */
    public static void securityArmingCtrl(final AppliancesInfo info, int state) {
//        HDLDeviceManager.isSecurityCtrlSuccess = false;
        HDLDeviceManager.setDeviceCtrlSuccessStateWithInfo(info, false);
        if (securityCtrlFailTimer != null) {
            securityCtrlFailTimer.cancel();
            securityCtrlFailTimer = null;
        }
        if (info.getBigType() == Configuration.SECURITY_BIG_TYPE) {
            byte[] sendbytes = SecurityParser.getArmingByte(info, state);
            addSendData(info, sendbytes, Configuration.CONTROL);
            securityCtrlFailTimer = new Timer();
            securityCtrlFailTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    if (!HDLDeviceManager.getDeviceCtrlSuccessStateWithInfo(info)) {
                        EventBus.getDefault().post(new SecurityArmingFeedBackEvent(info,0, false));
                    }
                }
            }, 5000);
        } else {
            HDLLog.info("安防模块不在范围内"
                    + " LittleType = " + info.getLittleType()
                    + " BigType = " + info.getBigType()
            );
        }
    }
//    /**
//     * 安防模块 报警设置
//     * 2019-7-29
//     * @param info
//     * @param state 发送的报警内容,只报警一种
//     */
//    public static void securitySendAlarm(final AppliancesInfo info, int state) {
//        if (info.getBigType() == Configuration.SECURITY_BIG_TYPE) {
//            byte[] sendbytes = SecurityParser.getAlarmByte(info, state);
//            cusSendCommand(Configuration.SECURITY_ALARM_CTRL_COMMAND, info.getDeviceSubnetID(), info.getDeviceDeviceID(), sendbytes);
//        } else {
//            HDLLog.info("不是安防模块"
//                    + " LittleType = " + info.getLittleType()
//                    + " BigType = " + info.getBigType()
//            );
//        }
//    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLDeviceManager.java
@@ -12,6 +12,7 @@
import com.hdl.sdk.hdl_core.HDLAppliances.HDLAirCondition.AirCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLAirCondition.Parser.AirCtrlParser;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLAudio.HDLAudio;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCommonSwitch.CommonSwitchBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCurtain.CurtainCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCurtain.Parser.CurtainCtrlParser;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLFreshAir.FreshAirBackInfo;
@@ -19,6 +20,7 @@
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLight.LightCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLogic.LogicCtrlBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLogic.LogicMode;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.SecurityBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSensor.SensorStateBackInfo;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLWarning.WarningType;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
@@ -28,6 +30,8 @@
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.RcuLight;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.UdpDataBean;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.AirFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CommonSwitchCtrlBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CommonSwitchStateBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.CurtainFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.DeviceStateEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.EventCode;
@@ -35,6 +39,8 @@
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.GeothermalFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.LightFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.LogicFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.SecurityAlarmFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.SecurityArmingFeedBackEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent.WarningInfoEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Parser.DeviceParser;
import com.hdl.sdk.hdl_core.Util.LogUtil.HDLLog;
@@ -177,7 +183,20 @@
            case Configuration.GEOTHERMAL_MODULE_CTRL_BACK_COMMAND://20190709新增
                handleGeothermalCtrlData(getDatas);
                break;
            /***2020-06-23 新增通用开关**/
            case Configuration.COMMON_SWITCH_CTRL_BACK_COMMAND:
                handleCommonSwitchCtrlData(getDatas);
                break;
            case Configuration.COMMON_SWITCH_STATE_BACK_COMMAND:
                handleCommonSwitchStateData(getDatas);
                break;
            case Configuration.SECURITY_ARMING_CTRL_BACK_COMMAND://20190729新增
            case Configuration.SECURITY_ALARM_CTRL_BACK_COMMAND://报警设置反馈
                handleSecurityCtrlData(getDatas);
                break;
            case Configuration.SECURITY_STATE_BACK_COMMAND:
                handleSecurityStateData(getDatas);
                break;
//          获取设备备注
            case Configuration.DEVICES_READ_BACK_COMMAND:
@@ -2619,7 +2638,199 @@
        }
    }
    /**
     * 通用开关控制反馈
     *
     * @param getDatas
     */
    private static void handleCommonSwitchCtrlData(UdpDataBean getDatas) {
        outter:
        for (int i = 0, len = devicesDataList.size(); i < len; i++) {
            if (devicesDataList.get(i).getSourceSubnetID() == getDatas.sourceSubnetID
                    && devicesDataList.get(i).getSourceDeviceID() == getDatas.sourceDeviceID) {
                List<AppliancesInfo> infos = devicesDataList.get(i).getAppliancesInfoList();
                for (int j = 0, len2 = infos.size(); j < len2; j++) {
                    if (infos.get(j).getBigType() == Configuration.COMMON_SWITCH_BIG_TYPE
                            && infos.get(j).getDeviceType() == HDLApConfig.TYPE_COMMON_SWITCH) {
                        if (infos.get(j).getChannelNum() == (getDatas.addBytes[0] & 0xFF)) {
                            //大类、小类、回路号都匹配
                            devicesDataList.get(i).getAppliancesInfoList().get(j).setCurState(getDatas.addBytes[1] & 0xFF);
                            devicesDataList.get(i).getAppliancesInfoList().get(j).setIntCurState(getDatas.addBytes[1] & 0xFF);
                            AppliancesInfo mSwitchInfo = infos.get(j);
                            CommonSwitchBackInfo info = new CommonSwitchBackInfo();
                            info.setAppliancesInfo(mSwitchInfo);
                            info.setSwitchNum(getDatas.addBytes[0] & 0xFF);
                            info.setSwitchState(getDatas.addBytes[1] & 0xFF);
                            setDeviceCtrlSuccessStateWithInfo(infos.get(j), true);
                            EventBus.getDefault().post(new CommonSwitchCtrlBackEvent(info, true));
                            break outter;//跳出循环
                        }
                    }
                }
                break outter;//跳出循环
            }
        }
    }
    /**************************************2020-06-23新增***************************************/
    /**
     * 通用开关读状态反馈反馈
     *
     * @param getDatas
     */
    private static void handleCommonSwitchStateData(UdpDataBean getDatas) {
        outter:
        for (int i = 0, len = devicesDataList.size(); i < len; i++) {
            if (devicesDataList.get(i).getSourceSubnetID() == getDatas.sourceSubnetID
                    && devicesDataList.get(i).getSourceDeviceID() == getDatas.sourceDeviceID) {
                List<AppliancesInfo> infos = devicesDataList.get(i).getAppliancesInfoList();
                for (int j = 0, len2 = infos.size(); j < len2; j++) {
                    if (infos.get(j).getBigType() == Configuration.COMMON_SWITCH_BIG_TYPE
                            && infos.get(j).getDeviceType() == HDLApConfig.TYPE_COMMON_SWITCH) {
                        if (infos.get(j).getChannelNum() == (getDatas.addBytes[0] & 0xFF)) {
                            //大类、小类、回路号都匹配
                            if (getDatas.addBytes.length >= 2) {
                                isGetDeviceStateSuccess = true;
                                devicesDataList.get(i).getAppliancesInfoList().get(j).setCurState(getDatas.addBytes[1] & 0xFF);
                                devicesDataList.get(i).getAppliancesInfoList().get(j).setIntCurState(getDatas.addBytes[1] & 0xFF);
                                AppliancesInfo mSwitchInfo = infos.get(j);
                                CommonSwitchBackInfo info = new CommonSwitchBackInfo();
                                info.setAppliancesInfo(mSwitchInfo);
                                info.setSwitchNum(getDatas.addBytes[0] & 0xFF);
                                info.setSwitchState(getDatas.addBytes[1] & 0xFF);
                                EventBus.getDefault().post(new CommonSwitchStateBackEvent(info, true));
                            }
                            break outter;//跳出循环
                        }
                    }
                }
                break outter;//跳出循环
            }
        }
    }
    /**
     * 读取安防设置反馈
     * 2020-06-23
     *
     * @param getDatas
     */
    private static void handleSecurityStateData(UdpDataBean getDatas) {
        outter:
        for (int i = 0, len = devicesDataList.size(); i < len; i++) {
            if (devicesDataList.get(i).getSourceSubnetID() == getDatas.sourceSubnetID
                    && devicesDataList.get(i).getSourceDeviceID() == getDatas.sourceDeviceID
            ) {
                List<AppliancesInfo> infos = devicesDataList.get(i).getAppliancesInfoList();
                for (int j = 0, len2 = infos.size(); j < len2; j++) {
                    if (infos.get(j).getBigType() == Configuration.SECURITY_BIG_TYPE
                            && infos.get(j).getDeviceType() == HDLApConfig.TYPE_SECURITY_MODULE
                            && infos.get(j).getChannelNum() == (getDatas.addBytes[0] & 0xFF)) {//2019-07-29
                        if (getDatas.addBytes.length >= 2) {
                            isGetDeviceStateSuccess = true;
                            devicesDataList.get(i).getAppliancesInfoList().get(j).setArrCurState(getDatas.addBytes);
                            EventBus.getDefault().post(new DeviceStateEvent(devicesDataList.get(i).getAppliancesInfoList().get(j), true));
                        } else {
                            isGetDeviceStateSuccess = true;
                            EventBus.getDefault().post(new DeviceStateEvent(devicesDataList.get(i).getAppliancesInfoList().get(j), false));
                            HDLLog.info("handleSecurityStateData 返回addBytes数据异常");
                        }
                        break outter;
                    } else {
                        HDLLog.info("handleSecurityStateData 没有找到匹配类型");
                    }
                }
                break outter;
            }
        }
    }
    /**
     * 处理安防设备
     * 2020-06-23
     *
     * @param getDatas
     */
    private static void handleSecurityCtrlData(UdpDataBean getDatas) {
        switch (getDatas.command) {
            //Arming 布防设置反馈
            case Configuration.SECURITY_ARMING_CTRL_BACK_COMMAND:
                outter:
                for (int i = 0, len = devicesDataList.size(); i < len; i++) {
                    if (devicesDataList.get(i).getSourceSubnetID() == getDatas.sourceSubnetID
                            && devicesDataList.get(i).getSourceDeviceID() == getDatas.sourceDeviceID
                    ) {
                        List<AppliancesInfo> infos = devicesDataList.get(i).getAppliancesInfoList();
                        for (int j = 0, len2 = infos.size(); j < len2; j++) {
                            if (getDatas.addBytes.length > 0) {
                                if (infos.get(j).getBigType() == Configuration.SECURITY_BIG_TYPE
                                        && infos.get(j).getDeviceType() == HDLApConfig.TYPE_SECURITY_MODULE
                                        && infos.get(j).getChannelNum() == (getDatas.addBytes[0] & 0xFF)) {
                                    if (getDatas.addBytes.length >= 2) {
                                        AppliancesInfo mInfo = devicesDataList.get(i).getAppliancesInfoList().get(j);
//                                        isSecurityCtrlSuccess = true;
                                        setDeviceCtrlSuccessStateWithInfo(mInfo, true);
                                        EventBus.getDefault().post(new SecurityArmingFeedBackEvent(mInfo, getDatas.addBytes[1] & 0xFF, true));
                                    } else {
                                        HDLLog.E("布防设置 反馈数据异常");
                                    }
                                    break outter;
                                }
                            }
                        }
                        break outter;
                    }
                }
                break;
            //ALARM 报警设置反馈
            case Configuration.SECURITY_ALARM_CTRL_BACK_COMMAND:
                outter:
                for (int i = 0, len = devicesDataList.size(); i < len; i++) {
                    if (devicesDataList.get(i).getSourceSubnetID() == getDatas.sourceSubnetID
                            && devicesDataList.get(i).getSourceDeviceID() == getDatas.sourceDeviceID
                    ) {
                        List<AppliancesInfo> infos = devicesDataList.get(i).getAppliancesInfoList();
                        for (int j = 0, len2 = infos.size(); j < len2; j++) {
                            if (getDatas.addBytes.length > 0) {
                                if (infos.get(j).getBigType() == Configuration.SECURITY_BIG_TYPE
                                        && infos.get(j).getDeviceType() == HDLApConfig.TYPE_SECURITY_MODULE
                                        && infos.get(j).getChannelNum() == (getDatas.addBytes[0] & 0xFF)) {
                                    if (getDatas.addBytes.length >= 3) {
                                        //byte[] getBytes = devicesDataList.get(i).getAppliancesInfoList().get(j).getArrCurState();
                                        devicesDataList.get(i).getAppliancesInfoList().get(j).setArrCurState(getDatas.addBytes);
                                        AppliancesInfo mInfo = devicesDataList.get(i).getAppliancesInfoList().get(j);
                                        SecurityBackInfo info = new SecurityBackInfo(mInfo);
//                                        isSecurityCtrlSuccess = true;
                                        setDeviceCtrlSuccessStateWithInfo(infos.get(j), true);
                                        EventBus.getDefault().post(new SecurityAlarmFeedBackEvent(info, true));
                                    } else {
                                        HDLLog.E("报警设置反馈 反馈数据异常");
                                    }
                                    break outter;
                                }
                            }
                        }
                        break outter;
                    }
                }
                break;
        }
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLSDK.java
New file
@@ -0,0 +1,64 @@
//package com.hdl.sdk.hdl_core.HDLDeviceManger.Core;
//
//import android.content.Context;
//
//import com.hdl.sdk.hdl_core.Util.LogUtil.HDLLog;
//import com.hdl.sdk.hdl_core.Util.SPUtil.SPUtils;
//
///**
// * Created by jlchen on 2020-06-23.
// */
//public class HDLSDK {
//
//    /**
//     * 初始化 SDK
//     *
//     * @param context
//     */
//    public static void init(Context context) {
//        HDLDeviceManager.init(context);
//    }
//
//    /**
//     * 开启bus模式
//     * 启用6000端口
//     * @param context
//     */
//    public static void startHomeMode(Context context) {
//        SPUtils.setParam(context, SPUtils.KEY_RCU_IP_, "");
//        HandleSearch.curSearchMode = HandleSearch.GET_BUS_DEVICES;
//        HandleSearch.rcuIp = "";
//        HDLUdpCore.closeSocket6008();
//        HDLUdpCore.init6000();
//    }
//
//    /**
//     * 开启RCU模式
//     * 启用6008端口
//     * @param context
//     * @param newRcuIp RCU的IP地址
//     */
//    public static void startRcuMode(Context context, String newRcuIp) {
//        HandleSearch.curSearchMode = HandleSearch.GET_RCU_DEVICES;
//        HandleSearch.rcuIp = newRcuIp;
//        SPUtils.setParam(context, SPUtils.KEY_RCU_IP_, newRcuIp);
//        HDLUdpCore.closeSocket6000();
//        HDLUdpCore.init6008();
//    }
//
//    /**
//     * 是否开启SDK日志打印
//     *
//     * @param bOpen
//     */
//    public static void setHDLLogOpen(boolean bOpen) {
//        HDLLog.setHDLLogOpen(bOpen);
//    }
//
//    /**
//     * 释放资源 关闭串口
//     */
//    public static void release() {
//        HDLDeviceManager.release();
//    }
//}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Core/HDLUdpCore.java
@@ -433,6 +433,11 @@
            case Configuration.FRESH_AIR_STATE_BACK_COMMAND://20190709新增
            case Configuration.GEOTHERMAL_MODULE_CTRL_BACK_COMMAND://20190709新增 地热模块
            case Configuration.GEOTHERMAL_MODULE_STATE_BACK_COMMAND://20190709新增
            case Configuration.COMMON_SWITCH_CTRL_BACK_COMMAND:  //2020-06-23 通用开关
            case Configuration.COMMON_SWITCH_STATE_BACK_COMMAND: //2020-06-23 通用开关
            case Configuration.SECURITY_ARMING_CTRL_BACK_COMMAND://20190729安防模块 布防设置反馈
            case Configuration.SECURITY_STATE_BACK_COMMAND://20190729 读取安防设置反馈
            case Configuration.SECURITY_ALARM_CTRL_BACK_COMMAND://20190729 报警设置反馈
            case Configuration.CURTAIN_STATE_BACK_COMMAND:
            case Configuration.AIR_STATE_BACK_COMMAND:
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/CommonSwitchCtrlBackEvent.java
New file
@@ -0,0 +1,26 @@
package com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCommonSwitch.CommonSwitchBackInfo;
/**
 * Created by jlchen on 2020-04-01.
 */
public class CommonSwitchCtrlBackEvent {
    CommonSwitchBackInfo mCommonSwitchBackInfo;
    boolean isSuccess;
    public CommonSwitchCtrlBackEvent(CommonSwitchBackInfo commonSwitchBackInfo, boolean isSuccess){
        this.isSuccess = isSuccess;
        this.mCommonSwitchBackInfo = commonSwitchBackInfo;
    }
    public CommonSwitchBackInfo getCommonSwitchBackInfo() {
        return mCommonSwitchBackInfo;
    }
    public boolean isSuccess() {
        return isSuccess;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/CommonSwitchStateBackEvent.java
New file
@@ -0,0 +1,26 @@
package com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLCommonSwitch.CommonSwitchBackInfo;
/**
 * Created by jlchen on 2020-04-01.
 */
public class CommonSwitchStateBackEvent {
    CommonSwitchBackInfo mCommonSwitchBackInfo;
    boolean isSuccess;
    public CommonSwitchStateBackEvent(CommonSwitchBackInfo commonSwitchBackInfo, boolean isSuccess){
        this.isSuccess = isSuccess;
        this.mCommonSwitchBackInfo = commonSwitchBackInfo;
    }
    public CommonSwitchBackInfo getCommonSwitchBackInfo() {
        return mCommonSwitchBackInfo;
    }
    public boolean isSuccess() {
        return isSuccess;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/SecurityAlarmFeedBackEvent.java
New file
@@ -0,0 +1,24 @@
package com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLSecurity.SecurityBackInfo;
/**
 * Created by JLChen on 2019/7/29
 */
public class SecurityAlarmFeedBackEvent {
    SecurityBackInfo mSecurityBackInfo;
    boolean isSuccess;
    public SecurityAlarmFeedBackEvent(SecurityBackInfo securityBackInfo, boolean isSuccess){
        this.mSecurityBackInfo = securityBackInfo;
        this.isSuccess = isSuccess;
    }
    public SecurityBackInfo getSecurityBackInfo() {
        return mSecurityBackInfo;
    }
    public boolean isSuccess() {
        return isSuccess;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/EventBusEvent/SecurityArmingFeedBackEvent.java
New file
@@ -0,0 +1,35 @@
package com.hdl.sdk.hdl_core.HDLDeviceManger.EventBusEvent;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
/**
 * Created by JLChen on 2019/7/29
 */
public class SecurityArmingFeedBackEvent {
    AppliancesInfo appliancesInfo;
    int armingState;
    boolean isSuccess;
    public SecurityArmingFeedBackEvent(boolean isSuccess){
        this.isSuccess = isSuccess;
    }
    public SecurityArmingFeedBackEvent(AppliancesInfo mAppliancesInfo, int armingState, boolean isSuccess){
        this.appliancesInfo = mAppliancesInfo;
        this.armingState = armingState;
        this.isSuccess = isSuccess;
    }
    public int getArmingState() {
        return armingState;
    }
    public boolean isSuccess() {
        return isSuccess;
    }
    public AppliancesInfo getAppliancesInfo() {
        return appliancesInfo;
    }
}
hdl_core/src/main/java/com/hdl/sdk/hdl_core/HDLDeviceManger/Parser/DeviceParser.java
@@ -2,6 +2,7 @@
import com.hdl.sdk.hdl_core.Config.Configuration;
import com.hdl.sdk.hdl_core.HDLAppliances.Config.HDLApConfig;
import com.hdl.sdk.hdl_core.HDLAppliances.HDLLogic.LogicMode;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.AppliancesInfo;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Bean.DevicesData;
import com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLDeviceManager;
@@ -10,6 +11,8 @@
import java.util.ArrayList;
import java.util.List;
import static com.hdl.sdk.hdl_core.HDLDeviceManger.Core.HDLDeviceManager.devicesDataList;
/**
 * Created by djl on 2017/3/29.
@@ -223,6 +226,29 @@
                    case Configuration.FRESH_AIR_LITTLE_TYPE_0:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.COMMON_SWITCH_BIG_TYPE://2020-06-23 通用开关设备
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
                    default:
                        isWant = false;
                        break;
                }
                break;
            case Configuration.SECURITY_BIG_TYPE:
                switch (littleType) {
                    case 0:
                        isWant = true;
                        break;
//                    case 2:
//                        isWant = true;
//                        break;
                    default:
                        isWant = false;
                        break;
@@ -723,7 +749,7 @@
        if (bWantData) {
            devicesData.setAppliancesInfoList(appliancesInfoList);
            HDLDeviceManager.devicesDataList.add(devicesData);
            devicesDataList.add(devicesData);
            HandleSearch.OnDeviceListGetSuccessCallBack();
        }else {
@@ -765,6 +791,12 @@
            case Configuration.FRESH_AIR_BIG_TYPE:
                parseFreshAirData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, port, "");
                break;
            case Configuration.COMMON_SWITCH_BIG_TYPE://2020-06-23 通用开关
                parseCommonSwitchData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            case Configuration.SECURITY_BIG_TYPE://2020-06-23  新增
                parseSecurityData(littleType, appliancesInfo, devicesData, parentRemarks, curChannelNum, 0, "");
                break;
            default:
//                            appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
@@ -782,4 +814,219 @@
    }
    /**
     * 2020-06-23
     * 新增通用开关
     * @param littleType
     * @param appliancesInfo
     * @param devicesData
     * @param parentRemarks
     * @param channelNum
     * @param port
     * @param ipAddress
     */
    private static void parseCommonSwitchData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("通用开关");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_COMMON_SWITCH);
                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.COMMON_SWITCH_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
            appliancesInfo.setCtrlCommand(Configuration.COMMON_SWITCH_CTRL_COMMAND);//
            appliancesInfo.setCtrlBackCommand(Configuration.COMMON_SWITCH_CTRL_BACK_COMMAND);//
            appliancesInfo.setStateCommand(Configuration.COMMON_SWITCH_STATE_COMMAND);//
            appliancesInfo.setStateBackCommand(Configuration.COMMON_SWITCH_STATE_BACK_COMMAND);//
        }
    }
    /**
     * 2020-06-23 新增
     *
     * @param littleType
     * @param appliancesInfo
     * @param devicesData
     * @param parentRemarks
     * @param channelNum
     * @param port
     * @param ipAddress
     */
    private static void parseSecurityData(int littleType, AppliancesInfo appliancesInfo, DevicesData devicesData, String parentRemarks, int channelNum, int port, String ipAddress) {
        switch (littleType) {
            case 0:
                appliancesInfo.setDeviceName("安防模块");
                appliancesInfo.setDeviceType(HDLApConfig.TYPE_SECURITY_MODULE);
                break;
//            case 2:
//                appliancesInfo.setDeviceName("安防控制面板");
//                appliancesInfo.setDeviceType(HDLApConfig.SECURITY_CONTROL_PANEL);
//                break;
            default:
                appliancesInfo.setDeviceName(Configuration.UNKNOW_TYPE);
                break;
        }
        if (devicesData != null) {
            appliancesInfo.setChannelNum(channelNum);
            appliancesInfo.setBigType(Configuration.SECURITY_BIG_TYPE);
            appliancesInfo.setLittleType(littleType);
            appliancesInfo.setDeviceSubnetID(devicesData.getSourceSubnetID());
            appliancesInfo.setDeviceDeviceID(devicesData.getSourceDeviceID());
            appliancesInfo.setParentRemarks(parentRemarks);
//            appliancesInfo.setPort(port);
//            appliancesInfo.setIpAddress(ipAddress);
            appliancesInfo.setCtrlCommand(Configuration.SECURITY_ARMING_CTRL_COMMAND);//布防
            appliancesInfo.setCtrlBackCommand(Configuration.SECURITY_ARMING_CTRL_BACK_COMMAND);//布防设置反馈
            appliancesInfo.setStateCommand(Configuration.SECURITY_STATE_COMMAND);//读取安防设置
            appliancesInfo.setStateBackCommand(Configuration.SECURITY_STATE_BACK_COMMAND);//读取安防设置反馈
        }
    }
    /**
     * 添加设备回路
     * 如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
     * @param port 发送UDP包 端口号
     * @param bigType
     * @param littleType
     * @param mSubnetID
     * @param mDeviceID
     * @param mChannelNum
     * @param mChannelRemark
     * @param parentRemarks
     * @param bSaveAndCallBack 是否马上保存本地并且推送DevicesInfoEvent 事件
     * @return
     */
    public static DevicesData addDevicesListWithoutSearching(int port, int bigType, int littleType, int mSubnetID, int mDeviceID, int mChannelNum, String mChannelRemark, String parentRemarks, boolean bSaveAndCallBack) {
//        boolean bWantData = false;
        if (isWantData(bigType, littleType)) {
            DevicesData devicesData = new DevicesData();
            devicesData.setSourceSubnetID(mSubnetID);
            devicesData.setSourceDeviceID(mDeviceID);
            devicesData.setRemark(parentRemarks);
            Boolean isFindDevicesData = false;
            int index = 0;
            for (int i = 0; i < devicesDataList.size(); i++) {
                if (devicesDataList.get(i).getSourceSubnetID() == mSubnetID && devicesDataList.get(i).getSourceDeviceID() == mDeviceID) {
                    index = i;
                    isFindDevicesData = true;
                    break;
                }
            }
            if (isFindDevicesData) {
                AppliancesInfo mAppliancesInfo = getDevicesInfo(devicesData, bigType, littleType, mChannelNum, port, parentRemarks, mChannelRemark);
                devicesDataList.get(index).getAppliancesInfoList().add(mAppliancesInfo);
                devicesData = devicesDataList.get(index);
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            } else {
                List<AppliancesInfo> appliancesInfoList = new ArrayList<>();
                appliancesInfoList.add(getDevicesInfo(devicesData, bigType, littleType, mChannelNum, port, parentRemarks, mChannelRemark));
                devicesData.setAppliancesInfoList(appliancesInfoList);
                devicesDataList.add(devicesData);
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            }
            return devicesData;
        } else {
            return null;
        }
    }
    /**
     * 添加场景设备回路
     * 如果存在相同子网号 设备号,则当成混合模块添加到该回路下,不存在则新添加模块
     * @param mSubnetID
     * @param mDeviceID
     * @param mAreaNum //场景 区域号
     * @param mAreaSceneNum //场景 当前区域场景号
     * @param mChannelRemark
     * @param parentRemarks
     * @param bSaveAndCallBack 是否马上保存本地并且推送DevicesInfoEvent 事件
     * @return
     */
    public static DevicesData addScenesDevicesListWithoutSearching(int port, int mSubnetID, int mDeviceID, int mAreaNum, int mAreaSceneNum, String mChannelRemark, String parentRemarks, boolean bSaveAndCallBack) {
//        boolean bWantData = false;
        int bigType = Configuration.GLOBAL_LOGIC_BIG_TYPE;
        int littleType = 0;
        if (isWantData(bigType, littleType)) {
            DevicesData devicesData = new DevicesData();
            devicesData.setSourceSubnetID(mSubnetID);
            devicesData.setSourceDeviceID(mDeviceID);
            devicesData.setRemark(parentRemarks);
            Boolean isFindDevicesData = false;
            int index = 0;
            for (int i = 0; i < devicesDataList.size(); i++) {
                if (devicesDataList.get(i).getSourceSubnetID() == mSubnetID && devicesDataList.get(i).getSourceDeviceID() == mDeviceID) {
                    index = i;
                    isFindDevicesData = true;
                    break;
                }
            }
            if (isFindDevicesData) {
                AppliancesInfo mAppliancesInfo = getDevicesInfo(devicesData, bigType, littleType, mAreaNum, port, parentRemarks, mChannelRemark);
                LogicMode mLogicMode = new LogicMode();
                mLogicMode.setAreaNum(mAreaNum);
                mLogicMode.setAreaSceneNum(mAreaSceneNum);
                mAppliancesInfo.setLogicMode(mLogicMode);
                devicesDataList.get(index).getAppliancesInfoList().add(mAppliancesInfo);
                devicesData = devicesDataList.get(index);
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            } else {
                List<AppliancesInfo> appliancesInfoList = new ArrayList<>();
                AppliancesInfo mAppliancesInfo = getDevicesInfo(devicesData, bigType, littleType, mAreaNum, port, parentRemarks, mChannelRemark);
                LogicMode mLogicMode = new LogicMode();
                mLogicMode.setAreaNum(mAreaNum);
                mLogicMode.setAreaSceneNum(mAreaSceneNum);
                mAppliancesInfo.setLogicMode(mLogicMode);
                appliancesInfoList.add(mAppliancesInfo);
                devicesData.setAppliancesInfoList(appliancesInfoList);
                devicesDataList.add(devicesData);
                if(bSaveAndCallBack){
                    HandleSearch.OnDeviceListGetSuccessCallBack();}
            }
            return devicesData;
        } else {
            return null;
        }
    }
}