一、协议设计概述
系统采用分层通信协议设计,用于定义 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 通用指令格式
| 字段含义 | 平台编号 | 平台编号 | 设备编号 | 设备编号 | 操作编码 | 操作编码 | 操作编码 | 操作编码 |
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__


