thingsboard接入臻识道闸

news2024/12/29 10:31:17

thingsboard 和tb-gateway 是通过源码idea启动测试开发

为了测试这里只是买了臻识道闸的摄像机模组方便调试,然后添加一个开关量开关模拟雷达

image.png

道闸品牌

臻识C3R3C5R5变焦500万车牌识别相机高速追逃费相机华厦V86像机
淘宝地址 https://item.taobao.com/item.htm?_u=s1thkikq47ab&id=705371091697&spm=a1z09.2.0.0.2fe72e8dxewbm6
image.png

image.png

了解道闸协议

这里通过mqtt进行通信,下面是臻识道闸的mqtt通信协议,这里只是截图用到的部分

道闸识别车牌结果发送topic

车牌识别topic ${sn}/device/message/up/ivs_result
image.png
image.png
image.png
image.png

下发设备io事件开闸

开闸topic ${sn}/device/message/down/gpio_out
image.png
image.png

thingsboard 设置

1.在平台添加一个网关,设置为网关
image.png

配置iot gateway 并且启动

  1. 修改iot gateway 配置文件路径:thingsboard_gateway/config/tb_gateway.json
    设置host 为thingsboard服务器的mqtt地址
    image.png

  2. 复制网关token到gateway配置
    image.png
    粘贴到accessToken
    image.png

  3. 开启gprc
    image.png

  4. 添加mqtt配置引用
    image.png
    下面是总的配置文件不要直接复制我的,token不一样

{  
  "thingsboard": {  
    "host": "127.0.0.1",   
    "port": 1883,  
    "remoteShell": false,  
    "remoteConfiguration": true,  
    "statistics": {  
      "enable": true,  
      "statsSendPeriodInSeconds": 3600  
    },  
    "deviceFiltering": {  
      "enable": false,  
      "filterFile": "list.json"  
    },  
    "maxPayloadSizeBytes": 1024,  
    "minPackSendDelayMS": 200,  
    "minPackSizeToSend": 500,  
    "checkConnectorsConfigurationInSeconds": 60,  
    "handleDeviceRenaming": true,  
    "security": {  
      "type": "accessToken",  
      "accessToken": "QWk7kMTZsdjQC8nVEo7f"  
    },  
    "qos": 1,  
    "checkingDeviceActivity": {  
      "checkDeviceInactivity": false,  
      "inactivityTimeoutSeconds": 200,  
      "inactivityCheckPeriodSeconds": 500  
    }  
  },  
  "storage": {  
    "type": "memory",  
    "read_records_count": 100,  
    "max_records_count": 100000,  
    "data_folder_path": "./data/",  
    "max_file_count": 10,  
    "max_read_records_count": 10,  
    "max_records_per_file": 10000,  
    "data_file_path": "./data/data.db",  
    "messages_ttl_check_in_hours": 1,  
    "messages_ttl_in_days": 7  
  },  
  "grpc": {  
    "enabled": true,  
    "serverPort": 9595,  
    "keepaliveTimeMs": 10000,  
    "keepaliveTimeoutMs": 5000,  
    "keepalivePermitWithoutCalls": true,  
    "maxPingsWithoutData": 0,  
    "minTimeBetweenPingsMs": 10000,  
    "minPingIntervalWithoutDataMs": 5000,  
    "keepAliveTimeMs": 10000,  
    "keepAliveTimeoutMs": 5000  
  },  
  "connectors": [  
    {  
      "name": "MQTT Broker Connector",  
      "type": "mqtt",  
      "configuration": "mqtt.json"  
    }  
  ]  
}
  1. 启动一个 mqtt broker,这里用docker 启动
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.3.2
  1. 配置mqtt.json
    5.1 配置文件路径:thingsboard_gateway/config/mqtt.json
    修改成你自己启动的mqtt broker
    image.png
    5.2 在"mapping"[]里面添加下面配置
    这个/device/message/up/ivs_result 是臻识道闸车牌识别topic
    timeseries内的是重新组合设备数据
    eventType 字段是事件触发类型1代表是车牌识别
    license 车牌 base64加密
    full_image_content 车牌拍照图片 base64加密
{  
  "topicFilter": "/device/message/up/ivs_result",  
  "converter": {  
    "type": "json",  
    "deviceNameJsonExpression": "${sn}",  
    "deviceTypeJsonExpression": "臻识道闸设备配置",  
    "sendDataOnlyOnChange": false,  
    "timeout": 60000,  
    "attributes": [  
  
    ],  
    "timeseries": [  
      {  
        "type": "string",  
        "key": "eventType",  
        "value": "1"  
      },  
       {  
        "type": "string",  
        "key": "id",  
        "value": "${id}"  
      },  
       {  
        "type": "string",  
        "key": "sn",  
        "value": "${sn}"  
  
      },  
      {  
        "type": "string",  
        "key": "name",  
        "value": "${name}"  
  
      },  
       {  
        "type": "string",  
        "key": "version",  
        "value": "${version}"  
  
      },  
      {  
        "type": "long",  
        "key": "timestamp",  
        "value": "${timestamp}"  
      },  
      {  
        "type": "string",  
        "key": "license",  
        "value": "${payload.AlarmInfoPlate.result.PlateResult.license}"  
      },  
      {  
        "type": "string",  
        "key": "full_image_content",  
        "value": "${payload.AlarmInfoPlate.result.PlateResult.full_image_content}"  
      }  
    ]  
  }  
},

5.3 配置单向下发rpc控制
在serverSideRpc 里面下面配置配置
${deviceName}/device/message/down/gpio_out 是控制道闸开闸的topic

{  
  "type": "oneWay",  
  "deviceNameFilter": ".*",  
  "methodFilter": "no-reply",  
  "requestTopicExpression": "/${deviceName}/device/message/down/gpio_out",  
  "valueExpression": "${params}"  
},

具体全部配置 mqtt.json

{  
  "broker": {  
    "name": "192.168.1.73",  
    "host": "192.168.1.73",  
    "port": 1883,  
    "clientId": "ThingsBoard_gateway111",  
    "version": 5,  
    "maxMessageNumberPerWorker": 10,  
    "maxNumberOfWorkers": 100,  
    "sendDataOnlyOnChange": false,  
    "security": {  
      "type": "basic",  
      "username": "admin",  
      "password": "public"  
    }  
  },  
  "mapping": [  
    {  
      "topicFilter": "sensor/data",  
      "converter": {  
        "type": "json",  
        "deviceNameJsonExpression": "${serialNumber}",  
        "deviceTypeJsonExpression": "${sensorType}",  
        "sendDataOnlyOnChange": false,  
        "timeout": 60000,  
        "attributes": [  
          {  
            "type": "string",  
            "key": "model",  
            "value": "${sensorModel}"  
          },  
          {  
            "type": "string",  
            "key": "${sensorModel}",  
            "value": "on"  
          }  
        ],  
        "timeseries": [  
          {  
            "type": "double",  
            "key": "temperature",  
            "value": "${temp}"  
          },  
          {  
            "type": "double",  
            "key": "humidity",  
            "value": "${hum}"  
          },  
          {  
            "type": "string",  
            "key": "combine",  
            "value": "${hum}:${temp}"  
          }  
        ]  
      }  
    },  
    {  
      "topicFilter": "/device/message/up/ivs_result",  
      "converter": {  
        "type": "json",  
        "deviceNameJsonExpression": "${sn}",  
        "deviceTypeJsonExpression": "臻识道闸设备配置",  
        "sendDataOnlyOnChange": false,  
        "timeout": 60000,  
        "attributes": [  
  
        ],  
        "timeseries": [  
          {  
            "type": "string",  
            "key": "eventType",  
            "value": "1"  
          },  
           {  
            "type": "string",  
            "key": "id",  
            "value": "${id}"  
          },  
           {  
            "type": "string",  
            "key": "sn",  
            "value": "${sn}"  
  
          },  
          {  
            "type": "string",  
            "key": "name",  
            "value": "${name}"  
  
          },  
           {  
            "type": "string",  
            "key": "version",  
            "value": "${version}"  
  
          },  
          {  
            "type": "long",  
            "key": "timestamp",  
            "value": "${timestamp}"  
          },  
          {  
            "type": "string",  
            "key": "license",  
            "value": "${payload.AlarmInfoPlate.result.PlateResult.license}"  
          },  
          {  
            "type": "string",  
            "key": "full_image_content",  
            "value": "${payload.AlarmInfoPlate.result.PlateResult.full_image_content}"  
          }  
        ]  
      }  
    },  
    {  
      "topicFilter": "sensor/+/data",  
      "converter": {  
        "type": "json",  
        "deviceNameTopicExpression": "(?<=sensor/)(.*?)(?=/data)",  
        "deviceTypeTopicExpression": "Thermometer",  
        "sendDataOnlyOnChange": false,  
        "timeout": 60000,  
        "attributes": [  
          {  
            "type": "string",  
            "key": "model",  
            "value": "${sensorModel}"  
          }  
        ],  
        "timeseries": [  
          {  
            "type": "double",  
            "key": "temperature",  
            "value": "${temp}"  
          },  
          {  
            "type": "double",  
            "key": "humidity",  
            "value": "${hum}"  
          }  
        ]  
      }  
    },  
    {  
      "topicFilter": "sensor/raw_data",  
      "converter": {  
        "type": "bytes",  
        "deviceNameExpression": "[0:4]",  
        "deviceTypeExpression": "default",  
        "sendDataOnlyOnChange": false,  
        "timeout": 60000,  
        "attributes": [  
          {  
            "type": "raw",  
            "key": "rawData",  
            "value": "[:]"  
          }  
        ],  
        "timeseries": [  
          {  
            "type": "raw",  
            "key": "temp",  
            "value": "[4:]"  
          }  
        ]  
      }  
    },  
    {  
      "topicFilter": "custom/sensors/+",  
      "converter": {  
        "type": "custom",  
        "extension": "CustomMqttUplinkConverter",  
        "cached": true,  
        "extension-config": {  
          "temperatureBytes": 2,  
          "humidityBytes": 2,  
          "batteryLevelBytes": 1  
        }  
      }  
    }  
  ],  
  "connectRequests": [  
    {  
      "topicFilter": "sensor/connect",  
      "deviceNameJsonExpression": "${serialNumber}"  
    },  
    {  
      "topicFilter": "sensor/+/connect",  
      "deviceNameTopicExpression": "(?<=sensor/)(.*?)(?=/connect)"  
    }  
  ],  
  "disconnectRequests": [  
    {  
      "topicFilter": "sensor/disconnect",  
      "deviceNameJsonExpression": "${serialNumber}"  
    },  
    {  
      "topicFilter": "sensor/+/disconnect",  
      "deviceNameTopicExpression": "(?<=sensor/)(.*?)(?=/disconnect)"  
    }  
  ],  
  "attributeRequests": [  
    {  
      "retain": false,  
      "topicFilter": "v1/devices/me/attributes/request",  
      "deviceNameJsonExpression": "${serialNumber}",  
      "attributeNameJsonExpression": "${versionAttribute}, ${pduAttribute}",  
      "topicExpression": "devices/${deviceName}/attrs",  
      "valueExpression": "${attributeKey}: ${attributeValue}"  
    }  
  ],  
  "attributeUpdates": [  
    {  
      "retain": true,  
      "deviceNameFilter": ".*",  
      "attributeFilter": "firmwareVersion",  
      "topicExpression": "sensor/${deviceName}/${attributeKey}",  
      "valueExpression": "{\"${attributeKey}\":\"${attributeValue}\"}"  
    }  
  ],  
  "serverSideRpc": [  
    {  
      "type": "twoWay",  
      "deviceNameFilter": ".*",  
      "methodFilter": "echo",  
      "requestTopicExpression": "sensor/${deviceName}/request/${methodName}/${requestId}",  
      "responseTopicExpression": "sensor/${deviceName}/response/${methodName}/${requestId}",  
      "responseTimeout": 10000,  
      "valueExpression": "${params}"  
    },  
    {  
      "type": "oneWay",  
      "deviceNameFilter": ".*",  
      "methodFilter": "no-reply",  
      "requestTopicExpression": "/${deviceName}/device/message/down/gpio_out",  
      "valueExpression": "${params}"  
    },  
    {  
      "type": "oneWay",  
      "deviceNameFilter": ".*",  
      "methodFilter": "no-reply",  
      "requestTopicExpression": "asd/123",  
      "valueExpression": "${params}"  
    }  
  ],  
  "id": "546ac257-db5e-43a0-8d38-4755ae904aa8"  
}

配置完成启动tb-gateway服务

设置道闸规则链

在thingsboard添加一个名字为臻识道闸规则链 的责任链
image.png

注意在switch 事件切换进行事件触发判断
在script 进行组合下发命令
然后rpc call request 进行下发发送执行
image.png

switch tbel编写

function nextRelation(metadata, msg) {
    var arr=[];

if(msg.eventType == "1") {
    arr.push('车牌识别触发事件');
 
}
return arr;
}
return nextRelation(metadata, msg);

script tbel编写

msg.payload={
type: "gpio_out",
 body: {
 delay: 500,
 io: 0,
 value: 2
 }
};
msg.name="gpio_out";
msg.version="1.0";
var decodedData = atob(msg.license); // 解析base64车牌
if(decodedData.indexOf("无")== -1){
var msg1={method:"no-reply",params:msg};
metadata.oneway=true;
return {msg: msg1, metadata: metadata, msgType: "RPC_CALL_FROM_SERVER_TO_DEVICE"};
}

这个是规则链json,复制下来直接导入即可

{
  "ruleChain": {
    "name": "臻识道闸规则链",
    "type": "CORE",
    "firstRuleNodeId": null,
    "root": false,
    "debugMode": false,
    "configuration": null,
    "additionalInfo": {
      "description": ""
    }
  },
  "metadata": {
    "firstNodeIndex": 6,
    "nodes": [
      {
        "type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
        "name": "Save Timeseries",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "defaultTTL": 0
        },
        "additionalInfo": {
          "description": null,
          "layoutX": 569,
          "layoutY": 120
        }
      },
      {
        "type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
        "name": "Save Client Attributes",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 2,
        "configuration": {
          "scope": "CLIENT_SCOPE",
          "notifyDevice": false,
          "sendAttributesUpdatedNotification": false,
          "updateAttributesOnlyOnValueChange": true
        },
        "additionalInfo": {
          "description": null,
          "layoutX": 612,
          "layoutY": 24
        }
      },
      {
        "type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
        "name": "Message Type Switch",
        "debugMode": false,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "version": 0
        },
        "additionalInfo": {
          "description": null,
          "layoutX": 257,
          "layoutY": 127
        }
      },
      {
        "type": "org.thingsboard.rule.engine.action.TbLogNode",
        "name": "Log RPC from Device",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "TBEL",
          "jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
          "tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
        },
        "additionalInfo": {
          "description": null,
          "layoutX": 554,
          "layoutY": 230
        }
      },
      {
        "type": "org.thingsboard.rule.engine.action.TbLogNode",
        "name": "Log Other",
        "debugMode": false,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "TBEL",
          "jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
          "tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
        },
        "additionalInfo": {
          "description": null,
          "layoutX": 554,
          "layoutY": 343
        }
      },
      {
        "type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
        "name": "RPC Call Request",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "timeoutInSeconds": 60
        },
        "additionalInfo": {
          "description": null,
          "layoutX": 557,
          "layoutY": 430
        }
      },
      {
        "type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
        "name": "Device Profile Node",
        "debugMode": false,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "persistAlarmRulesState": false,
          "fetchAlarmRulesStateOnStart": false
        },
        "additionalInfo": {
          "description": "Process incoming messages from devices with the alarm rules defined in the device profile. Dispatch all incoming messages with \"Success\" relation type.",
          "layoutX": 190,
          "layoutY": 413
        }
      },
      {
        "type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode",
        "name": "下发",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "TBEL",
          "jsScript": "msg.payload={\ntype: \"gpio_out\",\n body: {\n delay: 500,\n io: 0,\n value: 2\n }\n}\nvar msg1={method:\"no-reply\",params:msg,}\nmetadata.oneway=true;\nreturn {msg: msg1, metadata: metadata, msgType: \"RPC_CALL_FROM_SERVER_TO_DEVICE\"};",
          "tbelScript": "msg.payload={\ntype: \"gpio_out\",\n body: {\n delay: 500,\n io: 0,\n value: 2\n }\n};\nmsg.name=\"gpio_out\";\nmsg.version=\"1.0\";\nvar decodedData = atob(msg.license); // decode the string\nif(decodedData.indexOf(\"无\")== -1){\nvar msg1={method:\"no-reply\",params:msg};\nmetadata.oneway=true;\nreturn {msg: msg1, metadata: metadata, msgType: \"RPC_CALL_FROM_SERVER_TO_DEVICE\"};\n}"
        },
        "additionalInfo": {
          "description": "",
          "layoutX": 1074,
          "layoutY": 421
        }
      },
      {
        "type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
        "name": "下发",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "timeoutInSeconds": 60
        },
        "additionalInfo": {
          "description": "",
          "layoutX": 1001,
          "layoutY": 655
        }
      },
      {
        "type": "org.thingsboard.rule.engine.filter.TbJsSwitchNode",
        "name": "事件切换",
        "debugMode": true,
        "singletonMode": false,
        "queueName": null,
        "configurationVersion": 0,
        "configuration": {
          "scriptLang": "TBEL",
          "jsScript": "function nextRelation(metadata, msg) {\n    return ['one','nine'];\n}\nif(msgType === 'POST_TELEMETRY_REQUEST') {\n    return ['two'];\n}\nreturn nextRelation(metadata, msg);",
          "tbelScript": "function nextRelation(metadata, msg) {\n    var arr=[];\n\nif(msg.eventType == \"1\") {\n    arr.push('车牌识别触发事件');\n \n}\nreturn arr;\n}\nreturn nextRelation(metadata, msg);"
        },
        "additionalInfo": {
          "description": "",
          "layoutX": 1005,
          "layoutY": 197
        }
      }
    ],
    "connections": [
      {
        "fromIndex": 0,
        "toIndex": 9,
        "type": "Success"
      },
      {
        "fromIndex": 2,
        "toIndex": 0,
        "type": "Post telemetry"
      },
      {
        "fromIndex": 2,
        "toIndex": 1,
        "type": "Post attributes"
      },
      {
        "fromIndex": 2,
        "toIndex": 3,
        "type": "RPC Request from Device"
      },
      {
        "fromIndex": 2,
        "toIndex": 4,
        "type": "Other"
      },
      {
        "fromIndex": 2,
        "toIndex": 5,
        "type": "RPC Request to Device"
      },
      {
        "fromIndex": 6,
        "toIndex": 2,
        "type": "Success"
      },
      {
        "fromIndex": 7,
        "toIndex": 8,
        "type": "Success"
      },
      {
        "fromIndex": 9,
        "toIndex": 7,
        "type": "车牌识别触发事件"
      }
    ],
    "ruleChainConnections": null
  }
}

创建一个设备配置

设备配置规则链要用上面配置的规则链"臻识道闸设备配置"
image.png

臻识道闸设备配置这个名称不要写错,因为在网关gateway 的配置中
“deviceTypeJsonExpression”: “臻识道闸设备配置”, 是对应的deviceType的

配置道闸后台

首先要给道闸插网线,然后电脑和道闸在一个网络
登录道闸后台,道闸后台的地址在摄像头模组上有地址
1.在后台的高级设置>高级网络>mqtt配置
先配置mqtt broker

image.png

然后配置topic,注意这里只配置
道闸识别topic /device/message/up/ivs_result
下发控制io事件topic /设备id/device/message/down/gpio_out
image.png
开启抓拍图片上传mqtt,开启之后图片是通过道闸识别topic /device/message/up/ivs_result 进行base64上传 对应字段full_image_content

image.png

然后保存确定

测试

找一个车牌图片,打开道闸后台对准摄像头 按下模拟雷达开关触发
image.png

这个时候会自动创建一个设备
image.png
设备详情遥测
image.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

渗透攻击(思考题)

目录 1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 2. 我们通过hashdump 抓取出 所有用户的密文&#xff0c;分为两个模块&#xff0c;为什么&#xff1f; 这两个模块分…

什么是GPT-4o,推荐GPT-4o的获取使用方法,使用GPT4o模型的最新方法教程(2024年5月16更新)

2024年5月最新GPT-4o模型使用教程和简介 2024年5月最新GPT-4o模型使用教程和简介 2024 年 5 月 13 日&#xff0c;openai 发布了最新的模型 GPT4o。 很多同学还不知道如何访问GPT-4、GPT-4 Turbo和GPT-4o等模型&#xff0c;这篇文章介绍如何在ChatGPT中访问GPT-4o&#xff0…

大模型时代下,数字员工演进全景图:RPA/IPA/Agent

从蒸汽机到电力&#xff0c;再到计算机&#xff0c;每一次技术的飞跃都极大地提升了企业效率。 如今&#xff0c;随着数字化转型的浪潮席卷全球&#xff0c;企业开始寻求新的解决方案来优化业务流程、打破数据屏障&#xff0c;达到提效降本的目的。在这一背景下&#xff0c;数字…

Python考试复习--day4

1.三角函数计算 import math aeval(input()) beval(input()) x(-bpow(2*a*math.sin(math.pi/3)*math.cos(math.pi/3),0.5))/(2*a) print(x) math库 2.分段函数B import math xeval(input()) if -6<x<0:yabs(x)5 elif 0<x<3:ymath.factorial(x) elif 3<x<6:y…

智慧园区:打造未来城市的新模式

随着城市化进程的加速和科技创新的推动&#xff0c;城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性&#xff0c;是一个亟待解决的问题。在这个背景下&#xff0c;智慧园区作为一种新型的城市发展模式&#xff0c;引起了越来越多的关注和探索。 什么是智慧园区&…

黑马聚合的分类及实现

1、什么是聚合? 聚合是对文档数据的统计、分析、计算 聚合的常见种类有哪些? 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组&#xff0c;例如一周为一组&#xff0c;或者一月为一组 度量(…

Docker 入门版

目录 1. 关于Docker 2. Dockr run命令中常见参数解读 3. Docker常见命令 4. Docker 数据卷 5. Docker本地目录挂载 6. 自定义镜像 Dockerfile 语法 自定义镜像模板 Demo 7. Docker网络 1. 关于Docker 在docker里面下载东西&#xff0c;就是相当于绿色面安装板&#x…

弘君资本:沪指跌0.46%,电力板块逆市爆发,半导体板块强势

28日&#xff0c;沪指早盘窄幅震动&#xff0c;午后回落走低&#xff1b;深证成指、创业板指大幅下探&#xff1b;两市成交额小幅萎缩。 截至收盘&#xff0c;沪指跌0.46%报3109.57点&#xff0c;深证成指跌1.23%报9391.05点&#xff0c;创业板指跌1.35%报1806.25点&#xff0c…

手搓顺序表(C语言)

目录 SeqList.h SeqList.c 头插尾插复用任意位置插入 头删尾删复用任意位置删除 SLtest.c 测试示例 顺序表优劣分析 SeqList.h //SeqList.h#pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h> #define IN_CY 3typedef int S…

CyberDAO全国行第三站·西安圆满落幕

CyberDAO全国行第三站于2024年5月27日在西安顺利召开。以聚势启新&#xff0c;聚焦Web3新机遇&#xff0c;开启Web3财富密码为本次会议的思想路线&#xff0c;汇聚了大批Web3爱好者齐聚古城西安。CyberDAO致力于帮助更多Web3爱好者捕获行业价值。 以圆桌论坛《机遇拥抱Web3》拉…

matplotlib ---词云图

词云图是一种直观的方式来展示文本数据&#xff0c;可以体现出一个文本中词频的使用情况&#xff0c;有利于文本分析&#xff0c;通过词频可以抓住一篇文章的重点 本文通过处理一篇关于分析影响洋流流向的文章&#xff0c;分析影响洋流流向的主要因素都有哪些 文本在文末结尾 …

升级鸿蒙4.2新变化,新增 WLAN 网络自动连接开关!

手机已经成为现代人生活中不可或缺的一部分&#xff0c;手机里的功能可以满足大部分人的生活场景&#xff0c;但是最依赖的应该就是手机网络&#xff0c;手机网络突然变差怎么办——消息发不出去&#xff1f;刷新闻速度变慢&#xff1f;仔细检查后&#xff0c;发现其实不是手机…

Linux-CentOS7-解决vim修改不了主机名称(无法打开并写入文件)

Linux-CentOS7-修改主机名称 修改之后使用强制保存退出也不行。 解决办法&#xff1a; 使用hostnamectl命令进行修改 查看系统主机名和信息&#xff1a; hostnamectl这条命令会显示当前系统的主机名、操作系统信息、内核版本、架构信息等相关信息。 修改系统主机名&#xff1…

HQChart使用教程99-K线窗口设置上下间距

HQChart使用教程99-K线窗口设置上下预留间距 指标窗口布局说明设置预留间距数据结构通过Setoption设置通过ChangeIndex设置 HQChart代码地址 指标窗口布局说明 顶部预留间距(3)和底部预留间距(5) 这个部分是算在Y轴坐标上的 设置预留间距 数据结构 HorizontalReserved&#…

Hono 框架使用经验谈

Hono&#x1f525;是一个小型、快速并开源的 Serverless Web 框架&#xff0c;用 TypeScript 写就。它适用于任何JavaScript运行时&#xff1a;Cloudflare Workers&#xff0c;Fastly ComputeEdge&#xff0c;Deno&#xff0c;Bun&#xff0c;Vercel&#xff0c;Netlify&#x…

Linux:线程

文章目录 前言1. 线程概念1.1 什么是线程1.2 线程比进程更加轻量化1.3 虚拟地址到物理地址的转化物理内存的管理页表 1.4 线程的优点1.5 线程的缺点1.6 线程异常1.7 线程用途 2. 进程 vs 线程3. 线程控制3.1 线程创建3.2 线程退出3.3 线程等待3.4 分离线程3.5 线程取消 4. 线程…

开源大模型与闭源大模型:谁将引领AI的未来?

前言 在AI领域&#xff0c;开源大模型和闭源大模型一直并存&#xff0c;各自有其独特的优势和挑战。下面&#xff0c;我们将从数据隐私、商业应用和社区参与三个方向&#xff0c;对这两种模型进行深入探讨。 一、数据隐私 开源大模型&#xff1a; 1. 透明度高&#xff1a; …

Raven2掠夺者2渡鸦2账号怎么验证 注册怎么验证账号教程

《渡鸦2》作为韩国孕育的次世代MMORPG手游巨制&#xff0c;是《Raven》系列辉煌传奇的最新篇章&#xff0c;它在暗黑奇幻的广袤天地间再度挥洒创意&#xff0c;深度融合前所未有的游戏机制与海量新颖内容&#xff0c;为该类型游戏树立了崭新的里程碑。公测日期锁定在2024年5月2…

线上政务大厅如何通过智能化服务和透明流程改变政务办理模式?

一、线上政务大厅方便快捷办理业务 1、多功能集成的一站式服务 线上政务大厅集成了多种政府服务功能&#xff0c;用户只需一个账号就能访问多个服务平台&#xff0c;办理各类政务业务。包括&#xff1a; &#xff08;1&#xff09;身份认证&#xff1a;用户可以通过线上政务大厅…

春秋云境CVE-2020-26048

简介 CuppaCMS是一套内容管理系统&#xff08;CMS&#xff09;。 CuppaCMS 2019-11-12之前版本存在安全漏洞&#xff0c;攻击者可利用该漏洞在图像扩展内上传恶意文件&#xff0c;通过使用文件管理器提供的重命名函数的自定义请求&#xff0c;可以将图像扩展修改为PHP&#xf…