skills/jy-aiot-collector-developer/SKILL.md
基于矿山鸿雁(jy-aiot)Plugin框架,根据Markdown表格格式的数据采集协议文档,生成混合模式的采集模块代码(配置+代码片段)。使用此技能可快速实现HTTP服务端/客户端、FTP、数据库、MQTT、Kafka等通信协议的采集模块,简化定制协议采集组件的开发复杂度。
npx skillsauth add feelingsray/ray-aillm-skills jy-aiot-collector-developerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
本技能用于为矿山鸿雁(jy-aiot)产品的Plugin框架快速生成数据采集模块代码。根据用户提供的Markdown表格格式的协议定义文档,自动生成符合Plugin框架规范的采集模块,包括:
协议文档必须包含以下表格结构:
## 通信配置
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| protocol | string | 是 | 通信协议:http_server/http_client/ftp/database/mqtt/kafka |
| host | string | 是 | 服务地址 |
| port | int | 是 | 端口号 |
| path | string | 否 | 路径(HTTP/FTP) |
| username | string | 否 | 用户名 |
| password | string | 否 | 密码 |
| interval | int | 否 | 采集间隔(秒),默认60 |
## 数据点定义
| 字段名称 | 字段标识 | 数据类型 | 字节偏移 | 字节长度 | 缩放因子 | 起始位 | 位长度 | 备注 |
|----------|----------|----------|----------|----------|----------|--------|--------|------|
| 温度 | temperature | float | 0 | 4 | 0.1 | - | - | 设备温度值 |
| 压力 | pressure | int | 4 | 2 | 1 | - | - | 管道压力 |
## 数据解析规则
| 规则ID | 目标字段 | 源数据表达式 | 转换公式 | 数据单位 | 备注 |
|--------|----------|--------------|----------|----------|------|
| rule_01 | temperature | raw[0:4] | bytes_to_float_le(value) | ℃ | 小端解析 |
| rule_02 | pressure | raw[4:6] | bytes_to_int_le(value) / 100 | MPa | 缩放转换 |
| 协议 | 说明 | 适用场景 | |------|------|----------| | http_server | HTTP服务端 | 被动接收设备推送数据 | | http_client | HTTP客户端 | 主动轮询RESTful API | | ftp | FTP文件读取 | 定时拉取设备导出文件 | | database | 数据库客户端 | 直接读取数据库表 | | mqtt | MQTT订阅 | 订阅MQTT主题接收数据 | | kafka | Kafka订阅 | 订阅Kafka topic接收数据 |
| 类型标识 | Go类型 | 说明 | 示例 | |----------|--------|------|------| | int | int32/int64 | 有符号整数 | 传感器整数值 | | uint | uint32/uint64 | 无符号整数 | 计数器值 | | float | float32/float64 | 浮点数 | 温度、压力 | | string | string | 字符串 | 设备状态文本 | | bool | bool | 布尔值 | 开关状态 | | bytes | []byte | 字节数组 | 原始二进制数据 |
分析用户提供的协议文档,提取:
根据协议类型生成对应的采集模块代码:
collector_{protocol}/
├── config.yaml # 通信和采集配置
├── collector.go # 采集器主逻辑
├── parser.go # 数据解析器
├── metrics.go # 数据模型定义
└── README.md # 集成说明
所有采集模块必须实现Plugin框架的核心接口:
type Collector interface {
// Init 初始化采集器
Init(config Config) error
// Start 启动采集
Start(ctx context.Context) error
// Stop 停止采集
Stop() error
// GetMetrics 获取采集到的数据
GetMetrics() []Metric
// Health 健康检查
Health() HealthStatus
}
type Metric struct {
DeviceID string `json:"device_id"` // 设备标识
MetricID string `json:"metric_id"` // 指标标识
Timestamp time.Time `json:"timestamp"` // 采集时间
Value interface{} `json:"value"` // 值
Quality DataQuality `json:"quality"` // 数据质量
Tags map[string]string `json:"tags"` // 标签
Fields map[string]string `json:"fields"` // 扩展字段
}
type DataQuality int
const (
QualityGood DataQuality = 0 // 好
QualityBad DataQuality = 1 // 坏数据
QualityUncertain DataQuality = 2 // 不确定
)
用于被动接收设备推送的数据:
type HTTPServerCollector struct {
config HTTPServerConfig
handler *http.Server
parser DataParser
buffer sync.Map
}
func (c *HTTPServerCollector) Start(ctx context.Context) error {
c.handler = &http.Server{
Addr: fmt.Sprintf(":%d", c.config.Port),
Handler: c.createRouter(),
}
go c.handler.ListenAndServe()
return nil
}
用于订阅MQTT主题接收实时数据:
type MQTTCollector struct {
config MQTTConfig
client mqtt.Client
parser DataParser
buffer sync.Map
}
func (c *MQTTCollector) Start(ctx context.Context) error {
opts := mqtt.NewClientOptions().
AddBroker(fmt.Sprintf("tcp://%s:%d", c.config.Host, c.config.Port)).
SetClientID(c.config.ClientID)
c.client = mqtt.NewClient(opts)
if token := c.client.Connect(); token.Wait() && token.Error() != nil {
return token.Error()
}
c.client.Subscribe(c.config.Topic, 0, c.messageHandler)
return nil
}
用于直接查询数据库:
type DatabaseCollector struct {
config DatabaseConfig
db *sql.DB
parser DataParser
interval time.Duration
}
func (c *DatabaseCollector) Start(ctx context.Context) error {
connStr := fmt.Sprintf("user=%s password=%s host=%s port=%d dbname=%s",
c.config.Username, c.config.Password,
c.config.Host, c.config.Port, c.config.Database)
var err error
c.db, err = sql.Open("postgres", connStr)
if err != nil {
return err
}
ticker := time.NewTicker(c.interval)
go c.pollLoop(ctx, ticker)
return nil
}
jy-aiot-collector-{protocol}/
├── config/
│ ├── collector.yaml # 主配置
│ └── metrics.yaml # 指标定义
├── internal/
│ ├── collector.go # 采集器实现
│ ├── parser.go # 数据解析器
│ ├── client.go # 协议客户端
│ └── model.go # 数据模型
├── scripts/
│ ├── test_connection.sh # 连接测试脚本
│ └── mock_server.py # 模拟服务器(测试用)
├── deploy/
│ ├── docker-compose.yml # 部署配置
│ └── k8s-deployment.yaml # K8s部署
├── go.mod
├── main.go
└── README.md
# collector.yaml
collector:
name: "temperature_sensor"
protocol: "mqtt"
enabled: true
interval: 10 # 秒
mqtt:
broker: "tcp://192.168.1.100:1883"
topic: "sensors/+/temperature"
client_id: "jy-aiot-collector-001"
username: "collector"
password: "${MQTT_PASSWORD}"
qos: 1
clean_session: true
metrics:
- id: "temperature"
name: "设备温度"
source: "payload.temperature"
datatype: "float"
unit: "℃"
tags:
device_type: "sensor"
parser:
format: "json"
timestamp_field: "timestamp"
timestamp_format: "2006-01-02T15:04:05Z07:00"
output:
buffer_size: 1000
batch_size: 100
flush_interval: 5
// internal/parser.go
type DataParser interface {
Parse(raw []byte) ([]Metric, error)
Validate(data interface{}) bool
Transform(value interface{}, rule string) interface{}
}
type JSONParser struct {
timestampField string
timestampFormat string
}
func (p *JSONParser) Parse(raw []byte) ([]Metric, error) {
var data map[string]interface{}
if err := json.Unmarshal(raw, &data); err != nil {
return nil, err
}
metrics := make([]Metric, 0)
// 解析逻辑
return metrics, nil
}
在Plugin框架中注册采集模块:
// plugin.go
func init() {
collector.Register("mqtt", NewMQTTCollector)
collector.Register("http_server", NewHTTPServerCollector)
collector.Register("database", NewDatabaseCollector)
}
加载并验证配置:
// config/config.go
type Config struct {
Collector CollectorConfig `yaml:"collector"`
MQTT MQTTConfig `yaml:"mqtt"`
Metrics []MetricConfig `yaml:"metrics"`
Parser ParserConfig `yaml:"parser"`
Output OutputConfig `yaml:"output"`
}
func LoadConfig(path string) (*Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var config Config
if err := yaml.Unmarshal(data, &config); err != nil {
return nil, err
}
// 验证配置
if err := config.Validate(); err != nil {
return nil, err
}
return &config, nil
}
实现健康检查接口:
func (c *MQTTCollector) Health() HealthStatus {
status := HealthStatus{
Status: "healthy",
Checks: make(map[string]string),
}
if !c.client.IsConnected() {
status.Status = "unhealthy"
status.Checks["connection"] = "disconnected"
}
return status
}
用户请求:
请基于以下协议文档生成MQTT温度传感器采集模块:
## 通信配置
| 字段 | 值 |
|------|-----|
| protocol | mqtt |
| host | 192.168.1.100 |
| port | 1883 |
| topic | sensors/+/temperature |
## 数据点定义
| 字段名称 | 字段标识 | 数据类型 |
|----------|----------|----------|
| 温度值 | temperature | float |
| 设备ID | device_id | string |
根据协议文档生成完整的采集模块代码,包括:
collector.yaml 配置文件internal/collector.go 采集器实现internal/parser.go JSON解析器main.go 程序入口README.md 集成说明generate_collector.py - 采集模块代码生成脚本test_protocol.py - 协议解析测试工具mock_device.py - 模拟设备数据源templates/collector_template.go - 采集器代码模板templates/config_template.yaml - 配置文件模板schemas/metric.schema.json - 指标定义JSON Schematools
UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 9 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient. Integrations: shadcn/ui MCP for component search and examples.
development
# UI 提示词设计师技能包(UI Prompt Generator) ## 角色定义 你是 UI 提示词设计师,负责根据产品需求文档(Product-Spec.md)自动生成原型图提示词。你的核心职责是: 1. **理解需求**:深度理解产品文档,提炼核心功能 2. **视觉转换**:将功能需求转化为视觉设计描述 3. **风格适配**:根据产品特点选择合适的视觉风格 4. **细节描述**:提供清晰、具体的界面元素描述 5. **多方案生成**:为每个核心功能生成多个设计方案的提示词 ## 前置条件 - ✅ 必须存在 Product-Spec.md - ✅ 产品文档必须包含: - 项目概述 - 目标用户 - 核心功能列表(至少 3 个) - 功能描述、输入输出、业务规则 ## 工作流程 ### 步骤 1:读取产品文档 - 读取 Product-Spec.md - 理解项目概述和目标用户 - 提取核心功能列表 ### 步骤 2:确定设计风格 根据产品特点和目标用户,选择合适的视觉风格: **Web应用**:Modern Minimalist, Mat
development
# 产品经理技能包(Product Spec Builder) ## 角色定义 你是一个**毒舌产品经理**,负责需求收集、产品文档编写和迭代更新。你的核心特点是: 1. **不接受模糊回答**:对"大概""可能""差不多"这样的表述零容忍 2. **直接指出问题**:发现逻辑漏洞、自嗨功能、矛盾需求时,直接点破 3. **逼用户想清楚**:通过追问,确保需求完整、逻辑自洽 4. **AI增强建议**:主动建议用 AI 简化繁琐的手动流程 5. **冲突检测**:在迭代模式下,自动检测新需求与现有文档的冲突 ## 工作模式 ### 0-1 模式(新建项目) 触发条件:Product-Spec.md 不存在 执行步骤: 1. 询问用户的核心想法(一句话描述) 2. 追问目标用户群体 3. 追问核心功能列表(至少 3 个) 4. 对每个功能进行细节追问(输入、输出、规则、异常处理) 5. 追问功能优先级(必须有高、中、低之分) 6. 询问是否需要 AI 增强功能 7. 检查逻辑冲突和漏洞 8. 生成产品文档 9. 生成变更记录 ### 迭代模式(已有项目) 触发条件:Pr
development
# 全栈开发工程师技能包(Dev Builder) ## 角色定义 你是全栈开发工程师,负责根据产品需求文档(Product-Spec.md)和原型图(如有)实现功能代码。你的核心职责是: 1. **技术栈选择**:根据项目需求选择合适的技术栈 2. **项目初始化**:搭建项目结构,配置开发环境 3. **功能实现**:按照产品文档实现核心功能 4. **代码质量**:确保代码规范、可读、可维护 5. **功能验证**:对照产品文档检查功能完整度 ## 前置条件 - ✅ 必须存在 Product-Spec.md - ✅ 产品文档必须包含: - 核心功能列表 - 功能描述、输入输出、业务规则 - 功能优先级 - AI 增强功能(如果有) - 技术栈建议(如果有) ## 工作流程 ### 步骤 1:读取产品文档 - 读取 Product-Spec.md - 理解核心功能列表 - 提取技术栈建议 - 确定开发优先级(先实现高优先级功能) ### 步骤 2:检测现有项目 - 检查是否存在现有代码文件(如 package.json, requirements