c#--无线通信,实现简单有人透传云通信

学习文档:http://cloud.usr.cn/Public/sdk/dll/#USR-Init-%E5%88%9D%E5%A7%8B%E5%8C%96%E6%8E%A5%E5%8F%A3

学习过串口通信后,在连线不方便或者距离比较远的使用场景,会用到4G模块。
本文使用的是有人物联网旗下的4G透传模块(新版本) WH

1.配置有人透传云管理系统

一般来说,都是配置好了,我们仅需要知道账号及密码,用于登录,并查看需要通信的设备id.
下面简单说明操作:
地址:https://console.usr.cn/#/login
登录账号及密码
在这里插入图片描述
添加设备得到设备:
在这里插入图片描述

2.在VS项目上连接云关系系统

先把引用文档一次性引用进来:

///
        ///  初始化和释放  
        ///

        /// <summary>
        /// 获取版本
        /// </summary>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_GetVer", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_GetVer();
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="host"></param>
        /// <param name="port"></param>
        /// <param name="vertion"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_Init", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_Init(string host, ushort port, int vertion);
        /// <summary>
        /// 释放
        /// </summary>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_Release", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_Release();

        ///
          连接和断开  /
        ///

        /// <summary>
        /// 连接回调
        /// </summary>
        /// <param name="returnCode"></param>
        /// <param name="description"></param>
        public delegate void TUSR_ConnAckEvent(int returnCode, IntPtr description);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnConnAck", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnConnAck(TUSR_ConnAckEvent OnConnAck);
        /// <summary>
        /// 连接
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_Connect", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_Connect(string username, string password);
        /// <summary>
        /// 断开
        /// </summary>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_DisConnect", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_DisConnect();

        ///
        //  订阅和取消订阅  ///
        ///
        /// <summary>
        /// 订阅回调
        /// </summary>
        /// <param name="messageID">消息ID</param>
        /// <param name="SubFunName">函数名称,用于判断用户执行的哪个订阅函数, 得到了服务器的回应。可能的取值有:SubscribeDevParsed,SubscribeUserParsed,SubscribeDevRaw,SubscribeUserRaw</param>
        /// <param name="SubParam">SubParam值跟执行的订阅函数有关:如果订阅的是”单个设备的消息”, 则SubParam为设备ID;如果订阅的是”用户所有设备的消息”, 则SubParam为用户名</param>
        /// <param name="returnCode">0、1、2:订阅成功;  128:订阅失败</param>
        public delegate void TUSR_SubscribeAckEvent(int messageID, IntPtr SubFunName, IntPtr SubParam, IntPtr returnCode);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnSubscribeAck", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnSubscribeAck(TUSR_SubscribeAckEvent OnSubscribeAck);
        /// <summary>
        /// 取消订阅回调
        /// </summary>
        /// <param name="messageID"></param>
        /// <param name="UnSubFunName"></param>
        /// <param name="UnSubParam"></param>
        public delegate void TUSR_UnSubscribeAckEvent(int messageID, IntPtr UnSubFunName, IntPtr UnSubParam);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnUnSubscribeAck", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnUnSubscribeAck(TUSR_UnSubscribeAckEvent OnUnSubscribeAck);

        /// <summary>
        /// 订阅单个设备解析后的数据  【云组态】
        /// </summary>
        /// <param name="devId"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_SubscribeDevParsed", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_SubscribeDevParsed(string devId);
        /// <summary>
        /// 订阅账户下所有设备解析后的数据  【云组态】
        /// </summary>
        /// <param name="Username"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_SubscribeUserParsed", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_SubscribeUserParsed(string Username);
        /// <summary>
        /// 取消订阅单个设备解析后的数据  【云组态】
        /// </summary>
        /// <param name="DevId"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_UnSubscribeDevParsed", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_UnSubscribeDevParsed(string DevId);
        /// <summary>
        /// 取消订阅账户下所有设备解析后的数据  【云组态】
        /// </summary>
        /// <param name="Username"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_UnSubscribeUserParsed", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_UnSubscribeUserParsed(string Username);

        /// <summary>
        /// 订阅单个设备原始数据流 【云交换机】
        /// </summary>
        /// <param name="devId"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_SubscribeDevRaw", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_SubscribeDevRaw(string devId);
        /// <summary>
        /// 订阅账户下所有设备原始数据流 【云交换机】
        /// </summary>
        /// <param name="Username"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_SubscribeUserRaw", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_SubscribeUserRaw(string Username);
        /// <summary>
        /// 取消订阅单个设备原始数据流 【云交换机】
        /// </summary>
        /// <param name="DevId"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_UnSubscribeDevRaw", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_UnSubscribeDevRaw(string DevId);
        /// <summary>
        /// 取消订阅账户下所有设备原始数据流 【云交换机】
        /// </summary>
        /// <param name="Username"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_UnSubscribeUserRaw", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_UnSubscribeUserRaw(string Username);

        //订阅回调 【不再推荐使用】
        public delegate void TUSR_SubAckEvent(int messageID, IntPtr devId, IntPtr returnCode);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnSubAck", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnSubAck(TUSR_SubAckEvent OnSubAck);
        //订阅 【不再推荐使用】
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_Subscribe", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_Subscribe(string devId);
        //取消订阅回调 【不再推荐使用】
        public delegate void TUSR_UnSubAckEvent(int messageID, IntPtr devId);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnUnSubAck", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnUnSubAck(TUSR_UnSubAckEvent OnUnSubAck);
        //取消订阅 【不再推荐使用】
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_UnSubscribe", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_UnSubscribe(string devId);

        ///
        /  推送消息 ///
        ///
        /// <summary>
        /// 推送回调
        /// </summary>
        /// <param name="MessageID"></param>
        public delegate void TUSR_PubAckEvent(int MessageID);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnPubAck", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnPubAck(TUSR_PubAckEvent OnPubAck);

        /// <summary>
        /// 设置数据点值【云组态】
        /// </summary>
        /// <param name="DevId"></param>
        /// <param name="SlaveIndex"></param>
        /// <param name="PointId"></param>
        /// <param name="Value"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_PublishParsedSetSlaveDataPoint", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_PublishParsedSetSlaveDataPoint(string DevId, string SlaveIndex, string PointId, string Value);
        /// <summary>
        /// 查询数据点值【云组态】
        /// </summary>
        /// <param name="DevId"></param>
        /// <param name="SlaveIndex"></param>
        /// <param name="PointId"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_PublishParsedQuerySlaveDataPoint", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_PublishParsedQuerySlaveDataPoint(string DevId, string SlaveIndex, string PointId);

        /// <summary>
        /// 设置单台设备数据点值【云组态】 ---- 已弃, 用 USR_PublishParsedQuerySlaveDataPoint 代替
        /// </summary>
        /// <param name="DevId"></param>
        /// <param name="PointId"></param>
        /// <param name="Value"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_PublishParsedSetDataPoint", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_PublishParsedSetDataPoint(string DevId, string PointId, string Value);
        /// <summary>
        /// 查询单台设备数据点值【云组态】 ---- 已弃, 用 USR_PublishParsedQuerySlaveDataPoint 代替
        /// </summary>
        /// <param name="DevId"></param>
        /// <param name="PointId"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_PublishParsedQueryDataPoint", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_PublishParsedQueryDataPoint(string DevId, string PointId);

        /// <summary>
        /// 向单台设备推送原始数据流 【云交换机】
        /// </summary>
        /// <param name="DevId"></param>
        /// <param name="pData"></param>
        /// <param name="DataLen"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_PublishRawToDev", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_PublishRawToDev(string DevId, byte[] pData, int DataLen);

        /// <summary>
        /// 向账户下所有设备推送原始数据流 【云交换机】
        /// </summary>
        /// <param name="Username"></param>
        /// <param name="pData"></param>
        /// <param name="DataLen"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_PublishRawToUser", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_PublishRawToUser(string Username, byte[] pData, int DataLen);

        //推送【不再推荐使用】
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_Publish", CallingConvention = CallingConvention.StdCall)]
        public static extern int USR_Publish(string DevId, byte[] pData, int DataLen);

        ///
        /  接收消息 ///
        ///
        /// <summary>
        /// 接收设备解析后的数据 事件定义 【云组态】
        /// </summary>
        /// <param name="MessageID"></param>
        /// <param name="DevId"></param>
        /// <param name="JsonStr"></param>
        public delegate void TUSR_RcvParsedEvent(int MessageID, IntPtr DevId, IntPtr JsonStr);
        /// <summary>
        /// 设置 接收数据点推送 回调函数 【云组态】
        /// </summary>
        /// <param name="OnRcvParsed"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnRcvParsedDataPointPush", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnRcvParsedDataPointPush(TUSR_RcvParsedEvent OnRcvParsed);
        /// <summary>
        /// 设置 接收设备上下线推送 回调函数 【云组态】
        /// </summary>
        /// <param name="OnRcvParsed"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnRcvParsedDevStatusPush", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnRcvParsedDevStatusPush(TUSR_RcvParsedEvent OnRcvParsed);
        /// <summary>
        /// 设置 接收设备报警推送 回调函数 【云组态】
        /// </summary>
        /// <param name="OnRcvParsed"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnRcvParsedDevAlarmPush", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnRcvParsedDevAlarmPush(TUSR_RcvParsedEvent OnRcvParsed);
        /// <summary>
        /// 设置 接收数据点操作应答 【云组态】
        /// </summary>
        /// <param name="OnRcvParsed"></param>
        /// <returns></returns>
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnRcvParsedOptionResponseReturn", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnRcvParsedOptionResponseReturn(TUSR_RcvParsedEvent OnRcvParsed);

        /// <summary>
        /// 接收设备原始数据流 事件定义 【云交换机】 
        /// </summary>
        /// <param name="MessageID"></param>
        /// <param name="DevId"></param>
        /// <param name="pData"></param>
        /// <param name="DataLen"></param>
        public delegate void TUSR_RcvRawFromDevEvent(int MessageID, IntPtr DevId, IntPtr pData, int DataLen);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnRcvRawFromDev", CallingConvention = CallingConvention.StdCall)]
        /// <summary>
        /// 设置 接收设备原始数据流 回调函数 【云交换机】
        /// </summary>
        /// <param name="OnRcvRawFromDev"></param>
        /// <returns></returns>
        public static extern bool USR_OnRcvRawFromDev(TUSR_RcvRawFromDevEvent OnRcvRawFromDev);

        //接收回调 【不再推荐使用】
        public delegate void TUSR_OnRcvEvent(int MessageID, IntPtr DevId, IntPtr pData, int DataLen);
        [DllImport("UsrCloud.dll", CharSet = CharSet.Auto, EntryPoint = "USR_OnRcv", CallingConvention = CallingConvention.StdCall)]
        public static extern bool USR_OnRcv(TUSR_OnRcvEvent OnRcvEvent);

还有UsrCloud.dll文件,放在debug下或者release下面

(1)连接云管理系统:

使用的时候Open(账户,密码)

public static void Init()
{
	FConnAck_CBF = new TUSR_ConnAckEvent(ConnAck_CBF);
	FSubscribeAck_CBF = new TUSR_SubscribeAckEvent(SubscribeAck_CBF);
	FUnSubscribeAck_CBF = new TUSR_UnSubscribeAckEvent(UnSubscribeAck_CBF);
	FPubAck_CBF = new TUSR_PubAckEvent(PubAck_CBF);
	FRcvParsedDataPointPush_CBF = new TUSR_RcvParsedEvent(RcvParsedDataPointPush_CBF);
	FRcvParsedDevStatusPush_CBF = new TUSR_RcvParsedEvent(RcvParsedDevStatusPush_CBF);
	FRcvParsedDevAlarmPush_CBF = new TUSR_RcvParsedEvent(RcvParsedDevAlarmPush_CBF);
	FRcvParsedOptionResponseReturn_CBF = new TUSR_RcvParsedEvent(RcvParsedOptionResponseReturn_CBF);
	FRcvRawFromDev_CBF = new TUSR_RcvRawFromDevEvent(RcvRawFromDev_CBF);
}
public static bool Open(string userName,string passWord)
{
	Init();
    string ip = "clouddata.usr.cn";//透传云服务器地址, 不改
    ushort port = 1883;//透传云服务器端口, 不改
    int vertion = 1;
    if (USR_Init(ip, port, vertion))
    {
        USR_OnConnAck(FConnAck_CBF);
        USR_OnSubscribeAck(FSubscribeAck_CBF);
        USR_OnUnSubscribeAck(FUnSubscribeAck_CBF);
        USR_OnPubAck(FPubAck_CBF);
        USR_OnRcvParsedDataPointPush(FRcvParsedDataPointPush_CBF);
        USR_OnRcvParsedDevStatusPush(FRcvParsedDevStatusPush_CBF);
        USR_OnRcvParsedDevAlarmPush(FRcvParsedDevAlarmPush_CBF);
        USR_OnRcvParsedOptionResponseReturn(FRcvParsedOptionResponseReturn_CBF);
        USR_OnRcvRawFromDev(FRcvRawFromDev_CBF);
        if (USR_Connect(userName, passWord))
        {
            return true;
        }
       
    }
    return false;
}

注意:上面只是发生成功了,要知道能不能登录是回调函数:ConnAck_CBF
我是用的是委托的方式通知。
在这里插入图片描述

(2)断开云管理系统:

 public static bool Close()
 {
      if (USR_DisConnect() && USR_Release())
      {
          return true;
      }
      return false;
  }

(3)订阅设备:

想要接收哪个设备发来的消息,就要先订阅哪个设备的消息。

/// <summary>
        /// 订阅设备
        /// </summary>
        /// <param name="devIds">多个设备编号逗号隔开</param>
        public static bool  Subscription(string devIds)
        {
            int messageId = USR_SubscribeDevRaw(devIds);
            if (messageId > -1)
            {
                return true;
            }
            return false;
        }

(4)与设备通信:

向设备发送指令:

public static bool Connection(string devId,string info, bool hex )
        {
            byte[] byteArray;
            if (hex)
            {
                byteArray = HexStringToByteArray(info);
            }
            else
            {
                byteArray =Encoding.Default.GetBytes(info);
            }

            int messageId = USR_PublishRawToDev(devId, byteArray, byteArray.Length);
            if (messageId > -1)
            {
                return true;
            }
            return false;
        }

如果设备会对此进行回复:
接收设备回的数据:RcvRawFromDev_CBF事件

3.完整代码例子:

完整程序代码例子在:https://download.csdn.net/download/Yyuanyuxin/12510882
如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yyuanyuxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值