16. 消息通道

16.消息通道

16.1. 概述

消息: 是通过消息通道传递的数据。消息包括两类: 普通消息和指令消息
普通消息: 仅仅用于消息展示,如聊天信息。
指令消息: 是普通消息的扩展,既可以展示,又代表一定的业务意义,接收方需要根据需要对指令消息进行响应。
消息结构:

    {
            'name':'xxx',
            'icon':'xxx',
            'id':'xxx',
            'content':'xxx',
            'msgType':'normal'
    }

name 发送者的昵称
icon 发送者头像
id 发送者编号(业务层面理解,如用户id)
content 发送的消息内容,可以是文本(如聊天内容),或对象
msgType 消息类型,省略该属性,或者值为 normal 表示发送的是普通消息(聊天消息)。当收到指令消息时,如果与自身相关则做出响应,否者忽略。


16.2.直播开始通知

用于直播开始通知。

  • 请求
    直播开始时,系统会向左右在直播界面的客户端发送一条直播开始的通知。
    通知通过该直播课程的聊天消息通道发送。
    结构如下:

    {"name":"管理员","icon":null,"id":"43","content":"直播开始了","msgType":"live_start"}

msgType 元素,值为“live_start”

  • 客户端行为指南

客户端(PC或移动页面等)收到消息后,如果判断存在msgType=live_start的属性,则启动播放器播放直播流。

该消息可以直接在聊天界面显示,无需特殊过滤。


16.3. 视频互动

视频互动前,互动双方需要通过消息通道进行协商,建立双方视频互动的连接。
本小节定义视频互动建立连接的协商过程。
我们将视频互动的双方分别叫发起方响应方。 首先发起互动邀请的一方叫发起方,另一方叫响应方。

协商流程:

    1)发起方向响应方发起互动邀请
                发起方------->响应方
    2)响应方向发起方发送互动响应
                响应方-------->发起方
    3)发起方开启互动
             发起方------->响应方

协商协议
1)发起方向响应方发起互动邀请
发起方------->响应方

        {
                'name':'王老师',
                'icon':'xxx',
                'id':'xxx',
                'content':'王老师邀请大家参与视频互动!',
                'msgType':'meeting_req'
        }

业务处理: 响应方收到该消息后,首先判断终端环境是否具备视频互动条件,如果具备则显示一个“申请互动”的按钮,等待点击。 点击按钮后进入下一步流程。

2)响应方向发起方发送互动响应
响应方-------->发起方

        {
                'name':'小明同学',
                'icon':'xxx',
                'id':'xxx',
                'content':'小明同学申请视频互动!',
                'msgType':'meeting_res'
        }

业务处理:发起方收到该消息后,应当将该用户头像加入申请用户的列表。点击用户头像进入下一步流程。

3)发起方开启会议
发起方------->响应方

        {
                'name':'王老师',
                'icon':'xxx',
                'id':'xxx',
                'content':{'id':'xxx','name','myname','room':'xxx','pwd':'xxx'},
                'msgType':'meeting_begin'
        }

这里content是一个对象,包含允许互动用户的id和互动的房间号等。
id 允许互动的用户id
room 互动的房间号码
name 互动的姓名
pwd 互动的密码

业务处理:响应方收到该消息后,拉起视频互动界面,传入房间号、帐号、密码参数给视频互动系统,开始互动,
应确保将返回的content对象参数原样传递给信令服务器。

其他消息:
1)取消互动申请
发送互动申请的用户可以取消申请。
响应方-------->发起方

        {
                'name':'王老师',
                'icon':'xxx',
                'id':'xxx',
                'content':'xxx',
                'msgType':'meeting_res_cancel'
        }

业务处理: 发起方收该消息后便知道用户撤销了互动申请,应将用户从申请列表中去掉。

2)终止互动
发起方随时可以终止互动。
发起方------->响应方

        {
                'name':'王老师',
                'icon':'xxx',
                'id':'xxx',
                'content':'xxx',
                'msgType':'meeting_end'
        }

业务处理: 响应方收该消息后立即退出互动。

转载于:https://blog.51cto.com/livestreaming/2176582

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用PCANBasic.cs库实现CAN通讯的C#示例代码: ```csharp using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace PCANExample { public partial class MainForm : Form { // PCANBasic.cs API导入 [DllImport("PCANBasic.dll", EntryPoint = "CAN_GetValue")] private static extern TPCANStatus GetValue( UInt16 Channel, // CAN通道 TPCANParameter Parameter, // 所需参数 out UInt32 Buffer, // 输出参数缓冲区 UInt32 BufferLength // 缓冲区大小 ); [DllImport("PCANBasic.dll", EntryPoint = "CAN_Initialize")] private static extern TPCANStatus Initialize( UInt16 Channel, // CAN通道 TPCANBaudrate Btr0Btr1, // 波特率 TPCANType HwType, // 硬件类型 UInt32 IOPort, // I/O端口 UInt16 Interrupt // 中断号 ); [DllImport("PCANBasic.dll", EntryPoint = "CAN_Write")] private static extern TPCANStatus Write( UInt16 Channel, // CAN通道 ref TPCANMsg Message // CAN消息 ); [DllImport("PCANBasic.dll", EntryPoint = "CAN_Read")] private static extern TPCANStatus Read( UInt16 Channel, // CAN通道 out TPCANMsg Message, // CAN消息缓冲区 out TPCANTimestamp Timestamp // 时间戳缓冲区 ); // PCANBasic.cs常量定义 private const UInt16 PCAN_USBBUS1 = 0x31; private const UInt16 PCAN_USBBUS2 = 0x32; private const UInt16 PCAN_USBBUS3 = 0x33; private const UInt16 PCAN_USBBUS4 = 0x34; private const UInt16 PCAN_USBBUS5 = 0x35; private const UInt16 PCAN_USBBUS6 = 0x36; private const UInt16 PCAN_USBBUS7 = 0x37; private const UInt16 PCAN_USBBUS8 = 0x38; private const TPCANBaudrate PCAN_BAUD_125K = TPCANBaudrate.PCAN_BAUD_125K; private const TPCANType PCAN_TYPE_ISA = TPCANType.PCAN_TYPE_ISA; private const TPCANMsgType PCAN_MESSAGE_STANDARD = TPCANMsgType.PCAN_MESSAGE_STANDARD; private enum TPCANParameter { PCAN_CHANNEL_VERSION = 0x0000, PCAN_API_VERSION = 0x0001, PCAN_HARDWARE_TYPE = 0x0002, PCAN_RECEIVE_EVENT = 0x0003, PCAN_MESSAGE_FILTER = 0x0004, PCAN_API_INITIALIZED = 0x0005, PCAN_CHANNEL_CONDITION = 0x0006, PCAN_HARDWARE_NAME = 0x0007, PCAN_RECEIVE_STATUS = 0x0008, } private struct TPCANMsg { public UInt32 ID; // CAN消息ID public TPCANMsgType MSGTYPE; // CAN消息类型 public byte LEN; // 数据长度 public byte[] DATA; // 数据 } private struct TPCANTimestamp { public UInt32 millis; // 毫秒时间戳 public UInt16 millis_overflow; // 毫秒溢出 public UInt16 micros; // 微秒时间戳 } private enum TPCANStatus { PCAN_ERROR_OK = 0x00000, // 操作成功 PCAN_ERROR_XMTFULL, // 发送队列已满 PCAN_ERROR_OVERRUN, // CAN控制器发生数据溢出 PCAN_ERROR_BUSLIGHT, // CAN总线连接错误,可能是电缆故障 PCAN_ERROR_BUSHEAVY, // CAN总线连接错误,可能是终端电阻故障 PCAN_ERROR_BUSOFF, // CAN总线掉线 PCAN_ERROR_ANYBUSERR, // 其它CAN总线错误 PCAN_ERROR_QRCVEMPTY, // 接收队列为空 PCAN_ERROR_QOVERRUN, // 接收队列溢出 PCAN_ERROR_QXMTFULL, // 发送队列已满 PCAN_ERROR_REGTEST, // CAN控制器寄存器测试错误 PCAN_ERROR_NODRIVER, // 没有安装PCAN驱动 PCAN_ERROR_HWINUSE, // 硬件资源已被占用 PCAN_ERROR_NETINUSE, // 网络资源已被占用 PCAN_ERROR_ILLHW, // 硬件配置参数无效 PCAN_ERROR_ILLNET, // 网络配置参数无效 PCAN_ERROR_ILLCLIENT, // 客户端参数无效 PCAN_ERROR_ILLHANDLE, // 设备句柄无效 PCAN_ERROR_RESOURCE, // 无法打开设备 PCAN_ERROR_ILLPARAMTYPE, // 无效的参数类型 PCAN_ERROR_ILLPARAMVAL, // 无效的参数值 PCAN_ERROR_UNKNOWN, // 未知错误 } public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 获取CAN通道名称 UInt32 dwBuffer = 0; TPCANStatus status = GetValue(PCAN_USBBUS1, TPCANParameter.PCAN_CHANNEL_VERSION, out dwBuffer, sizeof(UInt32)); if (status == TPCANStatus.PCAN_ERROR_OK) { // 显示CAN通道名称 this.Text = "CAN Channel: " + dwBuffer.ToString("X8"); } } private void btnConnect_Click(object sender, EventArgs e) { // 建立连接 TPCANStatus status = Initialize(PCAN_USBBUS1, PCAN_BAUD_125K, PCAN_TYPE_ISA, 0, 0); if (status == TPCANStatus.PCAN_ERROR_OK) { MessageBox.Show("Connect successful!"); } else { MessageBox.Show("Connect failed! Error code: " + ((int)status).ToString("X")); } } private void btnSend_Click(object sender, EventArgs e) { // 构造CAN消息 TPCANMsg message = new TPCANMsg(); message.ID = 0x123; message.MSGTYPE = PCAN_MESSAGE_STANDARD; message.LEN = 8; message.DATA = new byte[8] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; // 发送CAN消息 TPCANStatus status = Write(PCAN_USBBUS1, ref message); if (status != TPCANStatus.PCAN_ERROR_OK) { MessageBox.Show("Send failed! Error code: " + ((int)status).ToString("X")); } } private void btnReceive_Click(object sender, EventArgs e) { // 接收CAN消息 TPCANMsg message = new TPCANMsg(); TPCANTimestamp timestamp = new TPCANTimestamp(); TPCANStatus status = Read(PCAN_USBBUS1, out message, out timestamp); // 显示CAN消息 if (status == TPCANStatus.PCAN_ERROR_OK) { string data = ""; for (int i = 0; i < message.LEN; i++) { data += message.DATA[i].ToString("X2") + " "; } MessageBox.Show("ID: " + message.ID.ToString("X") + "\nData: " + data); } else { MessageBox.Show("Receive failed! Error code: " + ((int)status).ToString("X")); } } } } ``` 该程序基本上包含了常用的CAN通讯功能,包括获取CAN通道名称、建立连接、发送CAN消息以及接收CAN消息。需要注意的是,在使用PCANBasic.cs库前需要先安装Peak CAN驱动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值