欢迎光临
我们一直在努力

嵌入式安防监控项目———通信协议构建

一、协议设计概述

系统采用分层通信协议设计,用于定义 ZigBee 终端节点与 IMX6ULL 网关之间的数据结构,以及多线程间的同步与通信机制。这些定义统一放置在头文件 data_global.h 中。

二、数据结构定义

2.1 ZigBee 传感器数据结构

typedef struct zigbee_info{
uint8_t head[3]; // 标识位(帧头)
uint8_t type; // 数据类型
float tempature; // 温度值(℃)
float humidity; // 湿度值(%RH)
float tempMin; // 温度最小值(报警阈值)
float tempMax; // 温度最大值(报警阈值)
float humiMin; // 湿度最小值(报警阈值)
float humiMax; // 湿度最大值(报警阈值)
uint32_t reserved[2]; // 预留字段
} zigbee_info_t;

2.2 IMX6ULL 本地采集数据结构

typedef struct imx6ull_info{
uint8_t head[3]; // 标识位(帧头)
uint8_t type; // 数据类型
uint32_t adc; // ADC 采集值(如光强/电位器)
uint16_t gyrox; // 陀螺仪 X 轴值
uint16_t gyroy; // 陀螺仪 Y 轴值
uint16_t gyroz; // 陀螺仪 Z 轴值
uint16_t accx; // 加速度计 X 轴值
uint16_t accy; // 加速度计 Y 轴值
uint16_t accz; // 加速度计 Z 轴值
uint32_t reserved[2]; // 预留字段
} imx6ull_info_t;

2.3 环境数据联合结构

struct env_data{
zigbee_info_t zigbee_data; // ZigBee 传感器数据
imx6ull_info_t imx6ull_data; // 本地采集数据
};

struct env_info_client_addr{
struct env_data monitor_no[MONITOR_NUM]; // 多路监控数据存储
};

三、命令格式设计

3.1 通用指令格式

二进制位76543210
字段含义 平台编号 平台编号 设备编号 设备编号 操作编码 操作编码 操作编码 操作编码

3.2 平台编号分配

平台编号数值说明
0号平台 0x00 ZigBee 平台
1号平台 0x40 ARM 平台
2号平台 0x80 STM32 平台
3号平台 0xC0 保留扩展

3.3 设备编号与操作编码

3.3.1 LED 设备(设备编号:0x00)

操作编码命令值说明
0x00 0x00 全部关闭
0x01 0x01 全部打开
0x02 0x02 打开 LED2
0x03 0x03 打开 LED3
0x04 0x04 打开 LED4
0x05 0x05 打开 LED5
0x10 0x10 打开流水灯

3.3.2 蜂鸣器设备(设备编号:0x10)

操作编码命令值说明
0x00 0x10 关闭蜂鸣器
0x01 0x11 打开蜂鸣器
0x02 0x12 自动报警关闭
0x03 0x13 自动报警打开

3.3.3 风扇设备(设备编号:0x20)

操作编码命令值说明
0x00 0x20 关闭风扇
0x01 0x21 打开风扇

3.3.4 数码管设备(设备编号:0x30)

操作编码命令值说明
0x00 ~ 0x0F 0x30 ~ 0x3F 显示 0~F 数字
0x0F 0x3F 关闭数码管

3.4 命令封装示例

命令 = 平台编号 + 设备编号 + 操作编码

示例平台编号设备编号操作编码命令值说明
示例1 0x00 0x20 0x01 0x21 风扇打开
示例2 0x40 0x10 0x01 0x51 蜂鸣器打开
示例3 0x40 0x30 0x08 0x78 数码管显示 8
示例4 0x40 0x30 0x0F 0x7F 关闭数码管

四、进程间通信(IPC)机制

4.1 消息队列

struct msg{
long mtype; // 消息队列接收时的消息类型
long msgtype; // 具体消息类型(1L, 2L, 3L…)
unsigned char mtext[QUEUE_SIZE];// 消息内容缓冲区
};

#define QUEUE_SIZE 36 // 消息队列大小
int msgid; // 消息队列 ID

4.2 消息类型分配

消息类型值说明
LED 控制 1L LED 灯控制指令
蜂鸣器控制 2L 蜂鸣器控制指令
数码管控制 3L 四路 LED 灯模拟的数码管
风扇控制 4L 风扇控制指令
温湿度最值设置 5L 温湿度阈值设置
扩展预留 6L ~ 9L 用于个人扩展
GPRS 通信 10L 3G 通信模块

4.3 共享内存

#define MONITOR_NUM 2 // 监控路数
int shmid; // 共享内存 ID

4.4 信号量

int semid; // 信号量 ID,用于进程同步
key_t key; // IPC 键值

五、多线程同步机制

5.1 互斥锁

pthread_mutex_t mutex_client_request; // 客户端请求互斥锁
pthread_mutex_t mutex_client_transfer; // 数据传输互斥锁
pthread_mutex_t mutex_led; // LED 控制互斥锁
pthread_mutex_t mutex_beep; // 蜂鸣器控制互斥锁

5.2 条件变量

pthread_cond_t cond_client_request; // 客户端请求条件变量
pthread_cond_t cond_client_transfer; // 数据传输条件变量
pthread_cond_t cond_led; // LED 控制条件变量
pthread_cond_t cond_beep; // 蜂鸣器控制条件变量

5.3 线程声明

pthread_t thread_led; // LED 控制线程
pthread_t thread_beep; // 蜂鸣器控制线程
pthread_t thread_transfer; // 数据传输线程
pthread_t thread_request; // 请求处理线程
pthread_t thread_refresh; // 数据刷新线程

六、设备文件接口

6.1 设备路径定义

#define LED_DEV "/sys/class/leds/sys-led/brightness" // LED 设备节点
#define BEEP_DEV "/sys/class/leds/beep/brightness" // 蜂鸣器设备节点
#define LIGHT_DEV "/sys/class/misc/ap3216c/als" // 光强传感器节点

6.2 设备控制变量

extern int led_pending; // LED 命令待处理标志
extern unsigned char led_command; // LED 命令参数

extern int beep_pending; // 蜂鸣器命令待处理标志
extern unsigned char beep_command; // 蜂鸣器命令参数

七、协议字段说明

字段类型说明
head[3] uint8_t 帧标识位,用于数据帧起始校验
type uint8_t 数据类型(0x01=ZigBee数据,0x02=本地数据)
tempature float 温度值,单位:摄氏度
humidity float 湿度值,单位:%RH
tempMin/tempMax float 温度报警阈值上下限
humiMin/humiMax float 湿度报警阈值上下限
adc uint32_t ADC 采集值(0~4095)
gyrox/gyroy/gyroz uint16_t 陀螺仪三轴角速度值
accx/accy/accz uint16_t 加速度计三轴加速度值
reserved[2] uint32_t 预留扩展字段

八、头文件完整汇总

#ifndef __DATA_GLOBAL_H__
#define __DATA_GLOBAL_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <stdint.h>
#include <pthread.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>

// 类型重定义
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;

// 宏定义
#define MONITOR_NUM 2
#define QUEUE_SIZE 36

// 消息类型分配
#define MSG_TYPE_LED 1L
#define MSG_TYPE_BEEP 2L
#define MSG_TYPE_NIXIE 3L
#define MSG_TYPE_FAN 4L
#define MSG_TYPE_THRESHOLD 5L
#define MSG_TYPE_GPRS 10L

// 平台编号
#define PLATFORM_ZIGBEE 0x00
#define PLATFORM_A9 0x40
#define PLATFORM_STM32 0x80
#define PLATFORM_RESERVE 0xC0

// 设备编号
#define DEVICE_LED 0x00
#define DEVICE_BEEP 0x10
#define DEVICE_FAN 0x20
#define DEVICE_NIXIE 0x30

// LED 操作编码
#define LED_ALL_OFF 0x00
#define LED_ALL_ON 0x01
#define LED2_ON 0x02
#define LED3_ON 0x03
#define LED4_ON 0x04
#define LED5_ON 0x05
#define LED_WATERFLOW 0x10

// 蜂鸣器操作编码
#define BEEP_OFF 0x00
#define BEEP_ON 0x01
#define BEEP_ALARM_OFF 0x02
#define BEEP_ALARM_ON 0x03

// 风扇操作编码
#define FAN_OFF 0x00
#define FAN_ON 0x01

// 数据结构定义
typedef struct zigbee_info{
uint8_t head[3];
uint8_t type;
float tempature;
float humidity;
float tempMin;
float tempMax;
float humiMin;
float humiMax;
uint32_t reserved[2];
} zigbee_info_t;

typedef struct imx6ull_info{
uint8_t head[3];
uint8_t type;
uint32_t adc;
uint16_t gyrox;
uint16_t gyroy;
uint16_t gyroz;
uint16_t accx;
uint16_t accy;
uint16_t accz;
uint32_t reserved[2];
} imx6ull_info_t;

struct env_data{
zigbee_info_t zigbee_data;
imx6ull_info_t imx6ull_data;
};

struct env_info_client_addr{
struct env_data monitor_no[MONITOR_NUM];
};

// 消息队列结构体
struct msg{
long mtype;
long msgtype;
unsigned char mtext[QUEUE_SIZE];
};

// 设备路径定义
#define LED_DEV "/sys/class/leds/sys-led/brightness"
#define BEEP_DEV "/sys/class/leds/beep/brightness"
#define LIGHT_DEV "/sys/class/misc/ap3216c/als"

// 全局变量声明
int msgid;
int shmid;
int semid;
key_t key;

extern int led_pending;
extern unsigned char led_command;
extern int beep_pending;
extern unsigned char beep_command;

// 互斥锁
pthread_mutex_t mutex_client_request;
pthread_mutex_t mutex_client_transfer;
pthread_mutex_t mutex_led;
pthread_mutex_t mutex_beep;

// 条件变量
pthread_cond_t cond_client_request;
pthread_cond_t cond_client_transfer;
pthread_cond_t cond_led;
pthread_cond_t cond_beep;

// 线程声明
extern void *beep_pthread(void *arg);
extern void *led_pthread(void *arg);
extern void *pthread_transfer(void *arg);
extern void *pthread_request(void *arg);
extern void *pthread_refresh(void *arg);

#endif // __DATA_GLOBAL_H__

赞(0)
未经允许不得转载:171主机测评 » 嵌入式安防监控项目———通信协议构建
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址