开发者中心 开发者中心
  • 简体中文
  • English
视频教程
敢为云网站
  • 6.0版本
  • 6.1 版本
视频教程
敢为云网站
  • 平台概述
  • 平台功能
  • 平台安装
  • 开发者指南
  • 项目实战
  • 附录
    • 常用协议说明
    • 常用调试工具
    • 接口说明
      • 服务端API
        • 概述
        • 协议文件结构图
        • 客户端集成步骤
        • 接口方法说明
          • 1. AlarmCenterService 接口提供的登录方法
          • 2. AlarmCenterDatabaseService 契约
          • 3. AlarmCenterService
          • 4. IAlarmCenterCallbackService 接口
          • 5. 消息接收,可通过NetMQ来接收消息
      • 后台WebAPI
      • 北向WebAPI
    • 数据库说明
    • 平台接入能力
    • 如何使用gRPC
    • 敢为公共库
    • 内网平台获取外网平台数据
    • 扩展插件使用说明
    • VForm3开发者文档
    • 虚拟计算表达式
    • 基于K8s负载均衡云服务配置
    • Q&A

服务端Api

# 接口说明

服务端Api说明

# 概述

IotCenter提供了一套完整的Api通信服务以供客户端与服务端间进行通信和数据交互,该机制主要使用 gRPC 协议作为数据传输的接口,proto文件作为该协议机制的协议文档,可供不同语言的开发者进行调用。

# 协议文件结构图

设计的协议文件包括以下组成部分:

├─AlarmCenterGrpcService.Protos  协议文件类库
│  ├─account.proto 登录
│  ├─AlarmCenterCallback.proto 部分实时数据查询及回调
│  ├─AlarmCenterDatabase.proto 数据库访问  
│  ├─common.proto 部分通用类型 
│  ├─greet.proto 初始化握手  
│  ├─serviceInstaceContract.proto 与服务管理有关的契约 
│  ├─SystemManage.proto 系统管理有关的契约 
│  ├─Tool.proto 部分工具类

# 客户端集成步骤

1、实现greet.proto所提供的客户端握手方法。

var clientMonitor = new GreetService();
await clientMonitor.GreetAsync();

2、实现account.proto所提供的登录方法。

3、集成上述方法后,可调用其他方法。

4、具体如何集成,可参见【如何使用gRPC 】获得完整使用步骤。

接下来就可以进行IotCenter服务的客户端集成了。

# 接口方法说明

# 1. AlarmCenterService 接口提供的登录方法

封装了一系列与用户登录相关的方法。

  • 接口索引
代码
public class AlarmCenterService
{
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        string Login(string userName, string password, ClientType clientType);
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <param name="clientType"></param>
        /// <returns></returns>
        bool LoginRetry(string userName, string password, ClientType clientType);
        /// <summary>
        /// 登录并重试
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        string Listen();
        /// <summary>
        /// 结束会话
        /// </summary>
        void CloseSession();
        /// <summary>
        /// 连接状态
        /// </summary>
        ConnectionStatus ConnectionStatus { get; set; } 
}
  • 示例代码
代码
var iconnectService = new AlarmCenterService();
iconnectService.Login("admin", "xxxx", AlarmCenterGrpc.Core.ClientType.Dll);//登录
iconnectService.CloseSession();//退出

# 2. AlarmCenterDatabaseService 契约

封装了一系列与数据库操作有关的方法。

  • 接口索引
代码
public class AlarmCenterDatabaseService
{
	/// <summary>
    /// 获取设备表(equip表)的DataTable
    /// </summary>
    /// <returns>equip表的DataTable</returns> 
    DataTable GetDataTableOfEquip();    
    /// <summary>
    /// 通过SQL语句获取一个对象
    /// </summary>
    /// <param name="strSQL">SQL语句</param>
    /// <returns>对象</returns>
    object GetObjectFromSQL(string strSQL);
    /// <summary>
    /// 获取YCP表的DataTable
    /// </summary>
    /// <param name="sta_no">站点好,填入1,当前无意义</param>
    /// <param name="equip_no">设备号</param>
    /// <returns>YCP表的DataTable</returns>
    DataTable GetDataTableOfYCP(int sta_no, int equip_no);
    /// <summary>
    /// 获取YXP表的DataTable
    /// </summary>
    /// <param name="sta_no">站点好,填入1,当前无意义</param>
    /// <param name="equip_no">设备号</param>
    /// <returns>YXP表的DataTable</returns>
    DataTable GetDataTableOfYXP(int sta_no, int equip_no);
    /// <summary>
    /// 获取SetParm表的DataTable
    /// </summary>
    /// <param name="sta_no">站点好,填入1,当前无意义</param>
    /// <param name="equip_no">设备号</param>
    /// <returns>SetParm表的DataTable</returns>
    DataTable GetDataTableOfSetParm(int sta_no, int equip_no);
    /// <summary>
    /// 通过SQL语句获取一个DataTable
    /// </summary>
    /// <param name="strSQL"></param>
    /// <returns></returns>
    DataTable GetDataTableFromSQL(string strSQL);
 	/// <summary>
    /// 执行一个SQL语句
    /// </summary>
    /// <param name="strSQL">SQL语句</param>
    /// <returns>返回受影响的行数</returns>
    int ExecuteSQL(string strSQL);
    /// <summary>
    /// 通过事务执行SQL语句(一条或者多条)
    /// </summary>
    /// <param name="cmdtext">SQL语句的数组</param> 
    void ExecuteSQLsWithTransaction(string[] cmdtext);
}
  • 示例代码
代码
var dbOperate = new AlarmCenterDatabaseService();
var dt = dbOperate.GetDataTableOfYCP(1, 1);
var result = dbOperate.GetDataTableFromSQL("select * from gwuser");

# 3. AlarmCenterService

封装了与IotCenter操作相关的方法。

  • 接口索引
代码
public class AlarmCenterService
{
    /// <summary>
    /// 监听
    /// </summary>
    void Listen(); /// <summary>
    /// 监听
    /// </summary>
    /// <returns></returns>
    string ListenEx();
    /// <summary>
    /// 登录
    /// </summary>
    /// <param name="User">用户名</param>
    /// <param name="Pwd">密码</param>
    /// <returns></returns> 
    bool Login(string User, string Pwd, ClientType CT, bool bRetry = false);
    /// <summary>
    /// 登录并返回令牌
    /// </summary>
    /// <param name="User"></param>
    /// <param name="Pwd"></param>
    /// <param name="CT"></param>
    /// <returns></returns>
    string LoginEx(string User, string Pwd, ClientType CT);
    /// <summary>
    /// 程序内部的站点链接登录
    /// </summary>
    /// <param name="bs">数字证书的内容</param>
    /// <returns></returns> 
    DllLoginReturnInfo DllLogin(byte[] bs);
    /// <summary>
    /// 注册组件
    /// </summary>
    /// <param name="RegisterData"></param>
    /// <returns></returns>
    bool DllRegisterData(List<RemoteRegisterData> RegisterData);
    /// <summary>
    /// 获取客户端IP和端口
    /// </summary>
    /// <returns></returns>
    string GetClientIPAndPort();
    /// <summary>
    /// 结束会话
    /// </summary>
    void CloseSession();  
    /// <summary>
    /// 停止服务端数据采集
    /// </summary>
    void StopDataCenter();
    string GetApplicationRootPath();
    /// <summary>
    /// 服务的数据采集是否在运行
    /// </summary>
    /// <returns></returns> 
    bool IsRun();
    /// <summary>
    /// 获取设备的运行状态
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <returns>状态</returns> 
    EquipState GetEquipStateFromEquipNo(int iEquipNo);
    /// <summary>
    /// 获取所有设备的状态
    /// </summary>
    /// <returns></returns> 
    Dictionary<int, EquipState> GetEquipStateDict();
    /// <summary>
    /// 获取模拟量测点的实时值
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iYcpNo">模拟量测点号</param>
    /// <returns>返回值</returns> 
    object GetYCValue(int iEquipNo, int iYcpNo);
    /// <summary>
    /// 获取指定设备的所有YC实时值
    /// </summary>
    /// <returns></returns> 
    Dictionary<int, object> GetYCValueDictFromEquip(int iEquipNo);
    /// <summary>
    /// 获取模拟量测点的报警状态
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iYcpNo">测点号</param>
    /// <returns>true:有报警; false:无报警</returns> 
    bool GetYCAlarmState(int iEquipNo, int iYcpNo);
    /// <summary>
    /// 获取指定设备的所有YC报警状态值
    /// </summary>
    /// <returns></returns> 
    Dictionary<int, bool> GetYCAlarmStateDictFromEquip(int iEquipNo);
    /// <summary>
    /// 获取状态量测点的实时值
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iYxpNo">状态量测点号</param>
    /// <returns>返回值</returns> 
    object GetYXValue(int iEquipNo, int iYxpNo);
    /// <summary>
    /// 获取指定设备的所有YX状态值
    /// </summary>
    /// <returns></returns>  
    Dictionary<int, string> GetYXValueDictFromEquip(int iEquipNo);
    /// <summary>
    /// 获取状态量测点的报警状态
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iYxpNo">状态量测点号</param>
    /// <returns>true:有报警; false:无报警</returns> 
    bool GetYXAlarmState(int iEquipNo, int iYxpNo);
    string GetYXEvt01(int iEquipNo, int iYxpNo);
    string GetYXEvt10(int iEquipNo, int iYxpNo);

    /// <summary>
    /// 获取指定设备的所有YX报警状态
    /// </summary>
    /// <returns></returns> 
    Dictionary<int, bool> GetYXAlarmStateDictFromEquip(int iEquipNo);
    /// <summary>
    /// 获得历史曲线的数据
    /// </summary>
    /// <param name="d">读取日期</param>
    /// <param name="eqpno">设备号</param>
    /// <param name="ycpno">模拟量测点号</param>
    /// <returns></returns>  
    byte[] GetCurveData(DateTime d, int eqpno, int ycno);
    /// <summary>
    /// 获取数据曲线
    /// </summary>
    /// <param name="d"></param>
    /// <param name="eqpno"></param>
    /// <param name="ycyxno"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    byte[] GetCurveData1(DateTime d, int eqpno, int ycyxno, string type);
    /// <summary>
    /// 获取数据曲线
    /// </summary>
    /// <param name="DTList"></param>
    /// <param name="stano"></param>
    /// <param name="eqpno"></param>
    /// <param name="ycyxno"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    Task<List<myCurveData>> GetDataFromCurve(List<DateTime> DTList, int stano, int eqpno, int ycyxno, string type);
    Task<List<myCurveData>> GetChangedDataFromCurveAsync(DateTime bgn, DateTime end, int stano, int eqpno, int ycyxno, string type);
    /// <summary>
    /// 把设备设置成调试状态
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="bFlag">true:调试状态; false:非调试状态</param> 
    void SetEquipDebug(int iEquipNo, bool bFlag);
    /// <summary>
    /// 获取设备的调试状态
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <returns></returns>
    bool GetEquipDebugState(int iEquipNo);
    /// <summary>
    /// 向设备发送设置命令
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <param name="strCMD1">命令字符串1</param>
    /// <param name="strCMD2">命令字符串2</param>
    /// <param name="strCMD3">命令字符串3</param>
    /// <param name="strUser">用户名(当前登录用户)</param> 
    void SetParm(int EquipNo, string strCMD1, string strCMD2, string strCMD3, string strUser);
    void SetParm_1(int EquipNo, string strCMD1, string strCMD2, string strCMD3, string strUser, bool bShowDlg);
    void SetParm1(int EquipNo, int SetNo, string strUser);
    void SetParm1_1(int EquipNo, int SetNo, string strValue, string strUser, bool bShowDlg);
    void SetParm2(int EquipNo, string strCMD1, string strCMD2, string strCMD3, string strType, string strUser);
    void SetParm2_1(int EquipNo, string strCMD1, string strCMD2, string strCMD3, string strType, string strUser, bool bShowDlg);
    void DoSetParmFromString(string csParmStr);
    /// <summary>
    /// 设备是否有模拟量测点
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <returns></returns> 
    bool HaveYCP(int EquipNo);
    /// <summary>
    /// 设备是否有状态量测点
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <returns></returns> 
    bool HaveYXP(int EquipNo);
    /// <summary>
    /// 设备是否有控制命令
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <returns></returns> 
    bool HaveSet(int EquipNo);
    /// <summary>
    /// 是否有历史曲线记录
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <param name="YCPNo">模拟量测点号</param>
    /// <returns></returns> 
    bool HaveHistoryCurve(int EquipNo, int YCPNo);
    /// <summary>
    /// 获取设备列表的字符串
    /// </summary>
    /// <returns>[设备号][设备名称];[设备号][设备名称]...</returns> 
    string GetEquipListStr();
    /// <summary>
    /// 获取模拟量列表的字符串
    /// </summary>
    /// <returns>[测点号][测点名称];[测点号][测点名称]...</returns> 
    string GetYCPListStr(int iEquipNo);
    /// <summary>
    /// 获取状态量列表的字符串
    /// </summary>
    /// <returns>[测点号][测点名称];[测点号][测点名称]...</returns> 
    string GetYXPListStr(int iEquipNo);
    /// <summary>
    /// 获取设置列表的字符串
    /// </summary>
    /// <returns>[设置名称][命令字符串1][命令字符串2][命令字符串3];[设置名称][命令字符串1][命令字符串2][命令字符串3]...</returns>   
    string GetSetListStr(int iEquipNo);
    /// <summary>
    /// 获取指定模拟量测点的“越限事件+处理意见”
    /// </summary>
    /// <param name="iEqpNo">设备号</param>
    /// <param name="iYCPNo">测点号</param>
    /// <returns></returns> 
    string GetYCAlarmComments(int iEqpNo, int iYCPNo);
    /// <summary>
    /// 获取指定状态量测点的“报警处理意见”
    /// </summary>
    /// <param name="iEqpNo">设备号</param>
    /// <param name="iYXPNo">测点号</param>
    /// <returns></returns> 
    string GetYXAlarmComments(int iEqpNo, int iYXPNo);
    /// <summary>
    /// 获取程序版本号
    /// </summary>
    /// <returns>程序版本号</returns> 
    string GetVersionInfo();
    /// <summary>
    /// 获取所有实时Proxy_YCItem值 
    /// </summary>
    void GetTotalRTYCItemData1();
    /// <summary>
    /// 获取所有实时Proxy_YXItem值
    /// </summary>
    void GetTotalRTYXItemData1();
    /// <summary>
    /// 获取变化的实时Proxy_YCItem值
    /// </summary>
    void GetChangedRTYCItemData1();
    /// <summary>
    /// 获取变化的实时Proxy_YXItem值
    /// </summary>
    void GetChangedRTYXItemData1();
    /// <summary>
    ///获取所有实时Proxy_EquipItem值
    /// </summary>
    void GetTotalRTEquipItemData1();
    /// <summary>
    /// 
    /// </summary>
    void GetChangedRTEquipItemData1();
    /// <summary>
    /// 获取动态添加的设备的Proxy_EquipItem值
    /// </summary>
    /// <returns></returns>
    int[] GetAddRTEquipItemData();
    /// <summary>
    /// 获取动态删除的设备的设备号数组
    /// </summary>
    /// <returns></returns>
    int[] GetDelRTEquipItemData();
    /// <summary>
    /// 获取动态删除的设备的设备号数组
    /// </summary>
    /// <returns></returns>
    int[] GetEditRTEquipItemData();
    /// <summary>
    /// 获取设备树的XML文件
    /// </summary>
    /// <returns></returns> 
    byte[] GetEquipTreeXMLFile();
    /// <summary>
    /// 通过平台的短信模块向指定手机号码发送短信
    /// </summary>
    /// <param name="TelNumber">手机号码</param>
    /// <param name="msg">短信内容</param>
    /// <returns></returns> 
    bool SendSMS(string TelNumber, string msg);
    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    bool ReadNextBuffer();
    /// <summary>
    /// 
    /// </summary>
    /// <returns></returns>
    byte[] GetCurrentBuffer();
    /// <summary>
    /// 获取新增的实时事件
    /// </summary>
    void GetAddRealEventItem1();
    /// <summary>
    /// 获取删除后的实时事件
    /// </summary>
    void GetDelRealEventItem1();
    /// <summary>
    /// 删除调试信息
    /// </summary>
    /// <param name="iEquipNo"></param>
    void DeleteDebugInfo(int iEquipNo);
    /// <summary>
    /// 确认设备状态
    /// </summary>
    /// <param name="item"></param>
    void ConfirmedRealTimeEventItem(WcfRealTimeEventItem item);
    /// <summary>
    /// 消息预警
    /// </summary>
    /// <param name="level"></param>
    /// <param name="msgstr"></param>
    /// <param name="equipno"></param>
    /// <param name="CanRepeat"></param>
    void AddMessage(MessageLevel level, string msgstr, int equipno, bool CanRepeat = true); 
    /// <summary>
    /// 数据库设备信息改变后(修改了equip、ycp、yxp表)进行重置
    /// </summary>
    void ResetEquips();
    /// <summary>
    /// 设备设置表的信息改变后(修改了SetParm表)进行重置
    /// </summary>
    void ResetSetParmTable();
    /// <summary>
    /// 修改了设备联动关系后进行程序重置
    /// </summary>
    void ResetEquipmentLinkage();
    /// <summary>
    /// 修改了定时任务的逻辑后进行程序重置
    /// </summary>
    void ResetProcTimeManage();
    /// <summary>
    /// 修改了定时抄表的逻辑后进行程序重置
    /// </summary>
    void ResetGWDataRecordItems();
    /// <summary>
    /// 修改了延时执行动作的列表后(修改了GWDelayAction表)进行程序重置
    /// </summary>
    void ResetDelayActionPlan(); 
    /// <summary>
    /// 资产管理:增加一个资产
    /// </summary>
    /// <param name="ZCID">资产号</param>
    void ZCAddReset(string ZCID);
    /// <summary>
    /// 资产管理:修改一个资产
    /// </summary>
    /// <param name="ZCID"></param>
    void ZCEditReset(string ZCID);
    /// <summary>
    /// 资产管理:删除一个资产
    /// </summary>
    /// <param name="ZCID"></param>
    void ZCDelReset(string ZCID);
    /// <summary>
    /// 获取所有资产项目
    /// </summary>
    /// <returns></returns>
    WcfZCItem[] FirstGetRealZCItem();
    /// <summary>
    /// 获取改变了的资产项目,包括增加项和修改项
    /// </summary>
    /// <returns></returns>
    WcfZCItem[] GetChangedZCItem();
    /// <summary>
    /// 获取删除了的资产项目
    /// </summary>
    /// <returns></returns>
    WcfZCItem[] GetDeleteZCItem();
    /// <summary>
    /// 把对应资产的图片传到服务端存储
    /// </summary>
    /// <param name="ZCID"></param>
    /// <param name="bs">图片的二进制数组</param>
    void SendImageToSvr(string ZCID, byte[] bs);
    /// <summary>
    /// 从服务端取回对应资产的图片
    /// </summary>
    /// <param name="ZCID">资产号</param>
    /// <returns>图片的二进制数据数组</returns>
    byte[] GetImageFromSvr(string ZCID);
    /// <summary>
    /// 加入资产维护记录
    /// </summary>
    /// <param name="ZCID">资产ID</param>
    /// <param name="Name">维护人,通常就是App的登录用户名</param>
    /// <param name="RecordStr">输入的维护记录</param>
    /// <param name="Pictures">通过手机拍的照片,一张或多张</param>
    /// <returns></returns>
    bool AddWeihuRecord4ZC(string ZCID, string Name, string RecordStr, List<byte[]> Pictures);
    /// <summary>
    /// 删除一条维护记录
    /// </summary>
    /// <param name="ID">维护记录表中的唯一ID</param>
    /// <returns></returns>
    bool RemoveWeihuRecord4ZC(long ID/////////////////////////////////////////////
    /// <summary>
    /// 把预案的图片存到服务端
    /// </summary>
    /// <param name="ID">预案号</param>
    /// <param name="bs">图片的二进制数组</param>
    void SendPlanImageToSvr(string ID, byte[] bs);
    /// <summary>
    /// 从服务端获取预案的对应图片
    /// </summary>
    /// <param name="ID">预案ID</param>
    /// <returns>图片数据的数组</returns>
    byte[] GetPlanImageFromSvr(string ID);
    /// <summary>
    /// 获取所有预案的图片名称
    /// </summary>
    /// <returns>名称数组</returns>
    List<string> GetAllPlanImageName();
    bool IsPlanFileExist(string fileName); 
    /// <summary>
    /// 获取软件的授权名称
    /// </summary>
    /// <returns></returns>
    string GetName2SF();
    /// <summary>
    /// 获取授权用户名称
    /// </summary>
    /// <returns></returns>
    string GetUserName2SF();
    /// <summary>
    /// 获取系统的唯一标识码
    /// </summary>
    /// <returns></returns>
    string GetSystemGUID();
    ////////////
    /// <summary>
    /// 设置设备名称
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <param name="Nm">新的设备名称</param>
    void SetEquipNm(int EquipNo, string Nm);
    /// <summary>
    /// 设置某个模拟量测点的名称
    /// </summary>
    /// <param name="EquipNo">对应设备号</param>
    /// <param name="YcpNo">对应测点号</param>
    /// <param name="Nm">新的测点名称</param>
    void SetYcpNm(int EquipNo, int YcpNo, string Nm);
    /// <summary>
    /// 设置某个状态量测点的名称
    /// </summary>
    /// <param name="EquipNo">对应设备号</param>
    /// <param name="YxpNo">对应测点号</param>
    /// <param name="Nm">新的测点名称</param>
    void SetYxpNm(int EquipNo, int YxpNo, string Nm);
    /// <summary>
    /// 把某个测点设置成非手工复位状态
    /// </summary>
    /// <param name="EquipNo">设备号</param>
    /// <param name="sType">"C"---模拟量;"X"---状态量</param>
    /// <param name="YcYxNo">测点号</param>
    void MResetYcYxNo(int EquipNo, string sType, int YcYxNo);
    /// <summary>
    /// 系统是否支持3D功能
    /// </summary>
    /// <returns></returns>
    bool Support3D();//3D支持
    /// <summary>
    /// 系统是否支持数据分析与挖掘的功能
    /// </summary>
    /// <returns></returns>
    bool SupportSJFX();
    /// <summary>
    /// 系统是否支持资产管理的功能
    /// </summary>
    /// <returns></returns>
    bool SupportZCGL();
    /// <summary>
    /// 系统是否支持体感控制的功能
    /// </summary>
    /// <returns></returns>
    bool SupportTGKZ();
    /// <summary>
    /// 系统是否支持多点触控的功能
    /// </summary>
    /// <returns></returns>
    bool SupportDDCK();
    /// <summary>
    /// 系统是否支持在线升级功能
    /// </summary>
    /// <returns></returns>
    bool SupportZXSJ();
    /// <summary>
    /// 系统是否支持能源管理的功能
    /// </summary>
    /// <returns></returns>
    bool SupportNYGL();
    /// <summary>
    /// 系统是否支持预案管理的功能
    /// </summary>
    /// <returns></returns>
    bool SupportYAGL();
    /// <summary>
    /// 系统是否支持多屏互动的功能
    /// </summary>
    /// <returns></returns>
    bool SupportDPHD();
    /// <summary>
    /// 系统是否支持BIM的功能
    /// </summary>
    /// <returns></returns>
    bool SupportBIM();
    /// <summary>
    /// 系统是否支持语音交互的功能
    /// </summary>
    /// <returns></returns>
    bool SupportVOICE();
    /// <summary>
    /// 系统是否支持二维码的功能
    /// </summary>
    /// <returns></returns>
    bool SupportQRCode();
    /// <summary>
    /// 是否采用中性版本的支持
    /// </summary>
    /// <returns></returns>
    bool IsNeuTral();
    ////////////双机热备////////////////////////////
    /// <summary>
    /// 系统是否为双机热备的热备模式
    /// </summary>
    /// <returns></returns>
    bool IsHotStandby();
    /// <summary>
    /// 获取双机热备备机的IP地址
    /// </summary>
    /// <returns></returns>
    string GetHotStandbyIP();
    /// <summary>
    /// 是否处于双机热备的侦听状态中
    /// </summary>
    /// <returns></returns>
    bool IsHotStandbyListenState();
    //////////////////////////////////////////////////
    ////////////操作属性文件////////////////////////////
    /// <summary>
    /// 读取系统的配置文件
    /// </summary>
    /// <param name="PropertyName">配置文件中的属性名称</param>
    /// <param name="NodeName">属性下面的节点名称</param>
    /// <param name="DefaultValue">如果没有配置该属性,则返回默认值</param>
    /// <returns>返回属性值</returns>
    string GetPropertyFromPropertyService(string PropertyName, string NodeName, string DefaultValue);
    /// <summary>
    /// 修改系统的配置文件
    /// </summary>
    /// <param name="PropertyName">配置文件中的属性名称</param>
    /// <param name="NodeName">属性下面的节点名称</param>
    /// <param name="DefaultValue">属性或者节点的值</param>
    void SetPropertyToPropertyService(string PropertyName, string NodeName, string Value);
    void SetInterScreenID(int id);
    void OpenPageInMultiScreens(string PageNm, string multiScreens, bool IsAutoOpen, bool DWAction, string infoConfig = null, bool? bStopPageCycle = null);
    void SetGUID(string strGUID);
    void AddChangedEquip(ChangedEquip EqpList);
    bool GetSiBState();//获取当前服务器的授权状态      
    /// <summary>
    /// 通过语音进行交互
    /// </summary>
    /// <param name="bVoices">语音流</param>
    /// <param name="UserNm">登录用户名</param>
    /// <returns></returns>
    GrpcVoiceItem SetVCtrol(byte[] bVoices, string UserNm);
    /// <summary>
    /// 通过语音进行交互
    /// </summary>
    /// <param name="csVoice">语音字符</param>
    /// <param name="UserNm">登录用户名</param>
    /// <returns></returns>
    GrpcVoiceItem SetVCtrol1(string csVoice, string UserNm);
    string[] GetHFString();//获取语音设置的高频词
    string GetXunfeiAPPID();
    /// <summary>
    /// 强制指定客户端下线,管理员才有此权限  
    /// </summary>
    /// <param name="GUID"></param>
    /// <returns>总是true</returns>
    bool KickClient(string GUID);
    /// <summary>
    /// 通知指定登录用户下线,用于用户权限变更的情形
    /// </summary>
    void NotifyLoginUserOffLine(string msg, string UserNm);
    /// <summary>
    /// 通知指定角色的用户下线,用于用户权限变更的情形
    /// </summary>
    void NotifyRoleUserOffLine(string msg, string RoleNm);
    /// <summary>
    /// 向指定客户端弹出信息   
    /// </summary>
    /// <param name="msg">消息</param>
    /// <param name="GUID">客户端GUID</param>
    void ShowMsg2GUID(string msg, string GUID);
    /// <summary>
    /// 从服务端获取指定图片文件
    /// </summary>
    /// <param name="path">文件路径</param>
    /// <param name="ImageNm">文件名</param>
    /// <returns></returns>
    byte[] GetImageFromSvr1(string path, string ImageNm);
    /// <summary>
    /// 把某个测点设置成误报状态,适用于处理误报的情况
    /// </summary>
    /// <param name="eqpno">设备号</param>
    /// <param name="type">类型 C-模拟量  X-状态量</param>
    /// <param name="ycyxno">测点号</param>
    /// <returns></returns>
    bool SetWuBao(int eqpno, string type, int ycyxno);
    /// <summary>
    /// 把某个测点设置为非报警状态---适用于处理报警后无恢复信号的情况
    /// </summary>
    /// <param name="eqpno">设备号</param>
    /// <param name="type">类型 C-模拟量  X-状态量</param>
    /// <param name="ycyxno">测点号</param>
    /// <returns></returns>
    bool SetNoAlarm(int eqpno, string type, int ycyxno);
    /// <summary>
    /// 执行扩展模块中的一个命令
    /// </summary>
    /// <param name="ModuleNm">模块名称.GWExProc表中的Proc_Module</param>
    /// <param name="cmd1">参数1.GWExProcCmd表中的main_instruction</param>
    /// <param name="cmd2">参数2.GWExProcCmd表中的minor_instruction</param>
    /// <param name="cmd3">参数3.GWExProcCmd表中的value</param>
    void DoExProcSetParm(string ModuleNm, string cmd1, string cmd2, string cmd3);
    /// <summary>
    /// 报警确认后恢复到正常状态---需要在设备dll中重新定义基类的虚函数
    /// public virtual bool Confirm2NormalState(string sYcYxType, int iYcYxNo)
    /// 默认情况返回false
    /// </summary>
    /// <param name="iEqpNo">设备号</param>
    /// <param name="sYcYxType">类型 C-模拟量  X-状态量</param>
    /// <param name="iYcYxNo">测点号</param>
    /// <returns>true可以执行, false不可以执行</returns>
    bool Confirm2NormalState(int iEqpNo, string sYcYxType, int iYcYxNo);
    /// <summary>
    /// 用户针对某个设置项进行锁定
    /// </summary>
    /// <param name="UserNm">用户名</param>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iSetNo">设置号</param>
    /// <param name="Client_Instance_GUID">客户端GUID标识</param>
    /// <returns></returns>
    bool LockSetItem(string UserNm, int iEquipNo, int iSetNo, string Client_Instance_GUID);
    /// <summary>
    /// 解除某个设置项的锁定
    /// </summary>
    /// <param name="UserNm">用户名</param>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iSetNo">设置号</param>
    /// <param name="Client_Instance_GUID">客户端实例GUID</param>
    /// <returns></returns>
    bool UnLockSetItem(string UserNm, int iEquipNo, int iSetNo, string Client_Instance_GUID);
    /// <summary>
    /// 获取设置项的描述
    /// </summary>
    /// <param name="iEquipNo">设备号</param>
    /// <param name="iSetNo">设置号</param>
    /// <returns>描述内容</returns>        
    string GetSetItemDesc(int iEquipNo, int iSetNo);
    /// <summary>
    /// 生成二维码图片
    /// </summary>
    /// <param name="Content">二维码内容</param>
    /// <returns>二维码图片字节流</returns>
    byte[] CreateQrCode2Jpeg(string Content);
    /// <summary>
    /// 生成具有用户身份的二维码
    /// </summary>
    /// <param name="OwnerName">用户名</param>
    /// <returns>二维码图片字节流</returns>
    byte[] CreateQrCode4Owner(string OwnerName);
    ///// <summary>
    ///// 生成具有访客身份的二维码
    ///// </summary>
    ///// <param name="VisitorNm">访客姓名</param>
    ///// <param name="OwnerNm">邀请人姓名</param>
    ///// <param name="ListEquipSetInfo">允许的设置项</param>
    ///// <returns>二维码图片字节流</returns>
    //byte[] CreateQrCode4Visitor(string VisitorNm, string OwnerNm, List<EquipSetInfo> ListEquipSetInfo);
    ///// <summary>
    ///// 生成具有设备身份的二维码
    ///// </summary>
    ///// <param name="ListEquipSetInfo">设备动作</param>
    ///// <param name="EqpNo">设备号</param>
    ///// <param name="ZhiChanNo">资产号</param>
    ///// <returns>二维码图片字节流</returns>
    //
    //byte[] CreateQrCode4Equip(List<EquipSetInfo> ListEquipSetInfo, string EqpNo, string ZhiChanNo);
    /// <summary>
    /// 移动端扫描设备二维码
    /// </summary>
    /// <param name="UserNm">用户名</param>
    /// <param name="QRContent">二维码内容</param>
    /// <returns>无意义</returns>
    bool QRScan4Equip(string UserNm, string QRContent);
    /// <summary>
    /// 移动端扫描设备二维码,带返回值
    /// </summary>
    /// <param name="UserNm">用户名</param>
    /// <param name="QRContent">二维码内容</param>
    /// <param name="RtnStr">返回值:设备号+资产号</param>
    /// <returns></returns>
    bool QRScan4Equip1(string UserNm, string QRContent, out string RtnStr);
    /// <summary>
    /// 通过表达式获取相应的返回值 float or string
    /// </summary>
    /// <param name="csExpr"></param>
    /// <returns></returns>
    object GetValueFromExpression(string csExpr);
    /// <summary>
    /// 激发kinect 挥手事件
    /// </summary>
    /// <param name="Type"></param>
    void ActiveHandWaveEvent(HandWaveType Type);
 }
  • 示例代码
代码
var alarmCenterApp =new AlarmCenterService();
alarmCenterApp.OpenPageInMultiScreens("123", "1234", true, true);

# 4. IAlarmCenterCallbackService 接口

封装了与回调方法相关的一系列操作类。

  • 接口方法索引
代码
public interface IAlarmCenterCallbackService
{
        /// <summary>
        /// 打开指定的窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="action"></param>
        void InterScreenOpenPage(object sender, EventArgs e, Action<string, bool, bool, string, bool?> action);
        /// <summary>
        /// 显示窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="action"></param>
        void ShowPage(object sender, EventArgs e, Action<string, bool> action);
        /// <summary>
        /// 关闭窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        /// <param name="action"></param>
        void ClosePage(object sender, EventArgs e, Action<string, bool> action);
        /// <summary>
        /// 登录并回调
        /// </summary>
        /// <param name="action"></param>
        void Login(Action<string, string> action);
        /// <summary>
        /// 监听
        /// </summary>
        void Listen();
        /// <summary>
        /// 设置屏幕id
        /// </summary>
        /// <param name="id"></param>
        void SetInterScreenID(int id);
        /// <summary>
        /// 设置guid
        /// </summary>
        /// <param name="strGUID"></param>
        void SetGUID(string strGUID);
        /// <summary>
        /// 设置用户名
        /// </summary>
        /// <param name="strNm"></param>
        void SetUserNm(string strNm); 
        /// <summary>
        /// 获取所有遥信点
        /// </summary>
        /// <param name="isDynamic"></param>
        /// <returns></returns>
        List<Proxy_YXItem> GetTotalYXDataEx(bool isDynamic);
        /// <summary>
        /// 获取所有设备数据
        /// </summary>
        /// <param name="isDynamic"></param>
        /// <returns></returns>
        IEnumerable<Proxy_EquipItem> GetTotalEquipData(bool isDynamic);
        /// <summary>
        /// 获取所有遥测点
        /// </summary>
        /// <param name="isDynamic"></param>
        /// <returns></returns>
        List<Proxy_YCItem> GetTotalYCData(bool isDynamic);
        /// <summary>
        /// 获取初始化数据
        /// </summary>
        /// <returns></returns>
        List<RealTimeEventItem> FirstGetRealEventItemEx();
}
  • 示例代码(代码不可执行,仅供参考)
代码
var alarmCenterServiceClient =new AlarmCenterService();
callBackService.InterScreenOpenPage("123", new InterScreenEventArgs("123", "123", false, false, "123", false) { }, (a, b, c, e, f) =>
                {
                    Console.WriteLine($"{a}_{b}_{c}_{e}_{f}");
                });
callBackService.Login((a, b) =>
                {
                    Console.WriteLine($"{a}_{b}");
                });

# 5. 消息接收,可通过NetMQ来接收消息

在登录方法中MqIdentity,该字段为netmq的消息推送密钥经过两次加密后的密文。 获取到此字段值后,使用nuget.ganweicloud.com里面的GWCrypto包的解密方法,进行解密后,可得到消息推送密钥了。

解密流程为:

代码
    var cyptoServiceProvider = new CyptoServiceProvider();
    input = cyptoServiceProvider.CreateDecryptor(”密文“, out string msg);

拿到密钥后,按这个方法来连接netmq发布端。

代码
using (var server = new SubscriberSocket())
{
    var cert = NetMQ.NetMQCertificate.CreateFromSecretKey(UTF8Encoding.UTF8.GetBytes(”这里是密钥“));
    var curveServerCertificate = serverPair;
    var clientCertificate = new NetMQCertificate(); ---这里是客户端密钥,
    server.Options.CurveServerCertificate = curveServerCertificate; ---这里是使用服务端密钥
    server.Options.CurveCertificate = clientCertificate; ---这里是客户端密钥,

    server.Connect(address);
    server.SubscribeToAnyTopic();// ("Topic");

    while (true)
    {
    	var response = server.ReceiveMultipartMessage();
    	Console.WriteLine(response.Last.ConvertToString());
    }
}

下载最新版本协议文件

上次更新: 2025/1/24 13:38:21

← MQTT 后台WebAPI→

目录
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式