首页 > 其他分享 >基于surging的木舟IOT平台如何添加网络组件

基于surging的木舟IOT平台如何添加网络组件

时间:2024-08-28 15:55:38浏览次数:12  
标签:ServiceLocator return 木舟 IOT GetService surging 组件 public string

  一 、 概述

          为了弥补代码的遗失,木舟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服务组件

当添加/编辑MQTT组件时, 设置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

标签:ServiceLocator,return,木舟,IOT,GetService,surging,组件,public,string
From: https://www.cnblogs.com/fanliang11/p/18384041

相关文章

  • uiotos和iframe有什么区别?
    尽管都能嵌套,UIOTOS主要是界面嵌套,而iframe是网页嵌套。其他多个方面存在显著的区别,以下是对两者主要区别的详细对比:1.定义与用途UIOTOS:UIOTOS是一款无需编程的前端开发工具,通过独特的专利技术,帮助非开发者快速定制复杂的WEB应用。它专注于解决前端界面开发定制难题,提供常......
  • uiotos和iframe在嵌套上的区别?
    UIOTOS与iframe在嵌套方面的对比区别主要体现在技术实现、功能整合、开发效率及维护性等多个方面。1.技术实现UIOTOS:UIOTOS通过其独特的页面嵌套技术,允许用户将不同的页面或组件无缝地集成在一起。这种嵌套不仅仅是界面上的整合,更重要的是实现了功能上的深度融合。UIOTOS支......
  • Linux磁盘监控管理(fdisk\df\du和iotop、iostat)
    1.fdisk\df\du基本语句及其含义fdiskfdisk-l:表示列出系统中所有可识别的硬盘、U盘等设备的分区情况。此外还有其他参数:p:列出分区表。这是最常用的命令之一,用于查看当前磁盘的分区情况。d:删除分区。用于删除现有的磁盘分区。n:创建新分区。用于在磁盘上创建新的分区。t:改......
  • 生物素-LC-聚乙二醇1-NHS酯|Biotin-LC-PEG1-NHS ester
    基本信息英文名称:Biotin-LC-PEG1-NHSester英文同义词:Biotin-LC-PEG1-NHSester中文名称:生物素-LC-聚乙二醇1-NHS酯中文同义词:生物素-LC-聚乙二醇1-NHS酯;生物素-LC-一聚乙二醇-琥珀酰亚胺酯结构式:分子式(Molecularformula):C25H39N5O8S分子量(Molecularweight):569.67......
  • cas:2247545-20-4|Biotin-LC-PEG4-NHS ester|生物素-LC-四聚乙二醇-琥珀酰亚胺酯
    描述Biotin-LC-PEG4-NHSester中的NHS-PEG4-Biotin是一种聚乙二醇化水溶性试剂,用于对抗体、蛋白质和其他含伯胺的大分子进行简单有效的生物素标记。N-羟基琥珀酰亚胺酯(NHS)基团与赖氨酸和N-末端氨基特异性且有效地反应形成稳定的酰胺键。亲水性聚乙二醇(PEG)间隔臂赋予......
  • 精度管理|AIRIOT智慧仓储解决方案
    随着国内数字化建设的持续深化,全行业对高效数字化管理的需求日益增长,仓储场景亦步入了一个更为高阶的数字化转型时代,智慧仓储作为工业4.0的核心支柱是现代物流体系中不可或缺的关键一环。然而,当前传统的仓储管理模式在实践中仍面临诸多痛点与挑战: 高度人工依赖、效率低下:传......
  • 基于surging的产品项目-木舟开源了!
      一、概述        因为前段时间电脑坏了,导致代码遗失,踌躇满志马上上线的平台产品付之东流,现在熬夜在写代码希望能尽快推出企业正常使用的平台产品,而这次把代码开源,一是让大家对surging使用有个深入的了解,二也是开源社区起到监督推动作用,底层的代码基本上已经完成......
  • AIoTedge边缘计算平台产品简介
    边缘计算兴起边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的开放平台,就近提供边缘智能服务,满足行业数字化在敏捷联接、实时业务、数据优化、应用智能、安全与隐私保护等方面的关键需求。边缘侧感知终端海量接入和AI大量应用推动边缘计算兴起,向......
  • IoTSharp:基于 .NET 6.0 的开源物联网平台
    目录前言项目介绍为什么会有IoTSharp?IoTSharp能做什么?IoTSharp的亮点项目技术1、编程语言2、系统框架3、数据库支持4、消息队列与EventBus5、EventBus存储项目使用1、下载2、启动3、注册服务4、初始化influxdb5、注册6、运行项目地址总结最后前......
  • STM32与华为云IoTDA的上传下达
    实现了Mqtt的链接后,需要与华为云IoTDA进行属性上报、命令解析、命令应答等。需要参照华为云官网给出的API参考使用前必读_设备接入IoTDA;1.华为云函数构建1.1.设备属性上报该功能就是用于设备按产品模型中定义的格式将属性数据上报给平台,最通常的温度信息设备状态等,上报后......