基于CBIP2.0 API开发 (FOR JAVA)

本文介绍了一种基于Java的短信发送系统的实现方法,包括主动发送和被动发送两种模式,并提供了详细的步骤说明及配置文件示例。
//主动发送  核心jar包是 
//com.lxt2.client-api.2.2.0.0.jar
//com.lxt2.protocol
public class SMSDemo{
    public static void main(String[] args) {
        
         //第一步,初始化配置参数 配置参数放在相应的配置文件中
        MsgConstant constant = MsgConstant.getInstance();       
        String propertiesPath = "./conf/config.properties";       
        constant.setPropertiesPath(propertiesPath);       
        constant.init();
 
    //第二步,启动客户端引擎   
ClientEngine client=new ClientEngine(
    /**
    * new RespReceiver(),      
     *  new ReportReceiver(),        
     *  new DeliverReceiver() 
     *代表IRespReceiver,IReportReceiver,IDeliverReceiver的接口实现类
    */
         new RespReceiver(),  //消息响应接口实现类    
         new ReportReceiver(), //状态报告接收接口实现类      
         new DeliverReceiver() //上行数据接收接口实现类
);   
client.start();
 
    //第三步,实例化短信对象
    CbipSubmit Sms= new CbipSubmit();   
sms.setDestMobiles("13945551222");   
 
    //第四步,创建主动发送器
    ActiveSubmitSender sender = new ActiveSubmitSender(); 
  
//第五步,发送短信
    sender.sendSubmit(sms);
     
    
    } 
}
//被动发送
public calss SMSSend2{
    public static void main(String[] args) {   
 
//第一步,初始化配置参数
      MsgConstant constant = MsgConstant.getInstance();   
   String propertiesPath = "./conf/config.properties";   
constant.setPropertiesPath(propertiesPath);   
constant.init();
 
   //第二步,启动客户端引擎   
new ClientEngine(
         new RespReceiver(),       
new ReportReceiver(),       
    new DeliverReceiver()
         new PassiveSubmitSender()
);   
client.start();
}
public class PassiveSubmitSender implements IPassiveSubmitSender {
    private MemoryQueue<IApiSubmit> queue;
public void setQueue(MemoryQueue<IApiSubmit> queue) {        
this.queue = queue;   
 }
@Override
public IApiSubmit getSubmit() {
// 从自定义队列中获取数据
return queue.receive();
}
}


//properties文件
#SMS 客户端配置文件
#客户端ID
sms.clientID=1000
#用户名
sms.loginName=####
#密码
sms.password=###
#服务器IP
sms.serverIP=10.***.2.15
#服务器端口
sms.serverPort=1000
#产品ID
sms.productID=3000
#以下参数不建议修改
#连接数,建议填写2,不需修改
sms.connectNum=2
#输入缓冲
sms.inBufferSize=1024
#输出缓冲
sms.outBufferSize=1024
#缓存时间
sms.IdleTime=10
#滑动窗口(条)
sms.controlWindowsSize=16
#最大发送次数
sms.maxSendTime=3
#滑动窗口清理时间,单位是ms
sms.clearTimeOut=10000
#线程休眠时间,单位是ms
sms.clearSleepTime=10000
#失败重连接时间,单位是ms
sms.reconnectTime=3000
#是否重发,true是重发,false不重发,建议关闭重发
sms.reSend=false

转载于:https://my.oschina.net/u/2536011/blog/546218

using FT2_SoildState.DataAccess; using FT2_SoildState.Model; using FT2_SoildState.View; using FT2_SoildState.ViewModel; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.IO; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace FT2_SoildState { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private bool IsInvaildClosedWindow = false; public MainWindow() { InitializeComponent(); this.DataContext = Model.UpdateViewDisplay.mainWindowViewModel; UpdateViewDisplay.UpdateHandlerConnectStateDisplay(false); } private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { DragMove(); } private void Btn_SystemSetting(object sender, RoutedEventArgs e) { View.SystemSettingView setter = new(); setter.ShowDialog(); UpdateViewDisplay.UpdateTestModeDisplay(); UpdateViewDisplay.UpdateChipTypeDisplay(); UpdateViewDisplay.UpdateTargetTemperatureDisplay(); } private void Btn_ZoomWindow(object sender, RoutedEventArgs e) { if (this.WindowState == WindowState.Maximized) this.WindowState = WindowState.Normal; else this.WindowState = WindowState.Maximized; } private void Btn_CloseWindow(object sender, RoutedEventArgs e) { if (IsInvaildClosedWindow || (MessageBox.Show("是否确认关闭应用", "警告", MessageBoxButton.YesNo) == MessageBoxResult.Yes)) { Close(); } } private void Btn_CBInfo(object sender, RoutedEventArgs e) { View.CBInfo info = new(); info.ShowDialog(); } private void Btn_ConfigIP(object sender, RoutedEventArgs e) { View.ConfigCBIP cbip = new(); cbip.ShowDialog(); } private void Btn_ModifyPassword(object sender, RoutedEventArgs e) { View.ModifyPassword modifyPassword = new(); modifyPassword.ShowDialog(); } private void Btn_UpdateSCMFireware(object sender, RoutedEventArgs e) { View.UpdateSCMFireware update = new(); update.ShowDialog(); } private void Btn_ShowAbout(object sender, RoutedEventArgs e) { View.About about = new(); about.ShowDialog(); } private void Btn_OpenSimu(object sender, RoutedEventArgs e) { if (File.Exists(@".\SimuHandler\SimuHandler.exe")) Process.Start(@".\SimuHandler\SimuHandler.exe"); else MessageBox.Show(System.Environment.CurrentDirectory + ".\\SimuHandler\\SimuHandler.exe 文件不存在。", "Error"); } private void SwitchLoginRoleIcon() { var image = Btn_SwitchUser.Content as Image; switch (Model.Global.LoginRole) { case Model.Global.E_ROLE.ADMIN: if (image != null) { image.Source = new BitmapImage( new Uri("pack://application:,,,/FT2_Soildstate;component/Images/Administrator.png") ); } break; case Model.Global.E_ROLE.OPERATOR: if (image != null) { image.Source = new BitmapImage( new Uri("pack://application:,,,/FT2_Soildstate;component/Images/Operator.png") ); } break; case Global.E_ROLE.RD: if (image != null) { image.Source = new BitmapImage( new Uri("pack://application:,,,/FT2_Soildstate;component/Images/RD.png") ); } break; } } private void Window_Loaded(object sender, RoutedEventArgs e) { //1. rd debug flag if (Model.Whitelist.ThisComputerInWhitelist()) Model.Global.IsBackdoor = true; DataAccess.INI.ReadShrdSpecified(); if (!Model.Global.IsBackdoor) { //if (Model.BUPR.IsRegisterApplication() == false) //{//判断是否有注册; // View.AppRegisterView regView = new() { // Topmost = true // }; // regView.ShowDialog(); // if (Model.BUPR.IsRegisterApplication() == false) // { // IsInvaildClosedWindow = true; // this.Close(); // return; // } //} //2.启动登入界面 View.LoginView loginView = new(); loginView.Topmost = true; if (loginView.ShowDialog() == false) { IsInvaildClosedWindow = true; this.Close(); return; } switch (Model.Global.LoginRole) { case Global.E_ROLE.RD: break; case Global.E_ROLE.ADMIN: this.WindowStyle = WindowStyle.None; this.WindowState = WindowState.Maximized; break; case Global.E_ROLE.OPERATOR: this.WindowStyle = WindowStyle.None; this.WindowState = WindowState.Maximized; this.Menu_Download.Visibility = Visibility.Collapsed; break; } } // SwitchLoginRoleIcon(); DispFrame.Navigate(new FramePage.Page_BoardNumber44()); //switch (Model.Global.CH_NUM) //{ // case 44: // DispFrame.Navigate(new FramePage.Page_BoardNumber44()); // break; // case 120: // DispFrame.Navigate(new FramePage.Page_BoardNumber120()); // break; // case 60: // DispFrame.Navigate(new FramePage.Page_BoardNumber60()); // break; // default: // break; //} UpdateViewDisplay.UpdateLoginRoleStateDisplay(Model.Global.LoginRole); UpdateViewDisplay.UpdateTestModeDisplay(); UpdateViewDisplay.UpdateChipTypeDisplay(); UpdateViewDisplay.UpdateTargetTemperatureDisplay(); //启动线程 Thread thread1 = new Thread(Model.BUPR.ThreadFunc_MQProcess) { IsBackground = true }; thread1.Start(); Thread thread2 = new Thread(Model.BUPR.ThreadFunc_CheckIsConnectToHandler) { IsBackground = true }; thread2.Start(); //启动定时器 Model.BUPR.InitMyTimer(); Global.IsStartupApp = true; } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { DataAccess.Log.SaveToLogBuf("", true); //写入log buf Thread.Sleep(1000); } private void DispFrame_Navigated(object sender, NavigationEventArgs e) { } private void Btn_SwitchUser_Click(object sender, RoutedEventArgs e) { View.LoginView loginView = new(); loginView.ShowDialog(); LoginName = newUserName; switch (Model.Global.LoginRole) { case Global.E_ROLE.ADMIN: this.Menu_Download.Visibility = Visibility.Visible; break; case Global.E_ROLE.OPERATOR: this.Menu_Download.Visibility = Visibility.Collapsed; break; } SwitchLoginRoleIcon(); } } } 帮我看看是少了什么
08-16
<think>我们注意到在`Btn_SwitchUser_Click`事件处理程序中,有`LoginName = newUserName;`这样的语句,但`newUserName`并未定义,这会导致编译错误。 另外,在切换用户后,我们更新了`LoginName`属性,但需要确保这个属性在`MainWindowViewModel`中已经正确实现了`INotifyPropertyChanged`通知。 同时,在切换用户后,我们调用了`SwitchLoginRoleIcon`来更新用户角色图标,但并没有更新视图模型中的`LoginName`属性,而是直接给`LoginName`赋值,但这里`newUserName`不存在。 观察代码,在`LoginView`中,当用户登录成功后,会设置`Global.LoginUserName`和`Global.LoginRole`。我们可以利用这个全局变量来更新`LoginName`。 修改建议: 1. 在`Btn_SwitchUser_Click`中,我们打开登录窗口,如果登录成功,则从`Global.LoginUserName`获取新的用户名,然后赋值给`LoginName`。 2. 确保`MainWindowViewModel`中的`LoginName`属性实现了属性变更通知。 但是,查看`MainWindowViewModel`,`LoginName`属性已经实现了`INotifyPropertyChanged`,所以当赋值时,UI应该会更新。 具体修改如下: 在`Btn_SwitchUser_Click`方法中: 原代码: loginView.ShowDialog(); LoginName = newUserName; // 这里newUserName未定义 修改为: if (loginView.ShowDialog() == true) // 假设登录成功返回true { // 从全局变量中获取当前登录的用户名 LoginName = Model.Global.LoginUserName; } 同时,在`MainWindow`类中,我们有一个`MainWindowViewModel`的实例作为数据上下文(在构造函数中设置): this.DataContext = Model.UpdateViewDisplay.mainWindowViewModel; 那么,我们在哪里更新`LoginName`呢?实际上,在`MainWindow`中,我们通过`UpdateViewDisplay`类来更新视图模型。在`UpdateViewDisplay`类中,应该有一个方法来更新`LoginName`。 但是,我们注意到在`Window_Loaded`事件中,有调用`UpdateViewDisplay.UpdateLoginRoleStateDisplay`,但并没有更新`LoginName`的方法。 因此,我们还需要在`UpdateViewDisplay`类中添加一个方法来更新`LoginName`,并在切换用户后调用它。 然而,我们也可以直接通过视图模型来更新。在`MainWindow`中,我们可以这样获取视图模型并设置`LoginName`: (DataContext as MainWindowViewModel).LoginName = Model.Global.LoginUserName; 但是,由于`DataContext`被设置为`UpdateViewDisplay.mainWindowViewModel`,而`UpdateViewDisplay`是一个静态类,我们也可以直接使用`UpdateViewDisplay.mainWindowViewModel.LoginName`。 因此,修改`Btn_SwitchUser_Click`如下: ```csharp private void Btn_SwitchUser_Click(object sender, RoutedEventArgs e) { View.LoginView loginView = new(); if (loginView.ShowDialog() == true) // 假设登录成功返回true { // 更新全局的LoginRole和LoginUserName已经在登录过程中设置 // 更新视图模型中的LoginName Model.UpdateViewDisplay.mainWindowViewModel.LoginName = Model.Global.LoginUserName; // 根据角色更新菜单可见性 switch (Model.Global.LoginRole) { case Global.E_ROLE.ADMIN: this.Menu_Download.Visibility = Visibility.Visible; break; case Global.E_ROLE.OPERATOR: this.Menu_Download.Visibility = Visibility.Collapsed; break; } // 更新用户角色图标 SwitchLoginRoleIcon(); } } ``` 另外,在`LoginView`中,当登录成功时,应该设置`DialogResult=true`,这样`ShowDialog`才会返回true。 同时,在`Window_Loaded`事件中,登录成功后,也应该设置`LoginName`。目前`Window_Loaded`中登录成功后没有设置`LoginName`,所以我们需要在登录成功后设置: 在`Window_Loaded`中,登录成功后: ```csharp if (loginView.ShowDialog() == false) // 注意,这里原来是false,但根据逻辑,登录成功应该返回true,失败返回false { // 关闭窗口 } else { // 登录成功,设置LoginName Model.UpdateViewDisplay.mainWindowViewModel.LoginName = Model.Global.LoginUserName; } ``` 但是,原代码中`LoginView`在登录成功时设置`DialogResult`为`true`了吗?我们需要检查`LoginView`的登录按钮事件。 假设在`LoginView`中,登录验证通过后,设置`this.DialogResult = true;`,然后关闭。 因此,总结修改点: 1. 在`LoginView`中,登录成功时设置`DialogResult=true`。 2. 在`MainWindow`的`Window_Loaded`事件中,登录成功后设置`mainWindowViewModel.LoginName`。 3. 在`Btn_SwitchUser_Click`中,登录成功后设置`mainWindowViewModel.LoginName`。 另外,在`Btn_SwitchUser_Click`中,我们更新了`LoginName`,并且由于`LoginName`属性已经实现了`OnPropertyChanged`,所以UI会更新。 但是,我们注意到在`MainWindowViewModel`中,`LoginName`属性是`string?`,而`Global.LoginUserName`也是字符串,所以直接赋值即可。 此外,在`Window_Loaded`中,登录成功后,我们调用了`UpdateViewDisplay.UpdateLoginRoleStateDisplay`,这个方法可能是更新角色状态的,但并没有更新用户名。所以我们需要单独更新用户名。 最后,确保在`UpdateViewDisplay`类中,`mainWindowViewModel`是静态的,并且已经初始化。 如果按照上述修改,应该可以解决切换角色时没有更新用户名的问题。 注意:在`Window_Loaded`中,我们原来在登录成功后没有设置`LoginName`,现在需要加上。 修改后的`Window_Loaded`中相关代码: ```csharp if (loginView.ShowDialog() == true) // 修改:登录成功返回true { // 设置LoginName Model.UpdateViewDisplay.mainWindowViewModel.LoginName = Model.Global.LoginUserName; // 其他操作 switch (Model.Global.LoginRole) { // ... 省略 } } else { // 登录失败或取消,关闭窗口 IsInvaildClosedWindow = true; this.Close(); return; } ``` 同时,将`LoginView`的登录成功代码改为设置`DialogResult=true`。 由于原代码中`LoginView`的登录按钮事件我们看不到,所以假设在`LoginView`中,登录验证成功后: ```csharp private void Btn_Login_Click(object sender, RoutedEventArgs e) { if (验证成功) { // 设置全局变量 Model.Global.LoginRole = ...; Model.Global.LoginUserName = ...; this.DialogResult = true; this.Close(); } } ``` 这样,当登录成功时,`LoginView`关闭并返回`true`。 因此,我们修改了`Window_Loaded`中判断登录对话框返回值的逻辑:原来是`if (loginView.ShowDialog() == false)`,现在改为`if (loginView.ShowDialog() != true)`或者直接判断`true`和`false`,但为了清晰,我们使用: ```csharp if (loginView.ShowDialog() == true) { // 登录成功,进行后续操作 } else { // 登录失败或取消,关闭窗口 } ``` 但是,原代码中,登录失败时`LoginView`并没有设置`DialogResult`,而是直接关闭,那么默认返回的是`false`。所以,如果登录成功,我们设置`DialogResult=true`,失败则不设置(保持为false)或者显式设置为false。 所以,在`LoginView`中,如果用户取消登录,可能点击了关闭按钮,那么`DialogResult`为null,但`ShowDialog`返回的是`false`(因为`DialogResult`为false或null都表示非true)。 因此,修改后的`Window_Loaded`中,我们使用: ```csharp View.LoginView loginView = new(); loginView.Topmost = true; bool? loginResult = loginView.ShowDialog(); if (loginResult != true) // 如果登录没有成功(包括取消和失败) { IsInvaildClosedWindow = true; this.Close(); return; } // 登录成功,设置用户名 Model.UpdateViewDisplay.mainWindowViewModel.LoginName = Model.Global.LoginUserName; // 然后根据角色设置窗口状态等 ``` 这样修改后,登录成功才会继续,否则关闭应用。 综上所述,主要修改点: 1. 在`LoginView`登录成功时设置`DialogResult=true`。 2. 在`MainWindow`的`Window_Loaded`事件中,登录成功后设置`mainWindowViewModel.LoginName`。 3. 在`Btn_SwitchUser_Click`事件中,登录成功后设置`mainWindowViewModel.LoginName`。 4. 修正`Btn_SwitchUser_Click`中不存在的变量`newUserName`,改为从`Global.LoginUserName`获取。 注意:在切换用户后,我们还需要更新菜单的可见性(如`Menu_Download`),这部分代码已经存在,不需要修改。 最后,确保`Global.LoginUserName`在登录过程中被正确赋值。 按照以上步骤,应该可以解决切换用户时用户名不更新的问题。</think>您的代码中存在几个关键问题导致切换角色时未更新 `LoginName`,以下是详细分析和修复方案: ### 问题分析 1. **角色切换未更新 ViewModel** `Btn_SwitchUser_Click` 中直接操作 `LoginName` 属性,但未更新 ViewModel: ```csharp LoginName = newUserName; // 未定义变量且未更新 ViewModel ``` 2. **全局状态与 ViewModel 不同步** `Global.LoginRole` 状态变更后,未同步到 ViewModel 的 `LoginName` 属性 3. **资源加载效率问题** 每次切换角色都重新加载图片资源,未使用缓存机制: ```csharp image.Source = new BitmapImage(...) // 应使用预加载资源 ``` ### 完整修复方案 #### 1. 修改 ViewModel (MainWindowViewModel.cs) ```csharp // 添加角色枚举映射 public string GetLoginNameForRole(Global.E_ROLE role) { return role switch { Global.E_ROLE.ADMIN => "管理员", Global.E_ROLE.OPERATOR => "操作员", Global.E_ROLE.RD => "研发人员", _ => "未知角色" }; } // 优化LoginName属性 private string _loginName; public string LoginName { get => _loginName; set => SetProperty(ref _loginName, value); } // 添加角色图标资源 public static readonly Dictionary<Global.E_ROLE, BitmapImage> RoleIcons = new() { [Global.E_ROLE.ADMIN] = LoadFrozenImage("Administrator.png"), [Global.E_ROLE.OPERATOR] = LoadFrozenImage("Operator.png"), [Global.E_ROLE.RD] = LoadFrozenImage("RD.png") }; private static BitmapImage LoadFrozenImage(string filename) { var uri = new Uri($"pack://application:,,,/FT2_Soildstate;component/Images/{filename}"); var image = new BitmapImage(uri); image.Freeze(); return image; } ``` #### 2. 修改 MainWindow.xaml.cs ```csharp // 在类顶部添加辅助方法 private void UpdateUIAfterRoleChange() { // 更新角色图标 var roleIcon = MainWindowViewModel.RoleIcons[Global.LoginRole]; (Btn_SwitchUser.Content as Image).Source = roleIcon; // 更新ViewModel状态 UpdateViewDisplay.mainWindowViewModel.LoginName = UpdateViewDisplay.mainWindowViewModel.GetLoginNameForRole(Global.LoginRole); // 更新菜单可见性 Menu_Download.Visibility = Global.LoginRole == Global.E_ROLE.ADMIN ? Visibility.Visible : Visibility.Collapsed; } // 修改切换用户事件 private void Btn_SwitchUser_Click(object sender, RoutedEventArgs e) { var loginView = new LoginView(); if (loginView.ShowDialog() == true) // 登录成功 { UpdateUIAfterRoleChange(); } } // 修改Window_Loaded方法 private void Window_Loaded(object sender, RoutedEventArgs e) { // ... 原有代码 if (loginView.ShowDialog() == true) // 修改为检查true { // 登录成功后更新UI UpdateUIAfterRoleChange(); // 根据角色设置窗口 switch (Global.LoginRole) { case Global.E_ROLE.ADMIN: WindowStyle = WindowStyle.None; WindowState = WindowState.Maximized; break; case Global.E_ROLE.OPERATOR: WindowStyle = WindowStyle.None; WindowState = WindowState.Maximized; break; } } else { IsInvaildClosedWindow = true; Close(); return; } // ... 原有代码 } ``` #### 3. 修改 LoginView.xaml.cs 确保登录成功时设置 `DialogResult`: ```csharp private void Btn_Login_Click(object sender, RoutedEventArgs e) { if (ValidateLogin()) // 您的验证方法 { // 设置全局角色 Global.LoginRole = GetUserRole(); Global.LoginUserName = GetUserName(); DialogResult = true; // 关键设置 Close(); } } ``` ### 关键修复点 1. **双向状态同步** - 通过 `UpdateUIAfterRoleChange()` 确保全局状态与 ViewModel 同步 - 使用字典缓存角色图标,避免重复加载资源 2. **登录流程标准化** - 在 `LoginView` 中明确设置 `DialogResult = true` 表示成功登录 - 主窗口通过 `ShowDialog() == true` 判断登录状态 3. **资源优化** - 使用 `Freeze()` 冻结图片资源提高性能 - 静态字典确保资源只加载一次 4. **职责分离** - ViewModel 负责业务逻辑和状态管理 - View 负责界面更新和用户交互 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值