一、协议设计概述

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

二、数据结构定义

2.1 LoRa 传感器数据结构

typedef struct lora_info{
    uint8_t head[3];        // 标识位(帧头 0x5A 0x5A 0x5A)
    uint8_t type;           // 数据类型(0x01=温湿度,0x02=烟雾,0x03=红外,0x04=门磁)
    uint8_t node_id;        // 节点 ID(1~20)
    float temperature;      // 温度值(℃)
    float humidity;         // 湿度值(%RH)
    float tempMin;          // 温度最小值(报警阈值)
    float tempMax;          // 温度最大值(报警阈值)
    float humiMin;          // 湿度最小值(报警阈值)
    float humiMax;          // 湿度最大值(报警阈值)
    uint8_t smoke;          // 烟雾浓度值(0~255)
    uint8_t infrared;       // 红外状态(0=无触发,1=触发)
    uint8_t door_magnet;    // 门磁状态(0=关闭,1=打开)
    uint8_t battery;        // 电池电量(0~100%)
    uint32_t reserved[1];   // 预留字段
} lora_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{
    lora_info_t lora_data;          // LoRa 传感器数据
    imx6ull_info_t imx6ull_data;    // 本地采集数据
};

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

三、命令格式设计

3.1 通用指令格式

二进制位 7 6 5 4 3 2 1 0
字段含义 平台编号 平台编号 设备编号 设备编号 操作编码 操作编码 操作编码 操作编码

命令字节 = 平台编号 | 设备编号 | 操作编码

3.2 平台编号分配

平台编号 数值 说明
0号平台 0x00 LoRa 终端平台
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_LORA_CTRL  6L
#define MSG_TYPE_GPRS       10L

// 平台编号
#define PLATFORM_LORA       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
#define DEVICE_LORA_CTRL    0x40

// 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

// LoRa 终端控制操作编码
#define LORA_ARM            0x00
#define LORA_DISARM         0x01
#define LORA_REPORT         0x02
#define LORA_REBOOT         0x03

// 数据结构定义
typedef struct lora_info{
    uint8_t head[3];
    uint8_t type;
    uint8_t node_id;
    float temperature;
    float humidity;
    float tempMin;
    float tempMax;
    float humiMin;
    float humiMax;
    uint8_t smoke;
    uint8_t infrared;
    uint8_t door_magnet;
    uint8_t battery;
    uint32_t reserved[1];
} lora_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{
    lora_info_t lora_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"
#define LORA_UART_DEV "/dev/ttymxc2"

// 全局变量声明
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;
extern int lora_cmd_pending;
extern unsigned char lora_cmd;

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

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

// 线程声明
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);
extern void *lora_recv_pthread(void *arg);
extern void *lora_send_pthread(void *arg);

#endif // __DATA_GLOBAL_H__
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐