688 lines
27 KiB
VB.net
688 lines
27 KiB
VB.net
Imports System.IO.Ports
|
||
Imports System.Text
|
||
Imports System.Threading
|
||
Imports Newtonsoft.Json
|
||
Imports StackExchange.Redis
|
||
Imports Telephone.PhoneBurstification
|
||
|
||
Public Class Telephone
|
||
'hex 发送标志
|
||
Public G_Hexflg As Boolean = False
|
||
'订阅字段
|
||
Public G_Subscribe As String = ""
|
||
Public G_OldSubscribe As String = ""
|
||
'发布字段
|
||
Public G_Publish As String = ""
|
||
'
|
||
Public G_RedisSub, G_Redislish As RedisSubscriber
|
||
'redis消息队列
|
||
Public M_RedisQueue As Queue
|
||
'事件处理线程
|
||
Public M_EventThread As Thread
|
||
'
|
||
Public G_SendBuffnode As SendBuffnode
|
||
|
||
'日志对象
|
||
Public G_Log As RuningLog
|
||
|
||
Private Sub Telephone_Load(sender As Object, e As EventArgs) Handles MyBase.Load
|
||
'设置页面标题为软件名称加版本号
|
||
Me.Text = Application.ProductName & " " & Application.ProductVersion
|
||
G_Hexflg = False
|
||
recvBufferli = New List(Of Byte)()
|
||
G_Log = New RuningLog(RichTextBox1, Application.StartupPath & "\log")
|
||
ComboBox1.Items.Clear()
|
||
ComboBox1.Items.AddRange(SerialPort.GetPortNames())
|
||
GetSeting()
|
||
|
||
initRedisSubscriber(G_Subscribe, G_OldSubscribe)
|
||
initRedisPublisher()
|
||
M_RedisQueue = New Queue()
|
||
M_EventThread = New Thread(AddressOf EventThread)
|
||
M_EventThread.Start()
|
||
Button1.PerformClick()
|
||
End Sub
|
||
|
||
|
||
Public Sub EventThread()
|
||
|
||
Dim msgCount As Integer
|
||
'获取发短信的集合并且按时间排序
|
||
Dim sendShortMessagesLi As New List(Of CallInfoNode)
|
||
Dim callLi As New List(Of CallInfoNode)
|
||
Dim item As CallInfoNode
|
||
While True
|
||
If M_RedisQueue.Count > 0 Then
|
||
'遍历队列
|
||
msgCount = M_RedisQueue.Count
|
||
sendShortMessagesLi.Clear()
|
||
callLi.Clear()
|
||
For i As Integer = 0 To msgCount - 1
|
||
item = M_RedisQueue.Dequeue()
|
||
If IsNothing(item) Then Continue For
|
||
If item.Type.Trim.Equals("1") Then
|
||
|
||
callLi.Add(item)
|
||
ElseIf item.Type.Trim.Equals("2") Then
|
||
sendShortMessagesLi.Add(item)
|
||
End If
|
||
Next
|
||
'判断是否有短信发送
|
||
If sendShortMessagesLi.Count > 0 Then
|
||
'发送短信
|
||
SendShortMessage(sendShortMessagesLi)
|
||
sendShortMessagesLi.Clear()
|
||
End If
|
||
'判断是否有电话拨号
|
||
If callLi.Count > 0 Then
|
||
'拨打电话
|
||
CallPhone(callLi)
|
||
callLi.Clear()
|
||
End If
|
||
End If
|
||
Thread.Sleep(10)
|
||
End While
|
||
End Sub
|
||
'发送短信
|
||
Public Sub SendShortMessage(sendShortMessagesLi As List(Of CallInfoNode))
|
||
'遍历sendShortMessagesLi
|
||
Dim gLogNode As LogNode
|
||
For Each item In sendShortMessagesLi
|
||
'获取当前时间的utc秒值
|
||
Dim nowt As Long = CLng(DateTime.UtcNow.Subtract(New DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds)
|
||
'判断是否超时
|
||
If item.DeadLine < nowt Then
|
||
Continue For
|
||
End If
|
||
gLogNode = New LogNode($"开始执行{item.CallerName}发送短信:{item.PhoneNumber}", RuningLog.LogType.e_info, RuningLog.LogMode.e_consoleandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
|
||
|
||
If ProcessshortmessagesData(item) Then
|
||
RedisPublishMessage($"执行{item.CallerName}发送短信:{item.PhoneNumber}成功")
|
||
gLogNode = New LogNode($"执行{item.CallerName}发送短信:{item.PhoneNumber}成功", RuningLog.LogType.e_info, RuningLog.LogMode.e_consoleandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Else
|
||
RedisPublishMessage($"执行{item.CallerName}发送短信:{item.PhoneNumber}失败")
|
||
gLogNode = New LogNode($"执行{item.CallerName}发送短信:{item.PhoneNumber}失败", RuningLog.LogType.e_Error, RuningLog.LogMode.e_consoleandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
End If
|
||
|
||
Next
|
||
End Sub
|
||
|
||
Public Function ProcessshortmessagesData(CallInfoNode As CallInfoNode) As Boolean
|
||
Dim li As List(Of SendBuffnode)
|
||
Dim gLogNode As LogNode
|
||
Dim SendData As Byte()
|
||
li = PhoneBurstification.PhoneBurstification(PhoneBurstification.PhoneBuffType.SendSMS, CallInfoNode)
|
||
For Each item As SendBuffnode In li
|
||
If SerialPort1.IsOpen Then
|
||
G_SendBuffnode = item
|
||
SendData = publicMode.StringToByte(item.SendData)
|
||
SerialPort1.Write(SendData, 0, SendData.Length)
|
||
SendBuffnode.SetSendStatus(item, SendBuffnode.SendStatustype.Sending)
|
||
gLogNode = New LogNode($"TX:{item.SendData}", RuningLog.LogType.e_info, RuningLog.LogMode.e_both)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Else
|
||
gLogNode = New LogNode("串口未打开!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_both)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
|
||
While True
|
||
|
||
If G_SendBuffnode.IsNodeReceiveTimeout2(G_SendBuffnode) Then
|
||
If G_SendBuffnode.ReceiveStatus = True Then
|
||
If G_SendBuffnode.CommandType = comdType.comdmsg Then
|
||
Thread.Sleep(100)
|
||
Else
|
||
Thread.Sleep(100)
|
||
End If
|
||
Exit While
|
||
'Select Case G_SendBuffnode.CommandType
|
||
' Case comdType.comdCDTAM
|
||
' If G_SendBuffnode.ReceiveResult = True Then
|
||
' Exit While
|
||
' End If
|
||
' Case comdType.comdCMGF
|
||
' Exit While
|
||
' Case comdType.comdCSCA
|
||
'End Select
|
||
End If
|
||
Else
|
||
|
||
gLogNode = New LogNode($"发送超时命令:{item.SendData}!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
|
||
End While
|
||
Next
|
||
Return True
|
||
End Function
|
||
|
||
|
||
|
||
'拨打电话
|
||
Public Sub CallPhone(callLi As List(Of CallInfoNode))
|
||
'遍历callli
|
||
Dim gLogNode As LogNode
|
||
For Each item In callLi
|
||
'获取当前时间的utc秒值
|
||
Dim nowt As Double = CInt(DateTime.UtcNow.Subtract(New DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds)
|
||
'判断是否超时
|
||
If item.DeadLine < nowt Then
|
||
Continue For
|
||
End If
|
||
gLogNode = New LogNode($"开始执行{item.CallerName}播打电话:{item.PhoneNumber}", RuningLog.LogType.e_info, RuningLog.LogMode.e_consoleandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
|
||
If ProcessData(item) Then
|
||
RedisPublishMessage($"执行{item.CallerName}播打电话:{item.PhoneNumber}成功")
|
||
gLogNode = New LogNode($"执行{item.CallerName}播打电话:{item.PhoneNumber}成功", RuningLog.LogType.e_info, RuningLog.LogMode.e_consoleandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Else
|
||
RedisPublishMessage($"执行{item.CallerName}播打电话:{item.PhoneNumber}失败")
|
||
gLogNode = New LogNode($"执行{item.CallerName}播打电话:{item.PhoneNumber}失败", RuningLog.LogType.e_Error, RuningLog.LogMode.e_consoleandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
End If
|
||
|
||
|
||
|
||
Next
|
||
End Sub
|
||
|
||
|
||
Public Function ProcessData(CallInfoNode As CallInfoNode) As Boolean
|
||
|
||
|
||
Dim li As List(Of SendBuffnode)
|
||
Dim gLogNode As LogNode
|
||
Dim SendData As Byte()
|
||
li = PhoneBurstification.PhoneBurstification(PhoneBurstification.PhoneBuffType.CallPhoneAndPlay, CallInfoNode)
|
||
For Each item As SendBuffnode In li
|
||
'If item.CommandType <> comdType.comd1A Then Continue For
|
||
'判断串口是否打开
|
||
If SerialPort1.IsOpen Then
|
||
G_SendBuffnode = item
|
||
SendData = publicMode.StringToByte(item.SendData)
|
||
SerialPort1.Write(SendData, 0, SendData.Length)
|
||
SendBuffnode.SetSendStatus(item, SendBuffnode.SendStatustype.Sending)
|
||
gLogNode = New LogNode($"TX:{item.SendData}", RuningLog.LogType.e_info, RuningLog.LogMode.e_both)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Else
|
||
gLogNode = New LogNode("串口未打开!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_both)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
|
||
While True
|
||
If G_SendBuffnode.IsNodeReceiveTimeout(G_SendBuffnode) Then
|
||
If G_SendBuffnode.ReceiveStatus = True Then
|
||
|
||
Select Case G_SendBuffnode.CommandType
|
||
Case comdType.comdCallPhone
|
||
If G_SendBuffnode.ReceiveResult = True Then
|
||
Thread.Sleep(1000)
|
||
Exit While
|
||
Else
|
||
gLogNode = New LogNode($"电话已经挂断!!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
|
||
Case comdType.comdSendSMS
|
||
Exit While
|
||
Case comdType.comdCallPhoneAndPlay
|
||
If G_SendBuffnode.ReceiveResult = True Then
|
||
If G_SendBuffnode.SendCurrentCount >= 10 Then
|
||
SendData = publicMode.StringToByte("AT+CHUP" & vbCrLf)
|
||
SerialPort1.Write(SendData, 0, SendData.Length)
|
||
gLogNode = New LogNode("主动挂掉电话!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
Else
|
||
Thread.Sleep(5000)
|
||
If SerialPort1.IsOpen Then
|
||
SerialPort1.Write(SendData, 0, SendData.Length)
|
||
SendBuffnode.SetSendStatus(item, SendBuffnode.SendStatustype.Resend)
|
||
gLogNode = New LogNode($"TX:{item.SendData}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Else
|
||
gLogNode = New LogNode("串口未打开!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
|
||
End If
|
||
Else
|
||
|
||
If G_SendBuffnode.CommandType = comdType.comdCallPhoneAndPlay AndAlso Not G_SendBuffnode.ReceiveData.Contains("VOICE CALL: END") Then
|
||
Continue While
|
||
End If
|
||
gLogNode = New LogNode($"电话已经挂断,停止发送语音!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
|
||
Case Else
|
||
Thread.Sleep(50)
|
||
Exit While
|
||
End Select
|
||
|
||
End If
|
||
|
||
Else
|
||
|
||
|
||
gLogNode = New LogNode($"发送超时命令:{item.SendData}!!", RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return False
|
||
End If
|
||
'判断接收状态
|
||
|
||
Thread.Sleep(10)
|
||
End While
|
||
Next
|
||
|
||
Return True
|
||
End Function
|
||
|
||
|
||
|
||
|
||
'获取系统缓存参数
|
||
Public Sub GetSeting()
|
||
'刷新系统缓存
|
||
My.Settings.Reload()
|
||
'获取系统缓存参数
|
||
ComboBox1.Text = My.Settings.SerialPortName
|
||
ComboBox2.Text = My.Settings.BaudRate
|
||
If My.Settings.THigh = 0 OrElse My.Settings.TWide = 0 Then
|
||
Else
|
||
Me.Height = My.Settings.THigh
|
||
Me.Width = My.Settings.TWide
|
||
End If
|
||
|
||
|
||
G_Subscribe = My.Settings.G_Subscribe
|
||
G_Publish = My.Settings.G_Publish
|
||
ToolStripTextBox2.Text = G_Subscribe
|
||
ToolStripTextBox1.Text = G_Publish
|
||
|
||
Dim dic As Dictionary(Of Integer, (String, String, String))
|
||
dic = JsonConvert.DeserializeObject(Of Dictionary(Of Integer, (String, String, String)))(My.Settings.GTable)
|
||
If IsNothing(dic) OrElse dic.Count = 0 Then Return
|
||
|
||
|
||
'JsonConvert.SerializeObject(m_Applicationconfig)
|
||
End Sub
|
||
'保存系统缓存参数
|
||
Public Sub SaveSeting()
|
||
|
||
'刷新系统缓存
|
||
My.Settings.Reload()
|
||
'获取系统缓存参数
|
||
My.Settings.SerialPortName = ComboBox1.Text
|
||
My.Settings.BaudRate = ComboBox2.Text
|
||
My.Settings.THigh = Me.Height
|
||
My.Settings.TWide = Me.Width
|
||
My.Settings.G_Subscribe = G_Subscribe
|
||
My.Settings.G_Publish = G_Publish
|
||
Dim dic As New Dictionary(Of Integer, (String, String, String))
|
||
|
||
My.Settings.GTable = JsonConvert.SerializeObject(dic)
|
||
My.Settings.Save()
|
||
|
||
End Sub
|
||
|
||
|
||
|
||
|
||
Private Sub ComboBox1_DropDown(sender As Object, e As EventArgs) Handles ComboBox1.DropDown
|
||
|
||
'判断串口是否打开
|
||
If SerialPort1.IsOpen Then
|
||
ComboBox1.DroppedDown = False
|
||
MsgBox("串口已打开,请先关闭串口")
|
||
'终止下拉
|
||
'收起ComboBox1 下拉
|
||
|
||
|
||
Return
|
||
End If
|
||
|
||
ComboBox1.Items.Clear()
|
||
ComboBox1.Items.AddRange(SerialPort.GetPortNames())
|
||
End Sub
|
||
|
||
Private Sub ComboBox2_DropDown(sender As Object, e As EventArgs) Handles ComboBox2.DropDown '判断串口是否打开
|
||
If SerialPort1.IsOpen Then
|
||
MsgBox("串口已打开,请先关闭串口")
|
||
Return
|
||
End If
|
||
|
||
End Sub
|
||
|
||
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
|
||
G_Hexflg = CheckBox1.Checked
|
||
End Sub
|
||
|
||
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
|
||
If Button1.Text = "打开串口" Then
|
||
Try
|
||
SerialPort1.PortName = ComboBox1.Text
|
||
SerialPort1.BaudRate = CInt(ComboBox2.Text)
|
||
SerialPort1.Open()
|
||
Button1.Text = "关闭串口"
|
||
Button1.ForeColor = Color.Red
|
||
Catch ex As Exception
|
||
MsgBox("串口打开失败")
|
||
End Try
|
||
Else
|
||
SerialPort1.Close()
|
||
Button1.Text = "打开串口"
|
||
Button1.ForeColor = Color.Black
|
||
End If
|
||
End Sub
|
||
'使用串口发送数据
|
||
Public Function SerialPortSendData(nstr As String, Optional hexflg As Boolean = False) As Boolean
|
||
If SerialPort1.IsOpen Then
|
||
'判断数据是否为空
|
||
If String.IsNullOrEmpty(nstr) Then
|
||
MsgBox("发送数据不能为空")
|
||
Return False
|
||
End If
|
||
|
||
If hexflg Then
|
||
Dim hex As String = StrToHex(nstr)
|
||
|
||
'RuningLog.OutputLogsToTheControl(RichTextBox1, New RuningLogConfig($"串口发送: {hex}", Color.Green, 12), 1)
|
||
SerialPort1.Write(hex)
|
||
Else
|
||
nstr = nstr & vbCrLf
|
||
'RuningLog.OutputLogsToTheControl(RichTextBox1, New RuningLogConfig($"串口发送: {nstr}", Color.Green, 12), 1)
|
||
|
||
SerialPort1.Write(nstr)
|
||
End If
|
||
Return True
|
||
Else
|
||
MsgBox("串口未打开")
|
||
Return False
|
||
|
||
End If
|
||
End Function
|
||
|
||
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
|
||
If SerialPort1.IsOpen Then
|
||
SerialPortSendData(TextBox2.Text, G_Hexflg)
|
||
Else
|
||
MsgBox("串口未打开")
|
||
End If
|
||
End Sub
|
||
|
||
'将字符串转Hex 数据
|
||
Private Function StrToHex(ByVal str As String) As String
|
||
Dim hex As String = ""
|
||
For Each c As Char In str
|
||
hex += Convert.ToString(Asc(c), 16).PadLeft(2, "0"c) & " "
|
||
Next
|
||
Return hex
|
||
End Function
|
||
|
||
'将Hex 数据转字符串
|
||
Private Function HexToStr(ByVal hex As String) As String
|
||
Dim str As String = ""
|
||
Dim hexs() As String = hex.Split(" "c)
|
||
For Each h As String In hexs
|
||
If h <> "" Then
|
||
str += ChrW(Convert.ToInt32(h, 16))
|
||
End If
|
||
Next
|
||
Return str
|
||
End Function
|
||
|
||
|
||
|
||
|
||
Private Sub Telephone_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
|
||
SaveSeting()
|
||
RedisClose()
|
||
If Not IsNothing(M_EventThread) AndAlso M_EventThread.IsAlive Then
|
||
M_EventThread.Abort()
|
||
End If
|
||
If Not IsNothing(G_Log) Then
|
||
G_Log.CloseThread()
|
||
End If
|
||
End Sub
|
||
|
||
Private Sub ToolStripButton3_Click(sender As Object, e As EventArgs) Handles ToolStripButton3.Click
|
||
RichTextBox1.Clear()
|
||
End Sub
|
||
|
||
Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
|
||
If RichTextBox1.Lines.Length > 2147000000 Then
|
||
RichTextBox1.Clear()
|
||
End If
|
||
End Sub
|
||
|
||
Private Sub ToolStripButton4_Click(sender As Object, e As EventArgs) Handles ToolStripButton4.Click
|
||
If String.IsNullOrEmpty(ToolStripTextBox2.Text) Then
|
||
MsgBox("请输入订阅频道")
|
||
Return
|
||
Else
|
||
G_OldSubscribe = G_Subscribe
|
||
G_Subscribe = ToolStripTextBox2.Text.Trim
|
||
End If
|
||
If String.IsNullOrEmpty(ToolStripTextBox1.Text) Then
|
||
MsgBox("请输入发布频道")
|
||
Return
|
||
Else
|
||
G_Publish = ToolStripTextBox1.Text.Trim
|
||
End If
|
||
|
||
|
||
initRedisSubscriber(G_Subscribe, G_OldSubscribe)
|
||
|
||
initRedisPublisher()
|
||
End Sub
|
||
'订阅初始化
|
||
''' <summary>
|
||
'''
|
||
''' </summary>
|
||
''' <param name="Subscribe"></param>
|
||
''' <param name="OldSubscribe"></param>
|
||
Public Sub initRedisSubscriber(Subscribe As String, OldSubscribe As String)
|
||
If String.IsNullOrEmpty(Subscribe) Then
|
||
MsgBox("未设置订阅频道")
|
||
Return
|
||
End If
|
||
|
||
If Not IsNothing(G_RedisSub) AndAlso G_RedisSub.IsConnected Then
|
||
' 取消订阅并关闭连接
|
||
G_RedisSub.UnsubscribeFromChannel(OldSubscribe)
|
||
G_RedisSub.CloseConnection()
|
||
End If
|
||
|
||
|
||
|
||
' 替换为你的 Redis 连接字符串
|
||
Dim connectionString = "127.0.0.1:6379"
|
||
Try
|
||
G_RedisSub = New RedisSubscriber(connectionString)
|
||
|
||
' 定义消息处理程序
|
||
Dim messageHandler As Action(Of RedisChannel, RedisValue) = Sub(channel, message)
|
||
Dim gLogNode As LogNode
|
||
Dim g_CallInfoNode As CallInfoNode
|
||
Try
|
||
g_CallInfoNode = JsonConvert.DeserializeObject(Of CallInfoNode)(message)
|
||
Catch ex As Exception
|
||
'MsgBox($"消息解析失败:{ex.Message}")
|
||
gLogNode = New LogNode(ex.Message, RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Return
|
||
End Try
|
||
|
||
|
||
gLogNode = New LogNode($"Redis:{channel}: {message}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
M_RedisQueue.Enqueue(g_CallInfoNode)
|
||
'Console.WriteLine($"接收到来自 {channel} 的消息: {message}")
|
||
|
||
End Sub
|
||
|
||
' 订阅频道
|
||
G_RedisSub.SubscribeToChannel(Subscribe, messageHandler)
|
||
Catch ex As Exception
|
||
MsgBox($"订阅失败:{ex.Message}")
|
||
End Try
|
||
|
||
|
||
'' 发布消息示例
|
||
'Console.WriteLine("发布测试消息...")
|
||
'G_RedisSub.PublishMessage("testChannel", "Hello from publisher!")
|
||
|
||
'' 保持程序运行以接收更多消息
|
||
'Console.WriteLine("按任意键退出...")
|
||
'Console.ReadKey()
|
||
|
||
End Sub
|
||
|
||
Private Sub ToolStripButton5_Click(sender As Object, e As EventArgs) Handles ToolStripButton5.Click
|
||
RedisPublishMessage("20131415926")
|
||
End Sub
|
||
'redis发布初始化
|
||
Public Sub initRedisPublisher()
|
||
If Not IsNothing(G_Redislish) AndAlso G_Redislish.IsConnected Then
|
||
G_Redislish.CloseConnection()
|
||
End If
|
||
' 替换为你的 Redis 连接字符串
|
||
Dim connectionString = "127.0.0.1:6379"
|
||
Try
|
||
G_Redislish = New RedisSubscriber(connectionString)
|
||
Catch ex As Exception
|
||
MsgBox($"redis发布初始化失败:{ex.Message}")
|
||
End Try
|
||
|
||
End Sub
|
||
'发布消息
|
||
Public Sub RedisPublishMessage(message As String)
|
||
If String.IsNullOrEmpty(G_Publish) Then
|
||
MsgBox("未设置发布频道")
|
||
Return
|
||
End If
|
||
If String.IsNullOrEmpty(message) Then
|
||
MsgBox("未输入发布内容")
|
||
Return
|
||
End If
|
||
If G_Redislish.IsConnected Then
|
||
Dim gLogNode As LogNode
|
||
|
||
Try
|
||
|
||
G_Redislish.PublishMessage(G_Publish, message)
|
||
gLogNode = New LogNode($"Redis:{G_Publish}: {message}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
|
||
Catch ex As Exception
|
||
MsgBox($"redis发布失败:{ex.Message}")
|
||
gLogNode = New LogNode(ex.Message, RuningLog.LogType.e_Error, RuningLog.LogMode.e_fileandRichTextBox)
|
||
gLogNode.SetLogColor(Color.Red)
|
||
G_Log.AddLogNode(gLogNode)
|
||
End Try
|
||
|
||
Else
|
||
MsgBox("redis未连接")
|
||
End If
|
||
End Sub
|
||
Public IsRead As Boolean = False
|
||
Public listening As Boolean = False
|
||
Public recvBufferli As List(Of Byte)
|
||
Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
|
||
|
||
'获取读缓冲区数据长度
|
||
Dim gLogNode As LogNode
|
||
Dim n As Integer = SerialPort1.BytesToRead
|
||
Dim recvBuffer As Byte() = New Byte(n - 1) {}
|
||
SerialPort1.Read(recvBuffer, 0, n)
|
||
If Not IsNothing(G_SendBuffnode) Then
|
||
|
||
G_SendBuffnode.ReceiveStatusStateMachine(G_SendBuffnode, recvBuffer)
|
||
'SendBuffnode.SetSendStatus(G_SendBuffnode, SendBuffnode.SendStatustype.ReceiveSuccess)
|
||
End If
|
||
'输出到富文本
|
||
If G_Hexflg Then
|
||
'RuningLog.OutputLogsToTheControl(RichTextBox1, New RuningLogConfig($"串口接收到数据:{ByteToString2(recvBuffer)}", Color.Olive, 12), 1)
|
||
gLogNode = New LogNode($"RX:{ByteToString2(recvBuffer)}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
Else
|
||
'RuningLog.OutputLogsToTheControl(RichTextBox1, New RuningLogConfig($"串口接收到数据:{Encoding.Default.GetString(recvBuffer)}", Color.Olive, 12), 1)
|
||
gLogNode = New LogNode($"RX:{Encoding.Default.GetString(recvBuffer)}", RuningLog.LogType.e_info, RuningLog.LogMode.e_fileandRichTextBox)
|
||
G_Log.AddLogNode(gLogNode)
|
||
End If
|
||
|
||
'Dim readstr As String = publicMode.ByteToString(recvBuffer)
|
||
|
||
|
||
|
||
End Sub
|
||
Public Shared Function ByteToString2(databuff() As Byte)
|
||
Dim strData As String = String.Empty
|
||
For i = 0 To databuff.Length - 1
|
||
strData &= $" {ByteToHex1(databuff(i)).PadLeft(2, "0"c)}"
|
||
Next
|
||
Return strData
|
||
End Function
|
||
Public Shared Function ByteToHex1(ByVal b As Byte) As String
|
||
Return b.ToString("X2")
|
||
End Function
|
||
|
||
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
|
||
'TextBox1
|
||
'判断TextBox1 是否为空
|
||
If String.IsNullOrEmpty(TextBox1.Text) Then
|
||
MsgBox("电话号码为空")
|
||
Return
|
||
End If
|
||
'判断TextBox1 是否为数字 且符合电话号码格式
|
||
If Not IsNumeric(TextBox1.Text) OrElse TextBox1.Text.Length <> 11 Then
|
||
MsgBox("电话号码格式不正确")
|
||
Return
|
||
End If
|
||
Dim str As String = $"ATD{TextBox1.Text};"
|
||
SerialPortSendData(str, False)
|
||
|
||
|
||
End Sub
|
||
|
||
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
|
||
Console.WriteLine(publicMode.SwapAndPad("18144070918"))
|
||
End Sub
|
||
|
||
|
||
'关闭redis
|
||
Public Sub RedisClose()
|
||
If Not IsNothing(G_RedisSub) AndAlso G_RedisSub.IsConnected Then
|
||
G_RedisSub.UnsubscribeFromChannel(G_Subscribe)
|
||
G_RedisSub.CloseConnection()
|
||
End If
|
||
If Not IsNothing(G_Redislish) AndAlso G_Redislish.IsConnected Then
|
||
G_Redislish.CloseConnection()
|
||
End If
|
||
End Sub
|
||
|
||
|
||
|
||
End Class
|