一 、 概述

为了弥补代码的遗失,木舟IOT平台正在加班加点进行研发,后面不只是针对于IOT设备接入上报,告警,视频管理,组态数据可视化大屏,后面还会有快速搭建微服务平台,利用surging.cli工具根据数据库表生成微服务,中间服务,能让程序员快速完成BOSS交给的任务,从而在这个内卷的社会能占有一席之地。这些都是没有完成任务的空话,现在发此篇的目的是作者有能力开发出优秀的IOT平台,先介绍一个比较突出的功能,就是可以基于共享或者独立配置添加网络组件, 下面来介绍一下如何添加网络组件。

一键运行打包成品下载:https://pan.baidu.com/s/11hcf9ieCkJxlGrzvIuxeQA?pwd=ajsr

测试用户:fanly

测试密码:123456

为了让大家节约时间,能尽快运行产品看到效果,上面有 一键运行打包成品可以进行下载测试运行。

二、如何测试运行

以下是目录结构,

IDE:consul 注册中心

kayak.client: 网关

kayak.server:微服务

apache-skywalking-apm:skywalking链路跟踪

以上是目录结构,大家不需要一个个运行,只需要打开运行startup.bat,如果需要测试skywalking ,只需要apache-skywalking-apm\bin\startup.bat  文件就可以了,以下是运行的界面

三、如何添加组件

1.添加http服务组件,

打开平台界面,然后点击设备接入->网络组件,然后可以看到如下界面

再点击新增组件或者编辑组件,完成后注意启动状态是关闭状态,此时并不能对于该组件功能进行访问调用,只有把启动状态打开,才能访问调用

以上是http服务组件,启动完成后,如何设置了webservice和swagger,你可以访问webservice和swagger是否可以访问

2.添加/编辑Tcp服务组件

当添加/编辑Tcp组件时,设置Host:127.0.0.1 ,port:248并且还有解析方式选项,选项里面有不处理,固定长度,分隔符,自定义脚本,下面我们就来看自定义脚本

添加脚本如下:

parser.Fixed(4).Handler(
function(buffer){
var buf = BytesUtils.Slice(buffer,1,4);
parser.Fixed(buffer.ReadableBytes).Result(buf);
}).Handler(
function(buffer){parser.Fixed(8).Result(buffer);}
).Handler(function(buffer){
parser.Result('处理完成','gb2312').Complete();
}
)

而基于TCP服务代码如下,需要继承于TcpBehavior

    internal class TcpDeviceDataService : TcpBehavior, ITcpDeviceDataService
{
private readonly IDeviceProvider _deviceProvider;
public TcpDeviceDataService(IDeviceProvider deviceProvider)
{
_deviceProvider = deviceProvider;
} public override void Load(string clientId, NetworkProperties tcpServerProperties)
{
var deviceStatus = _deviceProvider.IsConnected(clientId);
this.Parser.HandlePayload().Subscribe(async buffer => await ParserBuffer(buffer));
} public override void DeviceStatusProcess(DeviceStatus status, string clientId, NetworkProperties tcpServerProperties)
{
//throw new NotImplementedException();
} public async Task ParserBuffer(IByteBuffer buffer)
{
List<string> result = new List<string>();
while (buffer.ReadableBytes > 0)
{
result.Add(buffer.ReadString(this.Parser.GetNextFixedRecordLength(),
Encoding.GetEncoding("gb2312")));
} // var str= buffer.ReadString(buffer.ReadableBytes, Encoding.UTF8); var byteBuffer = Unpooled.Buffer();
byteBuffer.WriteString("\r\n", Encoding.UTF8);
byteBuffer.WriteString("处理完成", Encoding.GetEncoding("gb2312"));
await Sender.SendAndFlushAsync(byteBuffer);
// await Sender.SendAndFlushAsync("消息已接收",Encoding.GetEncoding("gb2312"));
this.Parser.Close();
} public Task<bool> ChangeDeviceStage(string deviceId)
{
throw new NotImplementedException();
}
}

用测试Tcp调试工具结果如下

3.添加/编辑UDP服务组件

当添加/编辑UDP组件时, 设置Host:127.0.0.1 ,port:267 并且可以是否开启组播

而基于udp服务代码如下,需要继承于UdpBehavior

  internal class UdpDeviceDataService : UdpBehavior, IUdpDeviceDataService
{
public Task<bool> ChangeDeviceStage(string deviceId)
{
throw new NotImplementedException();
} public override async Task Dispatch(IEnumerable<byte> bytes)
{
await Sender.SendAndFlushAsync("\r\n", Encoding.UTF8);
await Sender.SendAndFlushAsync("处理完成", Encoding.GetEncoding("gb2312"));
}
}

测试结果如下:

4.添加/编辑WebSocket服务组件

当添加/编辑WebSocket组件时, 设置Host:127.0.0.1 ,port:55

而基于websocket服务代码如下,需要继承于WSBehavior

internal class WSDeviceDataService : WSBehavior, IWSDeviceDataService
{
protected override void OnMessage(MessageEventArgs e)
{
this.Client.Value.SendTo($"send:{e.Data},\r\n reply:hello,welcome to you!",ID);
} protected override void OnOpen()
{ }
}

测试结果如下:

5.添加/编辑UDP服务组件

当添加/编辑WebSocket组件时, 设置Host:127.0.0.1 ,port:345

添加greet.proto文件,脚本如下:

syntax = "proto3";

package Greet;

service Greeter {
// Sends a greeting
rpc ChangeDeviceStage (DeviceRequest) returns (DeviceReply) {}
} message DeviceRequest {
string deviceId = 1;
} message DeviceReply {
bool message = 1;
}

然后再创建GreeterBehavior,继承Greeter.GreeterBase, IServiceBehavior,代码如下

public partial class GreeterBehavior : Greeter.GreeterBase, IServiceBehavior
{
private ServerReceivedDelegate received;
public event ServerReceivedDelegate Received
{
add
{
if (value == null)
{
received += value;
}
}
remove
{
received -= value;
}
} public string MessageId { get; } = Guid.NewGuid().ToString("N");
public async Task Write(object result, int statusCode = 200, string exceptionMessage = "")
{
if (received == null)
return;
var message = new TransportMessage(MessageId, new ReactiveResultMessage
{
ExceptionMessage = exceptionMessage,
StatusCode = statusCode,
Result = result });
await received(message);
} public T CreateProxy<T>(string key) where T : class
{
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(key);
} public object CreateProxy(Type type)
{
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(type);
} public object CreateProxy(string key, Type type)
{
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(key, type);
} public T CreateProxy<T>() where T : class
{
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>();
} public T GetService<T>(string key) where T : class
{
if (ServiceLocator.Current.IsRegisteredWithKey<T>(key))
return ServiceLocator.GetService<T>(key);
else
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(key);
} public T GetService<T>() where T : class
{
if (ServiceLocator.Current.IsRegistered<T>())
return ServiceLocator.GetService<T>();
else
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(); } public object GetService(Type type)
{
if (ServiceLocator.Current.IsRegistered(type))
return ServiceLocator.GetService(type);
else
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(type);
} public object GetService(string key, Type type)
{
if (ServiceLocator.Current.IsRegisteredWithKey(key, type))
return ServiceLocator.GetService(key, type);
else
return ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy(key, type); }
public void Publish(IntegrationEvent @event)
{
GetService<IEventBus>().Publish(@event);
} }

而基于grpc服务代码如下,需要继承于刚刚创建的GreeterBehavior

    public class GrpcDeviceDataService : GreeterBehavior, IGrpcDeviceDataService
{
public override Task<DeviceReply> ChangeDeviceStage(DeviceRequest request, ServerCallContext context)
{
return Task.FromResult(new DeviceReply
{
Message = true
}) ;
}
}

以下是测试结果:

6.添加/编辑MQTT服务组件

当添加/编辑WebSocket组件时, 设置Host:127.0.0.1 ,port:425

而基于mqtt服务代码如下,需要继承于MqttBehavior

 public class MQTTDeviceDataService : MqttBehavior, IMQTTDeviceDataService
{
public override async Task<bool> Authorized(string username, string password)
{
bool result = false;
if (username == "admin" && password == "123456")
result = true;
return await Task.FromResult(result);
} public async Task<bool> IsOnline(string deviceId)
{
return await base.GetDeviceIsOnine(deviceId);
} public async Task Publish(string deviceId, WillMessage message)
{
var willMessage = new MqttWillMessage
{
WillMessage = message.Message,
Qos = message.Qos,
Topic = message.Topic,
WillRetain = message.WillRetain
};
await Publish(deviceId, willMessage);
await RemotePublish(deviceId, willMessage);
}
}

以下是测试结果:

三、总结

木舟IOT平台会在github开源社区版本,可以自由更改代码,用于商业项目,但不能自营平台,如低代码平台,IOT平台等,如有违反,后果自负,还有最好不要更改命名空间,然后跟公司说是自己研发的,如果知道后,我在博客全网通报此人,以前surging相关的事件就算了,就当没发生过。,如果碰到困难,比较紧急的话,可以联系作者,加群:744677125

基于surging的木舟IOT平台如何添加网络组件的更多相关文章

  1. 低代码平台--基于surging开发微服务编排流程引擎构思

    前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...

  2. 基于surging网络组件多协议适配的平台化发展

    前言                Surging 发展已经有快6年的时间,经过这些年的发展,功能框架也趋于成熟,但是针对于商业化需求还需要不断的打磨,前段时间客户找到我想升级成平台化,针对他的需求我 ...

  3. Polaristech 刘洋:基于 OpenResty/Kong 构建边缘计算平台

    2019 年 3 月 23 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·北京站,Polaristech 技术专家刘洋在活动上做了<基于 ...

  4. 聊聊如何在华为云IoT平台进行产品开发

    摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...

  5. 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台

    搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...

  6. Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解

    Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...

  7. 基于AgileEAS.NET企业应用开发平台的分布式解决方案

    开篇 分布式应用 AgileEAS.NET基于Microsoft .Net构件技术而构建,Microsoft .Net最吸引人的莫过于分布式应用技术,基已经提供了XML WebService. .Ne ...

  8. 基于Activiti的流程应用开发平台JSAAS-WF V5.3

    第1章 产品概述及体系架构 1.1.概述 红迅JSAAS-WF工作流平台V5是广州红迅软件有限公司面向合作伙伴以及有IT运维团队中大型企业提供新一代的流程管理产品,它基于流行的JAVA开源技术上构建, ...

  9. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)

    ☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...

  10. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

随机推荐

  1. package-lock.json 文件

    今天有同事找到我说,本地js 编译不过,编译不过的代码如下 const host = window?.location?.host || 'localhost'; 是option chaining, ...

  2. 如何计算QPS、PV和需要部署机器数量?

    基本概念 网站访问量的常用衡量标准:独立访客(UV) 和 综合浏览量(PV),一般以日为单位来计算. 独立访客(UV):指一定时间范围内相同访客多次访问网站,只计算为1个独立访客. 综合浏览量(PV) ...

  3. 谈谈你对 keep-alive 的了解?

    在做电商有关的项目中,当我们第一次进入列表页需要请求一下数据,当我从列表页进入详情页,详情页不缓存也需要请求下数据,然后返回列表页,这时候我们使用keep-alive来缓存组件,防止二次渲染,这样会大 ...

  4. yb 课堂实战之视频列表接口开发+API权限路径规划 《三》

    开发JsonData工具类 package net.ybclass.online_ybclass.utils; public class JsonData { /** * 状态码,0表示成功过,1表示 ...

  5. c 语言学习第六天

    数组 语法: 类型 数组名[元素个数]; int a[6]; // 4*6 字节 char b[24]; // 1*24 字节 double c[2]; // 2*8 字节 访问数组中的元素 语法: ...

  6. [oeasy]python0012_字符_character_chr函数_根据序号得到字符

    ​ 字符(character) 回忆上次内容 上次了解了ord函数 这个函数可以通过字符得到序号 那么可以反过来吗? 通过序号得到字符可以吗? ​ 编辑 ord的逆运算chr 有来就有回 ​ 编辑 好 ...

  7. 【游记】CSP 2023

    day 0 和 printfmingren 整理了一下不会的知识点,发现有点多,遂开摆 音游真的太好玩了 对着<算法竞赛进阶指南>复习了下对拍器的写法,把部分算法的模板又打了一遍 感觉前途 ...

  8. C#:只支持GET和POST方法的浏览器,如何发送PUT/DELETE请求?RESTful WebAPI如何响应?

    理想的RESTful WebAPI采用面向资源的架构,并使用请求的HTTP方法表示针对目标资源的操作类型.但是理想和现实是有距离的,虽然HTTP协议提供了一系列原生的HTTP方法,但是在具体的网络环境 ...

  9. Django 解决跨域访问API失败问题

    解决跨域访问API失败问题   By:授客 QQ:103355122   实践环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: https://w ...

  10. 2024-07-27:用go语言,给定一个正整数数组,最开始可以对数组中的元素进行增加操作,每个元素最多加1。 然后从修改后的数组中选出一个或多个元素,使得这些元素排序后是连续的。 要求找出最多可以选

    2024-07-27:用go语言,给定一个正整数数组,最开始可以对数组中的元素进行增加操作,每个元素最多加1. 然后从修改后的数组中选出一个或多个元素,使得这些元素排序后是连续的. 要求找出最多可以选 ...