智能充电(新能源电动车,电单车)云管理系统的定制解决方案

一 系统简介

智能充电(新能源电动车,电单车)云管理系统 是一套能够实现对充电站/桩的实时通讯、状态监控、故障检测、运营分析、数据统计、策略设置的智能化多任务管理系统。

二 平台概览

智能充电云管理系统  
https://chongdianzhuang.itgcs.tech/  账号:demo 密码:demo123

b753b814019042eb99afc43ff9e4d556.png
三 通信协议

  • Http+SSL协议:运维管理平台
  • TCP协议:与充电桩通信
  • Websocket+SSL协议:与微信小程序实时双向通信

四 支持的充电桩

  • 新能源汽车充电:包括直流桩和交流桩,云快充平台协议V1.6
  • 两轮电单车充电
  • 桩企业私有协议等(定制开发)

五 运行环境

Windows 或 类Linux系统,Mysql,Redis,RabbitMQ等服务

六 通信代码

1 TCP Server:与充电桩通信,CRC校验

func TCPServer() {
	//以下是TCP Server
	listenAddrs := []string{
		GlobalConfig.TCPAddr1,
		GlobalConfig.TCPAddr2,
	}

	for _, addr := range listenAddrs {
		go func(addr string) {
			listener, err := net.Listen("tcp", addr)
			if err != nil {
				fmtPrintf("[TCP] Failed to listen on %s: %v", addr, err)
				return
			}
			defer listener.Close()

			fmtPrintf("[TCP] Server listening on %s", addr)

			for {
				conn, err := listener.Accept()
				if err != nil {
					fmtPrintf("[TCP] Error accepting connection: %v", err)
					continue
				}

				go handleConn(conn)
			}
		}(addr)
	}
}

1.1 充电桩登录消息定义


// 0x01 MsgLogin 登录消息
type MsgLogin struct {
	MsgHeader                // 继承 MsgHeader
	ChargePileID    [7]byte  `json:"ChargePileID"`    // 充电桩ID
	ChargePileType  byte     `json:"ChargePileType"`  // 充电桩类型
	ChargeShotNum   byte     `json:"ChargeShotNum"`   // 充电枪数量
	ProtocolVersion byte     `json:"ProtocolVersion"` // 协议版本
	ProgramVersion  [8]byte  `json:"ProgramVersion"`  // 程序版本
	NetType         byte     `json:"NetType"`         // 网络类型
	SIM             [10]byte `json:"SIM"`             // SIM卡信息
	NetCarrier      byte     `json:"NetCarrier"`      // 网络运营商
	// CheckSum        [2]byte  `json:"CheckSum"`        // 校验和
}

// 0x02 MsgLoginRsp 登录响应消息
type MsgLoginRsp struct {
	MsgHeader            // 继承 MsgHeader
	ChargePileID [7]byte `json:"ChargePileID"` // 充电桩ID
	Ret          byte    `json:"Ret"`          // 登录结果
}

1.2 充电桩启停充电消息定义


// 0x33
type MsgStartChargeRspToServer struct {
	MsgHeader              // 继承 MsgHeader
	TransactionID [16]byte `json:"TransactionID"` // 交易流水号
	ChargePileID  [7]byte  `json:"ChargePileID"`  // 桩编号
	ChargeGunID   byte     `json:"ChargeGunID"`   // 枪号
	Ret           byte     `json:"Ret"`           // 启动结果 0x00失败 0x01成功
	FailCode      byte     `json:"FailCode"`      // 失败原因
}

// 0x34
type MsgStartChargeToDevice struct {
	MsgHeader               // 继承 MsgHeader
	TransactionID  [16]byte `json:"TransactionID"`  // 交易流水号
	ChargePileID   [7]byte  `json:"ChargePileID"`   // 桩编号
	ChargeGunID    byte     `json:"ChargeGunID"`    // 枪号
	LogicalCardID  [8]byte  `json:"LogicalCardID"`  // 显示在屏幕上,不足补零,逻辑卡号为卡面印刷卡号
	PhysicalCardID [8]byte  `json:"PhysicalCardID"` // 不足补零,桩与平台交互需使用的物理卡号
	Balance        [4]byte  `json:"Balance"`        // 账户余额,保留到小数点两位
}

// 0x35
type MsgStopChargeRspToServer struct {
	MsgHeader            // 继承 MsgHeader
	ChargePileID [7]byte `json:"ChargePileID"` // 桩编号
	ChargeGunID  byte    `json:"ChargeGunID"`  // 枪号
	Ret          byte    `json:"Ret"`          // 启动结果 0x00失败 0x01成功
	FailCode     byte    `json:"FailCode"`     // 0x00 无 0x01 设备编号不匹配 0x02 枪未处于充电状态 0x03 其他
}

// 0x36
type MsgStopChargeToDevice struct {
	MsgHeader            // 继承 MsgHeader
	ChargePileID [7]byte `json:"ChargePileID"` // 桩编号
	ChargeGunID  byte    `json:"ChargeGunID"`  // 枪号
}

1.3 ModBusCRC校验实现


func ModbusCRC(pData []byte, lenData byte) (byte, byte) {
	var (
		crcHi byte = 0xFF
		crcLo byte = 0xFF
		idx   byte
	)

	crchi := []byte{
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41,
		0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0,
		0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40,
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1,
		0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41,
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1,
		0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41,
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40,
		0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1,
		0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40,
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40,
		0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0,
		0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40,
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41,
		0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41,
		0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40,
		0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1,
		0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41,
		0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0,
		0x80, 0x41, 0x00, 0xc1, 0x81, 0x40}

	crclow := []byte{
		0x00, 0xc0, 0xc1, 0x01, 0xc3, 0x03, 0x02, 0xc2, 0xc6, 0x06,
		0x07, 0xc7, 0x05, 0xc5, 0xc4, 0x04, 0xcc, 0x0c, 0x0d, 0xcd,
		0x0f, 0xcf, 0xce, 0x0e, 0x0a, 0xca, 0xcb, 0x0b, 0xc9, 0x09,
		0x08, 0xc8, 0xd8, 0x18, 0x19, 0xd9, 0x1b, 0xdb, 0xda, 0x1a,
		0x1e, 0xde, 0xdf, 0x1f, 0xdd, 0x1d, 0x1c, 0xdc, 0x14, 0xd4,
		0xd5, 0x15, 0xd7, 0x17, 0x16, 0xd6, 0xd2, 0x12, 0x13, 0xd3,
		0x11, 0xd1, 0xd0, 0x10, 0xf0, 0x30, 0x31, 0xf1, 0x33, 0xf3,
		0xf2, 0x32, 0x36, 0xf6, 0xf7, 0x37, 0xf5, 0x35, 0x34, 0xf4,
		0x3c, 0xfc, 0xfd, 0x3d, 0xff, 0x3f, 0x3e, 0xfe, 0xfa, 0x3a,
		0x3b, 0xfb, 0x39, 0xf9, 0xf8, 0x38, 0x28, 0xe8, 0xe9, 0x29,
		0xeb, 0x2b, 0x2a, 0xea, 0xee, 0x2e, 0x2f, 0xef, 0x2d, 0xed,
		0xec, 0x2c, 0xe4, 0x24, 0x25, 0xe5, 0x27, 0xe7, 0xe6, 0x26,
		0x22, 0xe2, 0xe3, 0x23, 0xe1, 0x21, 0x20, 0xe0, 0xa0, 0x60,
		0x61, 0xa1, 0x63, 0xa3, 0xa2, 0x62, 0x66, 0xa6, 0xa7, 0x67,
		0xa5, 0x65, 0x64, 0xa4, 0x6c, 0xac, 0xad, 0x6d, 0xaf, 0x6f,
		0x6e, 0xae, 0xaa, 0x6a, 0x6b, 0xab, 0x69, 0xa9, 0xa8, 0x68,
		0x78, 0xb8, 0xb9, 0x79, 0xbb, 0x7b, 0x7a, 0xba, 0xbe, 0x7e,
		0x7f, 0xbf, 0x7d, 0xbd, 0xbc, 0x7c, 0xb4, 0x74, 0x75, 0xb5,
		0x77, 0xb7, 0xb6, 0x76, 0x72, 0xb2, 0xb3, 0x73, 0xb1, 0x71,
		0x70, 0xb0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
		0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9c, 0x5c,
		0x5d, 0x9d, 0x5f, 0x9f, 0x9e, 0x5e, 0x5a, 0x9a, 0x9b, 0x5b,
		0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4b, 0x8b,
		0x8a, 0x4a, 0x4e, 0x8e, 0x8f, 0x4f, 0x8d, 0x4d, 0x4c, 0x8c,
		0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
		0x43, 0x83, 0x41, 0x81, 0x80, 0x40}

	for ; lenData > 0; lenData-- {
		idx = crcHi ^ pData[0]
		pData = pData[1:]
		crcHi = crcLo ^ crchi[idx]
		crcLo = crclow[idx]
	}

	// return uint16(crcHi)<<8 | uint16(crcLo)
	return crcHi, crcLo
}

 2 Websocket Server + SSL证书:提供小程序端通信服务

func WssServer() {
	http.HandleFunc("/websocket", handleClient)
	fmtPrintf("[WebSocket] Server listening on %s", GlobalConfig.WebSocketAddr)
	fmtPrintf("[WebSocket] Cert: %s, Key: %s ", GlobalConfig.ProtocolCert, GlobalConfig.ProtocolPrivateKey)
	err := http.ListenAndServeTLS(GlobalConfig.WebSocketAddr, GlobalConfig.ProtocolCert, GlobalConfig.ProtocolPrivateKey, nil)
	if err != nil {
		fmtPrintf("WebSocket server err:%v", err)
	}
	go wsClientsKeepalive()
}

3 Websocket Client 小程序端:含断线重连,保证客户端一个始终一个连接

// utils/webSocketManager.js
import util from 'util.js';
const webSocketManager = (() => {
  let socket;
  let reconnectTimer; // 用于存储定时器ID,用于重连
  const MAX_RECONNECT_TIMES = 10; // 最大重连次数
  const RECONNECT_INTERVAL = 3000; // 重连间隔时间,单位毫秒

  const initWebSocket = (url) => {
      util.log('WebSocket【initWebSocket】 连接:', url);
      if (socket && socket.readyState === 1) {
          util.log('WebSocket【initWebSocket】已连接,无需重新初始化 ');
          return;
      }
  
      socket = wx.connectSocket({ url: url });
      
      socket.onOpen(() => {
        util.log('WebSocket 【onOpen】');
        // 连接成功后发送login
        wx.getStorage({
          key: "openid",
          success(res) {
            if(res.data == null) {
              util.log("initWebSocket close socket openid null ")
              close()
            }
            let dataObj = {  
              cmd: 'login',  
              src: 'wx',
              dst: 'wx',
              uid:  res.data,  
              msg: null,  
            }; 
            send(dataObj);
          },
          fail (res) {   
            util.log("initWebSocket close socket wx.getStorage err: ", res)
            close()
          },
        })
      });

      socket.onMessage((res) => {
          util.log('WebSocket 【onMessage】:', res.data);
          // 在这里处理接收到的消息
          var obj = JSON.parse(res.data)

          // if (obj.cmd == "wx_requestPayment"){
          //   var msg = JSON.parse(obj.msg)
          //   wx.requestPayment({
          //     "timeStamp": msg.timeStamp,
          //     "nonceStr": msg.nonceStr,
          //     "package": msg.package,
          //     "signType": msg.signType,
          //     "paySign": msg.paySign,
          //     "success":function(res){
          //       util.log("requestPayment ok")
          //     },
          //     "fail":function(res){
          //       util.log("requestPayment fail",res)
          //     }
          //   })
          // }
      });

      socket.onError((err) => {
          // 这里可以处理错误情况,例如关闭socket
          util.log('WebSocket 【onError】连接已已出错,',err);
      });

      socket.onClose(() => {
        // 这里可以处理错误情况,例如关闭socket
        util.log('WebSocket 【onClose】连接已关闭,尝试重连...');
        // 当连接关闭时,也尝试重连
        if (!reconnectTimer && socket.readyState !== 1) {
            reconnectTimer = setInterval(() => {
                if (socket.readyState !== 1) {
                    initWebSocket(url);
                } else {
                    clearInterval(reconnectTimer);
                    reconnectTimer = null;
                }
            }, RECONNECT_INTERVAL);
        }
    });
  };

  const send = (data) => {
      if (socket && socket.readyState === 1) {
          var messageStr = JSON.stringify(data);
          util.log('WebSocket 【send】:', messageStr);
          socket.send({
            data: messageStr
          });
      } else {
          util.warn('WebSocket未连接,无法发送消息');
      }
  };

  const close = () => {
      if (socket) {
          socket.close();
          // 清除重连定时器
          if (reconnectTimer) {
              clearInterval(reconnectTimer);
              reconnectTimer = null;
          }
      }
  };

  return {
      initWebSocket,
      send,
      close,
  };
})();

export default webSocketManager;

4 HTTP+SSL证书服务:提供小程端通信服务


func HttpsServer() {
	// 加载证书和私钥
	cert, err := tls.LoadX509KeyPair(GlobalConfig.ProtocolCert, GlobalConfig.ProtocolPrivateKey)
	if err != nil {
		fmtPrintf("HttpsServer %v", err)
	}

	// 配置TLS
	config := &tls.Config{
		Certificates: []tls.Certificate{cert},
	}

	// 创建一个新的ServerMux实例(默认情况下,http.HandleFunc就是使用这个实例)
	mux := http.NewServeMux()

	// 注册处理程序
	// mux.HandleFunc("/", handler)
	mux.HandleFunc("/wx_notify_url", handle_wx_notify_url)
	// 监听端口并启动服务器
	srv := &http.Server{
		Addr:      GlobalConfig.HttpsAddr, // 或者使用其他端口,但443是HTTPS的标准端口
		Handler:   mux,
		TLSConfig: config,
	}

	fmtPrintf("[Https] Server listening on %s", GlobalConfig.HttpsAddr)
	fmtPrintf("[Https] WXNotifyURL: %s", GlobalConfig.WXNotifyURL)
	if err := srv.ListenAndServeTLS("", ""); err != nil { // 空字符串意味着使用上面定义的config中的证书和私钥
		log.Fatal(err)
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783129.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型+软件开发,计算机从业者转行的契机?

自从大模型吹响新一轮技术革命的号角后&#xff0c;整个行业各个层次都面临大模型带来的范式转换。我今年在 4 月份上海举办的全球机器学习技术大会上演讲时曾提出&#xff0c;大模型为计算产业带来了计算范式、开发范式、交互范式的三大范式改变。今天是软件研发技术大会&…

职业理念教育观

职业道德理念——教育观 教育是什么、干什么、为了什么&#xff0c;教育心该培养什么样的人、如何培养人等。 教育观 素质教育内涵 教学观 素质教育内涵 新课程改革的教学观

力扣-贪心算法4

406.根据身高重建队列 406. 根据身高重建队列 题目 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或…

微信商城自定义小程序源码系统,PHP+MySQL组合开发 带完整的源代码包以及搭建教程

系统概述 传统电商模式面临着诸多挑战&#xff0c;如用户体验不够个性化、运营成本较高等。而微信商城小程序凭借其轻量级、便捷性和与微信生态系统的紧密结合&#xff0c;为企业提供了新的发展机遇。小编给大家分享一款功能强大、易于定制和扩展的源码系统&#xff0c;帮助企…

C# 快速排序算法的详细讲解

目录 一、前言 二、例子 三、快速排序算法图片讲解 四、快速排序算法代码 五、纯净代码 一、前言 用比较好懂的方式讲一下快速排序算法。 二、例子 如果我有一堆钱&#xff0c;想数清楚&#xff0c;最快的方案是什么&#xff1f; 图1 一堆钱 答&#xff1a;先分类&…

数据库之MQL

1&#xff0c;查询所有 mysql> select * from grade;2&#xff0c; mysql> select id,firstname,lastname from grade;3&#xff0c; mysql> select firstname,lastname from grade where id > 4;4&#xff0c; mysql> select * from grade where sex f;5&…

『SD』比例切换插件 sd-webui-aspect-ratio-helper(附插件)

本文简介 ✨ 告别手动计算&#xff0c;SD绘图神器来啦&#xff01; &#x1f494; 是不是每次使用SD绘图时&#xff0c;都要自己手动去计算图片的宽高比&#xff0c;感觉好繁琐啊&#xff1f; &#x1f389; 今天就来给各位工友安利一个超实用的插件——sd-webui-aspect-ratio-…

【kubernetes集群如何更改所有节点IP】

kubernetes集群如何更改所有节点IP 情景描述更换IP前的准备工作更换IP后的工作--master更换IP后的工作--node节点重新部署之前那些服务 情景描述 我有三台服务器&#xff0c;想要将其组成了一个kubernetes集群&#xff0c;在部署之前&#xff0c;我就对其进行了固定IP的操作&a…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端&#xff1a; 1、【产品中心】产品案列、新闻动态的发布&#xff1b; 2、【员工管理】新增、修改、删除、搜索功能&#xff1b;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

springboot331+vue“有光”摄影分享网站系统+论文+源码+讲解

第3章 系统分析 3.1 可行性分析 3.1.1技术可行性 研发设计程序流程挑选面向对象设计、功能齐全、简单实用的Java编程设计核心理念。MySQL数据库存储数据。Idea工具作为编程软件&#xff0c;win10计算机操作系统作为应用系统&#xff0c;以及数据库可视化工具等技术职称。一般…

十款绚丽的前端 CSS 菜单导航动画

CSS汉堡菜单是一种非常流行的PC端和移动端web菜单风格&#xff0c;特别是移动端&#xff0c;这种风格的菜单应用更为广泛。这款菜单便非常适合在手机App上使用&#xff0c;它的特点是当顶部菜单弹出时&#xff0c;页面内容将会配合菜单出现适当的联动&#xff0c;让整个页面变得…

【软件分享】我们为分类而生—eCognition

分类是各位小伙伴入门遥感需要做的一项基础的工作&#xff0c;在进行遥感影像中的地物进行分类和提取时&#xff0c;如何提高分类精度&#xff0c;常常令人头疼。今天小编带来此前接触过的一个工具&#xff0c;他的名字是—eCognition&#xff0c;感觉比ENVI好用&#xff0c;在…

Java-01-源码篇-04集合-05-SortedMap NavigableMap TreeMap

目录 一&#xff0c;SortedMap 二&#xff0c;NavigableMap 三&#xff0c;TreeMap 3.1 TreeMap 继承结构 3.2 TreeMap 属性 3.3 TreeMap 构造器 3.4 TreeMap 内部类 3.4.1 Values 3.4.2 KeySet 3.4.3 EntrySet 3.4.5 相关集合迭代器 3.4.5.1 PrivateEntryIterato…

使用langchain与你自己的数据对话(二):向量存储与嵌入_langchain chat with your data

之前我以前完成了“使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割这篇文章&#xff0c;没有阅读的朋友可以先阅读一下&#xff0c;今天我们来继续讲解第三门课&#xff1a;向量存储与嵌入。 Langchain在实现与外部数据对话的功能时需要经历下面的5个阶段&am…

【智能制造-11】X型焊枪和C型焊枪

手工焊枪分为X型焊枪和C型焊枪两种。 X焊枪中&#xff0c;气缸活塞杆与活动枪臂体之间以轴连接&#xff0c;气缸活塞做直线运动&#xff0c;焊枪臂绕转轴摆动&#xff0c;进行焊接。 C型焊枪中&#xff0c;气缸活塞杆与活动枪臂联动&#xff0c;进行直线往复运动&#xff0c;进…

简单实现联系表单Contact Form自动发送邮件

如何实现简单Contact Form自动邮件功能&#xff1f;怎样简单设置&#xff1f; 联系表单不仅是访客与网站所有者沟通的桥梁&#xff0c;还可以收集潜在客户的信息&#xff0c;从而推动业务的发展。AokSend将介绍如何简单实现一个联系表单&#xff0c;自动发送邮件的过程&#x…

声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数

在之前的文章中曾介绍了函数模板&#xff0c;对于功能相同而数据类型不同的一些函数&#xff0c;不必定义各个函数&#xff0c;可以定义一个可对任何类型变量进行操作的函数模板&#xff0c;在调用函数时&#xff0c;系统会根据实参的类型&#xff0c;取代函数模板中的类型参数…

应用层协议原理——因特网提供的运输服务

我们已经考虑了计算机网络能够一般性地提供的运输服务。现在我们要更为具体地考察由因特网提供的运输服务类型。因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议&#xff0c;即UDP和TCP。当软件开发者为因特网创建一个新的应用时&#xff0c;首先要做出的决定是&…

游戏AI的创造思路-技术基础-决策树(2)

上一篇写了决策树的基础概念和一些简单例子&#xff0c;本篇将着重在实际案例上进行说明 目录 8. 决策树应用的实际例子 8.1. 方法和过程 8.1.1. 定义行为 8.1.2. 确定属性 8.1.3. 构建决策树 8.1.4. 实施行为 8.1.5. 实时更新 8.2. Python代码 8. 决策树应用的实际例子…

大模型网信办备案全网最详细说明【+流程+附件】

根据目前公开的国内大模型算法备案统计来看&#xff0c;首批境内深度合成服务算法备案清单&#xff0c;总共通过41家&#xff0c;14家互联网大厂和独角兽企业成功申报算法备案32个&#xff0c;6家新兴互联网公司成功申报算法备案9个&#xff0c;仅占比21.9%。 第二批境内…