nanoFramework.SignalR.Client 1.1.71
前缀已保留
dotnet add package nanoFramework.SignalR.Client --version 1.1.71
NuGet\Install-Package nanoFramework.SignalR.Client -Version 1.1.71
<PackageReference Include="nanoFramework.SignalR.Client" Version="1.1.71" />
paket add nanoFramework.SignalR.Client --version 1.1.71
#r "nuget: nanoFramework.SignalR.Client, 1.1.71"
// Install nanoFramework.SignalR.Client as a Cake Addin #addin nuget:?package=nanoFramework.SignalR.Client&version=1.1.71 // Install nanoFramework.SignalR.Client as a Cake Tool #tool nuget:?package=nanoFramework.SignalR.Client&version=1.1.71
欢迎使用.NET nanoFramework SignalR客户端库仓库
此API尽可能镜像官方.NET Microsoft.AspNetCore.SignalR.Client API。异常主要来自于.NET nanoFramework中缺少async
和泛型支持。
构建状态
组件 | 构建状态 | NuGet包 |
---|---|---|
nanoFramework.SignalR.Client |
用法
这是一个SignalR客户端库,它允许您将您的.net nanoFramework设备连接到SignalR中心。SignalR是ASP.NET框架的一部分,使得创建需要服务器高频更新的Web应用程序变得简单,如游戏。在物联网领域,SignalR可以用于创建例如显示连接智能电表的实时图表、控制机械臂等Web应用程序。
重要:您必须连接到一个具有有效IP地址的网络。请参考网络助手上的示例,了解如何设置此功能。
连接到集线器
为了建立连接,创建一个HubConnection
客户端。您需要在初始化HubConnection
时设置集线器URL。您还可以通过添加ClientWebsocketHeaders
来设置自定义头部,通过添加HubConnectionOptions
来设置额外选项。这些选项主要用于更改底层WebSocket的设置以及设置额外的SSL选项。您可以通过调用Start
来开始连接。
using System;
using System.Diagnostics;
using System.Threading;
using nanoFramework.SignalR.Client;
namespace NFSignalrTestClient
{
public class Program
{
public static void Main()
{
//setup connection
var options = new HubConnectionOptions() { Reconnect = true };
HubConnection hubConnection = new HubConnection("http://YourSignalrTestServer/testhub", options: options);
hubConnection.Closed += HubConnection_Closed;
hubConnection.On("ReceiveMessage", new Type[] { typeof(string), typeof(string) }, (sender, args) =>
{
var name = (string)args[0];
var message = (string)args[1];
Console.WriteLine($"{name} : {message}");
});
//start connection
hubConnection.Start();
AsyncResult dashboardClientConnected = hubConnection.InvokeCoreAsync("AwaitCientConnected", typeof(bool), new object[] { }, -1);
int seconds = 0;
while (!dashboardClientConnected.Completed)
{
Debug.WriteLine($"Waited {seconds} for client to open webapp");
seconds++;
Thread.Sleep(1000);
}
if ((bool)dashboardClientConnected.Value)
{
hubConnection.SendCore("ReportStatus", new object[] { "Client Connected" });
int count = 0;
while (hubConnection.State == HubConnectionState.Connected)
{
hubConnection.InvokeCore("SendMessage", null, new object[] { count, "this is a control message" });
count++;
Thread.Sleep(1000);
}
}
else
{
hubConnection.Stop("client failed to connect");
}
}
private static void HubConnection_Closed(object sender, SignalrEventMessageArgs message)
{
Debug.WriteLine($"closed received with message: {message.Message}");
}
}
}
处理丢失的连接
自动重连默认情况下,如果连接丢失或首次连接失败,HubConnection
客户端将不会自动重连。通过在HubConnection
初始化时将Reconnect
设置为true,客户端将尝试在0、2、10和30秒的间隔内重连,连续四次失败后将停止。当客户端尝试重连时,将触发Reconnecting事件。
注意:只有在收到包含服务器重连请求的服务器关闭消息后关闭连接时,客户端才会尝试重连。
连接状态
可以通过检查HubConnection
的State
来监控连接状态。不同的状态有:Disconnected
(断开)、Connected
(连接)、Connecting
(连接中)和Reconnecting
(正在重连)。连接建立后,每次状态更改将触发一个事件:Closed
(关闭)、Reconnecting
(正在重连)或Reconnected
(重连成功)。可以使用这些事件手动处理断开连接和重连。
从客户端调用集线器方法
有三种方式可以调用集线器上的方法。所有这三种方法都需要您传递集线器方法名以及集线器方法中定义的任何参数。
最简单的方式是调用SendCore
。这将调用方法而不需要等待或期待来自服务器的任何响应。这是一个“发射后不管”的方法。
第二种方法是InvokeCore
。InvokeCore需要传递集线器方法名、集线器方法返回类型、参数以及可选的超时时间(以毫秒为单位)。如果没有提供超时,则使用默认的ServerTimeout
。这是一个同步方法,将等待服务器回复。返回的对象是方法返回类型参数的类型。需要手动将对象转换为正确类型。注意:如果集线器方法返回类型是void,调用InvokeCore
或InvokeCoreAsync
时的返回类型应为null。
注意:将超时设置为-1将禁用服务器超时。如果未收到服务器的返回消息,这将无限期等待。
第三种方法是InvokeCoreAsync
。这和InvokeCore相同,但它是异步的。它将返回一个AsyncResult。
AsyncResult
AsyncResult
监控集线器方法的返回消息。完成时Completed
将为true。在完成时,Value
将保留需要手动转换为正确类型的返回对象。在完成之前调用Value
将导致等待服务器返回。如果发生错误,则Error
将为true,并且错误消息将在ErrorMessage
中。
AsyncResult dashboardClientConnected = hubConnection.InvokeCoreAsync("AwaitCientConnected", typeof(bool), new object[] { }, -1);
int seconds = 0;
while (!dashboardClientConnected.Completed)
{
Debug.WriteLine($"Waited {seconds} for client to open webapp");
seconds++;
Thread.Sleep(1000);
}
if ((bool)dashboardClientConnected.Value)
{
Debug.WriteLine("The client connected to the dashboard, start sending live data");
}
从集线器调用客户端方法
在连接开始前使用connection.On定义集线器调用的方法。
connection.On("ReceiveMessage", new Type[] { typeof(string), typeof(string) }, (sender, args) =>
{
var name = args[0] as string;
var message = args[1] as string;
Debug.WriteLine($"{name} : {message}");
});
connection.On中前面的代码在服务器端代码使用SendAsync方法调用它时运行。
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
停止连接
可以通过调用Stop
来关闭连接。这将停止连接。如果您想因为例如设备传感器故障等原因停止连接,可以通过可选的errorMessage
将错误信息传达给服务器。
反馈和文档
有关文档、提供反馈、问题和了解如何贡献,请参阅主仓库。
加入我们的Discord社区这里。
鸣谢
此项目的贡献者名单可在CONTRIBUTORS中找到。
许可证
nanoFramework类库采用MIT许可证。
行为准则
本项目采用了贡献者同盟定义的行为准则,以明确我社区中预期的行为。更多信息请参阅.NET基金会行为准则。
.NET基金会
本项目由.NET基金会支持。
-
- nanoFramework.CoreLibrary (>= 1.15.5)
- nanoFramework.Json (>= 2.2.122)
- nanoFramework.System.Net.WebSockets.Client (>= 1.1.102)
NuGet包
此包未被任何NuGet包使用。
GitHub仓库
此包未被任何流行的GitHub仓库使用。
版本 | 下载 | 最后更新 |
---|---|---|
1.1.71 | 51 | 8/1/2024 |
1.1.68 | 94 | 6/3/2024 |
1.1.66 | 111 | 4/4/2024 |
1.1.64 | 117 | 2/1/2024 |
1.1.62 | 89 | 1/26/2024 |
1.1.59 | 201 | 11/10/2023 |
1.1.57 | 173 | 5/29/2023 |
1.1.54 | 143 | 5/19/2023 |
1.1.49 | 260 | 2/20/2023 |
1.1.46 | 250 | 1/26/2023 |
1.1.44 | 279 | 12/28/2022 |
1.1.40 | 427 | 11/24/2022 |
1.1.38 | 313 | 11/15/2022 |
1.1.36 | 379 | 10/28/2022 |
1.1.34 | 357 | 10/27/2022 |
1.1.32 | 354 | 10/25/2022 |
1.1.30 | 357 | 10/25/2022 |
1.1.26 | 396 | 10/24/2022 |
1.1.24 | 383 | 10/21/2022 |
1.1.22 | 374 | 10/12/2022 |
1.1.20 | 384 | 10/11/2022 |
1.1.18 | 384 | 9/29/2022 |
1.1.14 | 430 | 9/23/2022 |
1.1.12 | 412 | 9/23/2022 |
1.1.10 | 476 | 9/18/2022 |
1.1.8 | 433 | 9/16/2022 |
1.1.6 | 398 | 9/8/2022 |
1.1.4 | 416 | 8/6/2022 |
1.1.2 | 410 | 8/5/2022 |
1.0.0 | 451 | 3/29/2022 |
1.0.0-preview.93 | 126 | 3/29/2022 |
1.0.0-preview.91 | 115 | 3/29/2022 |
1.0.0-preview.89 | 123 | 3/18/2022 |
1.0.0-preview.87 | 115 | 3/17/2022 |
1.0.0-preview.85 | 113 | 3/15/2022 |
1.0.0-preview.83 | 109 | 3/14/2022 |
1.0.0-preview.81 | 114 | 3/14/2022 |
1.0.0-preview.79 | 103 | 3/14/2022 |
1.0.0-preview.77 | 106 | 3/14/2022 |
1.0.0-preview.75 | 112 | 3/14/2022 |
1.0.0-preview.73 | 115 | 3/10/2022 |
1.0.0-preview.71 | 107 | 3/9/2022 |
1.0.0-preview.69 | 106 | 3/6/2022 |
1.0.0-preview.67 | 120 | 3/5/2022 |
1.0.0-preview.65 | 118 | 3/4/2022 |
1.0.0-preview.63 | 110 | 3/3/2022 |
1.0.0-preview.61 | 107 | 3/1/2022 |
1.0.0-preview.59 | 117 | 2/26/2022 |
1.0.0-preview.57 | 116 | 2/24/2022 |
1.0.0-preview.55 | 116 | 2/18/2022 |
1.0.0-preview.53 | 109 | 2/18/2022 |
1.0.0-preview.50 | 118 | 2/17/2022 |
1.0.0-preview.48 | 117 | 2/13/2022 |
1.0.0-preview.46 | 123 | 2/12/2022 |
1.0.0-preview.44 | 115 | 2/11/2022 |
1.0.0-preview.42 | 112 | 2/9/2022 |
1.0.0-preview.40 | 111 | 2/8/2022 |
1.0.0-preview.38 | 106 | 2/7/2022 |
1.0.0-preview.36 | 121 | 2/6/2022 |
1.0.0-preview.33 | 127 | 2/5/2022 |
1.0.0-preview.31 | 133 | 2/1/2022 |
1.0.0-preview.28 | 124 | 1/31/2022 |